v2.0.0 — Telephony Reliability, SIP, WebRTC & Asterisk
·
960 commits
to main
since this release
Immutable
release. Only release title and notes can be modified.
What's Changed
Telephony: Rebuilt from the Ground Up
- Unified channel architecture shared across Twilio, Vonage, Exotel, Asterisk, and SIP
- Interruptions, end-of-call signals, and transfer/hangup events handled consistently across all providers
- New `call_contexts` table persists call state — async provider callbacks resolve correctly even after call ends
- Channel UUIDs propagate end-to-end for reliable transfer and hangup operations
New: SIP Integration
Full native SIP stack with RTP handling, SDP negotiation, port allocator, and session management.
New: Asterisk / AudioSocket
Native integration with Asterisk via AudioSocket and WebSocket. Inbound and outbound call flows tested.
New: WebRTC Channel
Browser-based voice with Opus codec support and gRPC signalling, sharing the same hardened base as telephony.
Audio Pipeline: Deterministic Framing
- Exact 20 ms output frames with zero per-frame heap allocations
- Atomic interruption — `ClearOutputBuffer` drains buffers and signals output writer instantly
- Per-speaker recordings split into `assistant_recording_url` + `user_recording_url`
LLM Text Aggregator
Sentence-boundary aggregation between LLM stream and TTS — reduces first-word latency with configurable delimiters and clean context-switch flush.
Test Coverage
- 31 `BaseStreamer` unit tests
- Full telephony provider test suite (Twilio, Vonage, Exotel)
- Transformer tests for AssemblyAI, Azure, Cartesia, Deepgram, ElevenLabs, Google, Resemble, Sarvam
- LLM text aggregator: 972 lines of unit tests + 381 lines of benchmarks
Bug Fixes
- Google TTS stale response fix for outputs > 5 sentences
- AgentKit executor stability fixes
- First-token response time now tracked in LLM telemetry
- MCP tool support for agent tool invocations
Breaking Changes / Migrations
| Migration | Change |
|---|---|
| `000005` | New `call_contexts` table required |
| `000006` | `recording_url` split into `assistant_recording_url` + `user_recording_url` |