Which package?
UI / App ↕ events@ottervoice/core ← session, state machine, VAD, barge-in, usage ↕ RuntimeAdapterruntime-web | react-native | node ↕ Provider interfacesprovider-deepgram | elevenlabs | openrouter | azure-speech | customChoose
Section titled “Choose”| Package | When |
|---|---|
@ottervoice/core |
Always. createVoiceSession / createOtterVoiceSession, events, mocks. |
@ottervoice/runtime-web |
Browser mic + playback. |
@ottervoice/runtime-react-native |
Expo / RN with injected native audio. |
@ottervoice/runtime-node |
CLI / server audio and networking. |
Providers |
Pick a cloud vendor — or implement the same interfaces. |
@ottervoice/protocol |
Forward session events across processes. |
@ottervoice/provider-utils |
Custom providers: credentials, SSE, WebSocket ASR. |
One client contract, two backend implementations
Section titled “One client contract, two backend implementations”| Backend | Inside AudioLLMProvider |
Client difference |
|---|---|---|
| Native | audio in → native speech model → text + audio out | None |
| Composite | audio in → ASR → LLM → TTS → text + audio out | None |
VoiceSession always receives providers.audioLlm, plus optional
providers.asr for separate captions. Model count and vendor selection stay
behind the provider or trusted gateway.
Bundled OpenRouter adapters are optional demos, not a fixed production route.