Python SDK
pip install wordcab. Python 3.9+. Sync and async. httpx under the hood, Pydantic models on top.
Install
bash
pip install wordcab
# async only:
pip install "wordcab[async]"Requires Python 3.9+. No native dependencies; the SDK is pure Python with httpx under the hood.
Create a client
python
from wordcab import Wordcab
client = Wordcab() # reads WORDCAB_API_KEY
client = Wordcab(api_key="wc_live_...") # explicit
client = Wordcab(base_url="https://wc.internal.example.com") # self-hosted
client = Wordcab(timeout=30, max_retries=5)Async
python
from wordcab import AsyncWordcab
import asyncio
async def main():
async with AsyncWordcab() as client:
agents = await client.agents.list()
async for a in client.agents.auto_paging_iter():
print(a.id, a.name)
asyncio.run(main())Resources
Every resource mirrors the API:
python
client.transcripts.create(audio_url=..., model="qwen3-asr")
client.transcripts.get(transcript_id)
client.transcripts.list(limit=50)
client.transcripts.delete(transcript_id)
client.transcripts.wait(job_id, poll_interval=2, timeout=600) # helper
client.audio.speech.create(...)
client.audio.speech.stream(...)
client.audio.transcriptions.stream(model="voxtral-realtime", ...)
client.agents.create(...)
client.agents.calls.create(agent_id=..., phone_number=...)
client.calls.get(call_id)
client.calls.end(call_id)
client.test_suites.create(...)
client.test_suites.runs.create(suite_id=..., agent_id=...)
client.deployments.list()
client.api_keys.create(name=..., scopes=[...])
client.webhooks.create(url=..., events=[...])Streaming
python
# Chat streaming
stream = client.chat.completions.create(
model="qwen3.5-4b",
messages=[...],
stream=True,
)
for chunk in stream:
delta = chunk.choices[0].delta.content
if delta:
print(delta, end="", flush=True)
# TTS streaming
with client.audio.speech.stream(
input="...", model="qwen3-tts", voice="ember", format="pcm16", sample_rate=24000
) as audio:
for frame in audio:
sink.write(frame)
# STT WebSocket streaming
async with client.audio.transcriptions.stream(
model="voxtral-realtime", sample_rate=16000
) as stt:
await stt.send_audio(pcm_bytes)
async for evt in stt:
print(evt.type, evt.text)Errors
python
from wordcab.errors import (
APIError,
AuthenticationError,
NotFoundError,
PermissionError,
RateLimitError,
ValidationError,
)
try:
agent = client.agents.get("missing")
except NotFoundError as e:
print(e.message, e.request_id)Logging
The SDK uses stdlib logging under the wordcab logger. Set to DEBUG to see request ids, URLs, and retry counts, never bodies (which may contain audio or PHI).
python
import logging
logging.basicConfig(level=logging.INFO)
logging.getLogger("wordcab").setLevel(logging.DEBUG)Typed models
Every response is a Pydantic model. Use .model_dump() / .model_dump_json() for serialization, .model_validate() to parse webhook bodies.