/** * OpenRouter 子类 —— OpenAI 兼容,差异仅在默认 baseUrl 与 OpenRouter 转发 Gemini 的 reasoning 字段名。 * * 继承 OpenAIProvider,零复制 chat/流解析/重试/trace。仅覆写 defaultBaseUrl 与 messageToValue 的 * reasoning 分支(OpenRouter 转发 Gemini 思维链用 `delta.reasoning`,非 `reasoning_content`)。 * * 仅当帧/多模态形态有厂商差异时才需新增此类文件;纯 OpenAI 兼容接入只配置文本能力行,不新增文件。 * * 文件名 `llm.openrouter.js` 即注册键 `openrouter`。 */ import OpenAIProvider from './llm.openai.js' export default class OpenRouterProvider extends OpenAIProvider { /** @returns {string} */ defaultBaseUrl() { return 'https://openrouter.ai/api/v1' } /** * OpenRouter 专有 reasoning 帧优先处理,其余委回父类。 * @param {any} frame * @returns {import('../base.js').ParsedValue | null} */ messageToValue(frame) { const delta = frame?.choices?.[0]?.delta if (typeof delta?.reasoning === 'string' && delta.reasoning.length > 0) { return { type: 'reasoning', text: delta.reasoning } } return super.messageToValue(frame) } }