{"repo": "30bewater/qshot", "files": {"src/shared/ai-providers.js": {"1610d5280d24b9839ec81c9518f685ec6707c1b7": {"t": 1785745998.3989682, "n": 8120, "h": "60ed1136b05be5c4", "c": "export const AI_PROVIDER_KIND_OPENAI_COMPATIBLE = \"openai-compatible\";\n\nexport const AI_PROVIDERS = {\n deepseek: {\n id: \"deepseek\",\n label: \"DeepSeek\",\n kind: AI_PROVIDER_KIND_OPENAI_COMPATIBLE,\n baseUrl: \"https://api.deepseek.com\",\n apiKeyUrl: \"https://platform.deepseek.com/api_keys\",\n docsUrl: \"https://api-docs.deepseek.com/\",\n defaultModel: \"deepseek-v4-flash\",\n models: [\n { value: \"deepseek-v4-flash\", label: \"deepseek-v4-flash\" },\n { value: \"deepseek-v4-pro\", label: \"deepseek-v4-pro\" },\n { value: \"deepseek-chat\", label: \"deepseek-chat (legacy)\" },\n { value: \"deepseek-reasoner\", label: \"deepseek-reasoner (legacy)\" },\n ],\n },\n kimi: {\n id: \"kimi\",\n label: \"Kimi / Moonshot\",\n kind: AI_PROVIDER_KIND_OPENAI_COMPATIBLE,\n baseUrl: \"https://api.moonshot.cn/v1\",\n apiKeyUrl: \"https://platform.kimi.com/console/api-keys\",\n docsUrl: \"https://platform.moonshot.ai/docs/models\",\n defaultModel: \"kimi-k2.6\",\n models: [\n { value: \"kimi-k2.6\", label: \"kimi-k2.6\" },\n { value: \"kimi-k2.5\", label: \"kimi-k2.5\" },\n { value: \"moonshot-v1-8k\", label: \"moonshot-v1-8k\" },\n { value: \"moonshot-v1-32k\", label: \"moonshot-v1-32k\" },\n { value: \"moonshot-v1-128k\", label: \"moonshot-v1-128k\" },\n { value: \"moonshot-v1-8k-vision-preview\", label: \"moonshot-v1-8k-vision-preview\" },\n { value: \"moonshot-v1-32k-vision-preview\", label: \"moonshot-v1-32k-vision-preview\" },\n { value: \"moonshot-v1-128k-vision-preview\", label: \"moonshot-v1-128k-vision-preview\" },\n ],\n },\n zhipu: {\n id: \"zhipu\",\n label: \"Zhipu GLM\",\n kind: AI_PROVIDER_KIND_OPENAI_COMPATIBLE,\n baseUrl: \"https://open.bigmodel.cn/api/paas/v4\",\n apiKeyUrl: \"https://bigmodel.cn/usercenter/proj-mgmt/apikeys\",\n docsUrl: \"https://docs.bigmodel.cn/cn/guide/models/text/glm-4.7\",\n defaultModel: \"glm-4.7\",\n models: [\n { value: \"glm-4.7\", label: \"glm-4.7\" },\n { value: \"glm-4.7-flash\", label: \"glm-4.7-flash\" },\n { value: \"glm-4.6\", label: \"glm-4.6\" },\n { value: \"glm-4.5\", label: \"glm-4.5\" },\n { value: \"glm-4.5-air\", label: \"glm-4.5-air\" },\n { value: \"glm-4.5-flash\", label: \"glm-4.5-flash\" },\n { value: \"glm-5\", label: \"glm-5\" },\n { value: \"glm-5.1\", label: \"glm-5.1\" },\n { value: \"glm-4-flash\", label: \"glm-4-flash (legacy)\" },\n ],\n },\n qwen: {\n id: \"qwen\",\n label: \"Qwen / DashScope\",\n kind: AI_PROVIDER_KIND_OPENAI_COMPATIBLE,\n baseUrl: \"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n apiKeyUrl: \"https://bailian.console.aliyun.com/?tab=model#/api-key\",\n docsUrl: \"https://help.aliyun.com/zh/model-studio/compatibility-of-openai-with-dashscope\",\n defaultModel: \"qwen3.5-plus\",\n models: [\n { value: \"qwen3.5-plus\", label: \"qwen3.5-plus\" },\n { value: \"qwen3.5-flash\", label: \"qwen3.5-flash\" },\n { value: \"qwen3-max\", label: \"qwen3-max\" },\n { value: \"qwen-plus\", label: \"qwen-plus\" },\n { value: \"qwen-flash\", label: \"qwen-flash\" },\n { value: \"qwen3-coder-plus\", label: \"qwen3-coder-plus\" },\n { value: \"qwen3-coder-flash\", label: \"qwen3-coder-flash\" },\n { value: \"qwen-max\", label: \"qwen-max (legacy)\" },\n { value: \"qwen-turbo\", label: \"qwen-turbo (legacy)\" },\n ],\n },\n minimax: {\n id: \"minimax\",\n label: \"MiniMax\",\n kind: AI_PROVIDER_KIND_OPENAI_COMPATIBLE,\n baseUrl: \"https://api.minimaxi.com/v1\",\n apiKeyUrl: \"https://platform.minimaxi.com/user-center/basic-information/interface-key\",\n docsUrl: \"https://platform.minimaxi.com/docs/api-reference/text-openai-api\",\n defaultModel: \"MiniMax-M2.5\",\n models: [\n { value: \"MiniMax-M2.7\", label: \"MiniMax-M2.7\" },\n { value: \"MiniMax-M2.7-highspeed\", label: \"MiniMax-M2.7-highspeed\" },\n { value: \"MiniMax-M2.5\", label: \"MiniMax-M2.5\" },\n { value: \"MiniMax-M2.5-highspeed\", label: \"MiniMax-M2.5-highspeed\" },\n { value: \"MiniMax-M2.1\", label: \"MiniMax-M2.1\" },\n { value: \"MiniMax-M2.1-highspeed\", label: \"MiniMax-M2.1-highspeed\" },\n { value: \"MiniMax-M2\", label: \"MiniMax-M2\" },\n ],\n allowBaseUrlOverride: true,\n },\n siliconflow: {\n id: \"siliconflow\",\n label: \"SiliconFlow\",\n kind: AI_PROVIDER_KIND_OPENAI_COMPATIBLE,\n baseUrl: \"https://api.siliconflow.cn/v1\",\n apiKeyUrl: \"https://cloud.siliconflow.cn/account/ak\",\n docsUrl: \"https://docs.siliconflow.cn/\",\n defaultModel: \"deepseek-ai/DeepSeek-V4-Flash\",\n models: [\n { value: \"deepseek-ai/DeepSeek-V4-Flash\", label: \"DeepSeek-V4-Flash\" },\n { value: \"Pro/deepseek-ai/DeepSeek-V4-Flash\", label: \"Pro/DeepSeek-V4-Flash\" },\n { value: \"deepseek-ai/DeepSeek-V4-Pro\", label: \"DeepSeek-V4-Pro\" },\n { value: \"Pro/deepseek-ai/DeepSeek-V4-Pro\", label: \"Pro/DeepSeek-V4-Pro\" },\n { value: \"Pro/zai-org/GLM-5\", label: \"GLM-5\" },\n { value: \"Pro/zai-org/GLM-4.7\", label: \"GLM-4.7\" },\n { value: \"zai-org/GLM-4.6\", label: \"GLM-4.6\" },\n { value: \"deepseek-ai/DeepSeek-V3.2\", label: \"DeepSeek-V3.2\" },\n { value: \"Pro/deepseek-ai/DeepSeek-V3.2\", label: \"Pro/DeepSeek-V3.2\" },\n { value: \"deepseek-ai/DeepSeek-R1\", label: \"DeepSeek-R1\" },\n { value: \"Pro/deepseek-ai/DeepSeek-R1\", label: \"Pro/DeepSeek-R1\" },\n { value: \"Qwen/Qwen3.5-397B-A17B\", label: \"Qwen3.5-397B-A17B\" },\n { value: \"Qwen/Qwen3.5-122B-A10B\", label: \"Qwen3.5-122B-A10B\" },\n { value: \"Qwen/Qwen3.5-35B-A3B\", label: \"Qwen3.5-35B-A3B\" },\n { value: \"Qwen/Qwen3.5-27B\", label: \"Qwen3.5-27B\" },\n { value: \"Qwen/Qwen3-32B\", label: \"Qwen3-32B\" },\n { value: \"Qwen/Qwen3-14B\", label: \"Qwen3-14B\" },\n { value: \"Qwen/Qwen3-8B\", label: \"Qwen3-8B\" },\n ],\n },\n openrouter: {\n id: \"openrouter\",\n label: \"OpenRouter\",\n kind: AI_PROVIDER_KIND_OPENAI_COMPATIBLE,\n baseUrl: \"https://openrouter.ai/api/v1\",\n apiKeyUrl: \"https://openrouter.ai/settings/keys\",\n docsUrl: \"https://openrouter.ai/models\",\n defaultModel: \"deepseek/deepseek-v4-flash\",\n models: [\n { value: \"deepseek/deepseek-v4-flash\", label: \"DeepSeek V4 Flash\" },\n { value: \"deepseek/deepseek-v4-pro\", label: \"DeepSeek V4 Pro\" },\n { value: \"moonshotai/kimi-k2.6\", label: \"Kimi K2.6\" },\n { value: \"z-ai/glm-4.7\", label: \"GLM-4.7\" },\n { value: \"anthropic/claude-sonnet-4.6\", label: \"Claude Sonnet 4.6\" },\n { value: \"anthropic/claude-opus-4.7\", label: \"Claude Opus 4.7\" },\n { value: \"openai/gpt-5-mini\", label: \"GPT-5 mini\" },\n { value: \"openai/gpt-5\", label: \"GPT-5\" },\n { value: \"google/gemini-2.5-flash-preview\", label: \"Gemini 2.5 Flash\" },\n ],\n },\n custom: {\n id: \"custom\",\n label: \"Custom OpenAI-compatible\",\n kind: AI_PROVIDER_KIND_OPENAI_COMPATIBLE,\n baseUrl: \"\",\n apiKeyUrl: \"\",\n docsUrl: \"\",\n defaultModel: \"\",\n models: [],\n allowCustomBaseUrl: true,\n allowCustomModel: true,\n },\n};\n\nexport const DEFAULT_AI_PROVIDER_ID = \"deepseek\";\n\nexport function getAiProvider(providerId) {\n return AI_PROVIDERS[providerId] || AI_PROVIDERS[DEFAULT_AI_PROVIDER_ID];\n}\n\nexport function getAiProviderList() {\n return Object.values(AI_PROVIDERS);\n}\n\nexport function getDefaultModelForProvider(providerId) {\n const provider = getAiProvider(providerId);\n return provider.defaultModel || provider.models?.[0]?.value || \"\";\n}\n\nfunction isZhipuThinkingModel(modelId) {\n return /^glm-(4\\.(5|6|7)|5)/.test(modelId);\n}\n\nfunction isMinimaxM2Model(modelId) {\n return /^minimax-m2/.test(modelId);\n}\n\n/**\n * Provider/model-specific chat/completions extras for AI summary requests.\n * Some models reject custom temperature or require thinking to be disabled.\n */\nexport function getAiSummaryRequestExtras(providerId, model) {\n const modelId = String(model || \"\").trim().toLowerCase();\n\n if (providerId === \"kimi\" && modelId.startsWith(\"kimi-k2\")) {\n return { thinking: { type: \"disabled\" } };\n }\n\n if (providerId === \"zhipu\" && isZhipuThinkingModel(modelId)) {\n return { thinking: { type: \"disabled\" } };\n }\n\n if (providerId === \"minimax\" && isMinimaxM2Model(modelId)) {\n return { temperature: 1.0 };\n }\n\n return { temperature: 0.2 };\n}\n"}, "46a610402ac2af12e6d524ea9e69598966370d6c": {"t": 1785758651.296077, "n": 8120, "h": "60ed1136b05be5c4", "c": "export const AI_PROVIDER_KIND_OPENAI_COMPATIBLE = \"openai-compatible\";\n\nexport const AI_PROVIDERS = {\n deepseek: {\n id: \"deepseek\",\n label: \"DeepSeek\",\n kind: AI_PROVIDER_KIND_OPENAI_COMPATIBLE,\n baseUrl: \"https://api.deepseek.com\",\n apiKeyUrl: \"https://platform.deepseek.com/api_keys\",\n docsUrl: \"https://api-docs.deepseek.com/\",\n defaultModel: \"deepseek-v4-flash\",\n models: [\n { value: \"deepseek-v4-flash\", label: \"deepseek-v4-flash\" },\n { value: \"deepseek-v4-pro\", label: \"deepseek-v4-pro\" },\n { value: \"deepseek-chat\", label: \"deepseek-chat (legacy)\" },\n { value: \"deepseek-reasoner\", label: \"deepseek-reasoner (legacy)\" },\n ],\n },\n kimi: {\n id: \"kimi\",\n label: \"Kimi / Moonshot\",\n kind: AI_PROVIDER_KIND_OPENAI_COMPATIBLE,\n baseUrl: \"https://api.moonshot.cn/v1\",\n apiKeyUrl: \"https://platform.kimi.com/console/api-keys\",\n docsUrl: \"https://platform.moonshot.ai/docs/models\",\n defaultModel: \"kimi-k2.6\",\n models: [\n { value: \"kimi-k2.6\", label: \"kimi-k2.6\" },\n { value: \"kimi-k2.5\", label: \"kimi-k2.5\" },\n { value: \"moonshot-v1-8k\", label: \"moonshot-v1-8k\" },\n { value: \"moonshot-v1-32k\", label: \"moonshot-v1-32k\" },\n { value: \"moonshot-v1-128k\", label: \"moonshot-v1-128k\" },\n { value: \"moonshot-v1-8k-vision-preview\", label: \"moonshot-v1-8k-vision-preview\" },\n { value: \"moonshot-v1-32k-vision-preview\", label: \"moonshot-v1-32k-vision-preview\" },\n { value: \"moonshot-v1-128k-vision-preview\", label: \"moonshot-v1-128k-vision-preview\" },\n ],\n },\n zhipu: {\n id: \"zhipu\",\n label: \"Zhipu GLM\",\n kind: AI_PROVIDER_KIND_OPENAI_COMPATIBLE,\n baseUrl: \"https://open.bigmodel.cn/api/paas/v4\",\n apiKeyUrl: \"https://bigmodel.cn/usercenter/proj-mgmt/apikeys\",\n docsUrl: \"https://docs.bigmodel.cn/cn/guide/models/text/glm-4.7\",\n defaultModel: \"glm-4.7\",\n models: [\n { value: \"glm-4.7\", label: \"glm-4.7\" },\n { value: \"glm-4.7-flash\", label: \"glm-4.7-flash\" },\n { value: \"glm-4.6\", label: \"glm-4.6\" },\n { value: \"glm-4.5\", label: \"glm-4.5\" },\n { value: \"glm-4.5-air\", label: \"glm-4.5-air\" },\n { value: \"glm-4.5-flash\", label: \"glm-4.5-flash\" },\n { value: \"glm-5\", label: \"glm-5\" },\n { value: \"glm-5.1\", label: \"glm-5.1\" },\n { value: \"glm-4-flash\", label: \"glm-4-flash (legacy)\" },\n ],\n },\n qwen: {\n id: \"qwen\",\n label: \"Qwen / DashScope\",\n kind: AI_PROVIDER_KIND_OPENAI_COMPATIBLE,\n baseUrl: \"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n apiKeyUrl: \"https://bailian.console.aliyun.com/?tab=model#/api-key\",\n docsUrl: \"https://help.aliyun.com/zh/model-studio/compatibility-of-openai-with-dashscope\",\n defaultModel: \"qwen3.5-plus\",\n models: [\n { value: \"qwen3.5-plus\", label: \"qwen3.5-plus\" },\n { value: \"qwen3.5-flash\", label: \"qwen3.5-flash\" },\n { value: \"qwen3-max\", label: \"qwen3-max\" },\n { value: \"qwen-plus\", label: \"qwen-plus\" },\n { value: \"qwen-flash\", label: \"qwen-flash\" },\n { value: \"qwen3-coder-plus\", label: \"qwen3-coder-plus\" },\n { value: \"qwen3-coder-flash\", label: \"qwen3-coder-flash\" },\n { value: \"qwen-max\", label: \"qwen-max (legacy)\" },\n { value: \"qwen-turbo\", label: \"qwen-turbo (legacy)\" },\n ],\n },\n minimax: {\n id: \"minimax\",\n label: \"MiniMax\",\n kind: AI_PROVIDER_KIND_OPENAI_COMPATIBLE,\n baseUrl: \"https://api.minimaxi.com/v1\",\n apiKeyUrl: \"https://platform.minimaxi.com/user-center/basic-information/interface-key\",\n docsUrl: \"https://platform.minimaxi.com/docs/api-reference/text-openai-api\",\n defaultModel: \"MiniMax-M2.5\",\n models: [\n { value: \"MiniMax-M2.7\", label: \"MiniMax-M2.7\" },\n { value: \"MiniMax-M2.7-highspeed\", label: \"MiniMax-M2.7-highspeed\" },\n { value: \"MiniMax-M2.5\", label: \"MiniMax-M2.5\" },\n { value: \"MiniMax-M2.5-highspeed\", label: \"MiniMax-M2.5-highspeed\" },\n { value: \"MiniMax-M2.1\", label: \"MiniMax-M2.1\" },\n { value: \"MiniMax-M2.1-highspeed\", label: \"MiniMax-M2.1-highspeed\" },\n { value: \"MiniMax-M2\", label: \"MiniMax-M2\" },\n ],\n allowBaseUrlOverride: true,\n },\n siliconflow: {\n id: \"siliconflow\",\n label: \"SiliconFlow\",\n kind: AI_PROVIDER_KIND_OPENAI_COMPATIBLE,\n baseUrl: \"https://api.siliconflow.cn/v1\",\n apiKeyUrl: \"https://cloud.siliconflow.cn/account/ak\",\n docsUrl: \"https://docs.siliconflow.cn/\",\n defaultModel: \"deepseek-ai/DeepSeek-V4-Flash\",\n models: [\n { value: \"deepseek-ai/DeepSeek-V4-Flash\", label: \"DeepSeek-V4-Flash\" },\n { value: \"Pro/deepseek-ai/DeepSeek-V4-Flash\", label: \"Pro/DeepSeek-V4-Flash\" },\n { value: \"deepseek-ai/DeepSeek-V4-Pro\", label: \"DeepSeek-V4-Pro\" },\n { value: \"Pro/deepseek-ai/DeepSeek-V4-Pro\", label: \"Pro/DeepSeek-V4-Pro\" },\n { value: \"Pro/zai-org/GLM-5\", label: \"GLM-5\" },\n { value: \"Pro/zai-org/GLM-4.7\", label: \"GLM-4.7\" },\n { value: \"zai-org/GLM-4.6\", label: \"GLM-4.6\" },\n { value: \"deepseek-ai/DeepSeek-V3.2\", label: \"DeepSeek-V3.2\" },\n { value: \"Pro/deepseek-ai/DeepSeek-V3.2\", label: \"Pro/DeepSeek-V3.2\" },\n { value: \"deepseek-ai/DeepSeek-R1\", label: \"DeepSeek-R1\" },\n { value: \"Pro/deepseek-ai/DeepSeek-R1\", label: \"Pro/DeepSeek-R1\" },\n { value: \"Qwen/Qwen3.5-397B-A17B\", label: \"Qwen3.5-397B-A17B\" },\n { value: \"Qwen/Qwen3.5-122B-A10B\", label: \"Qwen3.5-122B-A10B\" },\n { value: \"Qwen/Qwen3.5-35B-A3B\", label: \"Qwen3.5-35B-A3B\" },\n { value: \"Qwen/Qwen3.5-27B\", label: \"Qwen3.5-27B\" },\n { value: \"Qwen/Qwen3-32B\", label: \"Qwen3-32B\" },\n { value: \"Qwen/Qwen3-14B\", label: \"Qwen3-14B\" },\n { value: \"Qwen/Qwen3-8B\", label: \"Qwen3-8B\" },\n ],\n },\n openrouter: {\n id: \"openrouter\",\n label: \"OpenRouter\",\n kind: AI_PROVIDER_KIND_OPENAI_COMPATIBLE,\n baseUrl: \"https://openrouter.ai/api/v1\",\n apiKeyUrl: \"https://openrouter.ai/settings/keys\",\n docsUrl: \"https://openrouter.ai/models\",\n defaultModel: \"deepseek/deepseek-v4-flash\",\n models: [\n { value: \"deepseek/deepseek-v4-flash\", label: \"DeepSeek V4 Flash\" },\n { value: \"deepseek/deepseek-v4-pro\", label: \"DeepSeek V4 Pro\" },\n { value: \"moonshotai/kimi-k2.6\", label: \"Kimi K2.6\" },\n { value: \"z-ai/glm-4.7\", label: \"GLM-4.7\" },\n { value: \"anthropic/claude-sonnet-4.6\", label: \"Claude Sonnet 4.6\" },\n { value: \"anthropic/claude-opus-4.7\", label: \"Claude Opus 4.7\" },\n { value: \"openai/gpt-5-mini\", label: \"GPT-5 mini\" },\n { value: \"openai/gpt-5\", label: \"GPT-5\" },\n { value: \"google/gemini-2.5-flash-preview\", label: \"Gemini 2.5 Flash\" },\n ],\n },\n custom: {\n id: \"custom\",\n label: \"Custom OpenAI-compatible\",\n kind: AI_PROVIDER_KIND_OPENAI_COMPATIBLE,\n baseUrl: \"\",\n apiKeyUrl: \"\",\n docsUrl: \"\",\n defaultModel: \"\",\n models: [],\n allowCustomBaseUrl: true,\n allowCustomModel: true,\n },\n};\n\nexport const DEFAULT_AI_PROVIDER_ID = \"deepseek\";\n\nexport function getAiProvider(providerId) {\n return AI_PROVIDERS[providerId] || AI_PROVIDERS[DEFAULT_AI_PROVIDER_ID];\n}\n\nexport function getAiProviderList() {\n return Object.values(AI_PROVIDERS);\n}\n\nexport function getDefaultModelForProvider(providerId) {\n const provider = getAiProvider(providerId);\n return provider.defaultModel || provider.models?.[0]?.value || \"\";\n}\n\nfunction isZhipuThinkingModel(modelId) {\n return /^glm-(4\\.(5|6|7)|5)/.test(modelId);\n}\n\nfunction isMinimaxM2Model(modelId) {\n return /^minimax-m2/.test(modelId);\n}\n\n/**\n * Provider/model-specific chat/completions extras for AI summary requests.\n * Some models reject custom temperature or require thinking to be disabled.\n */\nexport function getAiSummaryRequestExtras(providerId, model) {\n const modelId = String(model || \"\").trim().toLowerCase();\n\n if (providerId === \"kimi\" && modelId.startsWith(\"kimi-k2\")) {\n return { thinking: { type: \"disabled\" } };\n }\n\n if (providerId === \"zhipu\" && isZhipuThinkingModel(modelId)) {\n return { thinking: { type: \"disabled\" } };\n }\n\n if (providerId === \"minimax\" && isMinimaxM2Model(modelId)) {\n return { temperature: 1.0 };\n }\n\n return { temperature: 0.2 };\n}\n"}}}}