跳转到内容

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.asrpolicy.llmpolicy.tts 都存在时才启用。独立 audio_llm profile 对应原生语音模型, 独立 asr 只用于可选字幕;不再提供客户端 LLM/TTS profile。 createOpenRouterLLMcreateOpenRouterTTS 等直连工厂只用于可信后端组合 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。