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>atwss://api.pyai.com/v1/amd/stream. Theanswered_by_twiliofield maps to Twilio’s exactAnsweredByenum, so your routing logic doesn’t change. - One
aggressivenessdial (0-1, per account viaPOST /v1/amd/configor per call via a TwiML<Parameter>): human-safe ↔ machine-aggressive. - SDKs:
pyai.amd.config/pyai.amd.calls(+amd.stream()in TS); MCP toolsconfigure_amd,list_amd_calls,get_amd_call. New guide: 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.
Post-call data capture + Omni tools GA
- Post-call data capture, declare an
extraction_schema+extraction_webhook_urlon 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; configure it in the console Agents → Data capture tab. npm create pyai-app@latestscaffolds any runnable example in one command, no clone, no setup. Browse them at the examples repo.- 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. - Omni function calling (tools) is GA, client-loop
tool_call/tool_resulton the WebSocket. New guide: Omni tools. REST:/v1/tools,/v1/agents/{id}/tools. tools[]moved from roadmap → live in the protocol reference (~5 s default timeout).
One docs home + drift guards
docs.pyai.comis now the single home for everything: quickstart, guides, and the generated API reference.api.pyai.com/docsredirects here;api.pyai.com/openapi.jsonremains the machine-readable contract.- Quickstart verifies your key first. A new
GET /v1/mestep gives you a self-diagnosing first200in 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_usacross the quickstart, guides, and SDK READMEs.
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), 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 grounding with{"type":"config","grounding":true}. See Stream speech-to-text. - Telephony output on Speak: request
g711_ulaw/g711_alawfor native 8 kHz μ-law/A-law, no client-side resampling. New reference: Telephony audio with the exact integer resample ratios for the cases where you still convert yourself.
Developer experience
- New guides: browser voice agent, Twilio phone agent, and FreeSWITCH.
- Official SDKs:
@pyai/sdk(TypeScript/JavaScript) andpyai(Python), plus thepyaiCLI smoke tester. Idempotency-Keysupport and cursor pagination on transcription jobs.- Machine-readable error codes documented end to end (see Errors & limits).
- Sandbox tier:
pyai_test_keys work instantly with no billing gate.