Providers
所有 Provider 共享凭证形态(@ottervoice/provider-utils):
| 字段 | 用途 |
|---|---|
apiKey |
服务端长期密钥(禁止下发客户端) |
tokenBrokerUrl |
仅用于能签发短期、限权 token 的直连能力 |
tokenBrokerHeaders / tokenBrokerSessionId |
Broker 的应用鉴权与会话归属 |
fetch |
可注入 |
| 能力 | 包 | 传输 |
|---|---|---|
| Streaming ASR | @ottervoice/provider-deepgram |
WebSocket |
| Streaming ASR | @ottervoice/provider-elevenlabs |
WebSocket |
| LLM / SSE | @ottervoice/provider-openrouter |
HTTP SSE |
| TTS / STT / Audio LLM | @ottervoice/provider-openrouter |
HTTP(Demo 可选) |
| TTS | @ottervoice/provider-azure-speech |
REST + SSML |
自定义 ASR 必须正确声明 capabilities.streaming,core 据此选择 live 分片或完整轮次音频。
浏览器/App 接 OpenRouter 时使用 server-managed 工厂,客户端参数中没有 模型、prompt、voice 或生成控制:
import { createOpenRouterGatewayASR, createOpenRouterGatewayAudioLLM, createOpenRouterGatewayVoiceTurn,} from '@ottervoice/provider-openrouter';
// 服务端组合 ASR → LLM → TTS;输入转写与回复共用一次 SSE 请求。const cascadedVoice = createOpenRouterGatewayVoiceTurn({ baseUrl: '/api/voice/asr-llm-tts', prepareAudio,});
// 原生 Audio LLM 不一定返回输入转写,因此可并行配置 caption ASR。const asr = createOpenRouterGatewayASR({ baseUrl: '/api/voice/asr', format: 'webm',});const audioLlm = createOpenRouterGatewayAudioLLM({ baseUrl: '/api/voice/audio-llm', prepareAudio,});服务端用 createOpenRouterGateway() 配置 policy 和强制的 authorize
钩子。复合 asr_llm_tts profile 只有在 policy.asr、policy.llm 与
policy.tts 都存在时才启用。独立 audio_llm profile 对应原生语音模型,
独立 asr 只用于可选字幕;不再提供客户端 LLM/TTS profile。
createOpenRouterLLM、createOpenRouterTTS 等直连工厂只用于可信后端组合
AudioLLMProvider。
Deepgram 等能够签发短期且权限受限的直连 WebSocket 能力,仍可使用:
import { createDeepgramASR } from '@ottervoice/provider-deepgram';
const asr = createDeepgramASR({ tokenBrokerUrl: '/api/voice/token', tokenBrokerHeaders: { authorization: `Bearer ${applicationSessionToken}` }, tokenBrokerSessionId: voiceSessionId,});仅仅“短期”不够:若 token 仍可任意选择模型、路由或消耗额度,它就不能 下发客户端,必须留在策略网关后面。
凭证细节见 provider-utils。工厂参数表见 API 参考 与各包源码 JSDoc。