Skip to content

Which package?

UI / App
↕ events
@ottervoice/core ← session, state machine, VAD, barge-in, usage
↕ RuntimeAdapter
runtime-web | react-native | node
↕ Provider interfaces
provider-deepgram | elevenlabs | openrouter | azure-speech | custom
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.