llm.openrouter.js 1.17 KB
/**
 * 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)
  }
}