Skip to main content

Python SDK and CLI for direct Thalovant hub HTTPS clients and agents

Project description

Thalovant Python SDK

The Thalovant Python SDK is the developer layer for direct Thalovant hub access. Thalovant provisions client identities and policy; this SDK connects directly to the hub endpoint over the HTTPS data plane.

Thalovant API / dashboard -> provision identity and policy
Python SDK / CLI          -> direct hub HTTPS data-plane connection
Hub runtime               -> skills, events, and replies

Full documentation: https://docs.thalovant.com/developers/sdks/python/

Install

pip install thalovant

For local SDK development:

pip install -e ".[dev]"

Quick Start

Download or copy the client identity created in Thalovant, then:

from thalovant import ThalovantClient

with ThalovantClient.from_identity_file("_identity.json") as client:
    reply = client.ask("Tell me a short clean joke.")
    print(reply.text)

For async apps and agent runtimes:

import asyncio
from thalovant import AsyncThalovantClient


async def main():
    async with AsyncThalovantClient.from_identity_file("_identity.json") as client:
        reply = await client.ask("What time is it?")
        print(reply.text)


asyncio.run(main())

Identity

The identity file uses the same fields produced for Thalovant hub clients:

{
  "access_key": "client-access-key",
  "password": "client-password",
  "crypto_key": "optional-preshared-key",
  "site_id": "my-client-site",
  "default_master": "https://hub.example.com",
  "default_port": 443,
  "default_path": "/public"
}

Environment variables are also supported:

export THALOVANT_ACCESS_KEY=...
export THALOVANT_PASSWORD=...
export THALOVANT_CRYPTO_KEY=...
export THALOVANT_SITE_ID=...
export THALOVANT_HUB_HTTP_HOST=https://hub.example.com
export THALOVANT_HUB_HTTP_PORT=443
export THALOVANT_HUB_HTTP_PATH=/public
from thalovant import ThalovantClient

with ThalovantClient.from_env() as client:
    print(client.ask("Tell me a joke").text)

Keep identity files secret. They are client credentials, not public API keys.

Conversations

Use a conversation when multiple messages should share a stable session and correlation context:

from thalovant import ThalovantClient

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

Conversation helpers add session and request metadata automatically. When the hub echoes that metadata, SDK listeners filter unrelated events from other sessions.

Client Context

Use build_client_context when a web, mobile, kiosk, or service client needs to pass user, device, channel, and platform metadata to skills:

from thalovant import ThalovantClient, build_client_context

context = build_client_context(
    user_id="user-42",
    user_name="Ada",
    auth_provider="oidc",
    roles=["member"],
    platform="kiosk",
    source="checkout-kiosk",
    channel="chat",
)

with ThalovantClient.from_identity_file("_identity.json") as client:
    reply = client.ask("Show the next instruction.", context=context)

Provider-specific fields can still be passed through context or metadata. The SDK keeps the public helper generic.

Actions And Exact Inputs

Use send_action for button/quick-reply payloads, and send_code for exact values such as QR codes, serial numbers, asset IDs, or scanned labels:

with client.conversation(session_id="work-session") as convo:
    convo.send_action('/choose{"id":"42"}', title="Choose item")
    convo.send_code("SN-001-XYZ", kind="qr", label="serial")

Both helpers still emit normal recognizer_loop:utterance events, but add generic input metadata so downstream skills can distinguish typed/scanned values from speech transcription.

Rich Responses

Assistant responses can include text, choices, images, attachments, and tables. Use reply.display_items() or event.display_items() to render a UI without hand-parsing common rich media payloads:

reply = client.ask("Show matching parts.")

for item in reply.display_items(max_text_chars=600):
    if item.kind == "text":
        print(item.text)
    elif item.kind == "choices":
        print([choice["title"] for choice in item.data])

Agents

Use ThalovantAgent for long-running synchronous workers:

from thalovant import ThalovantAgent, EVENT_SPEAK

agent = ThalovantAgent.from_identity_file("_identity.json")


@agent.on(EVENT_SPEAK)
def handle_speak(event):
    print(event.text)


agent.run_forever()

Async agents work the same way:

import asyncio
from thalovant import AsyncThalovantAgent, EVENT_SPEAK

agent = AsyncThalovantAgent.from_identity_file("_identity.json")


@agent.on(EVENT_SPEAK)
async def handle_speak(event):
    print(event.text)


asyncio.run(agent.run_forever())

CLI

The package installs a thalovant command for smoke tests and operational debugging:

thalovant --identity _identity.json doctor
thalovant --identity _identity.json health
thalovant --identity _identity.json ask "Tell me a joke"
thalovant --identity _identity.json listen speak --timeout 30 --max-events 3
thalovant --identity _identity.json emit recognizer_loop:utterance \
  --data '{"utterances":["hello"],"lang":"en-us"}'

Add --json to commands that return structured output.

Events

For common flows, prefer helpers over raw event strings:

from thalovant import EVENT_SPEAK, ThalovantClient

with ThalovantClient.from_identity_file("_identity.json") as client:
    for event in client.listen(EVENT_SPEAK, timeout=30, max_events=1):
        print(event.text)

Use emit when you already know the hub event shape:

from thalovant import EVENT_RECOGNIZER_LOOP_UTTERANCE, ThalovantClient

with ThalovantClient.from_identity_file("_identity.json") as client:
    client.emit(
        EVENT_RECOGNIZER_LOOP_UTTERANCE,
        {"utterances": ["turn on the lights"], "lang": "en-us"},
    )

ThalovantEvent normalizes common fields:

  • event.text
  • event.utterances
  • event.session_id
  • event.request_id
  • event.is_failure
  • event.is_policy_denied

Diagnostics

Use doctor() before debugging application code:

with ThalovantClient.from_identity_file("_identity.json") as client:
    report = client.doctor()
    print(report.format())

The report checks identity shape, endpoint configuration, hub connection, handshake completion, and the live HTTP polling thread.

Documentation

The canonical public documentation lives on the Thalovant docs site:

This repository also keeps generated API reference material for maintainers:

  • Local preview: pip install -e ".[docs]" && mkdocs serve
  • Build check: mkdocs build --strict

Notes

  • This SDK is the developer convenience layer. It does not proxy messages through the Thalovant API.
  • The Thalovant API remains the control plane for creating clients, rotating or revoking identity material, and managing ACL/policy.
  • The data plane is direct hub protocol traffic from this SDK to the hub listener.

Publishing

This repository is configured for PyPI trusted publishing through .github/workflows/publish.yml. Use these values in the PyPI publisher form:

  • PyPI Project Name: thalovant
  • Owner: thalovant
  • Repository name: thalovant-python-sdk
  • Workflow name: publish.yml
  • Environment name: pypi

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

thalovant-0.4.0.tar.gz (32.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

thalovant-0.4.0-py3-none-any.whl (28.1 kB view details)

Uploaded Python 3

File details

Details for the file thalovant-0.4.0.tar.gz.

File metadata

  • Download URL: thalovant-0.4.0.tar.gz
  • Upload date:
  • Size: 32.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.5

File hashes

Hashes for thalovant-0.4.0.tar.gz
Algorithm Hash digest
SHA256 aea9294b55311408dae01ced9756223a398bac95baa388c5b73a6ffba0a9f123
MD5 8dd508fd6bac847201b7bc4ac5a3110c
BLAKE2b-256 b6d1b8759f9fbba2c8b365979bd6258a8b8fe229646bf8d07cad11b945cf1b68

See more details on using hashes here.

File details

Details for the file thalovant-0.4.0-py3-none-any.whl.

File metadata

  • Download URL: thalovant-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 28.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.5

File hashes

Hashes for thalovant-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ea67322a08f0c77d2c845221c292a877b1a885592bb33654847efbb5d07fa3b1
MD5 28ceb4aa0aaec1fc5a7c412722a28027
BLAKE2b-256 779c3c89aba8db5717e95aa16f1f5854455e6fc16e4e0d4581196da0396183c1

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page