@xopcai/xopc 0.0.131 → 0.0.133

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/README.md +23 -26
  2. package/README.zh-CN.md +25 -28
  3. package/dist/browser-ext/icons/icon-128.png +0 -0
  4. package/dist/browser-ext/icons/icon-16.png +0 -0
  5. package/dist/browser-ext/icons/icon-32.png +0 -0
  6. package/dist/browser-ext/icons/icon-48.png +0 -0
  7. package/dist/browser-ext/manifest.json +1 -1
  8. package/dist/extensions/telegram/xopc.extension.json +1 -1
  9. package/dist/extensions/weixin/src/messaging/process-message.js +5 -8
  10. package/dist/extensions/weixin/src/messaging/process-message.js.map +1 -1
  11. package/dist/extensions/weixin/src/plugin.js +11 -1
  12. package/dist/extensions/weixin/src/plugin.js.map +1 -1
  13. package/dist/extensions/weixin/src/routing-integration.d.ts +7 -0
  14. package/dist/extensions/weixin/src/routing-integration.js +17 -0
  15. package/dist/extensions/weixin/src/routing-integration.js.map +1 -0
  16. package/dist/gateway/static/root/apple-touch-icon.png +0 -0
  17. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BJYeTxQ9.js → agent-avatar-dicebear-Ab81VpCx.js} +1 -1
  18. package/dist/gateway/static/root/assets/agents-HCGFJG8I.js +2 -0
  19. package/dist/gateway/static/root/assets/{app-management-settings-panel-Bj8iJ-7d.js → app-management-settings-panel-DMI_sbnc.js} +1 -1
  20. package/dist/gateway/static/root/assets/{appearance-settings-6TjISbHB.js → appearance-settings-oQiCWQIQ.js} +1 -1
  21. package/dist/gateway/static/root/assets/{apps-page-DC4YwXLL.js → apps-page-CRYuPIdb.js} +1 -1
  22. package/dist/gateway/static/root/assets/{archive-plugin-2G62raBg.js → archive-plugin-BaKuWJws.js} +1 -1
  23. package/dist/gateway/static/root/assets/{attachment-load-kLNJMEJh.js → attachment-load-DYCFtbAA.js} +1 -1
  24. package/dist/gateway/static/root/assets/{automation-suggestion-card-CpcZSSD8.js → automation-suggestion-card-C6ZIz_B1.js} +1 -1
  25. package/dist/gateway/static/root/assets/automations-page-DjbtV2VP.js +4 -0
  26. package/dist/gateway/static/root/assets/{binary-plugins-C_zSrWow.js → binary-plugins-Bdg1hfhV.js} +1 -1
  27. package/dist/gateway/static/root/assets/{block-editor-D_PMrT-l.js → block-editor-CEgvbzpG.js} +1 -1
  28. package/dist/gateway/static/root/assets/{browser-settings-page-C89wKfPd.js → browser-settings-page-KcwlS_iE.js} +1 -1
  29. package/dist/gateway/static/root/assets/{capability-presets-api-CPFtajl7.js → capability-presets-api-CC3vmrm5.js} +1 -1
  30. package/dist/gateway/static/root/assets/{capability-presets-settings-panel-DWw31-4v.js → capability-presets-settings-panel-Di4uiKbv.js} +1 -1
  31. package/dist/gateway/static/root/assets/{channel-recipient-api-BUi8syv2.js → channel-recipient-api-RANYrzfa.js} +1 -1
  32. package/dist/gateway/static/root/assets/channels-settings-DMa0BEWf.js +1 -0
  33. package/dist/gateway/static/root/assets/channels-status-swr-BG_j4Ci-.js +1 -0
  34. package/dist/gateway/static/root/assets/{connectors-page-DCE-PgQF.js → connectors-page-DIZKYaMj.js} +1 -1
  35. package/dist/gateway/static/root/assets/{desktop-pet-BYV16wez.js → desktop-pet-CNnlqbkx.js} +1 -1
  36. package/dist/gateway/static/root/assets/{desktop-pet-settings-DGIaFqPR.js → desktop-pet-settings-ukJCc0LA.js} +1 -1
  37. package/dist/gateway/static/root/assets/{directory-picker-path-field-BEhDuShd.js → directory-picker-path-field-8hoieEyt.js} +1 -1
  38. package/dist/gateway/static/root/assets/dreaming-settings-BOrBSNLL.js +3 -0
  39. package/dist/gateway/static/root/assets/{extension-debug-page-BIjLZMAQ.js → extension-debug-page-D6Jc0hYZ.js} +1 -1
  40. package/dist/gateway/static/root/assets/{extension-page-Cxv4Bgj5.js → extension-page-CJMhBASX.js} +1 -1
  41. package/dist/gateway/static/root/assets/{extension-settings-page-DNd0tRFl.js → extension-settings-page-Dt-FWyMN.js} +1 -1
  42. package/dist/gateway/static/root/assets/{fetch-Bl7zMnmd.js → fetch-6HXXdO77.js} +1 -1
  43. package/dist/gateway/static/root/assets/{gateway-config-api-BiqKIkkp.js → gateway-config-api-CyYi-a3k.js} +1 -1
  44. package/dist/gateway/static/root/assets/{gateway-settings-D_Cvasqi.js → gateway-settings-yJvCmOBC.js} +1 -1
  45. package/dist/gateway/static/root/assets/{gateway-startup-retry-CPOgTcpv.js → gateway-startup-retry-BE1M9fH_.js} +1 -1
  46. package/dist/gateway/static/root/assets/goal-create-dialog-B3PLFUAl.js +1 -0
  47. package/dist/gateway/static/root/assets/{goal-detail-page-DF8QhTHH.js → goal-detail-page-BQXW29kk.js} +1 -1
  48. package/dist/gateway/static/root/assets/{goals-config-api-h26_-2Vm.js → goals-config-api-FU_bdYvR.js} +1 -1
  49. package/dist/gateway/static/root/assets/{goals-page-BzBKHZJg.js → goals-page-BmppU6mC.js} +1 -1
  50. package/dist/gateway/static/root/assets/{goals-settings-BFG1uTI8.js → goals-settings-BsXWV6CN.js} +1 -1
  51. package/dist/gateway/static/root/assets/heartbeat-settings-BqwSCZLD.js +1 -0
  52. package/dist/gateway/static/root/assets/index-DXUkWmeK.css +1 -0
  53. package/dist/gateway/static/root/assets/{index-DOetFpTt.js → index-DqFBdoK-.js} +41 -41
  54. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-Dpx1ovO6.js → keyboard-shortcuts-settings-D8J0hkTt.js} +1 -1
  55. package/dist/gateway/static/root/assets/{logs-page-3QO3elfx.js → logs-page-Cr5ptDtc.js} +1 -1
  56. package/dist/gateway/static/root/assets/{markdown-split-Ba4EsPkV.js → markdown-split-w-hIAZ9S.js} +1 -1
  57. package/dist/gateway/static/root/assets/{media-plugins-lA5rvtCq.js → media-plugins-DjFnDy3R.js} +1 -1
  58. package/dist/gateway/static/root/assets/{messages-Bq4REfIj.js → messages-DR9ODkb8.js} +2 -2
  59. package/dist/gateway/static/root/assets/{models-hub-panel-BBG87CHZ.js → models-hub-panel-DEsMnITi.js} +1 -1
  60. package/dist/gateway/static/root/assets/{notes-page-DrUGE-Hn.js → notes-page-D7bHXaeR.js} +1 -1
  61. package/dist/gateway/static/root/assets/{notes-workbench-eAIE8iKV.js → notes-workbench-DiuG4Ov7.js} +2 -2
  62. package/dist/gateway/static/root/assets/{page-tabs-Cy7bX7Ce.js → page-tabs-smjfSAwc.js} +1 -1
  63. package/dist/gateway/static/root/assets/{preview-open-alternatives-B9_iql49.js → preview-open-alternatives-v02THugE.js} +1 -1
  64. package/dist/gateway/static/root/assets/project-detail-page-Us3zDRE6.js +1 -0
  65. package/dist/gateway/static/root/assets/projects-page-BcvW8R0Z.js +1 -0
  66. package/dist/gateway/static/root/assets/{remote-access-hub-C29EWM0P.js → remote-access-hub-Bun2k0V-.js} +1 -1
  67. package/dist/gateway/static/root/assets/{save-bar-controls-nMloZ0mp.js → save-bar-controls-CD7LPbLU.js} +1 -1
  68. package/dist/gateway/static/root/assets/{schedule-field-BuajpVNF.js → schedule-field-Cf3p_M0z.js} +1 -1
  69. package/dist/gateway/static/root/assets/{schema-form-IeXV_yQk.js → schema-form-D8XdvcNH.js} +1 -1
  70. package/dist/gateway/static/root/assets/{sessions-page-DHHVDqsy.js → sessions-page-Bh44TVld.js} +1 -1
  71. package/dist/gateway/static/root/assets/settings-advanced-gate-BhyLZ0IW.js +1 -0
  72. package/dist/gateway/static/root/assets/{settings-collapsible-section-ByixWwvu.js → settings-collapsible-section-BVpPSgMs.js} +1 -1
  73. package/dist/gateway/static/root/assets/{settings-form-section-C-5-n-jM.js → settings-form-section-GAwBG9Vp.js} +1 -1
  74. package/dist/gateway/static/root/assets/{settings-loading-skeleton-CTA5Gje4.js → settings-loading-skeleton-CGxa3aCb.js} +1 -1
  75. package/dist/gateway/static/root/assets/{settings-page-DzqxeemF.js → settings-page-bZKl6uRR.js} +1 -1
  76. package/dist/gateway/static/root/assets/{settings-page-layout-DgFTf6nM.js → settings-page-layout-DfbMLJgN.js} +1 -1
  77. package/dist/gateway/static/root/assets/{setup-status-panel-svpHcJ62.js → setup-status-panel-DBIruh16.js} +1 -1
  78. package/dist/gateway/static/root/assets/{share-preview-page-IOjU69FC.js → share-preview-page-BglBMvA0.js} +1 -1
  79. package/dist/gateway/static/root/assets/shares-settings-C0fR-Oto.js +1 -0
  80. package/dist/gateway/static/root/assets/skill-reload-api-BG-FEo9B.js +1 -0
  81. package/dist/gateway/static/root/assets/{skills-page-DoonnYRs.js → skills-page-CwwZOoCH.js} +1 -1
  82. package/dist/gateway/static/root/assets/{system-settings-panel-BMDD7FXg.js → system-settings-panel-CTT0BkbS.js} +1 -1
  83. package/dist/gateway/static/root/assets/{typed-models-lib-DayamJ56.js → typed-models-lib-Fa9PjI0-.js} +1 -1
  84. package/dist/gateway/static/root/assets/{use-channel-catalog-ChYwFiqo.js → use-channel-catalog-BCBfSoHx.js} +1 -1
  85. package/dist/gateway/static/root/assets/{user-profile-settings-panel-Dd0X3mPv.js → user-profile-settings-panel-pCK-aMqu.js} +1 -1
  86. package/dist/gateway/static/root/assets/{utils-D9v9ZpK4.js → utils-aleluS3U.js} +1 -1
  87. package/dist/gateway/static/root/assets/{voice-api-key-field-QXGvjTwa.js → voice-api-key-field-Fh4mqUIK.js} +1 -1
  88. package/dist/gateway/static/root/assets/{work-item-detail-page-CP-5OUYI.js → work-item-detail-page-C0_3nId3.js} +1 -1
  89. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-IidqhbUI.js → workflow-run-setup-panel-r969H1r2.js} +1 -1
  90. package/dist/gateway/static/root/assets/{workflow-start-dialog-BQQkr8YD.js → workflow-start-dialog-C1GbcWN0.js} +1 -1
  91. package/dist/gateway/static/root/assets/{workflows-page-DtVIjVSX.js → workflows-page-DsPM3HEI.js} +1 -1
  92. package/dist/gateway/static/root/favicon-16x16.png +0 -0
  93. package/dist/gateway/static/root/favicon-32x32.png +0 -0
  94. package/dist/gateway/static/root/favicon-icon.svg +179 -15
  95. package/dist/gateway/static/root/favicon.ico +0 -0
  96. package/dist/gateway/static/root/favicon.png +0 -0
  97. package/dist/gateway/static/root/favicon.svg +179 -15
  98. package/dist/gateway/static/root/index.html +5 -5
  99. package/dist/gateway/static/root/logo-dark.svg +179 -15
  100. package/dist/gateway/static/root/logo.svg +179 -15
  101. package/dist/gateway/static/root/pwa-192x192.png +0 -0
  102. package/dist/gateway/static/root/pwa-512x512.png +0 -0
  103. package/dist/package.js +1 -1
  104. package/dist/src/agent/image/tool-model-config.js +5 -5
  105. package/dist/src/agent/image/tool-model-config.js.map +1 -1
  106. package/dist/src/agent/starter-agents.d.ts +1 -0
  107. package/dist/src/agent/starter-agents.js +38 -11
  108. package/dist/src/agent/starter-agents.js.map +1 -1
  109. package/dist/src/agent/transcript/thinking-types.js +2 -0
  110. package/dist/src/agent/transcript/thinking-types.js.map +1 -1
  111. package/dist/src/auth/oauth/google-oauth/google-gemini-cli.d.ts +1 -1
  112. package/dist/src/auth/oauth/google-oauth/google-gemini-cli.js.map +1 -1
  113. package/dist/src/chat-commands/builtins/model.js +3 -3
  114. package/dist/src/chat-commands/builtins/model.js.map +1 -1
  115. package/dist/src/cli/commands/models.js +9 -0
  116. package/dist/src/cli/commands/models.js.map +1 -1
  117. package/dist/src/commands/agents.config.d.ts +2 -0
  118. package/dist/src/commands/agents.config.js +1 -1
  119. package/dist/src/commands/agents.config.js.map +1 -1
  120. package/dist/src/config/schema.js +4 -2
  121. package/dist/src/config/schema.js.map +1 -1
  122. package/dist/src/gateway/hono/routes/status.js +2 -2
  123. package/dist/src/gateway/hono/routes/status.js.map +1 -1
  124. package/dist/src/gateway/hono/routes/voice.js +1 -1
  125. package/dist/src/gateway/hono/routes/voice.js.map +1 -1
  126. package/dist/src/providers/domestic-presets.d.ts +5 -15
  127. package/dist/src/providers/domestic-presets.js +31 -49
  128. package/dist/src/providers/domestic-presets.js.map +1 -1
  129. package/dist/src/providers/index.js +19 -5
  130. package/dist/src/providers/index.js.map +1 -1
  131. package/dist/src/providers/model-registry.js.map +1 -1
  132. package/dist/src/providers/model-supplements.d.ts +6 -0
  133. package/dist/src/providers/model-supplements.js +22 -0
  134. package/dist/src/providers/model-supplements.js.map +1 -0
  135. package/dist/src/providers/presentation.js +25 -26
  136. package/dist/src/providers/presentation.js.map +1 -1
  137. package/dist/src/voice/tts/summarize.js +1 -1
  138. package/dist/src/voice/tts/summarize.js.map +1 -1
  139. package/package.json +5 -5
  140. package/dist/gateway/static/root/assets/agents-kVsY4Iz_.js +0 -2
  141. package/dist/gateway/static/root/assets/automations-page-MZ8m4bYP.js +0 -4
  142. package/dist/gateway/static/root/assets/channels-settings-DOYzcMAE.js +0 -1
  143. package/dist/gateway/static/root/assets/dreaming-settings-BIkgLFDH.js +0 -3
  144. package/dist/gateway/static/root/assets/goal-create-dialog-DZ68qzpm.js +0 -1
  145. package/dist/gateway/static/root/assets/heartbeat-settings-5vV8vTva.js +0 -1
  146. package/dist/gateway/static/root/assets/index-W4ogAiHt.css +0 -1
  147. package/dist/gateway/static/root/assets/project-detail-page-Cwct6pCV.js +0 -1
  148. package/dist/gateway/static/root/assets/projects-page-BXZlzV8t.js +0 -1
  149. package/dist/gateway/static/root/assets/settings-advanced-gate-hDvmobsT.js +0 -1
  150. package/dist/gateway/static/root/assets/shares-settings-Ddg8gHPN.js +0 -1
  151. package/dist/gateway/static/root/assets/skill-reload-api-DcNOEJsK.js +0 -1
@@ -38,7 +38,7 @@ function resolveRefineModel(config) {
38
38
  if (envRef) try {
39
39
  return resolveModel(envRef);
40
40
  } catch {}
41
- for (const candidate of ["openai/gpt-4o-mini", "google/gemini-2.0-flash"]) try {
41
+ for (const candidate of ["openai/gpt-5.6-luna", "google/gemini-3.5-flash"]) try {
42
42
  return resolveModel(candidate);
43
43
  } catch {}
44
44
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"voice.js","names":[],"sources":["../../../../../src/gateway/hono/routes/voice.ts"],"sourcesContent":["/**\n * Voice routes — POST /api/voice/transcribe\n *\n * Single endpoint that:\n * 1. Runs STT (Whisper preferred for low latency, Alibaba fallback)\n * 2. Optionally runs LLM refine on the raw transcript\n * 3. Returns { raw, refined?, language }\n *\n * LLM refine is auto-applied when a model is resolvable; gracefully degrades\n * to raw-only when no LLM is configured.\n */\n\nimport type { Hono } from 'hono';\nimport { complete, type UserMessage } from '@earendil-works/pi-ai/compat';\n\nimport type { Config } from '../../../config/schema.js';\nimport { getDefaultModelSync, resolveModel } from '../../../providers/index.js';\nimport { isSTTAvailable, transcribe } from '../../../voice/stt/index.js';\nimport { isTTSAvailable, mergeTtsConfigFromAppConfig, speak } from '../../../voice/tts/index.js';\nimport { listTtsProvidersForApi } from '../../../voice/tts/list-providers.js';\nimport { listSttProvidersForApi } from '../../../voice/stt/list-providers.js';\nimport { mergeSttConfigFromAppConfig } from '../../../channels/attachments/voice-stt-webchat.js';\nimport { resolveSttProviderConfigSlice } from '../../../voice/stt/config-slice.js';\nimport { resolveTtsProviderConfigSlice } from '../../../voice/tts/config-slice.js';\nimport { createGatewayRouteLogger } from '../lib/route-logger.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nconst log = createGatewayRouteLogger('Voice');\n\nfunction readVoiceApiKeyFromConfigFileOnly(\n cfg: Config,\n kind: 'stt' | 'tts',\n providerId: string,\n): string | undefined {\n const id = providerId.trim();\n if (!id) return undefined;\n const slice =\n kind === 'stt'\n ? resolveSttProviderConfigSlice(id, cfg.tools?.media?.audio)\n : resolveTtsProviderConfigSlice(id, cfg.messages?.tts);\n const key = slice.apiKey;\n return typeof key === 'string' && key.trim() ? key.trim() : undefined;\n}\n\nconst REFINE_TIMEOUT_MS = 15_000;\nconst MAX_AUDIO_BYTES = 25 * 1024 * 1024; // 25 MB\n\nconst REFINE_SYSTEM_PROMPT = `你是语音转文字后处理助手。将语音转写原文整理为高质量文本输入。\n\n规则:\n1. 修正明显的语音识别错误\n2. 添加正确的标点符号\n3. 去除口语赘词(嗯、啊、那个、就是说、然后就是)\n4. 保持原意不变,不要扩写或改变语义\n5. 如果原文已经很好,原样输出\n6. 只输出整理后的文字,不要解释`;\n\nfunction resolveRefineModel(config: Config | undefined): ReturnType<typeof resolveModel> | null {\n const envRef = process.env.XOPC_VOICE_REFINE_MODEL?.trim();\n if (envRef) {\n try {\n return resolveModel(envRef);\n } catch { /* fall through */ }\n }\n for (const candidate of ['openai/gpt-4o-mini', 'google/gemini-2.0-flash']) {\n try {\n return resolveModel(candidate);\n } catch { /* next */ }\n }\n try {\n return resolveModel(getDefaultModelSync(config));\n } catch {\n return null;\n }\n}\n\nasync function refineTranscript(\n raw: string,\n config: Config | undefined,\n signal?: AbortSignal,\n): Promise<string | undefined> {\n if (!raw.trim()) return undefined;\n\n const model = resolveRefineModel(config);\n if (!model) {\n log.debug('No LLM model available for voice refine; returning raw only');\n return undefined;\n }\n\n try {\n const userMsg: UserMessage = {\n role: 'user',\n content: `${REFINE_SYSTEM_PROMPT}\\n\\n原文:${raw}`,\n timestamp: Date.now(),\n };\n\n const timeoutSignal =\n typeof AbortSignal !== 'undefined' && typeof AbortSignal.timeout === 'function'\n ? AbortSignal.timeout(REFINE_TIMEOUT_MS)\n : undefined;\n const mergedSignal =\n signal && timeoutSignal && typeof AbortSignal.any === 'function'\n ? AbortSignal.any([signal, timeoutSignal])\n : signal ?? timeoutSignal;\n\n const result = await complete(\n model,\n { messages: [userMsg] },\n {\n maxTokens: Math.min(raw.length * 3, 4096),\n temperature: 0.2,\n signal: mergedSignal as AbortSignal,\n },\n );\n\n let out = '';\n if (Array.isArray(result.content)) {\n for (const c of result.content) {\n if (c && typeof c === 'object' && (c as { type?: string }).type === 'text') {\n out += String((c as { text?: string }).text || '');\n }\n }\n }\n\n const refined = out.trim();\n if (!refined || refined === raw.trim()) return undefined;\n return refined;\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n log.warn({ errorMessage: msg }, 'Voice refine failed; returning raw only');\n return undefined;\n }\n}\n\nexport function registerVoiceRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service, strictRateLimitMiddleware } = deps;\n\n /**\n * GET /api/voice/providers\n *\n * Lists registered SpeechProviderPlugin ids with configured state for the\n * current gateway config (OpenClaw `tts.providers` equivalent).\n */\n authenticated.get('/api/voice/providers', (c) => {\n const config = service.currentConfig as Config;\n const payload = listTtsProvidersForApi(config);\n return c.json({ ok: true, payload });\n });\n\n /**\n * GET /api/voice/stt-providers\n *\n * Lists registered MediaUnderstandingProvider ids with configured state for\n * the current gateway config (OpenClaw `tools.media.audio.providers` equivalent).\n */\n authenticated.get('/api/voice/stt-providers', (c) => {\n const config = service.currentConfig as Config;\n const payload = listSttProvidersForApi(config);\n return c.json({ ok: true, payload });\n });\n\n /**\n * POST /api/voice/reveal-api-key — return plaintext voice provider apiKey from config file only.\n * Body: `{ kind: 'stt' | 'tts', provider: string }`\n */\n authenticated.post('/api/voice/reveal-api-key', strictRateLimitMiddleware, async (c) => {\n let body: { kind?: unknown; provider?: unknown } = {};\n try {\n body = (await c.req.json()) as typeof body;\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid JSON body' } }, 400);\n }\n const kind = body.kind === 'stt' || body.kind === 'tts' ? body.kind : null;\n const provider = typeof body.provider === 'string' ? body.provider.trim() : '';\n if (!kind) {\n return c.json({ ok: false, error: { message: 'kind must be \"stt\" or \"tts\"' } }, 400);\n }\n if (!provider) {\n return c.json({ ok: false, error: { message: 'provider is required' } }, 400);\n }\n\n const cfg = service.currentConfig as Config;\n const apiKey = readVoiceApiKeyFromConfigFileOnly(cfg, kind, provider);\n return c.json({\n ok: true,\n payload: {\n kind,\n provider,\n apiKey: apiKey ?? null,\n source: apiKey ? ('config' as const) : ('none' as const),\n },\n });\n });\n\n /**\n * POST /api/voice/tts-test\n *\n * Body: { text: string, provider?: string, model?: string, voice?: string }\n * Response: { ok: true, payload: { audio: string, format: string, provider: string } }\n */\n authenticated.post('/api/voice/tts-test', strictRateLimitMiddleware, async (c) => {\n let body: { text?: unknown; provider?: unknown; model?: unknown; voice?: unknown; providerConfig?: unknown } = {};\n try {\n body = (await c.req.json()) as typeof body;\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid JSON body' } }, 400);\n }\n\n const text = typeof body.text === 'string' ? body.text.trim() : '';\n if (!text) {\n return c.json({ ok: false, error: { message: 'text is required' } }, 400);\n }\n if (text.length > 1000) {\n return c.json({ ok: false, error: { message: 'text exceeds 1000 characters' } }, 400);\n }\n\n const config = service.currentConfig as Config;\n const baseTtsConfig = mergeTtsConfigFromAppConfig(config.messages?.tts);\n const provider = typeof body.provider === 'string' && body.provider.trim() ? body.provider.trim() : baseTtsConfig.provider;\n const providerConfig =\n body.providerConfig && typeof body.providerConfig === 'object' && !Array.isArray(body.providerConfig)\n ? (body.providerConfig as Record<string, unknown>)\n : undefined;\n const ttsConfig = {\n ...baseTtsConfig,\n enabled: true,\n provider,\n providers: {\n ...(baseTtsConfig.providers ?? {}),\n ...(providerConfig ? { [provider]: { ...(baseTtsConfig.providers?.[provider] ?? {}), ...providerConfig } } : {}),\n },\n fallback: { enabled: false, order: [provider] },\n };\n\n if (!isTTSAvailable(ttsConfig)) {\n return c.json({\n ok: false,\n error: { message: `TTS provider \"${provider}\" is not configured.` },\n }, 503);\n }\n\n try {\n const startedAt = Date.now();\n const result = await speak(text, ttsConfig, {\n appConfig: config,\n parseDirectives: false,\n tts: {\n ...(typeof body.model === 'string' && body.model.trim() ? { model: body.model.trim() } : {}),\n ...(typeof body.voice === 'string' && body.voice.trim() ? { voice: body.voice.trim() } : {}),\n },\n });\n if (!result.audio.length) {\n throw new Error(`TTS provider \"${result.provider}\" returned empty audio`);\n }\n const mimeType =\n result.format === 'opus' || result.format === 'ogg'\n ? 'audio/ogg'\n : result.format === 'mp3' || result.format === 'mpeg'\n ? 'audio/mpeg'\n : result.format === 'wav'\n ? 'audio/wav'\n : `audio/${result.format}`;\n return c.json({\n ok: true,\n payload: {\n audio: result.audio.toString('base64'),\n mimeType,\n format: result.format,\n provider: result.provider,\n latencyMs: Date.now() - startedAt,\n audioSize: result.audio.length,\n },\n });\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n log.error({ errorMessage: msg, provider }, 'Voice TTS test failed');\n return c.json({ ok: false, error: { message: `TTS test failed: ${msg}` } }, 502);\n }\n });\n\n /**\n * POST /api/voice/transcribe\n *\n * Body: { audio: string (base64), mimeType: string, language?: string }\n * Response: { ok: true, payload: { raw: string, refined?: string, language?: string } }\n */\n authenticated.post('/api/voice/transcribe', async (c) => {\n let body: { audio?: string; mimeType?: string; language?: string } = {};\n try {\n body = (await c.req.json()) as typeof body;\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid JSON body' } }, 400);\n }\n\n const { audio, mimeType, language } = body;\n if (!audio || typeof audio !== 'string') {\n return c.json({ ok: false, error: { message: 'Missing required field: audio (base64)' } }, 400);\n }\n if (!mimeType || typeof mimeType !== 'string') {\n return c.json({ ok: false, error: { message: 'Missing required field: mimeType' } }, 400);\n }\n\n // Decode base64 audio\n let audioBuffer: Buffer;\n try {\n audioBuffer = Buffer.from(audio, 'base64');\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid base64 audio data' } }, 400);\n }\n\n if (audioBuffer.length === 0) {\n return c.json({ ok: false, error: { message: 'Empty audio data' } }, 400);\n }\n if (audioBuffer.length > MAX_AUDIO_BYTES) {\n return c.json({ ok: false, error: { message: 'Audio data exceeds 25 MB limit' } }, 400);\n }\n\n // Resolve STT config from app config\n const config = service.currentConfig as Config;\n const sttConfigRaw = config.tools?.media?.audio;\n const sttConfig = mergeSttConfigFromAppConfig(sttConfigRaw, config.tools?.media);\n\n if (!isSTTAvailable(sttConfig)) {\n return c.json({\n ok: false,\n error: { message: 'STT is not configured. Enable STT in gateway config (tools.media.audio).' },\n }, 503);\n }\n\n // Run STT\n let raw: string;\n let detectedLanguage: string | undefined;\n try {\n const result = await transcribe(audioBuffer, sttConfig, {\n language: language || (sttConfig.provider === 'alibaba' ? 'zh' : undefined),\n });\n raw = result.text;\n detectedLanguage = result.language ?? language;\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n log.error({ errorMessage: msg }, 'Voice transcription failed');\n return c.json({ ok: false, error: { message: `Transcription failed: ${msg}` } }, 502);\n }\n\n if (!raw.trim()) {\n return c.json({\n ok: true,\n payload: { raw: '', language: detectedLanguage },\n });\n }\n\n // Run LLM refine (auto, best-effort)\n const refined = await refineTranscript(raw, config);\n\n return c.json({\n ok: true,\n payload: {\n raw,\n ...(refined ? { refined } : {}),\n ...(detectedLanguage ? { language: detectedLanguage } : {}),\n },\n });\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;gBAgBgF;AAWhF,MAAM,MAAM,yBAAyB,QAAQ;AAE7C,SAAS,kCACP,KACA,MACA,YACoB;CACpB,MAAM,KAAK,WAAW,MAAM;AAC5B,KAAI,CAAC,GAAI,QAAO,KAAA;CAKhB,MAAM,OAHJ,SAAS,QACL,8BAA8B,IAAI,IAAI,OAAO,OAAO,MAAM,GAC1D,8BAA8B,IAAI,IAAI,UAAU,IAAI,EACxC;AAClB,QAAO,OAAO,QAAQ,YAAY,IAAI,MAAM,GAAG,IAAI,MAAM,GAAG,KAAA;;AAG9D,MAAM,oBAAoB;AAC1B,MAAM,kBAAkB,KAAK,OAAO;AAEpC,MAAM,uBAAuB;;;;;;;;;AAU7B,SAAS,mBAAmB,QAAoE;CAC9F,MAAM,SAAS,QAAQ,IAAI,yBAAyB,MAAM;AAC1D,KAAI,OACF,KAAI;AACF,SAAO,aAAa,OAAO;SACrB;AAEV,MAAK,MAAM,aAAa,CAAC,sBAAsB,0BAA0B,CACvE,KAAI;AACF,SAAO,aAAa,UAAU;SACxB;AAEV,KAAI;AACF,SAAO,aAAa,oBAAoB,OAAO,CAAC;SAC1C;AACN,SAAO;;;AAIX,eAAe,iBACb,KACA,QACA,QAC6B;AAC7B,KAAI,CAAC,IAAI,MAAM,CAAE,QAAO,KAAA;CAExB,MAAM,QAAQ,mBAAmB,OAAO;AACxC,KAAI,CAAC,OAAO;AACV,MAAI,MAAM,8DAA8D;AACxE;;AAGF,KAAI;EACF,MAAM,UAAuB;GAC3B,MAAM;GACN,SAAS,GAAG,qBAAqB,SAAS;GAC1C,WAAW,KAAK,KAAK;GACtB;EAED,MAAM,gBACJ,OAAO,gBAAgB,eAAe,OAAO,YAAY,YAAY,aACjE,YAAY,QAAQ,kBAAkB,GACtC,KAAA;EACN,MAAM,eACJ,UAAU,iBAAiB,OAAO,YAAY,QAAQ,aAClD,YAAY,IAAI,CAAC,QAAQ,cAAc,CAAC,GACxC,UAAU;EAEhB,MAAM,SAAS,MAAM,SACnB,OACA,EAAE,UAAU,CAAC,QAAQ,EAAE,EACvB;GACE,WAAW,KAAK,IAAI,IAAI,SAAS,GAAG,KAAK;GACzC,aAAa;GACb,QAAQ;GACT,CACF;EAED,IAAI,MAAM;AACV,MAAI,MAAM,QAAQ,OAAO,QAAQ;QAC1B,MAAM,KAAK,OAAO,QACrB,KAAI,KAAK,OAAO,MAAM,YAAa,EAAwB,SAAS,OAClE,QAAO,OAAQ,EAAwB,QAAQ,GAAG;;EAKxD,MAAM,UAAU,IAAI,MAAM;AAC1B,MAAI,CAAC,WAAW,YAAY,IAAI,MAAM,CAAE,QAAO,KAAA;AAC/C,SAAO;UACA,OAAO;EACd,MAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AAClE,MAAI,KAAK,EAAE,cAAc,KAAK,EAAE,0CAA0C;AAC1E;;;AAIJ,SAAgB,oBAAoB,eAAqB,MAAoC;CAC3F,MAAM,EAAE,SAAS,8BAA8B;;;;;;;AAQ/C,eAAc,IAAI,yBAAyB,MAAM;EAC/C,MAAM,SAAS,QAAQ;EACvB,MAAM,UAAU,uBAAuB,OAAO;AAC9C,SAAO,EAAE,KAAK;GAAE,IAAI;GAAM;GAAS,CAAC;GACpC;;;;;;;AAQF,eAAc,IAAI,6BAA6B,MAAM;EACnD,MAAM,SAAS,QAAQ;EACvB,MAAM,UAAU,uBAAuB,OAAO;AAC9C,SAAO,EAAE,KAAK;GAAE,IAAI;GAAM;GAAS,CAAC;GACpC;;;;;AAMF,eAAc,KAAK,6BAA6B,2BAA2B,OAAO,MAAM;EACtF,IAAI,OAA+C,EAAE;AACrD,MAAI;AACF,UAAQ,MAAM,EAAE,IAAI,MAAM;UACpB;AACN,UAAO,EAAE,KAAK;IAAE,IAAI;IAAO,OAAO,EAAE,SAAS,qBAAqB;IAAE,EAAE,IAAI;;EAE5E,MAAM,OAAO,KAAK,SAAS,SAAS,KAAK,SAAS,QAAQ,KAAK,OAAO;EACtE,MAAM,WAAW,OAAO,KAAK,aAAa,WAAW,KAAK,SAAS,MAAM,GAAG;AAC5E,MAAI,CAAC,KACH,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,EAAE,SAAS,mCAA+B;GAAE,EAAE,IAAI;AAEtF,MAAI,CAAC,SACH,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,EAAE,SAAS,wBAAwB;GAAE,EAAE,IAAI;EAG/E,MAAM,MAAM,QAAQ;EACpB,MAAM,SAAS,kCAAkC,KAAK,MAAM,SAAS;AACrE,SAAO,EAAE,KAAK;GACZ,IAAI;GACJ,SAAS;IACP;IACA;IACA,QAAQ,UAAU;IAClB,QAAQ,SAAU,WAAsB;IACzC;GACF,CAAC;GACF;;;;;;;AAQF,eAAc,KAAK,uBAAuB,2BAA2B,OAAO,MAAM;EAChF,IAAI,OAA2G,EAAE;AACjH,MAAI;AACF,UAAQ,MAAM,EAAE,IAAI,MAAM;UACpB;AACN,UAAO,EAAE,KAAK;IAAE,IAAI;IAAO,OAAO,EAAE,SAAS,qBAAqB;IAAE,EAAE,IAAI;;EAG5E,MAAM,OAAO,OAAO,KAAK,SAAS,WAAW,KAAK,KAAK,MAAM,GAAG;AAChE,MAAI,CAAC,KACH,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,EAAE,SAAS,oBAAoB;GAAE,EAAE,IAAI;AAE3E,MAAI,KAAK,SAAS,IAChB,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,EAAE,SAAS,gCAAgC;GAAE,EAAE,IAAI;EAGvF,MAAM,SAAS,QAAQ;EACvB,MAAM,gBAAgB,4BAA4B,OAAO,UAAU,IAAI;EACvE,MAAM,WAAW,OAAO,KAAK,aAAa,YAAY,KAAK,SAAS,MAAM,GAAG,KAAK,SAAS,MAAM,GAAG,cAAc;EAClH,MAAM,iBACJ,KAAK,kBAAkB,OAAO,KAAK,mBAAmB,YAAY,CAAC,MAAM,QAAQ,KAAK,eAAe,GAChG,KAAK,iBACN,KAAA;EACN,MAAM,YAAY;GAChB,GAAG;GACH,SAAS;GACT;GACA,WAAW;IACT,GAAI,cAAc,aAAa,EAAE;IACjC,GAAI,iBAAiB,GAAG,WAAW;KAAE,GAAI,cAAc,YAAY,aAAa,EAAE;KAAG,GAAG;KAAgB,EAAE,GAAG,EAAE;IAChH;GACD,UAAU;IAAE,SAAS;IAAO,OAAO,CAAC,SAAS;IAAE;GAChD;AAED,MAAI,CAAC,eAAe,UAAU,CAC5B,QAAO,EAAE,KAAK;GACZ,IAAI;GACJ,OAAO,EAAE,SAAS,iBAAiB,SAAS,uBAAuB;GACpE,EAAE,IAAI;AAGT,MAAI;GACF,MAAM,YAAY,KAAK,KAAK;GAC5B,MAAM,SAAS,MAAM,MAAM,MAAM,WAAW;IAC1C,WAAW;IACX,iBAAiB;IACjB,KAAK;KACH,GAAI,OAAO,KAAK,UAAU,YAAY,KAAK,MAAM,MAAM,GAAG,EAAE,OAAO,KAAK,MAAM,MAAM,EAAE,GAAG,EAAE;KAC3F,GAAI,OAAO,KAAK,UAAU,YAAY,KAAK,MAAM,MAAM,GAAG,EAAE,OAAO,KAAK,MAAM,MAAM,EAAE,GAAG,EAAE;KAC5F;IACF,CAAC;AACF,OAAI,CAAC,OAAO,MAAM,OAChB,OAAM,IAAI,MAAM,iBAAiB,OAAO,SAAS,wBAAwB;GAE3E,MAAM,WACJ,OAAO,WAAW,UAAU,OAAO,WAAW,QAC1C,cACA,OAAO,WAAW,SAAS,OAAO,WAAW,SAC3C,eACA,OAAO,WAAW,QAChB,cACA,SAAS,OAAO;AAC1B,UAAO,EAAE,KAAK;IACZ,IAAI;IACJ,SAAS;KACP,OAAO,OAAO,MAAM,SAAS,SAAS;KACtC;KACA,QAAQ,OAAO;KACf,UAAU,OAAO;KACjB,WAAW,KAAK,KAAK,GAAG;KACxB,WAAW,OAAO,MAAM;KACzB;IACF,CAAC;WACK,OAAO;GACd,MAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AAClE,OAAI,MAAM;IAAE,cAAc;IAAK;IAAU,EAAE,wBAAwB;AACnE,UAAO,EAAE,KAAK;IAAE,IAAI;IAAO,OAAO,EAAE,SAAS,oBAAoB,OAAO;IAAE,EAAE,IAAI;;GAElF;;;;;;;AAQF,eAAc,KAAK,yBAAyB,OAAO,MAAM;EACvD,IAAI,OAAiE,EAAE;AACvE,MAAI;AACF,UAAQ,MAAM,EAAE,IAAI,MAAM;UACpB;AACN,UAAO,EAAE,KAAK;IAAE,IAAI;IAAO,OAAO,EAAE,SAAS,qBAAqB;IAAE,EAAE,IAAI;;EAG5E,MAAM,EAAE,OAAO,UAAU,aAAa;AACtC,MAAI,CAAC,SAAS,OAAO,UAAU,SAC7B,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,EAAE,SAAS,0CAA0C;GAAE,EAAE,IAAI;AAEjG,MAAI,CAAC,YAAY,OAAO,aAAa,SACnC,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,EAAE,SAAS,oCAAoC;GAAE,EAAE,IAAI;EAI3F,IAAI;AACJ,MAAI;AACF,iBAAc,OAAO,KAAK,OAAO,SAAS;UACpC;AACN,UAAO,EAAE,KAAK;IAAE,IAAI;IAAO,OAAO,EAAE,SAAS,6BAA6B;IAAE,EAAE,IAAI;;AAGpF,MAAI,YAAY,WAAW,EACzB,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,EAAE,SAAS,oBAAoB;GAAE,EAAE,IAAI;AAE3E,MAAI,YAAY,SAAS,gBACvB,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,EAAE,SAAS,kCAAkC;GAAE,EAAE,IAAI;EAIzF,MAAM,SAAS,QAAQ;EACvB,MAAM,eAAe,OAAO,OAAO,OAAO;EAC1C,MAAM,YAAY,4BAA4B,cAAc,OAAO,OAAO,MAAM;AAEhF,MAAI,CAAC,eAAe,UAAU,CAC5B,QAAO,EAAE,KAAK;GACZ,IAAI;GACJ,OAAO,EAAE,SAAS,4EAA4E;GAC/F,EAAE,IAAI;EAIT,IAAI;EACJ,IAAI;AACJ,MAAI;GACF,MAAM,SAAS,MAAM,WAAW,aAAa,WAAW,EACtD,UAAU,aAAa,UAAU,aAAa,YAAY,OAAO,KAAA,IAClE,CAAC;AACF,SAAM,OAAO;AACb,sBAAmB,OAAO,YAAY;WAC/B,OAAO;GACd,MAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AAClE,OAAI,MAAM,EAAE,cAAc,KAAK,EAAE,6BAA6B;AAC9D,UAAO,EAAE,KAAK;IAAE,IAAI;IAAO,OAAO,EAAE,SAAS,yBAAyB,OAAO;IAAE,EAAE,IAAI;;AAGvF,MAAI,CAAC,IAAI,MAAM,CACb,QAAO,EAAE,KAAK;GACZ,IAAI;GACJ,SAAS;IAAE,KAAK;IAAI,UAAU;IAAkB;GACjD,CAAC;EAIJ,MAAM,UAAU,MAAM,iBAAiB,KAAK,OAAO;AAEnD,SAAO,EAAE,KAAK;GACZ,IAAI;GACJ,SAAS;IACP;IACA,GAAI,UAAU,EAAE,SAAS,GAAG,EAAE;IAC9B,GAAI,mBAAmB,EAAE,UAAU,kBAAkB,GAAG,EAAE;IAC3D;GACF,CAAC;GACF"}
1
+ {"version":3,"file":"voice.js","names":[],"sources":["../../../../../src/gateway/hono/routes/voice.ts"],"sourcesContent":["/**\n * Voice routes — POST /api/voice/transcribe\n *\n * Single endpoint that:\n * 1. Runs STT (Whisper preferred for low latency, Alibaba fallback)\n * 2. Optionally runs LLM refine on the raw transcript\n * 3. Returns { raw, refined?, language }\n *\n * LLM refine is auto-applied when a model is resolvable; gracefully degrades\n * to raw-only when no LLM is configured.\n */\n\nimport type { Hono } from 'hono';\nimport { complete, type UserMessage } from '@earendil-works/pi-ai/compat';\n\nimport type { Config } from '../../../config/schema.js';\nimport { getDefaultModelSync, resolveModel } from '../../../providers/index.js';\nimport { isSTTAvailable, transcribe } from '../../../voice/stt/index.js';\nimport { isTTSAvailable, mergeTtsConfigFromAppConfig, speak } from '../../../voice/tts/index.js';\nimport { listTtsProvidersForApi } from '../../../voice/tts/list-providers.js';\nimport { listSttProvidersForApi } from '../../../voice/stt/list-providers.js';\nimport { mergeSttConfigFromAppConfig } from '../../../channels/attachments/voice-stt-webchat.js';\nimport { resolveSttProviderConfigSlice } from '../../../voice/stt/config-slice.js';\nimport { resolveTtsProviderConfigSlice } from '../../../voice/tts/config-slice.js';\nimport { createGatewayRouteLogger } from '../lib/route-logger.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nconst log = createGatewayRouteLogger('Voice');\n\nfunction readVoiceApiKeyFromConfigFileOnly(\n cfg: Config,\n kind: 'stt' | 'tts',\n providerId: string,\n): string | undefined {\n const id = providerId.trim();\n if (!id) return undefined;\n const slice =\n kind === 'stt'\n ? resolveSttProviderConfigSlice(id, cfg.tools?.media?.audio)\n : resolveTtsProviderConfigSlice(id, cfg.messages?.tts);\n const key = slice.apiKey;\n return typeof key === 'string' && key.trim() ? key.trim() : undefined;\n}\n\nconst REFINE_TIMEOUT_MS = 15_000;\nconst MAX_AUDIO_BYTES = 25 * 1024 * 1024; // 25 MB\n\nconst REFINE_SYSTEM_PROMPT = `你是语音转文字后处理助手。将语音转写原文整理为高质量文本输入。\n\n规则:\n1. 修正明显的语音识别错误\n2. 添加正确的标点符号\n3. 去除口语赘词(嗯、啊、那个、就是说、然后就是)\n4. 保持原意不变,不要扩写或改变语义\n5. 如果原文已经很好,原样输出\n6. 只输出整理后的文字,不要解释`;\n\nfunction resolveRefineModel(config: Config | undefined): ReturnType<typeof resolveModel> | null {\n const envRef = process.env.XOPC_VOICE_REFINE_MODEL?.trim();\n if (envRef) {\n try {\n return resolveModel(envRef);\n } catch { /* fall through */ }\n }\n for (const candidate of ['openai/gpt-5.6-luna', 'google/gemini-3.5-flash']) {\n try {\n return resolveModel(candidate);\n } catch { /* next */ }\n }\n try {\n return resolveModel(getDefaultModelSync(config));\n } catch {\n return null;\n }\n}\n\nasync function refineTranscript(\n raw: string,\n config: Config | undefined,\n signal?: AbortSignal,\n): Promise<string | undefined> {\n if (!raw.trim()) return undefined;\n\n const model = resolveRefineModel(config);\n if (!model) {\n log.debug('No LLM model available for voice refine; returning raw only');\n return undefined;\n }\n\n try {\n const userMsg: UserMessage = {\n role: 'user',\n content: `${REFINE_SYSTEM_PROMPT}\\n\\n原文:${raw}`,\n timestamp: Date.now(),\n };\n\n const timeoutSignal =\n typeof AbortSignal !== 'undefined' && typeof AbortSignal.timeout === 'function'\n ? AbortSignal.timeout(REFINE_TIMEOUT_MS)\n : undefined;\n const mergedSignal =\n signal && timeoutSignal && typeof AbortSignal.any === 'function'\n ? AbortSignal.any([signal, timeoutSignal])\n : signal ?? timeoutSignal;\n\n const result = await complete(\n model,\n { messages: [userMsg] },\n {\n maxTokens: Math.min(raw.length * 3, 4096),\n temperature: 0.2,\n signal: mergedSignal as AbortSignal,\n },\n );\n\n let out = '';\n if (Array.isArray(result.content)) {\n for (const c of result.content) {\n if (c && typeof c === 'object' && (c as { type?: string }).type === 'text') {\n out += String((c as { text?: string }).text || '');\n }\n }\n }\n\n const refined = out.trim();\n if (!refined || refined === raw.trim()) return undefined;\n return refined;\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n log.warn({ errorMessage: msg }, 'Voice refine failed; returning raw only');\n return undefined;\n }\n}\n\nexport function registerVoiceRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service, strictRateLimitMiddleware } = deps;\n\n /**\n * GET /api/voice/providers\n *\n * Lists registered SpeechProviderPlugin ids with configured state for the\n * current gateway config (OpenClaw `tts.providers` equivalent).\n */\n authenticated.get('/api/voice/providers', (c) => {\n const config = service.currentConfig as Config;\n const payload = listTtsProvidersForApi(config);\n return c.json({ ok: true, payload });\n });\n\n /**\n * GET /api/voice/stt-providers\n *\n * Lists registered MediaUnderstandingProvider ids with configured state for\n * the current gateway config (OpenClaw `tools.media.audio.providers` equivalent).\n */\n authenticated.get('/api/voice/stt-providers', (c) => {\n const config = service.currentConfig as Config;\n const payload = listSttProvidersForApi(config);\n return c.json({ ok: true, payload });\n });\n\n /**\n * POST /api/voice/reveal-api-key — return plaintext voice provider apiKey from config file only.\n * Body: `{ kind: 'stt' | 'tts', provider: string }`\n */\n authenticated.post('/api/voice/reveal-api-key', strictRateLimitMiddleware, async (c) => {\n let body: { kind?: unknown; provider?: unknown } = {};\n try {\n body = (await c.req.json()) as typeof body;\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid JSON body' } }, 400);\n }\n const kind = body.kind === 'stt' || body.kind === 'tts' ? body.kind : null;\n const provider = typeof body.provider === 'string' ? body.provider.trim() : '';\n if (!kind) {\n return c.json({ ok: false, error: { message: 'kind must be \"stt\" or \"tts\"' } }, 400);\n }\n if (!provider) {\n return c.json({ ok: false, error: { message: 'provider is required' } }, 400);\n }\n\n const cfg = service.currentConfig as Config;\n const apiKey = readVoiceApiKeyFromConfigFileOnly(cfg, kind, provider);\n return c.json({\n ok: true,\n payload: {\n kind,\n provider,\n apiKey: apiKey ?? null,\n source: apiKey ? ('config' as const) : ('none' as const),\n },\n });\n });\n\n /**\n * POST /api/voice/tts-test\n *\n * Body: { text: string, provider?: string, model?: string, voice?: string }\n * Response: { ok: true, payload: { audio: string, format: string, provider: string } }\n */\n authenticated.post('/api/voice/tts-test', strictRateLimitMiddleware, async (c) => {\n let body: { text?: unknown; provider?: unknown; model?: unknown; voice?: unknown; providerConfig?: unknown } = {};\n try {\n body = (await c.req.json()) as typeof body;\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid JSON body' } }, 400);\n }\n\n const text = typeof body.text === 'string' ? body.text.trim() : '';\n if (!text) {\n return c.json({ ok: false, error: { message: 'text is required' } }, 400);\n }\n if (text.length > 1000) {\n return c.json({ ok: false, error: { message: 'text exceeds 1000 characters' } }, 400);\n }\n\n const config = service.currentConfig as Config;\n const baseTtsConfig = mergeTtsConfigFromAppConfig(config.messages?.tts);\n const provider = typeof body.provider === 'string' && body.provider.trim() ? body.provider.trim() : baseTtsConfig.provider;\n const providerConfig =\n body.providerConfig && typeof body.providerConfig === 'object' && !Array.isArray(body.providerConfig)\n ? (body.providerConfig as Record<string, unknown>)\n : undefined;\n const ttsConfig = {\n ...baseTtsConfig,\n enabled: true,\n provider,\n providers: {\n ...(baseTtsConfig.providers ?? {}),\n ...(providerConfig ? { [provider]: { ...(baseTtsConfig.providers?.[provider] ?? {}), ...providerConfig } } : {}),\n },\n fallback: { enabled: false, order: [provider] },\n };\n\n if (!isTTSAvailable(ttsConfig)) {\n return c.json({\n ok: false,\n error: { message: `TTS provider \"${provider}\" is not configured.` },\n }, 503);\n }\n\n try {\n const startedAt = Date.now();\n const result = await speak(text, ttsConfig, {\n appConfig: config,\n parseDirectives: false,\n tts: {\n ...(typeof body.model === 'string' && body.model.trim() ? { model: body.model.trim() } : {}),\n ...(typeof body.voice === 'string' && body.voice.trim() ? { voice: body.voice.trim() } : {}),\n },\n });\n if (!result.audio.length) {\n throw new Error(`TTS provider \"${result.provider}\" returned empty audio`);\n }\n const mimeType =\n result.format === 'opus' || result.format === 'ogg'\n ? 'audio/ogg'\n : result.format === 'mp3' || result.format === 'mpeg'\n ? 'audio/mpeg'\n : result.format === 'wav'\n ? 'audio/wav'\n : `audio/${result.format}`;\n return c.json({\n ok: true,\n payload: {\n audio: result.audio.toString('base64'),\n mimeType,\n format: result.format,\n provider: result.provider,\n latencyMs: Date.now() - startedAt,\n audioSize: result.audio.length,\n },\n });\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n log.error({ errorMessage: msg, provider }, 'Voice TTS test failed');\n return c.json({ ok: false, error: { message: `TTS test failed: ${msg}` } }, 502);\n }\n });\n\n /**\n * POST /api/voice/transcribe\n *\n * Body: { audio: string (base64), mimeType: string, language?: string }\n * Response: { ok: true, payload: { raw: string, refined?: string, language?: string } }\n */\n authenticated.post('/api/voice/transcribe', async (c) => {\n let body: { audio?: string; mimeType?: string; language?: string } = {};\n try {\n body = (await c.req.json()) as typeof body;\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid JSON body' } }, 400);\n }\n\n const { audio, mimeType, language } = body;\n if (!audio || typeof audio !== 'string') {\n return c.json({ ok: false, error: { message: 'Missing required field: audio (base64)' } }, 400);\n }\n if (!mimeType || typeof mimeType !== 'string') {\n return c.json({ ok: false, error: { message: 'Missing required field: mimeType' } }, 400);\n }\n\n // Decode base64 audio\n let audioBuffer: Buffer;\n try {\n audioBuffer = Buffer.from(audio, 'base64');\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid base64 audio data' } }, 400);\n }\n\n if (audioBuffer.length === 0) {\n return c.json({ ok: false, error: { message: 'Empty audio data' } }, 400);\n }\n if (audioBuffer.length > MAX_AUDIO_BYTES) {\n return c.json({ ok: false, error: { message: 'Audio data exceeds 25 MB limit' } }, 400);\n }\n\n // Resolve STT config from app config\n const config = service.currentConfig as Config;\n const sttConfigRaw = config.tools?.media?.audio;\n const sttConfig = mergeSttConfigFromAppConfig(sttConfigRaw, config.tools?.media);\n\n if (!isSTTAvailable(sttConfig)) {\n return c.json({\n ok: false,\n error: { message: 'STT is not configured. Enable STT in gateway config (tools.media.audio).' },\n }, 503);\n }\n\n // Run STT\n let raw: string;\n let detectedLanguage: string | undefined;\n try {\n const result = await transcribe(audioBuffer, sttConfig, {\n language: language || (sttConfig.provider === 'alibaba' ? 'zh' : undefined),\n });\n raw = result.text;\n detectedLanguage = result.language ?? language;\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n log.error({ errorMessage: msg }, 'Voice transcription failed');\n return c.json({ ok: false, error: { message: `Transcription failed: ${msg}` } }, 502);\n }\n\n if (!raw.trim()) {\n return c.json({\n ok: true,\n payload: { raw: '', language: detectedLanguage },\n });\n }\n\n // Run LLM refine (auto, best-effort)\n const refined = await refineTranscript(raw, config);\n\n return c.json({\n ok: true,\n payload: {\n raw,\n ...(refined ? { refined } : {}),\n ...(detectedLanguage ? { language: detectedLanguage } : {}),\n },\n });\n });\n}\n"],"mappings":"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"}
@@ -236,11 +236,6 @@ export declare const DOMESTIC_PROVIDER_PRESETS: readonly [{
236
236
  readonly name: "Kimi K2.6";
237
237
  readonly contextWindow: 128000;
238
238
  readonly input: ["text"];
239
- }, {
240
- readonly id: "kimi-k2.5";
241
- readonly name: "Kimi K2.5";
242
- readonly contextWindow: 128000;
243
- readonly input: ["text"];
244
239
  }];
245
240
  readonly aliases: ["kimi", "moonshot", "moonshot cn"];
246
241
  readonly quirks: ["Provider-specific thinking and tool-call stream fields may need compatibility handling."];
@@ -272,11 +267,6 @@ export declare const DOMESTIC_PROVIDER_PRESETS: readonly [{
272
267
  readonly name: "Kimi K2.6";
273
268
  readonly contextWindow: 128000;
274
269
  readonly input: ["text"];
275
- }, {
276
- readonly id: "kimi-k2.5";
277
- readonly name: "Kimi K2.5";
278
- readonly contextWindow: 128000;
279
- readonly input: ["text"];
280
270
  }];
281
271
  readonly aliases: ["kimi intl", "moonshot intl", "moonshot ai"];
282
272
  readonly quirks: ["Provider-specific thinking and tool-call stream fields may need compatibility handling."];
@@ -290,17 +280,17 @@ export declare const DOMESTIC_PROVIDER_PRESETS: readonly [{
290
280
  readonly envVars: ["KIMI_API_KEY", "MOONSHOT_API_KEY"];
291
281
  readonly api: "anthropic-messages";
292
282
  readonly headers: {
293
- readonly 'User-Agent': "claude-code/0.1.0";
283
+ readonly 'User-Agent': "KimiCLI/1.5";
294
284
  };
295
285
  readonly baseUrlPresets: [{
296
286
  readonly id: "coding";
297
287
  readonly label: "Coding endpoint";
298
- readonly baseUrl: "https://api.kimi.com/coding/";
288
+ readonly baseUrl: "https://api.kimi.com/coding";
299
289
  }];
300
290
  readonly defaultBaseUrlPreset: "coding";
301
- readonly defaultModel: "kimi-k2.7-code";
291
+ readonly defaultModel: "k2p7";
302
292
  readonly models: [{
303
- readonly id: "kimi-k2.7-code";
293
+ readonly id: "k2p7";
304
294
  readonly name: "Kimi K2.7 Code";
305
295
  readonly contextWindow: 262144;
306
296
  readonly maxTokens: 32768;
@@ -308,7 +298,7 @@ export declare const DOMESTIC_PROVIDER_PRESETS: readonly [{
308
298
  readonly input: ["text", "image"];
309
299
  }, {
310
300
  readonly id: "kimi-for-coding";
311
- readonly name: "Kimi Code";
301
+ readonly name: "Kimi For Coding";
312
302
  readonly contextWindow: 262144;
313
303
  readonly maxTokens: 32768;
314
304
  readonly reasoning: true;
@@ -328,28 +328,19 @@ const DOMESTIC_PROVIDER_PRESETS = [
328
328
  }],
329
329
  defaultBaseUrlPreset: "cn",
330
330
  defaultModel: "kimi-k2.7-code",
331
- models: [
332
- {
333
- id: "kimi-k2.7-code",
334
- name: "Kimi K2.7 Code",
335
- contextWindow: 262144,
336
- maxTokens: 32768,
337
- reasoning: true,
338
- input: ["text", "image"]
339
- },
340
- {
341
- id: "kimi-k2.6",
342
- name: "Kimi K2.6",
343
- contextWindow: 128e3,
344
- input: ["text"]
345
- },
346
- {
347
- id: "kimi-k2.5",
348
- name: "Kimi K2.5",
349
- contextWindow: 128e3,
350
- input: ["text"]
351
- }
352
- ],
331
+ models: [{
332
+ id: "kimi-k2.7-code",
333
+ name: "Kimi K2.7 Code",
334
+ contextWindow: 262144,
335
+ maxTokens: 32768,
336
+ reasoning: true,
337
+ input: ["text", "image"]
338
+ }, {
339
+ id: "kimi-k2.6",
340
+ name: "Kimi K2.6",
341
+ contextWindow: 128e3,
342
+ input: ["text"]
343
+ }],
353
344
  aliases: [
354
345
  "kimi",
355
346
  "moonshot",
@@ -373,28 +364,19 @@ const DOMESTIC_PROVIDER_PRESETS = [
373
364
  }],
374
365
  defaultBaseUrlPreset: "intl",
375
366
  defaultModel: "kimi-k2.7-code",
376
- models: [
377
- {
378
- id: "kimi-k2.7-code",
379
- name: "Kimi K2.7 Code",
380
- contextWindow: 262144,
381
- maxTokens: 32768,
382
- reasoning: true,
383
- input: ["text", "image"]
384
- },
385
- {
386
- id: "kimi-k2.6",
387
- name: "Kimi K2.6",
388
- contextWindow: 128e3,
389
- input: ["text"]
390
- },
391
- {
392
- id: "kimi-k2.5",
393
- name: "Kimi K2.5",
394
- contextWindow: 128e3,
395
- input: ["text"]
396
- }
397
- ],
367
+ models: [{
368
+ id: "kimi-k2.7-code",
369
+ name: "Kimi K2.7 Code",
370
+ contextWindow: 262144,
371
+ maxTokens: 32768,
372
+ reasoning: true,
373
+ input: ["text", "image"]
374
+ }, {
375
+ id: "kimi-k2.6",
376
+ name: "Kimi K2.6",
377
+ contextWindow: 128e3,
378
+ input: ["text"]
379
+ }],
398
380
  aliases: [
399
381
  "kimi intl",
400
382
  "moonshot intl",
@@ -411,16 +393,16 @@ const DOMESTIC_PROVIDER_PRESETS = [
411
393
  pricingUrl: "https://platform.kimi.com/docs/pricing/chat",
412
394
  envVars: ["KIMI_API_KEY", "MOONSHOT_API_KEY"],
413
395
  api: "anthropic-messages",
414
- headers: { "User-Agent": "claude-code/0.1.0" },
396
+ headers: { "User-Agent": "KimiCLI/1.5" },
415
397
  baseUrlPresets: [{
416
398
  id: "coding",
417
399
  label: "Coding endpoint",
418
- baseUrl: "https://api.kimi.com/coding/"
400
+ baseUrl: "https://api.kimi.com/coding"
419
401
  }],
420
402
  defaultBaseUrlPreset: "coding",
421
- defaultModel: "kimi-k2.7-code",
403
+ defaultModel: "k2p7",
422
404
  models: [{
423
- id: "kimi-k2.7-code",
405
+ id: "k2p7",
424
406
  name: "Kimi K2.7 Code",
425
407
  contextWindow: 262144,
426
408
  maxTokens: 32768,
@@ -428,7 +410,7 @@ const DOMESTIC_PROVIDER_PRESETS = [
428
410
  input: ["text", "image"]
429
411
  }, {
430
412
  id: "kimi-for-coding",
431
- name: "Kimi Code",
413
+ name: "Kimi For Coding",
432
414
  contextWindow: 262144,
433
415
  maxTokens: 32768,
434
416
  reasoning: true,
@@ -1 +1 @@
1
- {"version":3,"file":"domestic-presets.js","names":[],"sources":["../../../src/providers/domestic-presets.ts"],"sourcesContent":["import type { ProviderConfig } from '../config/models-json.js';\n\nexport interface DomesticProviderModelPreset {\n id: string;\n name?: string;\n contextWindow?: number;\n maxTokens?: number;\n reasoning?: boolean;\n input?: Array<'text' | 'image'>;\n}\n\nexport interface DomesticProviderBaseUrlPreset {\n id: string;\n label: string;\n baseUrl: string;\n description?: string;\n}\n\nexport interface DomesticProviderPreset {\n id: string;\n displayName: string;\n description: string;\n docsUrl: string;\n apiKeyUrl: string;\n pricingUrl?: string;\n envVars: string[];\n api: NonNullable<ProviderConfig['api']>;\n authHeader?: boolean;\n headers?: Record<string, string>;\n baseUrlPresets: DomesticProviderBaseUrlPreset[];\n defaultBaseUrlPreset: string;\n defaultModel: string;\n models: DomesticProviderModelPreset[];\n aliases: string[];\n quirks?: string[];\n}\n\nconst QWEN_MODELS: DomesticProviderModelPreset[] = [\n { id: 'qwen3.7-max', name: 'Qwen3.7 Max', contextWindow: 1000000, input: ['text', 'image'] },\n { id: 'qwen3.7-plus', name: 'Qwen3.7 Plus', contextWindow: 1000000, input: ['text', 'image'] },\n { id: 'qwen3.6-flash', name: 'Qwen3.6 Flash', contextWindow: 1000000, input: ['text'] },\n];\n\nconst STEPFUN_MODELS: DomesticProviderModelPreset[] = [\n { id: 'step-3.7-flash', name: 'Step 3.7 Flash', contextWindow: 1000000, reasoning: true, input: ['text', 'image'] },\n { id: 'step-3.5-flash-2603', name: 'Step 3.5 Flash 2603', contextWindow: 1000000, reasoning: true, input: ['text', 'image'] },\n { id: 'step-3.5-flash', name: 'Step 3.5 Flash', contextWindow: 1000000, reasoning: true, input: ['text'] },\n];\n\nconst MIMO_MODELS: DomesticProviderModelPreset[] = [\n { id: 'mimo-v2.5-pro', name: 'MiMo V2.5 Pro', contextWindow: 1000000, reasoning: true, input: ['text'] },\n { id: 'mimo-v2.5-pro-ultraspeed', name: 'MiMo V2.5 Pro UltraSpeed', contextWindow: 1000000, reasoning: true, input: ['text'] },\n { id: 'mimo-v2.5', name: 'MiMo V2.5', contextWindow: 1000000, reasoning: true, input: ['text', 'image'] },\n];\n\nconst MINIMAX_MODELS: DomesticProviderModelPreset[] = [\n { id: 'MiniMax-M3', name: 'MiniMax M3', contextWindow: 1000000, reasoning: true, input: ['text', 'image'] },\n { id: 'MiniMax-M2.7-highspeed', name: 'MiniMax M2.7 Highspeed', contextWindow: 204800, input: ['text'] },\n { id: 'MiniMax-M2.7', name: 'MiniMax M2.7', contextWindow: 204800, input: ['text'] },\n];\n\nexport const DOMESTIC_PROVIDER_PRESETS = [\n {\n id: 'dashscope-cn',\n displayName: 'Alibaba Bailian / DashScope China',\n description: 'Alibaba Bailian Qwen models through the China DashScope OpenAI-compatible endpoint.',\n docsUrl: 'https://help.aliyun.com/zh/model-studio/developer-reference/compatibility-of-openai-with-dashscope',\n apiKeyUrl: 'https://dashscope.console.aliyun.com/apiKey',\n pricingUrl: 'https://help.aliyun.com/zh/model-studio/developer-reference/tongyi-thousand-questions-metering-and-billing',\n envVars: ['DASHSCOPE_API_KEY', 'QWEN_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [\n {\n id: 'cn',\n label: 'China',\n baseUrl: 'https://dashscope.aliyuncs.com/compatible-mode/v1',\n },\n ],\n defaultBaseUrlPreset: 'cn',\n defaultModel: 'qwen3.7-plus',\n models: QWEN_MODELS,\n aliases: ['qwen', 'tongyi', 'aliyun', 'bailian', 'dashscope', 'dashscope cn', '阿里百炼'],\n quirks: ['Some Qwen coding endpoints use different hosts; keep the Base URL editable.'],\n },\n {\n id: 'dashscope-intl',\n displayName: 'Alibaba Bailian / DashScope International',\n description: 'Alibaba Bailian Qwen models through the international DashScope OpenAI-compatible endpoint.',\n docsUrl: 'https://www.alibabacloud.com/help/en/model-studio/compatibility-of-openai-with-dashscope',\n apiKeyUrl: 'https://modelstudio.console.alibabacloud.com/',\n pricingUrl: 'https://www.alibabacloud.com/help/en/model-studio/billing-for-tongyi-qianwen',\n envVars: ['DASHSCOPE_API_KEY', 'QWEN_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [\n {\n id: 'intl',\n label: 'International',\n baseUrl: 'https://dashscope-intl.aliyuncs.com/compatible-mode/v1',\n },\n ],\n defaultBaseUrlPreset: 'intl',\n defaultModel: 'qwen3.7-plus',\n models: QWEN_MODELS,\n aliases: ['qwen intl', 'tongyi intl', 'alibaba cloud', 'dashscope intl'],\n quirks: ['Use an international DashScope key for the international endpoint.'],\n },\n {\n id: 'volcengine-ark',\n displayName: 'Volcengine Ark',\n description: 'Volcengine Ark models through the OpenAI-compatible API.',\n docsUrl: 'https://www.volcengine.com/docs/82379/1302008',\n apiKeyUrl: 'https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey',\n envVars: ['ARK_API_KEY', 'VOLCENGINE_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [\n {\n id: 'cn-beijing',\n label: 'China Beijing',\n baseUrl: 'https://ark.cn-beijing.volces.com/api/v3',\n description: 'Model IDs are usually Ark endpoint IDs.',\n },\n ],\n defaultBaseUrlPreset: 'cn-beijing',\n defaultModel: 'ep-your-endpoint-id',\n models: [{ id: 'ep-your-endpoint-id', name: 'Ark endpoint ID', contextWindow: 128000, input: ['text'] }],\n aliases: ['doubao', 'ark', 'volcengine', 'volces', 'bytedance'],\n quirks: ['Use the Ark endpoint id as the model id.'],\n },\n {\n id: 'volcengine-plan',\n displayName: 'Volcengine Doubao Coding Plan',\n description: 'Doubao coding-plan models through Volcengine Ark coding endpoint.',\n docsUrl: 'https://www.volcengine.com/docs/82379/1302008',\n apiKeyUrl: 'https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey',\n envVars: ['ARK_API_KEY', 'VOLCENGINE_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [\n { id: 'cn-beijing-coding', label: 'China Beijing Coding Plan', baseUrl: 'https://ark.cn-beijing.volces.com/api/coding/v3' },\n ],\n defaultBaseUrlPreset: 'cn-beijing-coding',\n defaultModel: 'ark-code-latest',\n models: [\n { id: 'ark-code-latest', name: 'Ark Coding Plan', contextWindow: 256000, maxTokens: 4096, input: ['text'] },\n { id: 'doubao-seed-2.0-code', name: 'Doubao Seed 2.0 Code', contextWindow: 256000, maxTokens: 4096, input: ['text'] },\n { id: 'doubao-seed-2.0-pro', name: 'Doubao Seed 2.0 Pro', contextWindow: 256000, maxTokens: 4096, input: ['text'] },\n { id: 'doubao-seed-2.0-lite', name: 'Doubao Seed 2.0 Lite', contextWindow: 256000, maxTokens: 4096, input: ['text'] },\n ],\n aliases: ['doubao coding', 'volcengine plan', 'ark coding plan', '火山方舟 coding'],\n },\n {\n id: 'byteplus-plan',\n displayName: 'BytePlus Doubao Coding Plan',\n description: 'Doubao coding-plan models through the BytePlus international coding endpoint.',\n docsUrl: 'https://docs.byteplus.com/en/docs/ModelArk/OpenAI',\n apiKeyUrl: 'https://console.byteplus.com/ark/region:ark+ap-southeast-1/apiKey',\n envVars: ['BYTEPLUS_API_KEY', 'ARK_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [\n { id: 'ap-southeast-coding', label: 'Asia Pacific Coding Plan', baseUrl: 'https://ark.ap-southeast.bytepluses.com/api/coding/v3' },\n ],\n defaultBaseUrlPreset: 'ap-southeast-coding',\n defaultModel: 'ark-code-latest',\n models: [\n { id: 'ark-code-latest', name: 'Ark Coding Plan', contextWindow: 256000, maxTokens: 4096, input: ['text'] },\n { id: 'doubao-seed-2.0-code', name: 'Doubao Seed 2.0 Code', contextWindow: 256000, maxTokens: 4096, input: ['text'] },\n { id: 'doubao-seed-2.0-pro', name: 'Doubao Seed 2.0 Pro', contextWindow: 256000, maxTokens: 4096, input: ['text'] },\n { id: 'doubao-seed-2.0-lite', name: 'Doubao Seed 2.0 Lite', contextWindow: 256000, maxTokens: 4096, input: ['text'] },\n ],\n aliases: ['byteplus', 'byteplus plan', 'doubao coding international'],\n },\n {\n id: 'deepseek',\n displayName: 'DeepSeek',\n description: 'DeepSeek models through the OpenAI-compatible API.',\n docsUrl: 'https://api-docs.deepseek.com/',\n apiKeyUrl: 'https://platform.deepseek.com/api_keys',\n pricingUrl: 'https://api-docs.deepseek.com/quick_start/pricing',\n envVars: ['DEEPSEEK_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [{ id: 'default', label: 'Default', baseUrl: 'https://api.deepseek.com' }],\n defaultBaseUrlPreset: 'default',\n defaultModel: 'deepseek-v4-pro',\n models: [\n { id: 'deepseek-v4-pro', name: 'DeepSeek V4 Pro', contextWindow: 1000000, maxTokens: 393216, reasoning: true, input: ['text'] },\n { id: 'deepseek-v4-flash', name: 'DeepSeek V4 Flash', contextWindow: 1000000, maxTokens: 393216, reasoning: true, input: ['text'] },\n ],\n aliases: ['deep seek', 'deepseek', 'r1'],\n quirks: ['Prefer current catalog models; older chat/reasoner aliases may be deprecated by the provider.'],\n },\n {\n id: 'moonshotai-cn',\n displayName: 'Kimi / Moonshot China',\n description: 'Kimi models through the Moonshot China OpenAI-compatible endpoint.',\n docsUrl: 'https://platform.moonshot.cn/docs',\n apiKeyUrl: 'https://platform.moonshot.cn/console/api-keys',\n pricingUrl: 'https://platform.moonshot.cn/docs/pricing/chat',\n envVars: ['MOONSHOT_API_KEY', 'KIMI_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [{ id: 'cn', label: 'China', baseUrl: 'https://api.moonshot.cn/v1' }],\n defaultBaseUrlPreset: 'cn',\n defaultModel: 'kimi-k2.7-code',\n models: [\n { id: 'kimi-k2.7-code', name: 'Kimi K2.7 Code', contextWindow: 262144, maxTokens: 32768, reasoning: true, input: ['text', 'image'] },\n { id: 'kimi-k2.6', name: 'Kimi K2.6', contextWindow: 128000, input: ['text'] },\n { id: 'kimi-k2.5', name: 'Kimi K2.5', contextWindow: 128000, input: ['text'] },\n ],\n aliases: ['kimi', 'moonshot', 'moonshot cn'],\n quirks: ['Provider-specific thinking and tool-call stream fields may need compatibility handling.'],\n },\n {\n id: 'moonshotai',\n displayName: 'Kimi / Moonshot International',\n description: 'Kimi models through the Moonshot international OpenAI-compatible endpoint.',\n docsUrl: 'https://platform.moonshot.ai/docs',\n apiKeyUrl: 'https://platform.moonshot.ai/console/api-keys',\n pricingUrl: 'https://platform.moonshot.ai/docs/pricing',\n envVars: ['MOONSHOT_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [{ id: 'intl', label: 'International', baseUrl: 'https://api.moonshot.ai/v1' }],\n defaultBaseUrlPreset: 'intl',\n defaultModel: 'kimi-k2.7-code',\n models: [\n { id: 'kimi-k2.7-code', name: 'Kimi K2.7 Code', contextWindow: 262144, maxTokens: 32768, reasoning: true, input: ['text', 'image'] },\n { id: 'kimi-k2.6', name: 'Kimi K2.6', contextWindow: 128000, input: ['text'] },\n { id: 'kimi-k2.5', name: 'Kimi K2.5', contextWindow: 128000, input: ['text'] },\n ],\n aliases: ['kimi intl', 'moonshot intl', 'moonshot ai'],\n quirks: ['Provider-specific thinking and tool-call stream fields may need compatibility handling.'],\n },\n {\n id: 'kimi-coding',\n displayName: 'Kimi Coding',\n description: 'Kimi dedicated coding endpoint with Anthropic-compatible requests.',\n docsUrl: 'https://platform.kimi.com/docs',\n apiKeyUrl: 'https://platform.kimi.com/console/api-keys',\n pricingUrl: 'https://platform.kimi.com/docs/pricing/chat',\n envVars: ['KIMI_API_KEY', 'MOONSHOT_API_KEY'],\n api: 'anthropic-messages',\n headers: { 'User-Agent': 'claude-code/0.1.0' },\n baseUrlPresets: [{ id: 'coding', label: 'Coding endpoint', baseUrl: 'https://api.kimi.com/coding/' }],\n defaultBaseUrlPreset: 'coding',\n defaultModel: 'kimi-k2.7-code',\n models: [\n { id: 'kimi-k2.7-code', name: 'Kimi K2.7 Code', contextWindow: 262144, maxTokens: 32768, reasoning: true, input: ['text', 'image'] },\n { id: 'kimi-for-coding', name: 'Kimi Code', contextWindow: 262144, maxTokens: 32768, reasoning: true, input: ['text', 'image'] },\n ],\n aliases: ['kimi coding', 'kimi code', 'moonshot coding'],\n },\n {\n id: 'stepfun-intl',\n displayName: 'StepFun International',\n description: 'StepFun models through the international OpenAI-compatible API.',\n docsUrl: 'https://platform.stepfun.com/docs',\n apiKeyUrl: 'https://platform.stepfun.com/interface-key',\n envVars: ['STEPFUN_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [{ id: 'intl', label: 'International', baseUrl: 'https://api.stepfun.ai/v1' }],\n defaultBaseUrlPreset: 'intl',\n defaultModel: 'step-3.7-flash',\n models: STEPFUN_MODELS,\n aliases: ['step', 'stepfun', 'jieyue', 'stepfun intl'],\n },\n {\n id: 'stepfun-cn',\n displayName: 'StepFun China',\n description: 'StepFun models through the China OpenAI-compatible API.',\n docsUrl: 'https://platform.stepfun.com/docs',\n apiKeyUrl: 'https://platform.stepfun.com/interface-key',\n envVars: ['STEPFUN_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [{ id: 'cn', label: 'China', baseUrl: 'https://api.stepfun.com/v1' }],\n defaultBaseUrlPreset: 'cn',\n defaultModel: 'step-3.7-flash',\n models: STEPFUN_MODELS,\n aliases: ['step cn', 'stepfun cn', 'jieyue cn', '阶跃星辰'],\n },\n {\n id: 'stepfun-plan-intl',\n displayName: 'StepFun Step Plan International',\n description: 'StepFun Step Plan international coding/planning endpoint.',\n docsUrl: 'https://platform.stepfun.com/docs',\n apiKeyUrl: 'https://platform.stepfun.com/interface-key',\n envVars: ['STEPFUN_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [{ id: 'plan-intl', label: 'Step Plan International', baseUrl: 'https://api.stepfun.ai/step_plan/v1' }],\n defaultBaseUrlPreset: 'plan-intl',\n defaultModel: 'step-3.7-flash',\n models: STEPFUN_MODELS,\n aliases: ['step plan', 'stepfun plan', 'stepfun plan intl'],\n },\n {\n id: 'stepfun-plan-cn',\n displayName: 'StepFun Step Plan China',\n description: 'StepFun Step Plan China coding/planning endpoint.',\n docsUrl: 'https://platform.stepfun.com/docs',\n apiKeyUrl: 'https://platform.stepfun.com/interface-key',\n envVars: ['STEPFUN_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [{ id: 'plan-cn', label: 'Step Plan China', baseUrl: 'https://api.stepfun.com/step_plan/v1' }],\n defaultBaseUrlPreset: 'plan-cn',\n defaultModel: 'step-3.7-flash',\n models: STEPFUN_MODELS,\n aliases: ['step plan cn', 'stepfun plan cn', '阶跃 plan'],\n },\n {\n id: 'xiaomi',\n displayName: 'Xiaomi MiMo',\n description: 'Xiaomi MiMo API billing endpoint through OpenAI-compatible requests.',\n docsUrl: 'https://platform.xiaomimimo.com/',\n apiKeyUrl: 'https://platform.xiaomimimo.com/#/console/api-keys',\n pricingUrl: 'https://mimo.mi.com/',\n envVars: ['XIAOMI_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [{ id: 'api', label: 'API billing', baseUrl: 'https://api.xiaomimimo.com/v1' }],\n defaultBaseUrlPreset: 'api',\n defaultModel: 'mimo-v2.5-pro',\n models: MIMO_MODELS,\n aliases: ['xiaomi', 'mimo', 'xiaomimimo'],\n quirks: ['Some MiMo plans document api-key style auth; keep auth header behavior configurable if needed.'],\n },\n {\n id: 'xiaomi-token-plan-cn',\n displayName: 'Xiaomi MiMo Token Plan China',\n description: 'Xiaomi MiMo Token Plan China endpoint.',\n docsUrl: 'https://platform.xiaomimimo.com/',\n apiKeyUrl: 'https://platform.xiaomimimo.com/#/console/api-keys',\n pricingUrl: 'https://mimo.mi.com/',\n envVars: ['XIAOMI_TOKEN_PLAN_CN_API_KEY', 'XIAOMI_TOKEN_PLAN_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [{ id: 'cn', label: 'China', baseUrl: 'https://token-plan-cn.xiaomimimo.com/v1' }],\n defaultBaseUrlPreset: 'cn',\n defaultModel: 'mimo-v2.5-pro',\n models: MIMO_MODELS,\n aliases: ['xiaomi token plan cn', 'mimo token plan cn'],\n },\n {\n id: 'xiaomi-token-plan-ams',\n displayName: 'Xiaomi MiMo Token Plan Amsterdam',\n description: 'Xiaomi MiMo Token Plan Amsterdam endpoint.',\n docsUrl: 'https://platform.xiaomimimo.com/',\n apiKeyUrl: 'https://platform.xiaomimimo.com/#/console/api-keys',\n pricingUrl: 'https://mimo.mi.com/',\n envVars: ['XIAOMI_TOKEN_PLAN_AMS_API_KEY', 'XIAOMI_TOKEN_PLAN_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [{ id: 'ams', label: 'Amsterdam', baseUrl: 'https://token-plan-ams.xiaomimimo.com/v1' }],\n defaultBaseUrlPreset: 'ams',\n defaultModel: 'mimo-v2.5-pro',\n models: MIMO_MODELS,\n aliases: ['xiaomi token plan ams', 'mimo token plan ams'],\n },\n {\n id: 'xiaomi-token-plan-sgp',\n displayName: 'Xiaomi MiMo Token Plan Singapore',\n description: 'Xiaomi MiMo Token Plan Singapore endpoint.',\n docsUrl: 'https://platform.xiaomimimo.com/',\n apiKeyUrl: 'https://platform.xiaomimimo.com/#/console/api-keys',\n pricingUrl: 'https://mimo.mi.com/',\n envVars: ['XIAOMI_TOKEN_PLAN_SGP_API_KEY', 'XIAOMI_TOKEN_PLAN_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [{ id: 'sgp', label: 'Singapore', baseUrl: 'https://token-plan-sgp.xiaomimimo.com/v1' }],\n defaultBaseUrlPreset: 'sgp',\n defaultModel: 'mimo-v2.5-pro',\n models: MIMO_MODELS,\n aliases: ['xiaomi token plan sgp', 'mimo token plan sgp'],\n },\n {\n id: 'zhipu-cn',\n displayName: 'Zhipu GLM China',\n description: 'Zhipu GLM models through the BigModel OpenAI-compatible API.',\n docsUrl: 'https://docs.bigmodel.cn/cn/guide/start/model-overview',\n apiKeyUrl: 'https://bigmodel.cn/usercenter/proj-mgmt/apikeys',\n pricingUrl: 'https://bigmodel.cn/pricing',\n envVars: ['ZHIPU_API_KEY', 'BIGMODEL_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [{ id: 'cn', label: 'China', baseUrl: 'https://open.bigmodel.cn/api/paas/v4' }],\n defaultBaseUrlPreset: 'cn',\n defaultModel: 'glm-5.2',\n models: [\n { id: 'glm-5.2', name: 'GLM 5.2', contextWindow: 1000000, maxTokens: 65536, reasoning: true, input: ['text'] },\n ],\n aliases: ['zhipu', 'glm', 'bigmodel', 'zai cn'],\n },\n {\n id: 'zai',\n displayName: 'Zhipu GLM International',\n description: 'Zhipu GLM models through the z.ai OpenAI-compatible endpoint.',\n docsUrl: 'https://docs.z.ai/guides/overview/quick-start',\n apiKeyUrl: 'https://z.ai/manage-apikey/apikey-list',\n pricingUrl: 'https://z.ai/manage-apikey/billing',\n envVars: ['ZAI_API_KEY', 'Z_AI_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [{ id: 'global', label: 'International', baseUrl: 'https://api.z.ai/api/paas/v4' }],\n defaultBaseUrlPreset: 'global',\n defaultModel: 'glm-5.2',\n models: [\n { id: 'glm-5.2', name: 'GLM 5.2', contextWindow: 1000000, maxTokens: 65536, reasoning: true, input: ['text'] },\n ],\n aliases: ['zai', 'z.ai', 'zhipu global', 'glm global'],\n },\n {\n id: 'zai-coding-global',\n displayName: 'Zhipu GLM Coding Plan International',\n description: 'Zhipu GLM coding-plan international endpoint.',\n docsUrl: 'https://docs.z.ai/guides/overview/quick-start',\n apiKeyUrl: 'https://z.ai/manage-apikey/apikey-list',\n pricingUrl: 'https://z.ai/manage-apikey/billing',\n envVars: ['ZAI_API_KEY', 'Z_AI_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [{ id: 'coding-global', label: 'Coding Global', baseUrl: 'https://api.z.ai/api/coding/paas/v4' }],\n defaultBaseUrlPreset: 'coding-global',\n defaultModel: 'glm-5.2',\n models: [\n { id: 'glm-5.2', name: 'GLM 5.2', contextWindow: 1000000, maxTokens: 65536, reasoning: true, input: ['text'] },\n ],\n aliases: ['zai coding', 'zhipu coding global', 'glm coding global'],\n },\n {\n id: 'zhipu-coding-cn',\n displayName: 'Zhipu GLM Coding Plan China',\n description: 'Zhipu GLM coding-plan China endpoint.',\n docsUrl: 'https://docs.bigmodel.cn/cn/guide/start/model-overview',\n apiKeyUrl: 'https://bigmodel.cn/usercenter/proj-mgmt/apikeys',\n pricingUrl: 'https://bigmodel.cn/pricing',\n envVars: ['ZHIPU_API_KEY', 'BIGMODEL_API_KEY', 'ZAI_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [{ id: 'coding-cn', label: 'Coding China', baseUrl: 'https://open.bigmodel.cn/api/coding/paas/v4' }],\n defaultBaseUrlPreset: 'coding-cn',\n defaultModel: 'glm-5.2',\n models: [\n { id: 'glm-5.2', name: 'GLM 5.2', contextWindow: 1000000, maxTokens: 65536, reasoning: true, input: ['text'] },\n ],\n aliases: ['zhipu coding', 'glm coding cn', '智谱 coding'],\n },\n {\n id: 'minimax',\n displayName: 'MiniMax',\n description: 'MiniMax text models. Anthropic-compatible endpoint is preferred for agent/tool workflows.',\n docsUrl: 'https://platform.minimax.io/docs',\n apiKeyUrl: 'https://platform.minimax.io/user-center/basic-information/interface-key',\n pricingUrl: 'https://platform.minimax.io/docs/guides/models-intro',\n envVars: ['MINIMAX_API_KEY'],\n api: 'anthropic-messages',\n authHeader: true,\n baseUrlPresets: [\n { id: 'intl-anthropic', label: 'International Anthropic-compatible', baseUrl: 'https://api.minimax.io/anthropic' },\n { id: 'intl-openai', label: 'International OpenAI-compatible', baseUrl: 'https://api.minimax.io/v1' },\n ],\n defaultBaseUrlPreset: 'intl-anthropic',\n defaultModel: 'MiniMax-M3',\n models: MINIMAX_MODELS,\n aliases: ['minimax', 'mini max', 'abab'],\n quirks: ['Switch API type to OpenAI-compatible if you select an /v1 endpoint.'],\n },\n {\n id: 'minimax-cn',\n displayName: 'MiniMax China',\n description: 'MiniMax China endpoint. Anthropic-compatible endpoint is preferred for agent/tool workflows.',\n docsUrl: 'https://platform.minimaxi.com/document',\n apiKeyUrl: 'https://platform.minimaxi.com/user-center/basic-information/interface-key',\n pricingUrl: 'https://platform.minimaxi.com/document/Price',\n envVars: ['MINIMAX_CN_API_KEY', 'MINIMAX_API_KEY'],\n api: 'anthropic-messages',\n authHeader: true,\n baseUrlPresets: [\n { id: 'cn-anthropic', label: 'China Anthropic-compatible', baseUrl: 'https://api.minimaxi.com/anthropic' },\n { id: 'cn-openai', label: 'China OpenAI-compatible', baseUrl: 'https://api.minimaxi.com/v1' },\n ],\n defaultBaseUrlPreset: 'cn-anthropic',\n defaultModel: 'MiniMax-M3',\n models: MINIMAX_MODELS,\n aliases: ['minimax cn', 'mini max cn', 'abab cn'],\n quirks: ['Switch API type to OpenAI-compatible if you select an /v1 endpoint.'],\n },\n] as const satisfies readonly DomesticProviderPreset[];\n\nconst PRESET_BY_ID = new Map<string, DomesticProviderPreset>(\n DOMESTIC_PROVIDER_PRESETS.map((preset) => [preset.id, preset]),\n);\n\nexport function getDomesticProviderPreset(id: string): DomesticProviderPreset | undefined {\n return PRESET_BY_ID.get(id);\n}\n\nexport function getDomesticProviderPresetIds(): string[] {\n return DOMESTIC_PROVIDER_PRESETS.map((preset) => preset.id);\n}\n\nexport function getDomesticProviderBaseUrl(preset: DomesticProviderPreset): string {\n return (\n preset.baseUrlPresets.find((entry) => entry.id === preset.defaultBaseUrlPreset)?.baseUrl ??\n preset.baseUrlPresets[0]?.baseUrl ??\n ''\n );\n}\n\nexport function providerConfigFromDomesticPreset(\n preset: DomesticProviderPreset,\n params: { apiKey?: string; baseUrl?: string; modelIds?: string[] } = {},\n): ProviderConfig {\n const ids = params.modelIds?.length ? params.modelIds : preset.models.map((model) => model.id);\n return {\n baseUrl: params.baseUrl ?? getDomesticProviderBaseUrl(preset),\n apiKey: params.apiKey,\n api: preset.api,\n ...(preset.authHeader === undefined ? {} : { authHeader: preset.authHeader }),\n ...(preset.headers ? { headers: preset.headers } : {}),\n models: ids.map((id) => {\n const model = preset.models.find((entry) => entry.id === id);\n return {\n id,\n name: model?.name ?? id,\n api: preset.api,\n ...(model?.contextWindow ? { contextWindow: model.contextWindow } : {}),\n ...(model?.maxTokens ? { maxTokens: model.maxTokens } : {}),\n ...(model?.reasoning ? { reasoning: model.reasoning } : {}),\n input: model?.input ?? ['text'],\n };\n }),\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"domestic-presets.js","names":[],"sources":["../../../src/providers/domestic-presets.ts"],"sourcesContent":["import type { ProviderConfig } from '../config/models-json.js';\n\nexport interface DomesticProviderModelPreset {\n id: string;\n name?: string;\n contextWindow?: number;\n maxTokens?: number;\n reasoning?: boolean;\n input?: Array<'text' | 'image'>;\n}\n\nexport interface DomesticProviderBaseUrlPreset {\n id: string;\n label: string;\n baseUrl: string;\n description?: string;\n}\n\nexport interface DomesticProviderPreset {\n id: string;\n displayName: string;\n description: string;\n docsUrl: string;\n apiKeyUrl: string;\n pricingUrl?: string;\n envVars: string[];\n api: NonNullable<ProviderConfig['api']>;\n authHeader?: boolean;\n headers?: Record<string, string>;\n baseUrlPresets: DomesticProviderBaseUrlPreset[];\n defaultBaseUrlPreset: string;\n defaultModel: string;\n models: DomesticProviderModelPreset[];\n aliases: string[];\n quirks?: string[];\n}\n\nconst QWEN_MODELS: DomesticProviderModelPreset[] = [\n { id: 'qwen3.7-max', name: 'Qwen3.7 Max', contextWindow: 1000000, input: ['text', 'image'] },\n { id: 'qwen3.7-plus', name: 'Qwen3.7 Plus', contextWindow: 1000000, input: ['text', 'image'] },\n { id: 'qwen3.6-flash', name: 'Qwen3.6 Flash', contextWindow: 1000000, input: ['text'] },\n];\n\nconst STEPFUN_MODELS: DomesticProviderModelPreset[] = [\n { id: 'step-3.7-flash', name: 'Step 3.7 Flash', contextWindow: 1000000, reasoning: true, input: ['text', 'image'] },\n { id: 'step-3.5-flash-2603', name: 'Step 3.5 Flash 2603', contextWindow: 1000000, reasoning: true, input: ['text', 'image'] },\n { id: 'step-3.5-flash', name: 'Step 3.5 Flash', contextWindow: 1000000, reasoning: true, input: ['text'] },\n];\n\nconst MIMO_MODELS: DomesticProviderModelPreset[] = [\n { id: 'mimo-v2.5-pro', name: 'MiMo V2.5 Pro', contextWindow: 1000000, reasoning: true, input: ['text'] },\n { id: 'mimo-v2.5-pro-ultraspeed', name: 'MiMo V2.5 Pro UltraSpeed', contextWindow: 1000000, reasoning: true, input: ['text'] },\n { id: 'mimo-v2.5', name: 'MiMo V2.5', contextWindow: 1000000, reasoning: true, input: ['text', 'image'] },\n];\n\nconst MINIMAX_MODELS: DomesticProviderModelPreset[] = [\n { id: 'MiniMax-M3', name: 'MiniMax M3', contextWindow: 1000000, reasoning: true, input: ['text', 'image'] },\n { id: 'MiniMax-M2.7-highspeed', name: 'MiniMax M2.7 Highspeed', contextWindow: 204800, input: ['text'] },\n { id: 'MiniMax-M2.7', name: 'MiniMax M2.7', contextWindow: 204800, input: ['text'] },\n];\n\nexport const DOMESTIC_PROVIDER_PRESETS = [\n {\n id: 'dashscope-cn',\n displayName: 'Alibaba Bailian / DashScope China',\n description: 'Alibaba Bailian Qwen models through the China DashScope OpenAI-compatible endpoint.',\n docsUrl: 'https://help.aliyun.com/zh/model-studio/developer-reference/compatibility-of-openai-with-dashscope',\n apiKeyUrl: 'https://dashscope.console.aliyun.com/apiKey',\n pricingUrl: 'https://help.aliyun.com/zh/model-studio/developer-reference/tongyi-thousand-questions-metering-and-billing',\n envVars: ['DASHSCOPE_API_KEY', 'QWEN_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [\n {\n id: 'cn',\n label: 'China',\n baseUrl: 'https://dashscope.aliyuncs.com/compatible-mode/v1',\n },\n ],\n defaultBaseUrlPreset: 'cn',\n defaultModel: 'qwen3.7-plus',\n models: QWEN_MODELS,\n aliases: ['qwen', 'tongyi', 'aliyun', 'bailian', 'dashscope', 'dashscope cn', '阿里百炼'],\n quirks: ['Some Qwen coding endpoints use different hosts; keep the Base URL editable.'],\n },\n {\n id: 'dashscope-intl',\n displayName: 'Alibaba Bailian / DashScope International',\n description: 'Alibaba Bailian Qwen models through the international DashScope OpenAI-compatible endpoint.',\n docsUrl: 'https://www.alibabacloud.com/help/en/model-studio/compatibility-of-openai-with-dashscope',\n apiKeyUrl: 'https://modelstudio.console.alibabacloud.com/',\n pricingUrl: 'https://www.alibabacloud.com/help/en/model-studio/billing-for-tongyi-qianwen',\n envVars: ['DASHSCOPE_API_KEY', 'QWEN_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [\n {\n id: 'intl',\n label: 'International',\n baseUrl: 'https://dashscope-intl.aliyuncs.com/compatible-mode/v1',\n },\n ],\n defaultBaseUrlPreset: 'intl',\n defaultModel: 'qwen3.7-plus',\n models: QWEN_MODELS,\n aliases: ['qwen intl', 'tongyi intl', 'alibaba cloud', 'dashscope intl'],\n quirks: ['Use an international DashScope key for the international endpoint.'],\n },\n {\n id: 'volcengine-ark',\n displayName: 'Volcengine Ark',\n description: 'Volcengine Ark models through the OpenAI-compatible API.',\n docsUrl: 'https://www.volcengine.com/docs/82379/1302008',\n apiKeyUrl: 'https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey',\n envVars: ['ARK_API_KEY', 'VOLCENGINE_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [\n {\n id: 'cn-beijing',\n label: 'China Beijing',\n baseUrl: 'https://ark.cn-beijing.volces.com/api/v3',\n description: 'Model IDs are usually Ark endpoint IDs.',\n },\n ],\n defaultBaseUrlPreset: 'cn-beijing',\n defaultModel: 'ep-your-endpoint-id',\n models: [{ id: 'ep-your-endpoint-id', name: 'Ark endpoint ID', contextWindow: 128000, input: ['text'] }],\n aliases: ['doubao', 'ark', 'volcengine', 'volces', 'bytedance'],\n quirks: ['Use the Ark endpoint id as the model id.'],\n },\n {\n id: 'volcengine-plan',\n displayName: 'Volcengine Doubao Coding Plan',\n description: 'Doubao coding-plan models through Volcengine Ark coding endpoint.',\n docsUrl: 'https://www.volcengine.com/docs/82379/1302008',\n apiKeyUrl: 'https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey',\n envVars: ['ARK_API_KEY', 'VOLCENGINE_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [\n { id: 'cn-beijing-coding', label: 'China Beijing Coding Plan', baseUrl: 'https://ark.cn-beijing.volces.com/api/coding/v3' },\n ],\n defaultBaseUrlPreset: 'cn-beijing-coding',\n defaultModel: 'ark-code-latest',\n models: [\n { id: 'ark-code-latest', name: 'Ark Coding Plan', contextWindow: 256000, maxTokens: 4096, input: ['text'] },\n { id: 'doubao-seed-2.0-code', name: 'Doubao Seed 2.0 Code', contextWindow: 256000, maxTokens: 4096, input: ['text'] },\n { id: 'doubao-seed-2.0-pro', name: 'Doubao Seed 2.0 Pro', contextWindow: 256000, maxTokens: 4096, input: ['text'] },\n { id: 'doubao-seed-2.0-lite', name: 'Doubao Seed 2.0 Lite', contextWindow: 256000, maxTokens: 4096, input: ['text'] },\n ],\n aliases: ['doubao coding', 'volcengine plan', 'ark coding plan', '火山方舟 coding'],\n },\n {\n id: 'byteplus-plan',\n displayName: 'BytePlus Doubao Coding Plan',\n description: 'Doubao coding-plan models through the BytePlus international coding endpoint.',\n docsUrl: 'https://docs.byteplus.com/en/docs/ModelArk/OpenAI',\n apiKeyUrl: 'https://console.byteplus.com/ark/region:ark+ap-southeast-1/apiKey',\n envVars: ['BYTEPLUS_API_KEY', 'ARK_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [\n { id: 'ap-southeast-coding', label: 'Asia Pacific Coding Plan', baseUrl: 'https://ark.ap-southeast.bytepluses.com/api/coding/v3' },\n ],\n defaultBaseUrlPreset: 'ap-southeast-coding',\n defaultModel: 'ark-code-latest',\n models: [\n { id: 'ark-code-latest', name: 'Ark Coding Plan', contextWindow: 256000, maxTokens: 4096, input: ['text'] },\n { id: 'doubao-seed-2.0-code', name: 'Doubao Seed 2.0 Code', contextWindow: 256000, maxTokens: 4096, input: ['text'] },\n { id: 'doubao-seed-2.0-pro', name: 'Doubao Seed 2.0 Pro', contextWindow: 256000, maxTokens: 4096, input: ['text'] },\n { id: 'doubao-seed-2.0-lite', name: 'Doubao Seed 2.0 Lite', contextWindow: 256000, maxTokens: 4096, input: ['text'] },\n ],\n aliases: ['byteplus', 'byteplus plan', 'doubao coding international'],\n },\n {\n id: 'deepseek',\n displayName: 'DeepSeek',\n description: 'DeepSeek models through the OpenAI-compatible API.',\n docsUrl: 'https://api-docs.deepseek.com/',\n apiKeyUrl: 'https://platform.deepseek.com/api_keys',\n pricingUrl: 'https://api-docs.deepseek.com/quick_start/pricing',\n envVars: ['DEEPSEEK_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [{ id: 'default', label: 'Default', baseUrl: 'https://api.deepseek.com' }],\n defaultBaseUrlPreset: 'default',\n defaultModel: 'deepseek-v4-pro',\n models: [\n { id: 'deepseek-v4-pro', name: 'DeepSeek V4 Pro', contextWindow: 1000000, maxTokens: 393216, reasoning: true, input: ['text'] },\n { id: 'deepseek-v4-flash', name: 'DeepSeek V4 Flash', contextWindow: 1000000, maxTokens: 393216, reasoning: true, input: ['text'] },\n ],\n aliases: ['deep seek', 'deepseek', 'r1'],\n quirks: ['Prefer current catalog models; older chat/reasoner aliases may be deprecated by the provider.'],\n },\n {\n id: 'moonshotai-cn',\n displayName: 'Kimi / Moonshot China',\n description: 'Kimi models through the Moonshot China OpenAI-compatible endpoint.',\n docsUrl: 'https://platform.moonshot.cn/docs',\n apiKeyUrl: 'https://platform.moonshot.cn/console/api-keys',\n pricingUrl: 'https://platform.moonshot.cn/docs/pricing/chat',\n envVars: ['MOONSHOT_API_KEY', 'KIMI_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [{ id: 'cn', label: 'China', baseUrl: 'https://api.moonshot.cn/v1' }],\n defaultBaseUrlPreset: 'cn',\n defaultModel: 'kimi-k2.7-code',\n models: [\n { id: 'kimi-k2.7-code', name: 'Kimi K2.7 Code', contextWindow: 262144, maxTokens: 32768, reasoning: true, input: ['text', 'image'] },\n { id: 'kimi-k2.6', name: 'Kimi K2.6', contextWindow: 128000, input: ['text'] },\n ],\n aliases: ['kimi', 'moonshot', 'moonshot cn'],\n quirks: ['Provider-specific thinking and tool-call stream fields may need compatibility handling.'],\n },\n {\n id: 'moonshotai',\n displayName: 'Kimi / Moonshot International',\n description: 'Kimi models through the Moonshot international OpenAI-compatible endpoint.',\n docsUrl: 'https://platform.moonshot.ai/docs',\n apiKeyUrl: 'https://platform.moonshot.ai/console/api-keys',\n pricingUrl: 'https://platform.moonshot.ai/docs/pricing',\n envVars: ['MOONSHOT_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [{ id: 'intl', label: 'International', baseUrl: 'https://api.moonshot.ai/v1' }],\n defaultBaseUrlPreset: 'intl',\n defaultModel: 'kimi-k2.7-code',\n models: [\n { id: 'kimi-k2.7-code', name: 'Kimi K2.7 Code', contextWindow: 262144, maxTokens: 32768, reasoning: true, input: ['text', 'image'] },\n { id: 'kimi-k2.6', name: 'Kimi K2.6', contextWindow: 128000, input: ['text'] },\n ],\n aliases: ['kimi intl', 'moonshot intl', 'moonshot ai'],\n quirks: ['Provider-specific thinking and tool-call stream fields may need compatibility handling.'],\n },\n {\n id: 'kimi-coding',\n displayName: 'Kimi Coding',\n description: 'Kimi dedicated coding endpoint with Anthropic-compatible requests.',\n docsUrl: 'https://platform.kimi.com/docs',\n apiKeyUrl: 'https://platform.kimi.com/console/api-keys',\n pricingUrl: 'https://platform.kimi.com/docs/pricing/chat',\n envVars: ['KIMI_API_KEY', 'MOONSHOT_API_KEY'],\n api: 'anthropic-messages',\n headers: { 'User-Agent': 'KimiCLI/1.5' },\n baseUrlPresets: [{ id: 'coding', label: 'Coding endpoint', baseUrl: 'https://api.kimi.com/coding' }],\n defaultBaseUrlPreset: 'coding',\n defaultModel: 'k2p7',\n models: [\n { id: 'k2p7', name: 'Kimi K2.7 Code', contextWindow: 262144, maxTokens: 32768, reasoning: true, input: ['text', 'image'] },\n { id: 'kimi-for-coding', name: 'Kimi For Coding', contextWindow: 262144, maxTokens: 32768, reasoning: true, input: ['text', 'image'] },\n ],\n aliases: ['kimi coding', 'kimi code', 'moonshot coding'],\n },\n {\n id: 'stepfun-intl',\n displayName: 'StepFun International',\n description: 'StepFun models through the international OpenAI-compatible API.',\n docsUrl: 'https://platform.stepfun.com/docs',\n apiKeyUrl: 'https://platform.stepfun.com/interface-key',\n envVars: ['STEPFUN_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [{ id: 'intl', label: 'International', baseUrl: 'https://api.stepfun.ai/v1' }],\n defaultBaseUrlPreset: 'intl',\n defaultModel: 'step-3.7-flash',\n models: STEPFUN_MODELS,\n aliases: ['step', 'stepfun', 'jieyue', 'stepfun intl'],\n },\n {\n id: 'stepfun-cn',\n displayName: 'StepFun China',\n description: 'StepFun models through the China OpenAI-compatible API.',\n docsUrl: 'https://platform.stepfun.com/docs',\n apiKeyUrl: 'https://platform.stepfun.com/interface-key',\n envVars: ['STEPFUN_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [{ id: 'cn', label: 'China', baseUrl: 'https://api.stepfun.com/v1' }],\n defaultBaseUrlPreset: 'cn',\n defaultModel: 'step-3.7-flash',\n models: STEPFUN_MODELS,\n aliases: ['step cn', 'stepfun cn', 'jieyue cn', '阶跃星辰'],\n },\n {\n id: 'stepfun-plan-intl',\n displayName: 'StepFun Step Plan International',\n description: 'StepFun Step Plan international coding/planning endpoint.',\n docsUrl: 'https://platform.stepfun.com/docs',\n apiKeyUrl: 'https://platform.stepfun.com/interface-key',\n envVars: ['STEPFUN_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [{ id: 'plan-intl', label: 'Step Plan International', baseUrl: 'https://api.stepfun.ai/step_plan/v1' }],\n defaultBaseUrlPreset: 'plan-intl',\n defaultModel: 'step-3.7-flash',\n models: STEPFUN_MODELS,\n aliases: ['step plan', 'stepfun plan', 'stepfun plan intl'],\n },\n {\n id: 'stepfun-plan-cn',\n displayName: 'StepFun Step Plan China',\n description: 'StepFun Step Plan China coding/planning endpoint.',\n docsUrl: 'https://platform.stepfun.com/docs',\n apiKeyUrl: 'https://platform.stepfun.com/interface-key',\n envVars: ['STEPFUN_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [{ id: 'plan-cn', label: 'Step Plan China', baseUrl: 'https://api.stepfun.com/step_plan/v1' }],\n defaultBaseUrlPreset: 'plan-cn',\n defaultModel: 'step-3.7-flash',\n models: STEPFUN_MODELS,\n aliases: ['step plan cn', 'stepfun plan cn', '阶跃 plan'],\n },\n {\n id: 'xiaomi',\n displayName: 'Xiaomi MiMo',\n description: 'Xiaomi MiMo API billing endpoint through OpenAI-compatible requests.',\n docsUrl: 'https://platform.xiaomimimo.com/',\n apiKeyUrl: 'https://platform.xiaomimimo.com/#/console/api-keys',\n pricingUrl: 'https://mimo.mi.com/',\n envVars: ['XIAOMI_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [{ id: 'api', label: 'API billing', baseUrl: 'https://api.xiaomimimo.com/v1' }],\n defaultBaseUrlPreset: 'api',\n defaultModel: 'mimo-v2.5-pro',\n models: MIMO_MODELS,\n aliases: ['xiaomi', 'mimo', 'xiaomimimo'],\n quirks: ['Some MiMo plans document api-key style auth; keep auth header behavior configurable if needed.'],\n },\n {\n id: 'xiaomi-token-plan-cn',\n displayName: 'Xiaomi MiMo Token Plan China',\n description: 'Xiaomi MiMo Token Plan China endpoint.',\n docsUrl: 'https://platform.xiaomimimo.com/',\n apiKeyUrl: 'https://platform.xiaomimimo.com/#/console/api-keys',\n pricingUrl: 'https://mimo.mi.com/',\n envVars: ['XIAOMI_TOKEN_PLAN_CN_API_KEY', 'XIAOMI_TOKEN_PLAN_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [{ id: 'cn', label: 'China', baseUrl: 'https://token-plan-cn.xiaomimimo.com/v1' }],\n defaultBaseUrlPreset: 'cn',\n defaultModel: 'mimo-v2.5-pro',\n models: MIMO_MODELS,\n aliases: ['xiaomi token plan cn', 'mimo token plan cn'],\n },\n {\n id: 'xiaomi-token-plan-ams',\n displayName: 'Xiaomi MiMo Token Plan Amsterdam',\n description: 'Xiaomi MiMo Token Plan Amsterdam endpoint.',\n docsUrl: 'https://platform.xiaomimimo.com/',\n apiKeyUrl: 'https://platform.xiaomimimo.com/#/console/api-keys',\n pricingUrl: 'https://mimo.mi.com/',\n envVars: ['XIAOMI_TOKEN_PLAN_AMS_API_KEY', 'XIAOMI_TOKEN_PLAN_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [{ id: 'ams', label: 'Amsterdam', baseUrl: 'https://token-plan-ams.xiaomimimo.com/v1' }],\n defaultBaseUrlPreset: 'ams',\n defaultModel: 'mimo-v2.5-pro',\n models: MIMO_MODELS,\n aliases: ['xiaomi token plan ams', 'mimo token plan ams'],\n },\n {\n id: 'xiaomi-token-plan-sgp',\n displayName: 'Xiaomi MiMo Token Plan Singapore',\n description: 'Xiaomi MiMo Token Plan Singapore endpoint.',\n docsUrl: 'https://platform.xiaomimimo.com/',\n apiKeyUrl: 'https://platform.xiaomimimo.com/#/console/api-keys',\n pricingUrl: 'https://mimo.mi.com/',\n envVars: ['XIAOMI_TOKEN_PLAN_SGP_API_KEY', 'XIAOMI_TOKEN_PLAN_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [{ id: 'sgp', label: 'Singapore', baseUrl: 'https://token-plan-sgp.xiaomimimo.com/v1' }],\n defaultBaseUrlPreset: 'sgp',\n defaultModel: 'mimo-v2.5-pro',\n models: MIMO_MODELS,\n aliases: ['xiaomi token plan sgp', 'mimo token plan sgp'],\n },\n {\n id: 'zhipu-cn',\n displayName: 'Zhipu GLM China',\n description: 'Zhipu GLM models through the BigModel OpenAI-compatible API.',\n docsUrl: 'https://docs.bigmodel.cn/cn/guide/start/model-overview',\n apiKeyUrl: 'https://bigmodel.cn/usercenter/proj-mgmt/apikeys',\n pricingUrl: 'https://bigmodel.cn/pricing',\n envVars: ['ZHIPU_API_KEY', 'BIGMODEL_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [{ id: 'cn', label: 'China', baseUrl: 'https://open.bigmodel.cn/api/paas/v4' }],\n defaultBaseUrlPreset: 'cn',\n defaultModel: 'glm-5.2',\n models: [\n { id: 'glm-5.2', name: 'GLM 5.2', contextWindow: 1000000, maxTokens: 65536, reasoning: true, input: ['text'] },\n ],\n aliases: ['zhipu', 'glm', 'bigmodel', 'zai cn'],\n },\n {\n id: 'zai',\n displayName: 'Zhipu GLM International',\n description: 'Zhipu GLM models through the z.ai OpenAI-compatible endpoint.',\n docsUrl: 'https://docs.z.ai/guides/overview/quick-start',\n apiKeyUrl: 'https://z.ai/manage-apikey/apikey-list',\n pricingUrl: 'https://z.ai/manage-apikey/billing',\n envVars: ['ZAI_API_KEY', 'Z_AI_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [{ id: 'global', label: 'International', baseUrl: 'https://api.z.ai/api/paas/v4' }],\n defaultBaseUrlPreset: 'global',\n defaultModel: 'glm-5.2',\n models: [\n { id: 'glm-5.2', name: 'GLM 5.2', contextWindow: 1000000, maxTokens: 65536, reasoning: true, input: ['text'] },\n ],\n aliases: ['zai', 'z.ai', 'zhipu global', 'glm global'],\n },\n {\n id: 'zai-coding-global',\n displayName: 'Zhipu GLM Coding Plan International',\n description: 'Zhipu GLM coding-plan international endpoint.',\n docsUrl: 'https://docs.z.ai/guides/overview/quick-start',\n apiKeyUrl: 'https://z.ai/manage-apikey/apikey-list',\n pricingUrl: 'https://z.ai/manage-apikey/billing',\n envVars: ['ZAI_API_KEY', 'Z_AI_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [{ id: 'coding-global', label: 'Coding Global', baseUrl: 'https://api.z.ai/api/coding/paas/v4' }],\n defaultBaseUrlPreset: 'coding-global',\n defaultModel: 'glm-5.2',\n models: [\n { id: 'glm-5.2', name: 'GLM 5.2', contextWindow: 1000000, maxTokens: 65536, reasoning: true, input: ['text'] },\n ],\n aliases: ['zai coding', 'zhipu coding global', 'glm coding global'],\n },\n {\n id: 'zhipu-coding-cn',\n displayName: 'Zhipu GLM Coding Plan China',\n description: 'Zhipu GLM coding-plan China endpoint.',\n docsUrl: 'https://docs.bigmodel.cn/cn/guide/start/model-overview',\n apiKeyUrl: 'https://bigmodel.cn/usercenter/proj-mgmt/apikeys',\n pricingUrl: 'https://bigmodel.cn/pricing',\n envVars: ['ZHIPU_API_KEY', 'BIGMODEL_API_KEY', 'ZAI_API_KEY'],\n api: 'openai-completions',\n baseUrlPresets: [{ id: 'coding-cn', label: 'Coding China', baseUrl: 'https://open.bigmodel.cn/api/coding/paas/v4' }],\n defaultBaseUrlPreset: 'coding-cn',\n defaultModel: 'glm-5.2',\n models: [\n { id: 'glm-5.2', name: 'GLM 5.2', contextWindow: 1000000, maxTokens: 65536, reasoning: true, input: ['text'] },\n ],\n aliases: ['zhipu coding', 'glm coding cn', '智谱 coding'],\n },\n {\n id: 'minimax',\n displayName: 'MiniMax',\n description: 'MiniMax text models. Anthropic-compatible endpoint is preferred for agent/tool workflows.',\n docsUrl: 'https://platform.minimax.io/docs',\n apiKeyUrl: 'https://platform.minimax.io/user-center/basic-information/interface-key',\n pricingUrl: 'https://platform.minimax.io/docs/guides/models-intro',\n envVars: ['MINIMAX_API_KEY'],\n api: 'anthropic-messages',\n authHeader: true,\n baseUrlPresets: [\n { id: 'intl-anthropic', label: 'International Anthropic-compatible', baseUrl: 'https://api.minimax.io/anthropic' },\n { id: 'intl-openai', label: 'International OpenAI-compatible', baseUrl: 'https://api.minimax.io/v1' },\n ],\n defaultBaseUrlPreset: 'intl-anthropic',\n defaultModel: 'MiniMax-M3',\n models: MINIMAX_MODELS,\n aliases: ['minimax', 'mini max', 'abab'],\n quirks: ['Switch API type to OpenAI-compatible if you select an /v1 endpoint.'],\n },\n {\n id: 'minimax-cn',\n displayName: 'MiniMax China',\n description: 'MiniMax China endpoint. Anthropic-compatible endpoint is preferred for agent/tool workflows.',\n docsUrl: 'https://platform.minimaxi.com/document',\n apiKeyUrl: 'https://platform.minimaxi.com/user-center/basic-information/interface-key',\n pricingUrl: 'https://platform.minimaxi.com/document/Price',\n envVars: ['MINIMAX_CN_API_KEY', 'MINIMAX_API_KEY'],\n api: 'anthropic-messages',\n authHeader: true,\n baseUrlPresets: [\n { id: 'cn-anthropic', label: 'China Anthropic-compatible', baseUrl: 'https://api.minimaxi.com/anthropic' },\n { id: 'cn-openai', label: 'China OpenAI-compatible', baseUrl: 'https://api.minimaxi.com/v1' },\n ],\n defaultBaseUrlPreset: 'cn-anthropic',\n defaultModel: 'MiniMax-M3',\n models: MINIMAX_MODELS,\n aliases: ['minimax cn', 'mini max cn', 'abab cn'],\n quirks: ['Switch API type to OpenAI-compatible if you select an /v1 endpoint.'],\n },\n] as const satisfies readonly DomesticProviderPreset[];\n\nconst PRESET_BY_ID = new Map<string, DomesticProviderPreset>(\n DOMESTIC_PROVIDER_PRESETS.map((preset) => [preset.id, preset]),\n);\n\nexport function getDomesticProviderPreset(id: string): DomesticProviderPreset | undefined {\n return PRESET_BY_ID.get(id);\n}\n\nexport function getDomesticProviderPresetIds(): string[] {\n return DOMESTIC_PROVIDER_PRESETS.map((preset) => preset.id);\n}\n\nexport function getDomesticProviderBaseUrl(preset: DomesticProviderPreset): string {\n return (\n preset.baseUrlPresets.find((entry) => entry.id === preset.defaultBaseUrlPreset)?.baseUrl ??\n preset.baseUrlPresets[0]?.baseUrl ??\n ''\n );\n}\n\nexport function providerConfigFromDomesticPreset(\n preset: DomesticProviderPreset,\n params: { apiKey?: string; baseUrl?: string; modelIds?: string[] } = {},\n): ProviderConfig {\n const ids = params.modelIds?.length ? params.modelIds : preset.models.map((model) => model.id);\n return {\n baseUrl: params.baseUrl ?? getDomesticProviderBaseUrl(preset),\n apiKey: params.apiKey,\n api: preset.api,\n ...(preset.authHeader === undefined ? {} : { authHeader: preset.authHeader }),\n ...(preset.headers ? { headers: preset.headers } : {}),\n models: ids.map((id) => {\n const model = preset.models.find((entry) => entry.id === id);\n return {\n id,\n name: model?.name ?? id,\n api: preset.api,\n ...(model?.contextWindow ? { contextWindow: model.contextWindow } : {}),\n ...(model?.maxTokens ? { maxTokens: model.maxTokens } : {}),\n ...(model?.reasoning ? { reasoning: model.reasoning } : {}),\n input: model?.input ?? ['text'],\n };\n }),\n };\n}\n"],"mappings":"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"}
@@ -4,6 +4,7 @@ import { hasProviderAuthOnDiskSync, init_sync_provider_auth } from "../auth/sync
4
4
  import { PROVIDER_ENV_MAP, getApiKeyFromEnv, init_env_keys } from "./env-keys.js";
5
5
  import { ModelRegistry, getModelRegistry, init_model_registry, prewarmModelRegistry, resetModelRegistry } from "./model-registry.js";
6
6
  import { CredentialResolver, hasCredentials, init_credentials, resolveApiKey } from "../auth/credentials.js";
7
+ import { getSupplementalModels, init_model_supplements } from "./model-supplements.js";
7
8
  import { getProviderRegistry, init_plugin_registry } from "./plugin-registry.js";
8
9
  import { getModel, getModels, getProviders } from "@earendil-works/pi-ai/compat";
9
10
  //#region src/providers/index.ts
@@ -91,6 +92,8 @@ function resolveModel(ref) {
91
92
  const [provider, modelId] = trimmedRef.split("/");
92
93
  const piAiModel = getModel(provider, modelId);
93
94
  if (piAiModel) return normalizeProviderModel(piAiModel);
95
+ const supplementalModel = getSupplementalModels().find((m) => m.provider === provider && m.id === modelId);
96
+ if (supplementalModel) return normalizeProviderModel(supplementalModel);
94
97
  const plugin = getProviderRegistry().get(provider);
95
98
  if (plugin) {
96
99
  const pluginModel = plugin.models.find((m) => m.id === modelId);
@@ -104,6 +107,8 @@ function resolveModel(ref) {
104
107
  } catch {
105
108
  continue;
106
109
  }
110
+ const supplementalModel = getSupplementalModels().find((m) => m.id === trimmedRef);
111
+ if (supplementalModel) return normalizeProviderModel(supplementalModel);
107
112
  const pluginRegistry = getProviderRegistry();
108
113
  for (const plugin of pluginRegistry.listAll()) {
109
114
  const found = plugin.models.find((m) => m.id === trimmedRef);
@@ -113,10 +118,16 @@ function resolveModel(ref) {
113
118
  }
114
119
  function getModelsByProvider(provider) {
115
120
  const fromRegistry = getModelRegistry().getAll().filter((m) => m.provider === provider).map(normalizeProviderModel);
121
+ const existingIds = new Set(fromRegistry.map((m) => m.id));
122
+ const supplementalModels = getSupplementalModels().filter((m) => m.provider === provider && !existingIds.has(m.id)).map(normalizeProviderModel);
116
123
  const plugin = getProviderRegistry().get(provider);
117
- if (!plugin) return fromRegistry;
124
+ if (!plugin) return [...fromRegistry, ...supplementalModels];
118
125
  const pluginModels = plugin.models.map((m) => pluginModelToModel(provider, m));
119
- return [...fromRegistry, ...pluginModels];
126
+ return [
127
+ ...fromRegistry,
128
+ ...supplementalModels,
129
+ ...pluginModels
130
+ ];
120
131
  }
121
132
  function getAllProviders() {
122
133
  const registry = getModelRegistry();
@@ -202,10 +213,12 @@ async function getConfiguredProviders() {
202
213
  }
203
214
  function getAllModels() {
204
215
  const registryModels = getModelRegistry().getAll().map(normalizeProviderModel);
205
- const pluginProviders = getProviderRegistry().listAll();
206
- if (pluginProviders.length === 0) return registryModels;
207
216
  const existingIds = new Set(registryModels.map((m) => `${m.provider}/${m.id}`));
208
- const merged = [...registryModels];
217
+ const supplementalModels = getSupplementalModels().filter((m) => !existingIds.has(`${m.provider}/${m.id}`)).map(normalizeProviderModel);
218
+ for (const model of supplementalModels) existingIds.add(`${model.provider}/${model.id}`);
219
+ const pluginProviders = getProviderRegistry().listAll();
220
+ if (pluginProviders.length === 0) return [...registryModels, ...supplementalModels];
221
+ const merged = [...registryModels, ...supplementalModels];
209
222
  for (const plugin of pluginProviders) for (const model of plugin.models) {
210
223
  const compositeId = `${plugin.id}/${model.id}`;
211
224
  if (!existingIds.has(compositeId)) {
@@ -297,6 +310,7 @@ var init_providers = __esmMin((() => {
297
310
  init_credentials();
298
311
  init_sync_provider_auth();
299
312
  init_env_keys();
313
+ init_model_supplements();
300
314
  init_plugin_registry();
301
315
  EXTENSION_PROVIDER_BASE_URL = "extension://provider-plugin";
302
316
  OPENAI_CODEX_CANONICAL_BASE_URL = "https://chatgpt.com/backend-api/codex";