@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.
- package/README.md +23 -26
- package/README.zh-CN.md +25 -28
- package/dist/browser-ext/icons/icon-128.png +0 -0
- package/dist/browser-ext/icons/icon-16.png +0 -0
- package/dist/browser-ext/icons/icon-32.png +0 -0
- package/dist/browser-ext/icons/icon-48.png +0 -0
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/messaging/process-message.js +5 -8
- package/dist/extensions/weixin/src/messaging/process-message.js.map +1 -1
- package/dist/extensions/weixin/src/plugin.js +11 -1
- package/dist/extensions/weixin/src/plugin.js.map +1 -1
- package/dist/extensions/weixin/src/routing-integration.d.ts +7 -0
- package/dist/extensions/weixin/src/routing-integration.js +17 -0
- package/dist/extensions/weixin/src/routing-integration.js.map +1 -0
- package/dist/gateway/static/root/apple-touch-icon.png +0 -0
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BJYeTxQ9.js → agent-avatar-dicebear-Ab81VpCx.js} +1 -1
- package/dist/gateway/static/root/assets/agents-HCGFJG8I.js +2 -0
- package/dist/gateway/static/root/assets/{app-management-settings-panel-Bj8iJ-7d.js → app-management-settings-panel-DMI_sbnc.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-6TjISbHB.js → appearance-settings-oQiCWQIQ.js} +1 -1
- package/dist/gateway/static/root/assets/{apps-page-DC4YwXLL.js → apps-page-CRYuPIdb.js} +1 -1
- package/dist/gateway/static/root/assets/{archive-plugin-2G62raBg.js → archive-plugin-BaKuWJws.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-kLNJMEJh.js → attachment-load-DYCFtbAA.js} +1 -1
- package/dist/gateway/static/root/assets/{automation-suggestion-card-CpcZSSD8.js → automation-suggestion-card-C6ZIz_B1.js} +1 -1
- package/dist/gateway/static/root/assets/automations-page-DjbtV2VP.js +4 -0
- package/dist/gateway/static/root/assets/{binary-plugins-C_zSrWow.js → binary-plugins-Bdg1hfhV.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-D_PMrT-l.js → block-editor-CEgvbzpG.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-settings-page-C89wKfPd.js → browser-settings-page-KcwlS_iE.js} +1 -1
- package/dist/gateway/static/root/assets/{capability-presets-api-CPFtajl7.js → capability-presets-api-CC3vmrm5.js} +1 -1
- package/dist/gateway/static/root/assets/{capability-presets-settings-panel-DWw31-4v.js → capability-presets-settings-panel-Di4uiKbv.js} +1 -1
- package/dist/gateway/static/root/assets/{channel-recipient-api-BUi8syv2.js → channel-recipient-api-RANYrzfa.js} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-DMa0BEWf.js +1 -0
- package/dist/gateway/static/root/assets/channels-status-swr-BG_j4Ci-.js +1 -0
- package/dist/gateway/static/root/assets/{connectors-page-DCE-PgQF.js → connectors-page-DIZKYaMj.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-BYV16wez.js → desktop-pet-CNnlqbkx.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-DGIaFqPR.js → desktop-pet-settings-ukJCc0LA.js} +1 -1
- package/dist/gateway/static/root/assets/{directory-picker-path-field-BEhDuShd.js → directory-picker-path-field-8hoieEyt.js} +1 -1
- package/dist/gateway/static/root/assets/dreaming-settings-BOrBSNLL.js +3 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-BIjLZMAQ.js → extension-debug-page-D6Jc0hYZ.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-Cxv4Bgj5.js → extension-page-CJMhBASX.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-DNd0tRFl.js → extension-settings-page-Dt-FWyMN.js} +1 -1
- package/dist/gateway/static/root/assets/{fetch-Bl7zMnmd.js → fetch-6HXXdO77.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-api-BiqKIkkp.js → gateway-config-api-CyYi-a3k.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-settings-D_Cvasqi.js → gateway-settings-yJvCmOBC.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-startup-retry-CPOgTcpv.js → gateway-startup-retry-BE1M9fH_.js} +1 -1
- package/dist/gateway/static/root/assets/goal-create-dialog-B3PLFUAl.js +1 -0
- package/dist/gateway/static/root/assets/{goal-detail-page-DF8QhTHH.js → goal-detail-page-BQXW29kk.js} +1 -1
- package/dist/gateway/static/root/assets/{goals-config-api-h26_-2Vm.js → goals-config-api-FU_bdYvR.js} +1 -1
- package/dist/gateway/static/root/assets/{goals-page-BzBKHZJg.js → goals-page-BmppU6mC.js} +1 -1
- package/dist/gateway/static/root/assets/{goals-settings-BFG1uTI8.js → goals-settings-BsXWV6CN.js} +1 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-BqwSCZLD.js +1 -0
- package/dist/gateway/static/root/assets/index-DXUkWmeK.css +1 -0
- package/dist/gateway/static/root/assets/{index-DOetFpTt.js → index-DqFBdoK-.js} +41 -41
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-Dpx1ovO6.js → keyboard-shortcuts-settings-D8J0hkTt.js} +1 -1
- package/dist/gateway/static/root/assets/{logs-page-3QO3elfx.js → logs-page-Cr5ptDtc.js} +1 -1
- package/dist/gateway/static/root/assets/{markdown-split-Ba4EsPkV.js → markdown-split-w-hIAZ9S.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-lA5rvtCq.js → media-plugins-DjFnDy3R.js} +1 -1
- package/dist/gateway/static/root/assets/{messages-Bq4REfIj.js → messages-DR9ODkb8.js} +2 -2
- package/dist/gateway/static/root/assets/{models-hub-panel-BBG87CHZ.js → models-hub-panel-DEsMnITi.js} +1 -1
- package/dist/gateway/static/root/assets/{notes-page-DrUGE-Hn.js → notes-page-D7bHXaeR.js} +1 -1
- package/dist/gateway/static/root/assets/{notes-workbench-eAIE8iKV.js → notes-workbench-DiuG4Ov7.js} +2 -2
- package/dist/gateway/static/root/assets/{page-tabs-Cy7bX7Ce.js → page-tabs-smjfSAwc.js} +1 -1
- package/dist/gateway/static/root/assets/{preview-open-alternatives-B9_iql49.js → preview-open-alternatives-v02THugE.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-Us3zDRE6.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-BcvW8R0Z.js +1 -0
- package/dist/gateway/static/root/assets/{remote-access-hub-C29EWM0P.js → remote-access-hub-Bun2k0V-.js} +1 -1
- package/dist/gateway/static/root/assets/{save-bar-controls-nMloZ0mp.js → save-bar-controls-CD7LPbLU.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-BuajpVNF.js → schedule-field-Cf3p_M0z.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-IeXV_yQk.js → schema-form-D8XdvcNH.js} +1 -1
- package/dist/gateway/static/root/assets/{sessions-page-DHHVDqsy.js → sessions-page-Bh44TVld.js} +1 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-BhyLZ0IW.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-ByixWwvu.js → settings-collapsible-section-BVpPSgMs.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-C-5-n-jM.js → settings-form-section-GAwBG9Vp.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-loading-skeleton-CTA5Gje4.js → settings-loading-skeleton-CGxa3aCb.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-DzqxeemF.js → settings-page-bZKl6uRR.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-layout-DgFTf6nM.js → settings-page-layout-DfbMLJgN.js} +1 -1
- package/dist/gateway/static/root/assets/{setup-status-panel-svpHcJ62.js → setup-status-panel-DBIruh16.js} +1 -1
- package/dist/gateway/static/root/assets/{share-preview-page-IOjU69FC.js → share-preview-page-BglBMvA0.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-C0fR-Oto.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-BG-FEo9B.js +1 -0
- package/dist/gateway/static/root/assets/{skills-page-DoonnYRs.js → skills-page-CwwZOoCH.js} +1 -1
- package/dist/gateway/static/root/assets/{system-settings-panel-BMDD7FXg.js → system-settings-panel-CTT0BkbS.js} +1 -1
- package/dist/gateway/static/root/assets/{typed-models-lib-DayamJ56.js → typed-models-lib-Fa9PjI0-.js} +1 -1
- package/dist/gateway/static/root/assets/{use-channel-catalog-ChYwFiqo.js → use-channel-catalog-BCBfSoHx.js} +1 -1
- package/dist/gateway/static/root/assets/{user-profile-settings-panel-Dd0X3mPv.js → user-profile-settings-panel-pCK-aMqu.js} +1 -1
- package/dist/gateway/static/root/assets/{utils-D9v9ZpK4.js → utils-aleluS3U.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-api-key-field-QXGvjTwa.js → voice-api-key-field-Fh4mqUIK.js} +1 -1
- package/dist/gateway/static/root/assets/{work-item-detail-page-CP-5OUYI.js → work-item-detail-page-C0_3nId3.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-IidqhbUI.js → workflow-run-setup-panel-r969H1r2.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-start-dialog-BQQkr8YD.js → workflow-start-dialog-C1GbcWN0.js} +1 -1
- package/dist/gateway/static/root/assets/{workflows-page-DtVIjVSX.js → workflows-page-DsPM3HEI.js} +1 -1
- package/dist/gateway/static/root/favicon-16x16.png +0 -0
- package/dist/gateway/static/root/favicon-32x32.png +0 -0
- package/dist/gateway/static/root/favicon-icon.svg +179 -15
- package/dist/gateway/static/root/favicon.ico +0 -0
- package/dist/gateway/static/root/favicon.png +0 -0
- package/dist/gateway/static/root/favicon.svg +179 -15
- package/dist/gateway/static/root/index.html +5 -5
- package/dist/gateway/static/root/logo-dark.svg +179 -15
- package/dist/gateway/static/root/logo.svg +179 -15
- package/dist/gateway/static/root/pwa-192x192.png +0 -0
- package/dist/gateway/static/root/pwa-512x512.png +0 -0
- package/dist/package.js +1 -1
- package/dist/src/agent/image/tool-model-config.js +5 -5
- package/dist/src/agent/image/tool-model-config.js.map +1 -1
- package/dist/src/agent/starter-agents.d.ts +1 -0
- package/dist/src/agent/starter-agents.js +38 -11
- package/dist/src/agent/starter-agents.js.map +1 -1
- package/dist/src/agent/transcript/thinking-types.js +2 -0
- package/dist/src/agent/transcript/thinking-types.js.map +1 -1
- package/dist/src/auth/oauth/google-oauth/google-gemini-cli.d.ts +1 -1
- package/dist/src/auth/oauth/google-oauth/google-gemini-cli.js.map +1 -1
- package/dist/src/chat-commands/builtins/model.js +3 -3
- package/dist/src/chat-commands/builtins/model.js.map +1 -1
- package/dist/src/cli/commands/models.js +9 -0
- package/dist/src/cli/commands/models.js.map +1 -1
- package/dist/src/commands/agents.config.d.ts +2 -0
- package/dist/src/commands/agents.config.js +1 -1
- package/dist/src/commands/agents.config.js.map +1 -1
- package/dist/src/config/schema.js +4 -2
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/gateway/hono/routes/status.js +2 -2
- package/dist/src/gateway/hono/routes/status.js.map +1 -1
- package/dist/src/gateway/hono/routes/voice.js +1 -1
- package/dist/src/gateway/hono/routes/voice.js.map +1 -1
- package/dist/src/providers/domestic-presets.d.ts +5 -15
- package/dist/src/providers/domestic-presets.js +31 -49
- package/dist/src/providers/domestic-presets.js.map +1 -1
- package/dist/src/providers/index.js +19 -5
- package/dist/src/providers/index.js.map +1 -1
- package/dist/src/providers/model-registry.js.map +1 -1
- package/dist/src/providers/model-supplements.d.ts +6 -0
- package/dist/src/providers/model-supplements.js +22 -0
- package/dist/src/providers/model-supplements.js.map +1 -0
- package/dist/src/providers/presentation.js +25 -26
- package/dist/src/providers/presentation.js.map +1 -1
- package/dist/src/voice/tts/summarize.js +1 -1
- package/dist/src/voice/tts/summarize.js.map +1 -1
- package/package.json +5 -5
- package/dist/gateway/static/root/assets/agents-kVsY4Iz_.js +0 -2
- package/dist/gateway/static/root/assets/automations-page-MZ8m4bYP.js +0 -4
- package/dist/gateway/static/root/assets/channels-settings-DOYzcMAE.js +0 -1
- package/dist/gateway/static/root/assets/dreaming-settings-BIkgLFDH.js +0 -3
- package/dist/gateway/static/root/assets/goal-create-dialog-DZ68qzpm.js +0 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-5vV8vTva.js +0 -1
- package/dist/gateway/static/root/assets/index-W4ogAiHt.css +0 -1
- package/dist/gateway/static/root/assets/project-detail-page-Cwct6pCV.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-BXZlzV8t.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-hDvmobsT.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-Ddg8gHPN.js +0 -1
- 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-
|
|
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":"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"}
|
|
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': "
|
|
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: "
|
|
291
|
+
readonly defaultModel: "k2p7";
|
|
302
292
|
readonly models: [{
|
|
303
|
-
readonly id: "
|
|
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
|
|
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
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
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
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
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": "
|
|
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: "
|
|
403
|
+
defaultModel: "k2p7",
|
|
422
404
|
models: [{
|
|
423
|
-
id: "
|
|
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
|
|
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":";AAqCA,MAAM,cAA6C;CACjD;EAAE,IAAI;EAAe,MAAM;EAAe,eAAe;EAAS,OAAO,CAAC,QAAQ,QAAQ;EAAE;CAC5F;EAAE,IAAI;EAAgB,MAAM;EAAgB,eAAe;EAAS,OAAO,CAAC,QAAQ,QAAQ;EAAE;CAC9F;EAAE,IAAI;EAAiB,MAAM;EAAiB,eAAe;EAAS,OAAO,CAAC,OAAO;EAAE;CACxF;AAED,MAAM,iBAAgD;CACpD;EAAE,IAAI;EAAkB,MAAM;EAAkB,eAAe;EAAS,WAAW;EAAM,OAAO,CAAC,QAAQ,QAAQ;EAAE;CACnH;EAAE,IAAI;EAAuB,MAAM;EAAuB,eAAe;EAAS,WAAW;EAAM,OAAO,CAAC,QAAQ,QAAQ;EAAE;CAC7H;EAAE,IAAI;EAAkB,MAAM;EAAkB,eAAe;EAAS,WAAW;EAAM,OAAO,CAAC,OAAO;EAAE;CAC3G;AAED,MAAM,cAA6C;CACjD;EAAE,IAAI;EAAiB,MAAM;EAAiB,eAAe;EAAS,WAAW;EAAM,OAAO,CAAC,OAAO;EAAE;CACxG;EAAE,IAAI;EAA4B,MAAM;EAA4B,eAAe;EAAS,WAAW;EAAM,OAAO,CAAC,OAAO;EAAE;CAC9H;EAAE,IAAI;EAAa,MAAM;EAAa,eAAe;EAAS,WAAW;EAAM,OAAO,CAAC,QAAQ,QAAQ;EAAE;CAC1G;AAED,MAAM,iBAAgD;CACpD;EAAE,IAAI;EAAc,MAAM;EAAc,eAAe;EAAS,WAAW;EAAM,OAAO,CAAC,QAAQ,QAAQ;EAAE;CAC3G;EAAE,IAAI;EAA0B,MAAM;EAA0B,eAAe;EAAQ,OAAO,CAAC,OAAO;EAAE;CACxG;EAAE,IAAI;EAAgB,MAAM;EAAgB,eAAe;EAAQ,OAAO,CAAC,OAAO;EAAE;CACrF;AAED,MAAa,4BAA4B;CACvC;EACE,IAAI;EACJ,aAAa;EACb,aAAa;EACb,SAAS;EACT,WAAW;EACX,YAAY;EACZ,SAAS,CAAC,qBAAqB,eAAe;EAC9C,KAAK;EACL,gBAAgB,CACd;GACE,IAAI;GACJ,OAAO;GACP,SAAS;GACV,CACF;EACD,sBAAsB;EACtB,cAAc;EACd,QAAQ;EACR,SAAS;GAAC;GAAQ;GAAU;GAAU;GAAW;GAAa;GAAgB;GAAO;EACrF,QAAQ,CAAC,8EAA8E;EACxF;CACD;EACE,IAAI;EACJ,aAAa;EACb,aAAa;EACb,SAAS;EACT,WAAW;EACX,YAAY;EACZ,SAAS,CAAC,qBAAqB,eAAe;EAC9C,KAAK;EACL,gBAAgB,CACd;GACE,IAAI;GACJ,OAAO;GACP,SAAS;GACV,CACF;EACD,sBAAsB;EACtB,cAAc;EACd,QAAQ;EACR,SAAS;GAAC;GAAa;GAAe;GAAiB;GAAiB;EACxE,QAAQ,CAAC,qEAAqE;EAC/E;CACD;EACE,IAAI;EACJ,aAAa;EACb,aAAa;EACb,SAAS;EACT,WAAW;EACX,SAAS,CAAC,eAAe,qBAAqB;EAC9C,KAAK;EACL,gBAAgB,CACd;GACE,IAAI;GACJ,OAAO;GACP,SAAS;GACT,aAAa;GACd,CACF;EACD,sBAAsB;EACtB,cAAc;EACd,QAAQ,CAAC;GAAE,IAAI;GAAuB,MAAM;GAAmB,eAAe;GAAQ,OAAO,CAAC,OAAO;GAAE,CAAC;EACxG,SAAS;GAAC;GAAU;GAAO;GAAc;GAAU;GAAY;EAC/D,QAAQ,CAAC,2CAA2C;EACrD;CACD;EACE,IAAI;EACJ,aAAa;EACb,aAAa;EACb,SAAS;EACT,WAAW;EACX,SAAS,CAAC,eAAe,qBAAqB;EAC9C,KAAK;EACL,gBAAgB,CACd;GAAE,IAAI;GAAqB,OAAO;GAA6B,SAAS;GAAmD,CAC5H;EACD,sBAAsB;EACtB,cAAc;EACd,QAAQ;GACN;IAAE,IAAI;IAAmB,MAAM;IAAmB,eAAe;IAAQ,WAAW;IAAM,OAAO,CAAC,OAAO;IAAE;GAC3G;IAAE,IAAI;IAAwB,MAAM;IAAwB,eAAe;IAAQ,WAAW;IAAM,OAAO,CAAC,OAAO;IAAE;GACrH;IAAE,IAAI;IAAuB,MAAM;IAAuB,eAAe;IAAQ,WAAW;IAAM,OAAO,CAAC,OAAO;IAAE;GACnH;IAAE,IAAI;IAAwB,MAAM;IAAwB,eAAe;IAAQ,WAAW;IAAM,OAAO,CAAC,OAAO;IAAE;GACtH;EACD,SAAS;GAAC;GAAiB;GAAmB;GAAmB;GAAc;EAChF;CACD;EACE,IAAI;EACJ,aAAa;EACb,aAAa;EACb,SAAS;EACT,WAAW;EACX,SAAS,CAAC,oBAAoB,cAAc;EAC5C,KAAK;EACL,gBAAgB,CACd;GAAE,IAAI;GAAuB,OAAO;GAA4B,SAAS;GAAyD,CACnI;EACD,sBAAsB;EACtB,cAAc;EACd,QAAQ;GACN;IAAE,IAAI;IAAmB,MAAM;IAAmB,eAAe;IAAQ,WAAW;IAAM,OAAO,CAAC,OAAO;IAAE;GAC3G;IAAE,IAAI;IAAwB,MAAM;IAAwB,eAAe;IAAQ,WAAW;IAAM,OAAO,CAAC,OAAO;IAAE;GACrH;IAAE,IAAI;IAAuB,MAAM;IAAuB,eAAe;IAAQ,WAAW;IAAM,OAAO,CAAC,OAAO;IAAE;GACnH;IAAE,IAAI;IAAwB,MAAM;IAAwB,eAAe;IAAQ,WAAW;IAAM,OAAO,CAAC,OAAO;IAAE;GACtH;EACD,SAAS;GAAC;GAAY;GAAiB;GAA8B;EACtE;CACD;EACE,IAAI;EACJ,aAAa;EACb,aAAa;EACb,SAAS;EACT,WAAW;EACX,YAAY;EACZ,SAAS,CAAC,mBAAmB;EAC7B,KAAK;EACL,gBAAgB,CAAC;GAAE,IAAI;GAAW,OAAO;GAAW,SAAS;GAA4B,CAAC;EAC1F,sBAAsB;EACtB,cAAc;EACd,QAAQ,CACN;GAAE,IAAI;GAAmB,MAAM;GAAmB,eAAe;GAAS,WAAW;GAAQ,WAAW;GAAM,OAAO,CAAC,OAAO;GAAE,EAC/H;GAAE,IAAI;GAAqB,MAAM;GAAqB,eAAe;GAAS,WAAW;GAAQ,WAAW;GAAM,OAAO,CAAC,OAAO;GAAE,CACpI;EACD,SAAS;GAAC;GAAa;GAAY;GAAK;EACxC,QAAQ,CAAC,gGAAgG;EAC1G;CACD;EACE,IAAI;EACJ,aAAa;EACb,aAAa;EACb,SAAS;EACT,WAAW;EACX,YAAY;EACZ,SAAS,CAAC,oBAAoB,eAAe;EAC7C,KAAK;EACL,gBAAgB,CAAC;GAAE,IAAI;GAAM,OAAO;GAAS,SAAS;GAA8B,CAAC;EACrF,sBAAsB;EACtB,cAAc;EACd,QAAQ;GACN;IAAE,IAAI;IAAkB,MAAM;IAAkB,eAAe;IAAQ,WAAW;IAAO,WAAW;IAAM,OAAO,CAAC,QAAQ,QAAQ;IAAE;GACpI;IAAE,IAAI;IAAa,MAAM;IAAa,eAAe;IAAQ,OAAO,CAAC,OAAO;IAAE;GAC9E;IAAE,IAAI;IAAa,MAAM;IAAa,eAAe;IAAQ,OAAO,CAAC,OAAO;IAAE;GAC/E;EACD,SAAS;GAAC;GAAQ;GAAY;GAAc;EAC5C,QAAQ,CAAC,0FAA0F;EACpG;CACD;EACE,IAAI;EACJ,aAAa;EACb,aAAa;EACb,SAAS;EACT,WAAW;EACX,YAAY;EACZ,SAAS,CAAC,mBAAmB;EAC7B,KAAK;EACL,gBAAgB,CAAC;GAAE,IAAI;GAAQ,OAAO;GAAiB,SAAS;GAA8B,CAAC;EAC/F,sBAAsB;EACtB,cAAc;EACd,QAAQ;GACN;IAAE,IAAI;IAAkB,MAAM;IAAkB,eAAe;IAAQ,WAAW;IAAO,WAAW;IAAM,OAAO,CAAC,QAAQ,QAAQ;IAAE;GACpI;IAAE,IAAI;IAAa,MAAM;IAAa,eAAe;IAAQ,OAAO,CAAC,OAAO;IAAE;GAC9E;IAAE,IAAI;IAAa,MAAM;IAAa,eAAe;IAAQ,OAAO,CAAC,OAAO;IAAE;GAC/E;EACD,SAAS;GAAC;GAAa;GAAiB;GAAc;EACtD,QAAQ,CAAC,0FAA0F;EACpG;CACD;EACE,IAAI;EACJ,aAAa;EACb,aAAa;EACb,SAAS;EACT,WAAW;EACX,YAAY;EACZ,SAAS,CAAC,gBAAgB,mBAAmB;EAC7C,KAAK;EACL,SAAS,EAAE,cAAc,qBAAqB;EAC9C,gBAAgB,CAAC;GAAE,IAAI;GAAU,OAAO;GAAmB,SAAS;GAAgC,CAAC;EACrG,sBAAsB;EACtB,cAAc;EACd,QAAQ,CACN;GAAE,IAAI;GAAkB,MAAM;GAAkB,eAAe;GAAQ,WAAW;GAAO,WAAW;GAAM,OAAO,CAAC,QAAQ,QAAQ;GAAE,EACpI;GAAE,IAAI;GAAmB,MAAM;GAAa,eAAe;GAAQ,WAAW;GAAO,WAAW;GAAM,OAAO,CAAC,QAAQ,QAAQ;GAAE,CACjI;EACD,SAAS;GAAC;GAAe;GAAa;GAAkB;EACzD;CACD;EACE,IAAI;EACJ,aAAa;EACb,aAAa;EACb,SAAS;EACT,WAAW;EACX,SAAS,CAAC,kBAAkB;EAC5B,KAAK;EACL,gBAAgB,CAAC;GAAE,IAAI;GAAQ,OAAO;GAAiB,SAAS;GAA6B,CAAC;EAC9F,sBAAsB;EACtB,cAAc;EACd,QAAQ;EACR,SAAS;GAAC;GAAQ;GAAW;GAAU;GAAe;EACvD;CACD;EACE,IAAI;EACJ,aAAa;EACb,aAAa;EACb,SAAS;EACT,WAAW;EACX,SAAS,CAAC,kBAAkB;EAC5B,KAAK;EACL,gBAAgB,CAAC;GAAE,IAAI;GAAM,OAAO;GAAS,SAAS;GAA8B,CAAC;EACrF,sBAAsB;EACtB,cAAc;EACd,QAAQ;EACR,SAAS;GAAC;GAAW;GAAc;GAAa;GAAO;EACxD;CACD;EACE,IAAI;EACJ,aAAa;EACb,aAAa;EACb,SAAS;EACT,WAAW;EACX,SAAS,CAAC,kBAAkB;EAC5B,KAAK;EACL,gBAAgB,CAAC;GAAE,IAAI;GAAa,OAAO;GAA2B,SAAS;GAAuC,CAAC;EACvH,sBAAsB;EACtB,cAAc;EACd,QAAQ;EACR,SAAS;GAAC;GAAa;GAAgB;GAAoB;EAC5D;CACD;EACE,IAAI;EACJ,aAAa;EACb,aAAa;EACb,SAAS;EACT,WAAW;EACX,SAAS,CAAC,kBAAkB;EAC5B,KAAK;EACL,gBAAgB,CAAC;GAAE,IAAI;GAAW,OAAO;GAAmB,SAAS;GAAwC,CAAC;EAC9G,sBAAsB;EACtB,cAAc;EACd,QAAQ;EACR,SAAS;GAAC;GAAgB;GAAmB;GAAU;EACxD;CACD;EACE,IAAI;EACJ,aAAa;EACb,aAAa;EACb,SAAS;EACT,WAAW;EACX,YAAY;EACZ,SAAS,CAAC,iBAAiB;EAC3B,KAAK;EACL,gBAAgB,CAAC;GAAE,IAAI;GAAO,OAAO;GAAe,SAAS;GAAiC,CAAC;EAC/F,sBAAsB;EACtB,cAAc;EACd,QAAQ;EACR,SAAS;GAAC;GAAU;GAAQ;GAAa;EACzC,QAAQ,CAAC,iGAAiG;EAC3G;CACD;EACE,IAAI;EACJ,aAAa;EACb,aAAa;EACb,SAAS;EACT,WAAW;EACX,YAAY;EACZ,SAAS,CAAC,gCAAgC,4BAA4B;EACtE,KAAK;EACL,gBAAgB,CAAC;GAAE,IAAI;GAAM,OAAO;GAAS,SAAS;GAA2C,CAAC;EAClG,sBAAsB;EACtB,cAAc;EACd,QAAQ;EACR,SAAS,CAAC,wBAAwB,qBAAqB;EACxD;CACD;EACE,IAAI;EACJ,aAAa;EACb,aAAa;EACb,SAAS;EACT,WAAW;EACX,YAAY;EACZ,SAAS,CAAC,iCAAiC,4BAA4B;EACvE,KAAK;EACL,gBAAgB,CAAC;GAAE,IAAI;GAAO,OAAO;GAAa,SAAS;GAA4C,CAAC;EACxG,sBAAsB;EACtB,cAAc;EACd,QAAQ;EACR,SAAS,CAAC,yBAAyB,sBAAsB;EAC1D;CACD;EACE,IAAI;EACJ,aAAa;EACb,aAAa;EACb,SAAS;EACT,WAAW;EACX,YAAY;EACZ,SAAS,CAAC,iCAAiC,4BAA4B;EACvE,KAAK;EACL,gBAAgB,CAAC;GAAE,IAAI;GAAO,OAAO;GAAa,SAAS;GAA4C,CAAC;EACxG,sBAAsB;EACtB,cAAc;EACd,QAAQ;EACR,SAAS,CAAC,yBAAyB,sBAAsB;EAC1D;CACD;EACE,IAAI;EACJ,aAAa;EACb,aAAa;EACb,SAAS;EACT,WAAW;EACX,YAAY;EACZ,SAAS,CAAC,iBAAiB,mBAAmB;EAC9C,KAAK;EACL,gBAAgB,CAAC;GAAE,IAAI;GAAM,OAAO;GAAS,SAAS;GAAwC,CAAC;EAC/F,sBAAsB;EACtB,cAAc;EACd,QAAQ,CACN;GAAE,IAAI;GAAW,MAAM;GAAW,eAAe;GAAS,WAAW;GAAO,WAAW;GAAM,OAAO,CAAC,OAAO;GAAE,CAC/G;EACD,SAAS;GAAC;GAAS;GAAO;GAAY;GAAS;EAChD;CACD;EACE,IAAI;EACJ,aAAa;EACb,aAAa;EACb,SAAS;EACT,WAAW;EACX,YAAY;EACZ,SAAS,CAAC,eAAe,eAAe;EACxC,KAAK;EACL,gBAAgB,CAAC;GAAE,IAAI;GAAU,OAAO;GAAiB,SAAS;GAAgC,CAAC;EACnG,sBAAsB;EACtB,cAAc;EACd,QAAQ,CACN;GAAE,IAAI;GAAW,MAAM;GAAW,eAAe;GAAS,WAAW;GAAO,WAAW;GAAM,OAAO,CAAC,OAAO;GAAE,CAC/G;EACD,SAAS;GAAC;GAAO;GAAQ;GAAgB;GAAa;EACvD;CACD;EACE,IAAI;EACJ,aAAa;EACb,aAAa;EACb,SAAS;EACT,WAAW;EACX,YAAY;EACZ,SAAS,CAAC,eAAe,eAAe;EACxC,KAAK;EACL,gBAAgB,CAAC;GAAE,IAAI;GAAiB,OAAO;GAAiB,SAAS;GAAuC,CAAC;EACjH,sBAAsB;EACtB,cAAc;EACd,QAAQ,CACN;GAAE,IAAI;GAAW,MAAM;GAAW,eAAe;GAAS,WAAW;GAAO,WAAW;GAAM,OAAO,CAAC,OAAO;GAAE,CAC/G;EACD,SAAS;GAAC;GAAc;GAAuB;GAAoB;EACpE;CACD;EACE,IAAI;EACJ,aAAa;EACb,aAAa;EACb,SAAS;EACT,WAAW;EACX,YAAY;EACZ,SAAS;GAAC;GAAiB;GAAoB;GAAc;EAC7D,KAAK;EACL,gBAAgB,CAAC;GAAE,IAAI;GAAa,OAAO;GAAgB,SAAS;GAA+C,CAAC;EACpH,sBAAsB;EACtB,cAAc;EACd,QAAQ,CACN;GAAE,IAAI;GAAW,MAAM;GAAW,eAAe;GAAS,WAAW;GAAO,WAAW;GAAM,OAAO,CAAC,OAAO;GAAE,CAC/G;EACD,SAAS;GAAC;GAAgB;GAAiB;GAAY;EACxD;CACD;EACE,IAAI;EACJ,aAAa;EACb,aAAa;EACb,SAAS;EACT,WAAW;EACX,YAAY;EACZ,SAAS,CAAC,kBAAkB;EAC5B,KAAK;EACL,YAAY;EACZ,gBAAgB,CACd;GAAE,IAAI;GAAkB,OAAO;GAAsC,SAAS;GAAoC,EAClH;GAAE,IAAI;GAAe,OAAO;GAAmC,SAAS;GAA6B,CACtG;EACD,sBAAsB;EACtB,cAAc;EACd,QAAQ;EACR,SAAS;GAAC;GAAW;GAAY;GAAO;EACxC,QAAQ,CAAC,sEAAsE;EAChF;CACD;EACE,IAAI;EACJ,aAAa;EACb,aAAa;EACb,SAAS;EACT,WAAW;EACX,YAAY;EACZ,SAAS,CAAC,sBAAsB,kBAAkB;EAClD,KAAK;EACL,YAAY;EACZ,gBAAgB,CACd;GAAE,IAAI;GAAgB,OAAO;GAA8B,SAAS;GAAsC,EAC1G;GAAE,IAAI;GAAa,OAAO;GAA2B,SAAS;GAA+B,CAC9F;EACD,sBAAsB;EACtB,cAAc;EACd,QAAQ;EACR,SAAS;GAAC;GAAc;GAAe;GAAU;EACjD,QAAQ,CAAC,sEAAsE;EAChF;CACF;AAED,MAAM,eAAe,IAAI,IACvB,0BAA0B,KAAK,WAAW,CAAC,OAAO,IAAI,OAAO,CAAC,CAC/D;AAED,SAAgB,0BAA0B,IAAgD;AACxF,QAAO,aAAa,IAAI,GAAG;;AAG7B,SAAgB,+BAAyC;AACvD,QAAO,0BAA0B,KAAK,WAAW,OAAO,GAAG;;AAG7D,SAAgB,2BAA2B,QAAwC;AACjF,QACE,OAAO,eAAe,MAAM,UAAU,MAAM,OAAO,OAAO,qBAAqB,EAAE,WACjF,OAAO,eAAe,IAAI,WAC1B;;AAIJ,SAAgB,iCACd,QACA,SAAqE,EAAE,EACvD;CAChB,MAAM,MAAM,OAAO,UAAU,SAAS,OAAO,WAAW,OAAO,OAAO,KAAK,UAAU,MAAM,GAAG;AAC9F,QAAO;EACL,SAAS,OAAO,WAAW,2BAA2B,OAAO;EAC7D,QAAQ,OAAO;EACf,KAAK,OAAO;EACZ,GAAI,OAAO,eAAe,KAAA,IAAY,EAAE,GAAG,EAAE,YAAY,OAAO,YAAY;EAC5E,GAAI,OAAO,UAAU,EAAE,SAAS,OAAO,SAAS,GAAG,EAAE;EACrD,QAAQ,IAAI,KAAK,OAAO;GACtB,MAAM,QAAQ,OAAO,OAAO,MAAM,UAAU,MAAM,OAAO,GAAG;AAC5D,UAAO;IACL;IACA,MAAM,OAAO,QAAQ;IACrB,KAAK,OAAO;IACZ,GAAI,OAAO,gBAAgB,EAAE,eAAe,MAAM,eAAe,GAAG,EAAE;IACtE,GAAI,OAAO,YAAY,EAAE,WAAW,MAAM,WAAW,GAAG,EAAE;IAC1D,GAAI,OAAO,YAAY,EAAE,WAAW,MAAM,WAAW,GAAG,EAAE;IAC1D,OAAO,OAAO,SAAS,CAAC,OAAO;IAChC;IACD;EACH"}
|
|
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 [
|
|
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
|
|
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";
|