Both SDKs are generated from the backend’s OpenAPI schema, so they cannot drift from the real routes. Every route decorated with sdk_expose is in them — care, voices, generations, organization usage and the speech surfaces.
The packages are not published to PyPI/npm yet. Until they are, install them from a checkout of the repository — pip install -e sdk/python or npm install ./sdk/typescript.

Client

Request bodies are typed models, not dicts — the generated client calls model_dump() on whatever you pass, so a plain dict raises before the request is sent.

What the generated clients cover

Multipart uploads and audio responses are handled: create_speech returns the audio bytes, and create_voice and create_transcription take a file. The gaps are the streaming paths — SSE transcription, streamed chat completions, and /v1/realtime itself, which is a WebSocket and not an OpenAPI operation. For those, use an OpenAI client against the base URL or the raw socket; see Speech API and Realtime.

Errors

Everything the SDK raises subclasses EESISdkError, so you can catch the categories separately or together. ApiError is any non-2xx response and carries status_code plus the parsed body; RequestTimeoutError names which phase timed out.
GET requests retry once on a connection error; nothing else is retried, because a retried POST is a second call placed or a second voice cloned.

Regenerating

After changing routes or an sdk_expose decorator:
That regenerates the OpenAPI slice, the request/response models, the client mixins and the docs spec. CI runs it and fails if the diff is non-empty, which is what keeps the SDKs honest.

Going further

Authentication

Keys, sessions, and browser clients.

Speech API

The OpenAI-compatible surface the SDKs sit beside.