> ## Documentation Index
> Fetch the complete documentation index at: https://docs.pyai.com/llms.txt
> Use this file to discover all available pages before exploring further.

# PyAI changelog: API, SDK, and Omni protocol releases

> Release notes for the PyAI API, SDKs, and docs covering Hear, Speak, and Omni protocol updates, telephony audio, and developer-experience improvements.

<Update label="2026-07-01" description="AMD, answering machine detection">
  * **PyAI AMD is live**, answering-machine detection that tells your dialer *who
    or what* answered a call (human, voicemail, IVR, live receptionist,
    iPhone/Google screening, dead number, fax) in a fraction of Twilio's dead-air
    dwell, with the word-level **reason** it decided.
  * **One-line-TwiML Twilio drop-in:** point a `<Connect><Stream>` at
    `wss://api.pyai.com/v1/amd/stream`. The `answered_by_twilio` field maps to
    Twilio's exact `AnsweredBy` enum, so your routing logic doesn't change.
  * **One `aggressiveness` dial** (0-1, per account via `POST /v1/amd/config` or
    per call via a TwiML `<Parameter>`): human-safe ↔ machine-aggressive.
  * **SDKs:** `pyai.amd.config` / `pyai.amd.calls` (+ `amd.stream()` in TS);
    MCP tools `configure_amd`, `list_amd_calls`, `get_amd_call`. New guide:
    [Answering machine detection](/guides/amd-answering-machine-detection).
  * **Billing:** per answered call, first 5,000 answered calls/month free, then
    \$0.004/call; free bundled with PyAI telephony or Omni.
</Update>

<Update label="2026-06-22" description="Post-call data capture + Omni tools GA">
  * **Post-call data capture**, declare an `extraction_schema` + `extraction_webhook_url`
    on an agent and PyAI extracts structured JSON from each call's transcript and
    delivers it signed (`omni.call.extracted`). No client or engine code. New guide:
    [Post-call data capture](/guides/post-call-extraction); configure it in the console
    Agents → **Data capture** tab.
  * **`npm create pyai-app@latest`** scaffolds any runnable example in one command, no clone, no setup. Browse them at the [examples repo](https://github.com/atomsai/pyai-examples).
  * **New examples**, each linked from its guide and exercised in nightly CI: **OpenAI drop-in**,
    **voice cloning**, **call analytics**, and offline **`omni-mock`**.
  * **Machine-readable Omni contract:** AsyncAPI 3.0 at `contracts/omni-asyncapi.yaml`, see
    [Omni wire protocol](/realtime/omni-protocol).
  * **Omni function calling (tools) is GA**, client-loop `tool_call` / `tool_result` on the WebSocket.
    New guide: [Omni tools](/guides/omni-tools). REST: [`/v1/tools`](/api-reference),
    [`/v1/agents/{id}/tools`](/api-reference).
  * **`tools[]`** moved from roadmap → live in the protocol reference (\~5 s default timeout).
</Update>

<Update label="2026-06-19" description="One docs home + drift guards">
  * **`docs.pyai.com` is now the single home** for everything: quickstart, guides,
    and the generated [API reference](/api-reference). `api.pyai.com/docs` redirects
    here; `api.pyai.com/openapi.json` remains the machine-readable contract.
  * **Quickstart verifies your key first.** A new `GET /v1/me` step gives you a
    self-diagnosing first `200` in seconds before any audio call.
  * **Docs can't drift to dead ids.** CI now fails if any sample uses a voice or
    model id that isn't in the live catalog, every snippet stays copy-paste-runnable.
  * Example voice standardized to `stock_dorit_en_us` across the quickstart, guides,
    and SDK READMEs.
</Update>

<Update label="2026-06-16" description="Docs accuracy & unified API reference">
  * **REST reference unified in-site.** The full OpenAPI reference now lives
    inside these docs under the **API reference** tab (generated from
    [`https://api.pyai.com/openapi.json`](https://api.pyai.com/openapi.json)), no more bouncing to a separate page.
  * **Hear streaming protocol corrected** to match the live API: the engine
    emits bare frames (`partial`, `partial_stable`, `speech_final`, `final`,
    `error`); force-finalize with `{"type":"commit"}` (a bare `{"type":"end"}` is
    **ignored**); enable [Cue](/pricing-and-metering) grounding with
    `{"type":"config","grounding":true}`. See [Stream speech-to-text](/guides/streaming-stt).
  * **Telephony output on Speak:** request `g711_ulaw` / `g711_alaw` for native
    8 kHz μ-law/A-law, no client-side resampling. New reference:
    [Telephony audio](/reference/telephony-audio) with the exact integer resample
    ratios for the cases where you still convert yourself.
</Update>

<Update label="2026-06" description="Developer experience">
  * New guides: [browser voice agent](/guides/browser-voice-agent), [Twilio phone agent](/guides/twilio-voice-agent), and [FreeSWITCH](/guides/freeswitch-voice-agent).
  * Official SDKs: `@pyai/sdk` (TypeScript/JavaScript) and `pyai` (Python), plus the `pyai` CLI smoke tester.
  * `Idempotency-Key` support and cursor pagination on transcription jobs.
  * Machine-readable error codes documented end to end (see [Errors & limits](/errors-and-limits)).
  * Sandbox tier: `pyai_test_` keys work instantly with no billing gate.
</Update>
