Skip to content
Console

SDK Functions

Use this page when you want to build with the SDK, not memorize every method name.

Start with the quick example, then copy the recipe closest to your task. Each recipe shows the same idea in Python, Node.js, Go, and Rust where the SDKs expose it.

This example signs in, creates a client identity for one hub, connects, sends one request, and prints the reply.

from thalovant import ThalovantClient, ThalovantControlPlane
api = ThalovantControlPlane()
api.login("[email protected]", "password")
result = api.create_client_identity(
"hub-id",
name="python-demo-client",
preferred_protocols=("wss", "https", "mqtt"),
)
with ThalovantClient(result.identity, protocol="wss") as client:
reply = client.ask("Tell me a short clean joke.")
print(reply.text)

Expected result:

Why did the hub keep good logs? It wanted every punchline to be traceable.

Control plane

Discover hubs and create client identities.

Identity

Load saved credentials and choose a protocol.

Runtime client

Connect, ask, emit events, and send structured input.

Events and context

Listen for hub events and attach session metadata.

Use this before hub discovery or identity provisioning.

from thalovant import ThalovantControlPlane
api = ThalovantControlPlane()

Sign in before private control-plane actions such as creating a client identity.

api.login("[email protected]", "password")

Common failure:

Missing Thalovant API access token

Fix it by signing in before the private call, or by passing a valid API token to the control-plane client where your SDK supports that.

Use public hub discovery before you ask a user to choose a hub.

page = api.list_public_hubs(limit=12)
for hub in page["data"]:
print(hub["id"], hub["slug"], hub["title"])

Use this when you have a hub reference from a URL, card, or saved choice.

hub = api.get_public_hub("joke-garden")
print(hub["title"], hub["public_ref"])

Use this for hubs the signed-in workspace can see.

page = api.list_hubs(limit=25)
for hub in page["data"]:
print(hub["id"], hub["title"])

Use this after you already know the hub ID.

hub = api.get_hub("hub-id")
print(hub["title"])

Create an identity when a browser, service, voice client, device, or agent needs to connect to one hub.

result = api.create_client_identity(
"hub-id",
name="checkout-kiosk",
preferred_protocols=("wss", "https"),
)
identity = result.identity

Use config or a downloaded identity file when the client already exists.

from thalovant import ThalovantClient, ThalovantIdentity
identity = ThalovantIdentity.from_config(profile="prod")
same_identity = ThalovantIdentity.from_file("_identity.json")
client_from_config = ThalovantClient.from_config(profile="prod", protocol="wss")
client_from_file = ThalovantClient.from_identity_file("_identity.json")
client_from_env = ThalovantClient.from_env()

Use protocol helpers before forcing WSS, HTTPS, or MQTT.

print(identity.enabled_protocols())
print(identity.endpoint_for("wss"))
print(identity.endpoint_for("https"))
print(identity.endpoint_for("mqtt"))
print(identity.supports_protocol("wss"))
if identity.mqtt:
print(identity.mqtt["host"], identity.mqtt["port"])

Use a runtime client after you have identity material.

from thalovant import ThalovantClient
client = ThalovantClient(identity, protocol="wss")
client.connect()
print(client.healthcheck())
client.close()

Most code should use a context manager, try/finally, defer, or ? cleanup so connections close reliably.

Use ask for one request-response interaction.

reply = client.ask("What can this hub do?")
print(reply.text)
for item in reply.display_items():
print(item)

Expected output shape:

{
"text": "This hub can answer quick joke and trivia requests.",
"display_items": []
}

Use raw events when you already have an event name and a structured payload.

client.emit(
"thalovant.client.status",
{"state": "ready"},
{"source": "checkout-kiosk"},
)

Use an utterance when the input should behave like speech or chat text from a client.

client.send_utterance(
"What is the status?",
lang="en-us",
session_id="status-session",
)

Use actions for buttons, menu picks, confirmations, and tool commands.

client.send_action(
"/approve invoice-42",
title="Approve invoice",
session_id="approval-session",
)

Use code input for QR values, barcode scans, serial numbers, short codes, or typed exact values.

client.send_code(
"INV-2026-001",
kind="invoice",
session_id="scan-session",
)

Use a conversation when related turns should share the same session.

with client.conversation(lang="en-us") as convo:
print(convo.ask("Remember that my favorite color is blue.").text)
print(convo.ask("What color did I mention?").text)

Use this when one event proves the request completed.

from thalovant import EVENT_UTTERANCE_HANDLED
event = client.wait_for_event(EVENT_UTTERANCE_HANDLED, timeout=12)
print(event.text)

Use event streams for long-running clients, live status, speech output, and UI updates.

from thalovant import EVENT_SPEAK
for event in client.listen(EVENT_SPEAK, timeout=30, max_events=3):
print(event.text)

Context carries stable user, source, locale, and trace metadata without changing the utterance.

from thalovant import build_client_context
context = build_client_context(
user_id="user-42",
user_name="Ada",
source="checkout-kiosk",
platform="kiosk",
locale="en-US",
metadata={"trace_id": "req-2026-06-10-001"},
)
reply = client.ask("Show the next instruction.", context=context)
print(reply.text)

Use diagnostics when a client cannot connect, a protocol is missing, or an event never arrives.

print(client.doctor())

Use the SDK protocol enum or string that matches your language.

ProtocolPythonNode.jsGoRust
WSS"wss""wss"thalovant.ProtocolWSSHubProtocol::Wss
HTTPS"https""https"thalovant.ProtocolHTTPSHubProtocol::Https
MQTT"mqtt""mqtt"thalovant.ProtocolMQTTHubProtocol::Mqtt

When no protocol is forced, SDKs prefer WSS, then HTTPS, then MQTT when the identity includes broker credentials.

  1. Discover a hub. Use list_public_hubs, get_public_hub, list_hubs, or get_hub.
  2. Create or load identity material. Use create_client_identity for new clients, or load an existing identity from config, file, or environment.
  3. Choose a protocol. Start with WSS unless your deployment needs HTTPS or MQTT.
  4. Send one request. Use ask first because it gives a clear reply.
  5. Add events and context. Add listen, wait_for_event, and build_client_context once the basic request works.

Use this table only when you already know the task and need the language-specific name.

TaskPythonNode.jsGoRust
Create API clientThalovantControlPlane()new ThalovantControlPlane()NewDefaultControlPlane(token)ControlPlane::default()
Sign inlogin(email, password)login(email, password)Login(ctx, email, password, scope)login(email, password, scope)
List public hubslist_public_hubs(...)listPublicHubs(...)ListPublicHubs(ctx, limit, cursor)list_public_hubs(limit, cursor)
Get public hubget_public_hub(ref)getPublicHub(ref)GetPublicHub(ctx, ref)get_public_hub(ref)
List visible hubslist_hubs(...)listHubs(...)ListHubs(ctx, limit, cursor, ownerID)list_hubs(limit, cursor, owner_id)
Get hubget_hub(hub_id)getHub(hubId)GetHub(ctx, hubID)get_hub(hub_id)
Create identitycreate_client_identity(...)createClientIdentity(...)CreateClientIdentityForHubID(...)create_client_identity_for_hub_id(...)
TaskPythonNode.jsGoRust
Load identity from configThalovantIdentity.from_config(...)ThalovantIdentity.fromConfig(...)IdentityFromConfig(path, profile)Identity::from_config(profile)
Load identity fileThalovantIdentity.from_file(path)ThalovantIdentity.fromFile(path)IdentityFromFile(path)Identity::from_file(path)
Load client from fileThalovantClient.from_identity_file(path)ThalovantClient.fromIdentityFile(path)NewClientFromFile(path)Client::from_file(path)
Load client from configThalovantClient.from_config(...)ThalovantClient.fromConfig(...)NewClientFromConfig(path, profile)Client::from_config(profile)
Load client from envThalovantClient.from_env()ThalovantClient.fromEnv()NewClientFromEnv()Client::from_env()
Enabled protocolsenabled_protocols()enabledProtocols()EnabledProtocols()enabled_protocols()
Endpoint for protocolendpoint_for(protocol)endpointFor(protocol)EndpointFor(protocol)endpoint_for(protocol)
Check protocolsupports_protocol(protocol)supportsProtocol(protocol)SupportsProtocol(protocol)supports_protocol(protocol)
MQTT credentialsidentity.mqttidentity.mqttIdentity.MQTTidentity.mqtt
TaskPythonNode.jsGoRust
Create protocol clientThalovantClient(identity, protocol="wss")new ThalovantClient(identity, { protocol })NewClientWithOptions(identity, ClientOptions{Protocol: ...})Client::with_protocol(identity, protocol)
Connectconnect()connect()Connect(ctx)connect()
Closeclose()close()Close(ctx)close()
Healthhealthcheck()healthcheck()Healthcheck()healthcheck()
Askask(text, ...)ask(text, options)Ask(ctx, text, options)ask(text, options)
Emit raw eventemit(event, data, context)emit(event, data, context)Emit(ctx, event, data, context)emit(event, data, context)
Send utterancesend_utterance(text, ...)sendUtterance(text, options)SendUtterance(ctx, text, options)send_utterance(text, options)
Send actionsend_action(payload, ...)sendAction(payload, options)SendAction(ctx, payload, options)send_action(payload, options)
Send codesend_code(value, ...)sendCode(value, options)SendCode(ctx, value, options)send_code(value, options)
Conversationconversation(...)conversation(options)Conversation(options)conversation(options)
TaskPythonNode.jsGoRust
Wait for eventwait_for_event(name, ...)waitForEvent(name, options)client.Transport.Events() with timeoutclient.transport.subscribe() with timeout
Stream eventslisten(name, ...)on(name, handler, options)client.Transport.Events()client.transport.subscribe()
Diagnosticsdoctor()healthcheck()Healthcheck()healthcheck()
Build contextbuild_client_context(...)buildClientContext(...)BuildClientContext(...)build_client_context(...)
Response textreply.textreply.textreply.Textreply.text
Display itemsreply.display_items(...)reply.displayItems(...)reply.DisplayItems(...)reply.display_items(...)
Event textevent.textevent.textevent.Text()event.text()