@tombcato/ai-selector-vue 0.1.0
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/dist/AIConfigForm.vue.d.ts +29 -0
- package/dist/App.vue.d.ts +3 -0
- package/dist/AuthInput.vue.d.ts +18 -0
- package/dist/BaseUrlInput.vue.d.ts +17 -0
- package/dist/ChatDemo.vue.d.ts +6 -0
- package/dist/ModelSelect.vue.d.ts +22 -0
- package/dist/ProviderSelect.vue.d.ts +17 -0
- package/dist/SmartText.vue.d.ts +9 -0
- package/dist/index.css +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +1707 -0
- package/dist/index.js.map +1 -0
- package/dist/index.umd.cjs +3 -0
- package/dist/index.umd.cjs.map +1 -0
- package/dist/main.d.ts +1 -0
- package/dist/useAIConfig.d.ts +43 -0
- package/package.json +42 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../core/dist/i18n.js","../../core/dist/providers.js","../../core/dist/models.js","../../core/dist/strategies.js","../../core/dist/api.js","../../core/dist/storage.js","../../core/dist/config.js","../src/useAIConfig.ts","../../../node_modules/.pnpm/@tombcato+smart-ticker@1.0._add73ef6986dd10d53023186e7f9a4fd/node_modules/@tombcato/smart-ticker/dist/TickerCore-C7Ejc9kB.js","../../../node_modules/.pnpm/@tombcato+smart-ticker@1.0._add73ef6986dd10d53023186e7f9a4fd/node_modules/@tombcato/smart-ticker/dist/vue.js","../src/SmartText.vue","../src/ProviderSelect.vue","../src/AuthInput.vue","../src/ModelSelect.vue","../src/BaseUrlInput.vue","../src/AIConfigForm.vue"],"sourcesContent":["export const I18N = {\n zh: {\n save: '保存配置',\n saved: '保存成功',\n providerLabel: 'Provider',\n modelLabel: 'Model',\n selectProvider: '选择 Provider...',\n customBaseUrl: '自定义 Base URL',\n apiKeyLabel: 'API Key',\n apiKeyPlaceholder: '输入 API Key...',\n testConnection: '测试模型连接',\n testing: '测试中...',\n testSuccess: '连接成功',\n testFailed: '测试连通性失败',\n selectModel: '选择 Model...',\n searchModel: '搜索或自定义模型...',\n useCustom: '使用自定义',\n noModels: '暂无模型数据',\n apiKeyTip: '输入 API Key 后可获取完整模型列表',\n fetchModelsFailed: '拉取模型列表失败,已使用离线模型列表',\n refreshingModels: '列表刷新中...',\n modelListUpdated: '模型列表已刷新',\n preview: '配置预览',\n unselected: '(未选择)',\n },\n en: {\n save: 'Save Config',\n saved: 'Saved',\n providerLabel: 'Provider',\n modelLabel: 'Model',\n selectProvider: 'Select Provider...',\n customBaseUrl: 'Custom Base URL',\n apiKeyLabel: 'API Key',\n apiKeyPlaceholder: 'Enter API Key...',\n testConnection: 'Test Model Connection',\n testing: 'Testing...',\n testSuccess: 'Connection Successful',\n testFailed: 'Connection Failed',\n selectModel: 'Select Model...',\n searchModel: 'Search or custom models...',\n useCustom: 'Use custom',\n noModels: 'No models found',\n apiKeyTip: 'Enter API Key to fetch full model list',\n fetchModelsFailed: 'Failed to fetch model list, using offline models',\n refreshingModels: 'Refreshing models...',\n modelListUpdated: 'Model list updated',\n preview: 'Config Preview',\n unselected: '(Unselected)',\n }\n};\n//# sourceMappingURL=i18n.js.map","/**\n * AI Provider Selector - Provider Definitions\n * All supported AI providers metadata\n */\nconst ICON_CDN_BASE = 'https://registry.npmmirror.com/@lobehub/icons-static-svg/1.77.0/files/icons';\n// Provider IDs\nexport const PROVIDER_ID = {\n OPENAI: 'openai',\n ANTHROPIC: 'anthropic',\n GEMINI: 'gemini',\n DEEPSEEK: 'deepseek',\n OPENROUTER: 'openrouter',\n GROQ: 'groq',\n MISTRAL: 'mistral',\n MOONSHOT: 'moonshot',\n QWEN: 'qwen',\n ZHIPU: 'zhipu',\n SILICONFLOW: 'siliconflow',\n XAI: 'xai',\n TOGETHER: 'together',\n FIREWORKS: 'fireworks',\n DEEPINFRA: 'deepinfra',\n PERPLEXITY: 'perplexity',\n COHERE: 'cohere',\n OLLAMA: 'ollama',\n DOUBAO: 'doubao',\n MINIMAX: 'minimax',\n};\nexport const PROVIDERS = {\n [PROVIDER_ID.OPENAI]: {\n id: PROVIDER_ID.OPENAI,\n name: 'OpenAI',\n baseUrl: 'https://api.openai.com/v1',\n needsApiKey: true,\n apiFormat: 'openai',\n supportsModelsApi: true,\n icon: `${ICON_CDN_BASE}/openai.svg`,\n },\n [PROVIDER_ID.ANTHROPIC]: {\n id: PROVIDER_ID.ANTHROPIC,\n name: 'Anthropic (Claude)',\n baseUrl: 'https://api.anthropic.com/v1',\n needsApiKey: true,\n apiFormat: 'anthropic',\n supportsModelsApi: false,\n icon: `${ICON_CDN_BASE}/anthropic.svg`,\n },\n [PROVIDER_ID.GEMINI]: {\n id: PROVIDER_ID.GEMINI,\n name: 'Google Gemini',\n baseUrl: 'https://generativelanguage.googleapis.com/v1beta',\n needsApiKey: true,\n apiFormat: 'gemini',\n supportsModelsApi: true,\n icon: `${ICON_CDN_BASE}/gemini.svg`,\n },\n [PROVIDER_ID.OPENROUTER]: {\n id: PROVIDER_ID.OPENROUTER,\n name: 'OpenRouter',\n baseUrl: 'https://openrouter.ai/api/v1',\n needsApiKey: true,\n apiFormat: 'openai',\n supportsModelsApi: true,\n icon: `${ICON_CDN_BASE}/openrouter.svg`,\n },\n [PROVIDER_ID.DEEPSEEK]: {\n id: PROVIDER_ID.DEEPSEEK,\n name: 'DeepSeek',\n baseUrl: 'https://api.deepseek.com',\n needsApiKey: true,\n apiFormat: 'openai',\n supportsModelsApi: true,\n icon: `${ICON_CDN_BASE}/deepseek.svg`,\n },\n [PROVIDER_ID.MOONSHOT]: {\n id: PROVIDER_ID.MOONSHOT,\n name: 'Moonshot (Kimi)',\n baseUrl: 'https://api.moonshot.cn/v1',\n needsApiKey: true,\n apiFormat: 'openai',\n supportsModelsApi: true,\n icon: `${ICON_CDN_BASE}/moonshot.svg`,\n },\n [PROVIDER_ID.QWEN]: {\n id: PROVIDER_ID.QWEN,\n name: '通义千问 (Qwen)',\n baseUrl: 'https://dashscope.aliyuncs.com/compatible-mode/v1',\n needsApiKey: true,\n apiFormat: 'openai',\n supportsModelsApi: true,\n icon: `${ICON_CDN_BASE}/qwen.svg`,\n },\n [PROVIDER_ID.ZHIPU]: {\n id: PROVIDER_ID.ZHIPU,\n name: '智谱 AI (GLM)',\n baseUrl: 'https://open.bigmodel.cn/api/paas/v4',\n needsApiKey: true,\n apiFormat: 'openai',\n supportsModelsApi: true,\n icon: `${ICON_CDN_BASE}/zhipu.svg`,\n },\n [PROVIDER_ID.SILICONFLOW]: {\n id: PROVIDER_ID.SILICONFLOW,\n name: '硅基流动 (siliconflow)',\n baseUrl: 'https://api.siliconflow.cn/v1',\n needsApiKey: true,\n apiFormat: 'openai',\n supportsModelsApi: true,\n icon: `${ICON_CDN_BASE}/siliconcloud.svg`,\n },\n [PROVIDER_ID.DOUBAO]: {\n id: PROVIDER_ID.DOUBAO,\n name: '火山方舟 (Doubao)',\n baseUrl: 'https://ark.cn-beijing.volces.com/api/v3',\n needsApiKey: true,\n apiFormat: 'openai',\n supportsModelsApi: true,\n icon: `${ICON_CDN_BASE}/doubao.svg`,\n },\n [PROVIDER_ID.MINIMAX]: {\n id: PROVIDER_ID.MINIMAX,\n name: 'MiniMax',\n baseUrl: 'https://api.minimax.io/v1',\n needsApiKey: true,\n apiFormat: 'openai',\n supportsModelsApi: false,\n icon: `${ICON_CDN_BASE}/minimax.svg`,\n },\n [PROVIDER_ID.XAI]: {\n id: PROVIDER_ID.XAI,\n name: 'xAI (Grok)',\n baseUrl: 'https://api.x.ai/v1',\n needsApiKey: true,\n apiFormat: 'openai',\n supportsModelsApi: true,\n icon: `${ICON_CDN_BASE}/grok.svg`,\n },\n [PROVIDER_ID.GROQ]: {\n id: PROVIDER_ID.GROQ,\n name: 'Groq',\n baseUrl: 'https://api.groq.com/openai/v1',\n needsApiKey: true,\n apiFormat: 'openai',\n supportsModelsApi: true,\n icon: `${ICON_CDN_BASE}/groq.svg`,\n },\n [PROVIDER_ID.MISTRAL]: {\n id: PROVIDER_ID.MISTRAL,\n name: 'Mistral AI',\n baseUrl: 'https://api.mistral.ai/v1',\n needsApiKey: true,\n apiFormat: 'openai',\n supportsModelsApi: true,\n icon: `${ICON_CDN_BASE}/mistral.svg`,\n },\n [PROVIDER_ID.TOGETHER]: {\n id: PROVIDER_ID.TOGETHER,\n name: 'Together AI',\n baseUrl: 'https://api.together.xyz/v1',\n needsApiKey: true,\n apiFormat: 'openai',\n supportsModelsApi: true,\n icon: `${ICON_CDN_BASE}/together.svg`,\n },\n [PROVIDER_ID.FIREWORKS]: {\n id: PROVIDER_ID.FIREWORKS,\n name: 'Fireworks AI',\n baseUrl: 'https://api.fireworks.ai/inference/v1',\n needsApiKey: true,\n apiFormat: 'openai',\n supportsModelsApi: true,\n icon: `${ICON_CDN_BASE}/fireworks.svg`,\n },\n [PROVIDER_ID.DEEPINFRA]: {\n id: PROVIDER_ID.DEEPINFRA,\n name: 'DeepInfra',\n baseUrl: 'https://api.deepinfra.com/v1/openai',\n needsApiKey: true,\n apiFormat: 'openai',\n supportsModelsApi: true,\n icon: `${ICON_CDN_BASE}/deepinfra.svg`,\n },\n [PROVIDER_ID.PERPLEXITY]: {\n id: PROVIDER_ID.PERPLEXITY,\n name: 'Perplexity',\n baseUrl: 'https://api.perplexity.ai',\n needsApiKey: true,\n apiFormat: 'openai',\n supportsModelsApi: false,\n icon: `${ICON_CDN_BASE}/perplexity.svg`,\n },\n [PROVIDER_ID.COHERE]: {\n id: PROVIDER_ID.COHERE,\n name: 'Cohere',\n baseUrl: 'https://api.cohere.com/v2',\n needsApiKey: true,\n apiFormat: 'cohere',\n supportsModelsApi: true,\n icon: `${ICON_CDN_BASE}/cohere.svg`,\n },\n [PROVIDER_ID.OLLAMA]: {\n id: PROVIDER_ID.OLLAMA,\n name: 'Ollama (Local)',\n baseUrl: 'http://localhost:11434/v1',\n needsApiKey: false,\n apiFormat: 'openai',\n supportsModelsApi: true,\n icon: `${ICON_CDN_BASE}/ollama.svg`,\n },\n};\n/**\n * Get a provider by ID\n */\nexport function getProvider(id) {\n return PROVIDERS[id];\n}\n/**\n * Get all providers as an array\n */\nexport function getAllProviders() {\n return Object.values(PROVIDERS);\n}\n/**\n * Get providers by API format\n */\nexport function getProvidersByFormat(format) {\n return getAllProviders().filter(p => p.apiFormat === format);\n}\n//# sourceMappingURL=providers.js.map","/**\n * AI Provider Selector - Static Model Definitions\n * Models data when API doesn't support /models endpoint\n */\nimport { PROVIDER_ID } from './providers';\nexport const STATIC_MODELS = {\n [PROVIDER_ID.OPENAI]: [\n { id: 'gpt-5.2-pro', name: 'GPT-5.2 Pro' },\n { id: 'gpt-5.2', name: 'GPT-5.2' },\n { id: 'gpt-5', name: 'GPT-5' },\n { id: 'gpt-5-mini', name: 'GPT-5 Mini' },\n { id: 'gpt-5-nano', name: 'GPT-5 Nano' },\n { id: 'gpt-4.1', name: 'GPT-4.1' },\n ],\n [PROVIDER_ID.ANTHROPIC]: [\n { id: 'claude-opus-4.5-20251101', name: 'Claude Opus 4.5' },\n { id: 'claude-opus-4.5-20251101-thinking', name: 'Claude Opus 4.5 Thinking' },\n { id: 'claude-sonnet-4.5-20250929', name: 'Claude Sonnet 4.5' },\n { id: 'claude-sonnet-4.5-20250929-thinking', name: 'Claude Sonnet 4.5 Thinking' },\n { id: 'claude-haiku-4.5-20251001', name: 'Claude Haiku 4.5' },\n { id: 'claude-haiku-4.5-20251001-thinking', name: 'Claude Haiku 4.5 Thinking' },\n { id: 'claude-opus-4.1-20250805', name: 'Claude Opus 4.1' },\n { id: 'claude-opus-4.1-20250805-thinking', name: 'Claude Opus 4.1 Thinking' },\n ],\n [PROVIDER_ID.GEMINI]: [\n { id: 'gemini-3-flash-preview', name: 'Gemini 3 Flash Preview' },\n { id: 'gemini-3-pro-preview', name: 'Gemini 3 Pro Preview' },\n { id: 'gemini-2.5-pro', name: 'Gemini 2.5 Pro' },\n { id: 'gemini-2.5-flash', name: 'Gemini 2.5 Flash' },\n { id: 'gemini-2.5-flash-lite', name: 'Gemini 2.5 Flash-Lite' },\n ],\n [PROVIDER_ID.DEEPSEEK]: [\n { id: 'deepseek-chat', name: 'Deepseek Chat' },\n { id: 'deepseek-reasoner', name: 'Deepseek Reasoner' },\n ],\n [PROVIDER_ID.MISTRAL]: [\n { id: 'mistral-large-latest', name: 'Mistral Large' },\n { id: 'mistral-medium-latest', name: 'Mistral Medium' },\n { id: 'mistral-small-latest', name: 'Mistral Small' },\n { id: 'codestral-latest', name: 'Codestral' },\n { id: 'devstral-latest', name: 'Devstral' },\n { id: 'magistral-medium-latest', name: 'Magistral Medium' },\n { id: 'pixtral-large-latest', name: 'Pixtral Large' },\n { id: 'pixtral-12b-latest', name: 'Pixtral 12B' },\n { id: 'ministral-8b-latest', name: 'Ministral 8B' },\n { id: 'ministral-3b-latest', name: 'Ministral 3B' },\n ],\n [PROVIDER_ID.GROQ]: [\n { id: 'canopylabs/orpheus-v1-english', name: 'Orpheus V1 English' },\n { id: 'canopylabs/orpheus-arabic-saudi', name: 'Orpheus Arabic Saudi' },\n { id: 'moonshotai/kimi-k2-instruct', name: 'Kimi K2 Instruct' },\n { id: 'groq/compound-mini', name: 'Compound Mini' },\n { id: 'llama-3.3-70b-versatile', name: 'Llama 3.3 70B Versatile' },\n { id: 'openai/gpt-oss-120b', name: 'Gpt Oss 120B' },\n { id: 'qwen/qwen3-32b', name: 'Qwen3 32B' },\n { id: 'groq/compound', name: 'Compound' },\n { id: 'meta-llama/llama-4-maverick-17b-128e-instruct', name: 'Llama 4 Maverick 17B 128E Instruct' },\n ],\n [PROVIDER_ID.XAI]: [\n { id: 'grok-4', name: 'Grok 4' },\n { id: 'grok-4-fast', name: 'Grok 4 Fast' },\n { id: 'grok-3-latest', name: 'Grok 3' },\n { id: 'grok-3-fast', name: 'Grok 3 Fast' },\n { id: 'grok-3-mini-latest', name: 'Grok 3 Mini' },\n { id: 'grok-3-mini-fast', name: 'Grok 3 Mini Fast' },\n { id: 'grok-vision-beta', name: 'Grok Vision (Beta)' },\n ],\n [PROVIDER_ID.TOGETHER]: [\n { id: 'Qwen/Qwen2.5-72B-Instruct-Turbo', name: 'Qwen2.5 72B Instruct Turbo' },\n { id: 'Qwen/Qwen3-235B-A22B-Thinking-2507', name: 'Qwen3 235B A22B Thinking 2507' },\n { id: 'deepseek-ai/DeepSeek-R1', name: 'Deepseek R1' },\n { id: 'deepseek-ai/DeepSeek-V3.1', name: 'Deepseek V3.1' },\n { id: 'meta-llama/Llama-3.2-3B-Instruct-Turbo', name: 'Llama 3.2 3B Instruct Turbo' },\n { id: 'meta-llama/Llama-3.3-70B-Instruct-Turbo', name: 'Llama 3.3 70B Instruct Turbo' },\n { id: 'meta-llama/Llama-3.3-70B-Instruct-Turbo-Free', name: 'Llama 3.3 70B Instruct Turbo Free' },\n ],\n [PROVIDER_ID.FIREWORKS]: [\n { id: 'accounts/fireworks/models/llama4-scout-instruct-basic', name: 'Llama4 Scout Instruct Basic' },\n { id: 'accounts/fireworks/models/qwen3-vl-235b-a22b-thinking', name: 'Qwen3 Vl 235B A22B Thinking' },\n { id: 'accounts/fireworks/models/deepseek-v3p2', name: 'Deepseek V3P2' },\n { id: 'accounts/fireworks/models/qwen3-vl-30b-a3b-thinking', name: 'Qwen3 Vl 30B A3B Thinking' },\n { id: 'accounts/fireworks/models/qwen3-8b', name: 'Qwen3 8B' },\n { id: 'accounts/fireworks/models/qwen3-vl-30b-a3b-instruct', name: 'Qwen3 Vl 30B A3B Instruct' },\n { id: 'accounts/fireworks/models/qwen2p5-vl-32b-instruct', name: 'Qwen2P5 Vl 32B Instruct' },\n { id: 'accounts/fireworks/models/llama4-maverick-instruct-basic', name: 'Llama4 Maverick Instruct Basic' },\n { id: 'accounts/fireworks/models/qwen3-235b-a22b-thinking-2507', name: 'Qwen3 235B A22B Thinking 2507' },\n { id: 'accounts/fireworks/models/qwen3-coder-480b-a35b-instruct', name: 'Qwen3 Coder 480B A35B Instruct' },\n ],\n [PROVIDER_ID.DEEPINFRA]: [\n { id: 'meta-llama/Llama-3.2-11B-Vision-Instruct', name: 'Llama 3.2 11B Vision Instruct' },\n { id: 'Qwen/Qwen3-32B', name: 'Qwen3 32B' },\n { id: 'NousResearch/Hermes-3-Llama-3.1-70B', name: 'Hermes 3 Llama 3.1 70B' },\n { id: 'Qwen/Qwen2.5-72B-Instruct', name: 'Qwen2.5 72B Instruct' },\n { id: 'deepseek-ai/DeepSeek-V3-0324', name: 'Deepseek V3 0324' },\n { id: 'Qwen/Qwen3-VL-235B-A22B-Instruct', name: 'Qwen3 Vl 235B A22B Instruct' },\n { id: 'meta-llama/Llama-3.2-3B-Instruct', name: 'Llama 3.2 3B Instruct' },\n { id: 'Qwen/Qwen2.5-VL-32B-Instruct', name: 'Qwen2.5 Vl 32B Instruct' },\n { id: 'meta-llama/Meta-Llama-3.1-8B-Instruct', name: 'Meta Llama 3.1 8B Instruct' },\n { id: 'Qwen/Qwen3-Coder-480B-A35B-Instruct-Turbo', name: 'Qwen3 Coder 480B A35B Instruct Turbo' },\n ],\n [PROVIDER_ID.OPENROUTER]: [\n { id: 'google/gemini-3-flash-preview', name: 'Gemini 3 Flash Preview' },\n { id: 'mistralai/mistral-small-creative', name: 'Mistral Small Creative' },\n { id: 'openai/gpt-5.2-chat', name: 'Gpt 5.2 Chat' },\n { id: 'openai/gpt-5.2-pro', name: 'Gpt 5.2 Pro' },\n { id: 'openai/gpt-5.2', name: 'Gpt 5.2' },\n { id: 'mistralai/devstral-2512', name: 'Devstral 2512' },\n { id: 'openai/gpt-5.1-codex-max', name: 'Gpt 5.1 Codex Max' },\n { id: 'mistralai/ministral-14b-2512', name: 'Ministral 14B 2512' },\n { id: 'mistralai/ministral-8b-2512', name: 'Ministral 8B 2512' },\n { id: 'mistralai/ministral-3b-2512', name: 'Ministral 3B 2512' },\n { id: 'mistralai/mistral-large-2512', name: 'Mistral Large 2512' },\n { id: 'deepseek/deepseek-v3.2-speciale', name: 'Deepseek V3.2 Speciale' },\n ],\n [PROVIDER_ID.PERPLEXITY]: [\n { id: 'codellama-34b-instruct', name: 'Codellama 34B Instruct' },\n { id: 'codellama-70b-instruct', name: 'Codellama 70B Instruct' },\n { id: 'llama-2-70b-chat', name: 'Llama 2 70B Chat' },\n { id: 'llama-3.1-70b-instruct', name: 'Llama 3.1 70B Instruct' },\n { id: 'llama-3.1-8b-instruct', name: 'Llama 3.1 8B Instruct' },\n { id: 'llama-3.1-sonar-huge-128k-online', name: 'Llama 3.1 Sonar Huge 128K Online' },\n { id: 'llama-3.1-sonar-large-128k-chat', name: 'Llama 3.1 Sonar Large 128K Chat' },\n { id: 'llama-3.1-sonar-large-128k-online', name: 'Llama 3.1 Sonar Large 128K Online' },\n { id: 'llama-3.1-sonar-small-128k-chat', name: 'Llama 3.1 Sonar Small 128K Chat' },\n ],\n [PROVIDER_ID.COHERE]: [\n { id: 'command-a-vision-07-2025', name: 'Command A Vision 07 2025' },\n { id: 'command-a-reasoning-08-2025', name: 'Command A Reasoning 08 2025' },\n { id: 'command-r-08-2024', name: 'Command R 08 2024' },\n { id: 'command-r7b-arabic-02-2025', name: 'Command R7B Arabic 02 2025' },\n { id: 'command-r7b-12-2024', name: 'Command R7B 12 2024' },\n ],\n [PROVIDER_ID.MOONSHOT]: [\n { id: 'moonshot-v1-128k', name: 'Moonshot 128K' },\n { id: 'moonshot-v1-32k', name: 'Moonshot 32K' },\n { id: 'moonshot-v1-8k', name: 'Moonshot 8K' },\n { id: 'kimi-k2-0711-chat', name: 'Kimi K2 Chat' },\n { id: 'moonshot-v1-auto', name: 'Moonshot Auto' },\n ],\n [PROVIDER_ID.QWEN]: [\n { id: 'qwen-flash', name: 'Qwen Flash' },\n { id: 'qwen3-vl-plus-2025-12-19', name: 'Qwen3 Vl Plus 2025 12 19' },\n { id: 'qwen3-tts-vd-realtime-2025-12-16', name: 'Qwen3 Tts Vd Realtime 2025 12 16' },\n { id: 'qwen-image-edit-plus-2025-12-15', name: 'Qwen Image Edit Plus 2025 12 15' },\n { id: 'qwen3-omni-flash-2025-12-01', name: 'Qwen3 Omni Flash 2025 12 01' },\n { id: 'qwen3-omni-flash-realtime-2025-12-01', name: 'Qwen3 Omni Flash Realtime 2025 12 01' },\n { id: 'qwen3-livetranslate-flash-2025-12-01', name: 'Qwen3 Livetranslate Flash 2025 12 01' },\n { id: 'qwen3-livetranslate-flash', name: 'Qwen3 Livetranslate Flash' },\n { id: 'qwen-plus-2025-12-01', name: 'Qwen Plus 2025 12 01' },\n { id: 'qwen3-tts-vc-realtime-2025-11-27', name: 'Qwen3 Tts Vc Realtime 2025 11 27' },\n ],\n [PROVIDER_ID.ZHIPU]: [\n { id: 'glm-4.5', name: 'Glm 4.5' },\n { id: 'glm-4.5-air', name: 'Glm 4.5 Air' },\n { id: 'glm-4.6', name: 'Glm 4.6' },\n { id: 'glm-4.7', name: 'Glm 4.7' },\n ],\n [PROVIDER_ID.SILICONFLOW]: [\n { id: 'deepseek-ai/DeepSeek-V3.2', name: 'Deepseek V3.2' },\n { id: 'deepseek-ai/DeepSeek-V3.1-Terminus', name: 'Deepseek V3.1 Terminus' },\n { id: 'deepseek-ai/DeepSeek-R1', name: 'Deepseek R1' },\n { id: 'deepseek-ai/DeepSeek-V3', name: 'Deepseek V3' },\n { id: 'zai-org/GLM-4.6V', name: 'Glm 4.6V' },\n { id: 'zai-org/GLM-4.6', name: 'Glm 4.6' },\n { id: 'Pro/zai-org/GLM-4.7', name: 'Glm 4.7' },\n { id: 'Qwen/Qwen3-VL-32B-Instruct', name: 'Qwen3 Vl 32B Instruct' },\n ],\n [PROVIDER_ID.OLLAMA]: [\n { id: 'llama3.3', name: 'Llama 3.3' },\n { id: 'llama3.2', name: 'Llama 3.2' },\n { id: 'qwq', name: 'QwQ (推理)' },\n { id: 'qwen3:32b', name: 'Qwen3 32B' },\n { id: 'deepseek-r1:32b', name: 'DeepSeek R1 32B' },\n { id: 'deepseek-coder-v2', name: 'DeepSeek Coder V2' },\n { id: 'gemma3:27b', name: 'Gemma 3 27B' },\n { id: 'mistral:7b', name: 'Mistral 7B' },\n { id: 'phi4', name: 'Phi 4' },\n { id: 'codellama', name: 'Code Llama' },\n ],\n [PROVIDER_ID.DOUBAO]: [\n { id: 'doubao-seed-1-8-251215', name: 'Doubao 1.8' },\n { id: \"doubao-seed-1-6-251015\", name: \"Doubao 1.6\" },\n { id: 'doubao-seed-1-6-lite-251015', name: 'Doubao 1.6 Lite' },\n { id: 'doubao-seed-1-6-flash-250828', name: 'Doubao 1.6 Flash' },\n { id: 'doubao-seed-1-6-thinking-250615', name: 'Doubao 1.6 Thinking' },\n ],\n [PROVIDER_ID.MINIMAX]: [\n { id: 'MiniMax-M2.1', name: 'MiniMax M2.1' },\n { id: 'MiniMax-M2.1-lightning', name: 'MiniMax M2.1 Lightning' },\n { id: 'MiniMax-M2', name: 'MiniMax M2' },\n ],\n};\n/**\n * Get static models for a provider\n */\nexport function getStaticModels(providerId) {\n return STATIC_MODELS[providerId] || [];\n}\n//# sourceMappingURL=models.js.map","export const defaultParseModelsResponse = (data) => {\n if (Array.isArray(data?.data)) {\n return data.data\n .filter((m) => m.id)\n .map((m) => {\n const name = m.name ||\n (m.id.split('/').pop() ?? '')\n .replace(/[-_]/g, ' ')\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n return {\n id: m.id,\n name,\n created: m.created || 0,\n };\n })\n .sort((a, b) => (b.created || 0) - (a.created || 0)); // 最新的排在前面\n }\n return [];\n};\nconst openaiStrategy = {\n format: 'openai',\n getModelsEndpoint: (baseUrl) => `${baseUrl}/models`,\n getChatEndpoint: (baseUrl) => `${baseUrl}/chat/completions`,\n buildHeaders: (apiKey) => ({\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n }),\n buildChatPayload: (model, messages, maxTokens) => ({\n model,\n messages,\n max_tokens: maxTokens,\n }),\n parseChatResponse: (data) => {\n return data.choices?.[0]?.message?.content || '';\n },\n};\nconst anthropicStrategy = {\n format: 'anthropic',\n getChatEndpoint: (baseUrl) => `${baseUrl}/messages`,\n buildHeaders: (apiKey) => ({\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n }),\n buildChatPayload: (model, messages, maxTokens) => ({\n model,\n messages,\n max_tokens: maxTokens,\n }),\n parseChatResponse: (data) => {\n return data.content?.[0]?.text || '';\n },\n};\nconst geminiStrategy = {\n format: 'gemini',\n getModelsEndpoint: (baseUrl, apiKey) => `${baseUrl}/models?key=${apiKey}`,\n getChatEndpoint: (baseUrl, apiKey, model) => `${baseUrl}/models/${model}:generateContent?key=${apiKey}`,\n buildHeaders: () => ({\n 'Content-Type': 'application/json',\n }),\n buildChatPayload: (_model, messages, maxTokens) => {\n // 转换 OpenAI 格式的 messages 为 Gemini 格式\n const contents = messages.map(m => ({\n role: m.role === 'assistant' ? 'model' : 'user',\n parts: [{ text: m.content }],\n }));\n return {\n contents,\n generationConfig: { maxOutputTokens: maxTokens },\n };\n },\n parseChatResponse: (data) => {\n return data.candidates?.[0]?.content?.parts?.[0]?.text || '';\n },\n // Gemini 返回格式: { models: [{ name: \"models/gemini-pro\", ... }] }\n parseModelsResponse: (data) => {\n if (Array.isArray(data.models)) {\n return data.models\n .filter((m) => m.supportedGenerationMethods?.includes('generateContent'))\n .map((m) => ({\n id: m.name.replace('models/', ''), // \"models/gemini-pro\" -> \"gemini-pro\"\n name: m.displayName || m.name.replace('models/', ''),\n created: m.created || 0,\n }))\n .sort((a, b) => (b.created || 0) - (a.created || 0));\n }\n return [];\n },\n};\nconst cohereStrategy = {\n format: 'cohere',\n getModelsEndpoint: (baseUrl) => `${baseUrl}/models`,\n getChatEndpoint: (baseUrl) => `${baseUrl}/chat`,\n buildHeaders: (apiKey) => ({\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n }),\n buildChatPayload: (model, messages, maxTokens) => {\n // Cohere 使用不同的格式: message 是当前消息, chat_history 是历史\n const lastMessage = messages[messages.length - 1];\n const chatHistory = messages.slice(0, -1).map(m => ({\n role: m.role === 'assistant' ? 'CHATBOT' : 'USER',\n message: m.content,\n }));\n return {\n model,\n message: lastMessage.content,\n chat_history: chatHistory,\n max_tokens: maxTokens,\n };\n },\n parseChatResponse: (data) => {\n return data.text || '';\n },\n};\nexport const strategyRegistry = {\n openai: openaiStrategy,\n anthropic: anthropicStrategy,\n gemini: geminiStrategy,\n cohere: cohereStrategy,\n};\nexport function getStrategy(format) {\n return strategyRegistry[format] || openaiStrategy;\n}\n/**\n * 纯前端直连 AI 厂商进行聊天\n * 注意: 这会将 API Key 暴露在浏览器中,仅适用于 Demo/测试场景\n */\nexport async function sendDirectChat(options) {\n const { apiFormat, baseUrl, apiKey, model, messages, maxTokens = 2048 } = options;\n const strategy = getStrategy(apiFormat);\n const endpoint = strategy.getChatEndpoint(baseUrl, apiKey, model);\n const headers = strategy.buildHeaders(apiKey);\n const payload = strategy.buildChatPayload(model, messages, maxTokens);\n const startTime = performance.now();\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\n });\n const latencyMs = Math.round(performance.now() - startTime);\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n return {\n success: false,\n message: errorData.error?.message || `HTTP ${response.status}: ${response.statusText}`,\n latencyMs,\n };\n }\n const data = await response.json();\n const content = strategy.parseChatResponse(data);\n return {\n success: true,\n content,\n latencyMs,\n };\n }\n catch (e) {\n return {\n success: false,\n message: e instanceof Error ? e.message : '网络错误',\n };\n }\n}\n/**\n * 测试 AI 厂商连接 (通过发送一个简单的聊天请求)\n */\nexport async function testDirectConnection(options) {\n const result = await sendDirectChat({\n apiFormat: options.apiFormat,\n baseUrl: options.baseUrl,\n apiKey: options.apiKey,\n model: options.model,\n messages: [{ role: 'user', content: 'Hi' }],\n maxTokens: 5, // 最小 token 数,节省成本\n });\n return {\n success: result.success,\n latencyMs: result.latencyMs,\n message: result.success ? undefined : result.message,\n };\n}\n//# sourceMappingURL=strategies.js.map","/**\n * AI Provider Selector - API Functions\n * Connection testing and model fetching logic\n */\nimport { getStaticModels } from './models';\nimport { getStrategy, defaultParseModelsResponse } from './strategies';\nconst DEFAULT_TIMEOUT = 30000;\n/**\n * Test connection to an AI provider\n */\nexport async function testConnection(options) {\n const { provider, apiKey, model, baseUrl, proxyUrl } = options;\n const actualBaseUrl = baseUrl || provider.baseUrl;\n const startTime = Date.now();\n try {\n // If proxy URL is provided, use it\n if (proxyUrl) {\n const response = await fetch(`${proxyUrl}/test`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n provider_id: provider.id,\n api_key: apiKey,\n model: model || '',\n base_url: baseUrl || provider.baseUrl,\n api_format: provider.apiFormat,\n }),\n });\n const data = await response.json();\n return {\n success: data.success,\n latencyMs: data.latency_ms || (Date.now() - startTime),\n message: data.message,\n };\n }\n // Direct API call (for browser-compatible providers)\n const strategy = getStrategy(provider.apiFormat);\n const targetModel = model || '';\n // If no model provided, we cannot test (user must select model first)\n if (!targetModel) {\n return {\n success: false,\n latencyMs: 0,\n message: '请先选择模型 (Please select a model)'\n };\n }\n const headers = strategy.buildHeaders(apiKey);\n // 使用聊天接口进行测试,发送最简单的请求\n const testPayload = strategy.buildChatPayload(targetModel, [{ role: 'user', content: 'Hi' }], 5);\n const endpoint = strategy.getChatEndpoint(actualBaseUrl, apiKey, targetModel);\n const response = await fetch(endpoint, {\n method: 'POST',\n headers,\n body: JSON.stringify(testPayload),\n });\n const latencyMs = Date.now() - startTime;\n if (response.ok) {\n return { success: true, latencyMs, message: '连接成功' };\n }\n else {\n const errorText = await response.text();\n return {\n success: false,\n latencyMs,\n message: `HTTP ${response.status}: ${errorText.slice(0, 200)}`\n };\n }\n }\n catch (error) {\n return {\n success: false,\n latencyMs: Date.now() - startTime,\n message: error instanceof Error ? error.message : String(error),\n };\n }\n}\n/**\n * Fetch available models from a provider\n */\nexport async function fetchModels(options) {\n const { provider, apiKey, baseUrl, proxyUrl, fallbackToStatic = true } = options;\n // If proxy URL is provided, use it\n if (proxyUrl) {\n try {\n const response = await fetch(`${proxyUrl}/models`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n provider_id: provider.id,\n api_key: apiKey || undefined,\n base_url: baseUrl || provider.baseUrl,\n }),\n });\n const data = await response.json();\n if (data.success && data.models?.length > 0) {\n return data.models;\n }\n }\n catch (error) {\n console.warn('Failed to fetch models via proxy:', error);\n if (!fallbackToStatic)\n throw error;\n }\n }\n // Direct API call\n if (!proxyUrl && provider.supportsModelsApi) {\n try {\n const strategy = getStrategy(provider.apiFormat);\n if (strategy.getModelsEndpoint) {\n const endpoint = strategy.getModelsEndpoint(baseUrl || provider.baseUrl, apiKey || '');\n const headers = strategy.buildHeaders(apiKey || '');\n const response = await fetch(endpoint, {\n method: 'GET',\n headers\n });\n if (response.ok) {\n const data = await response.json();\n const parser = strategy.parseModelsResponse || defaultParseModelsResponse;\n return parser(data);\n }\n else {\n if (!fallbackToStatic)\n throw new Error(`HTTP ${response.status}`);\n }\n }\n }\n catch (e) {\n console.warn('Failed to fetch models directly:', e);\n if (!fallbackToStatic)\n throw e;\n }\n }\n if (!fallbackToStatic && provider.supportsModelsApi) {\n throw new Error('Failed to fetch models');\n }\n // Fallback to static models\n return getStaticModels(provider.id);\n}\n//# sourceMappingURL=api.js.map","/**\n * AI Provider Selector - Storage Utilities\n * Abstraction layer for config persistence\n */\nconst STORAGE_KEY = 'ai_provider_config';\n/**\n * Default localStorage adapter\n */\nexport const localStorageAdapter = {\n get: (key) => {\n if (typeof window === 'undefined')\n return null;\n return localStorage.getItem(key);\n },\n set: (key, value) => {\n if (typeof window === 'undefined')\n return;\n localStorage.setItem(key, value);\n },\n remove: (key) => {\n if (typeof window === 'undefined')\n return;\n localStorage.removeItem(key);\n },\n};\nexport function createConfigStorage(adapter = localStorageAdapter, options = {}) {\n const serialize = options.serialize || JSON.stringify;\n const deserialize = options.deserialize || JSON.parse;\n return {\n /**\n * Save AI config\n */\n save(config) {\n try {\n const serialized = serialize(config);\n adapter.set(STORAGE_KEY, serialized);\n }\n catch (e) {\n console.error('Failed to save config:', e);\n }\n },\n /**\n * Load AI config\n */\n load() {\n const raw = adapter.get(STORAGE_KEY);\n if (!raw)\n return null;\n try {\n return deserialize(raw);\n }\n catch (e) {\n console.error('Failed to load config:', e);\n return null;\n }\n },\n /**\n * Clear AI config\n */\n clear() {\n adapter.remove(STORAGE_KEY);\n },\n };\n}\n//# sourceMappingURL=storage.js.map","/**\n * AI Provider Selector - Config Resolution\n * Resolves ProviderConfig into a list of providers and models\n */\nimport { PROVIDERS } from './providers';\nimport { getStaticModels } from './models';\n/**\n * Resolve a ProviderConfig into usable providers and models\n */\nexport function resolveProviderConfig(config) {\n // Default config: use all built-in providers\n if (!config) {\n return {\n providers: Object.values(PROVIDERS),\n getModels: (providerId) => getStaticModels(providerId),\n };\n }\n const { mode, include, exclude, custom } = config;\n let providers = [];\n // Handle built-in providers based on mode\n if (mode === 'default') {\n let builtInProviders = Object.values(PROVIDERS);\n // Apply include filter\n if (include && include.length > 0) {\n builtInProviders = builtInProviders.filter(p => include.includes(p.id));\n }\n // Apply exclude filter\n if (exclude && exclude.length > 0) {\n builtInProviders = builtInProviders.filter(p => !exclude.includes(p.id));\n }\n providers = [...builtInProviders];\n }\n // Handle custom providers\n const customModelsMap = {};\n if (custom) {\n for (const [id, def] of Object.entries(custom)) {\n const customProvider = {\n id,\n name: def.name,\n baseUrl: def.baseUrl,\n needsApiKey: def.needsApiKey,\n apiFormat: def.apiFormat,\n supportsModelsApi: def.supportsModelsApi ?? false,\n icon: def.icon,\n };\n // Check if provider already exists (for override)\n const existingIndex = providers.findIndex(p => p.id === id);\n if (existingIndex >= 0) {\n // Merge/Override existing provider\n // We keep the original icon if custom doesn't provide one\n providers[existingIndex] = {\n ...providers[existingIndex],\n ...customProvider,\n icon: customProvider.icon || providers[existingIndex].icon\n };\n }\n else {\n // Add new provider\n providers.push(customProvider);\n }\n // Store custom models if provided\n if (def.models && def.models.length > 0) {\n customModelsMap[id] = def.models;\n }\n }\n }\n // Create getModels function that checks custom models first\n const getModels = (providerId) => {\n // Check custom models first\n if (customModelsMap[providerId]) {\n return customModelsMap[providerId];\n }\n // Fall back to static models\n return getStaticModels(providerId);\n };\n return { providers, getModels };\n}\n/**\n * Get a single provider by ID from config\n */\nexport function getProviderFromConfig(providerId, config) {\n const { providers } = resolveProviderConfig(config);\n return providers.find(p => p.id === providerId) || null;\n}\n//# sourceMappingURL=config.js.map","import { ref, computed, watch, onMounted } from 'vue';\r\nimport {\r\n testConnection,\r\n createConfigStorage,\r\n resolveProviderConfig,\r\n type Model,\r\n type AIConfig,\r\n type TestConnectionResult,\r\n type ProviderConfig,\r\n fetchModels,\r\n type ModelFetcher,\r\n} from '@tombcato/ai-selector-core';\r\n\r\nexport interface UseAIConfigOptions {\r\n proxyUrl?: string;\r\n initialConfig?: Partial<AIConfig>;\r\n providerConfig?: ProviderConfig;\r\n onSerialize?: (data: any) => string;\r\n onDeserialize?: (data: string) => any;\r\n modelFetcher?: ModelFetcher;\r\n}\r\n\r\nexport function useAIConfig(options: UseAIConfigOptions = {}) {\r\n const providerId = ref(options.initialConfig?.providerId || '');\r\n const apiKey = ref(options.initialConfig?.apiKey || '');\r\n const model = ref(options.initialConfig?.model || '');\r\n const modelName = ref(options.initialConfig?.modelName || '');\r\n const baseUrl = ref(options.initialConfig?.baseUrl || '');\r\n\r\n const models = ref<Model[]>([]);\r\n const testStatus = ref<'idle' | 'testing' | 'success' | 'error'>('idle');\r\n const testResult = ref<TestConnectionResult | null>(null);\r\n const isFetchingModels = ref(false);\r\n const fetchModelError = ref<string | null>(null);\r\n\r\n // Resolve provider config\r\n const resolvedConfig = computed(() => resolveProviderConfig(options.providerConfig));\r\n const allProviders = computed(() => resolvedConfig.value.providers);\r\n\r\n const provider = computed(() =>\r\n allProviders.value.find(p => p.id === providerId.value) || null\r\n );\r\n\r\n const storage = createConfigStorage(undefined, {\r\n serialize: options.onSerialize,\r\n deserialize: options.onDeserialize\r\n });\r\n\r\n // Flag to prevent clearing data during initial load\r\n const isLoaded = ref(false);\r\n\r\n // Load config\r\n onMounted(() => {\r\n const saved = storage.load();\r\n if (saved) {\r\n // Only load if provider exists in current config\r\n if (saved.providerId && allProviders.value.some(p => p.id === saved.providerId)) {\r\n providerId.value = saved.providerId;\r\n if (saved.apiKey) apiKey.value = saved.apiKey;\r\n if (saved.model) model.value = saved.model;\r\n if (saved.modelName) modelName.value = saved.modelName;\r\n if (saved.baseUrl) baseUrl.value = saved.baseUrl;\r\n }\r\n }\r\n setTimeout(() => { isLoaded.value = true; }, 0);\r\n });\r\n\r\n // Watch for provider changes to reset fields\r\n watch(providerId, () => {\r\n if (!isLoaded.value) return;\r\n apiKey.value = '';\r\n model.value = '';\r\n modelName.value = '';\r\n baseUrl.value = '';\r\n testStatus.value = 'idle';\r\n testResult.value = null;\r\n });\r\n\r\n // Watch for provider/apikey/baseurl to update models (with caching)\r\n let fetchTimer: any = null;\r\n const modelCache = new Map<string, Model[]>();\r\n\r\n watch([providerId, apiKey, baseUrl], () => {\r\n if (fetchTimer) clearTimeout(fetchTimer);\r\n\r\n if (!providerId.value || !provider.value) {\r\n models.value = [];\r\n fetchModelError.value = null;\r\n isFetchingModels.value = false;\r\n return;\r\n }\r\n\r\n const shouldFetch = provider.value.supportsModelsApi && (!provider.value.needsApiKey || !!apiKey.value);\r\n const actualBaseUrl = baseUrl.value || provider.value.baseUrl;\r\n const cacheKey = `${providerId.value}|${actualBaseUrl}|${apiKey.value}`;\r\n\r\n // Check cache first\r\n const cachedModels = modelCache.get(cacheKey);\r\n if (cachedModels) {\r\n models.value = cachedModels;\r\n fetchModelError.value = null;\r\n isFetchingModels.value = false;\r\n return;\r\n }\r\n\r\n if (!shouldFetch) {\r\n const staticModels = resolvedConfig.value.getModels(providerId.value);\r\n models.value = staticModels;\r\n modelCache.set(cacheKey, staticModels);\r\n fetchModelError.value = null;\r\n isFetchingModels.value = false;\r\n return;\r\n }\r\n\r\n // Set fetching immediately to fill debounce gap\r\n isFetchingModels.value = true;\r\n fetchModelError.value = null;\r\n\r\n // Pre-fill with static models if empty to avoid flicker\r\n if (models.value.length === 0) {\r\n models.value = resolvedConfig.value.getModels(providerId.value);\r\n }\r\n\r\n fetchTimer = setTimeout(async () => {\r\n try {\r\n let fetchedModels: Model[];\r\n\r\n if (options.modelFetcher) {\r\n fetchedModels = await options.modelFetcher({\r\n type: 'fetchModels',\r\n providerId: provider.value!.id,\r\n baseUrl: actualBaseUrl,\r\n apiKey: apiKey.value\r\n });\r\n } else {\r\n fetchedModels = await fetchModels({\r\n provider: provider.value!,\r\n apiKey: apiKey.value,\r\n baseUrl: actualBaseUrl,\r\n proxyUrl: options.proxyUrl,\r\n fallbackToStatic: false\r\n });\r\n }\r\n models.value = fetchedModels;\r\n modelCache.set(cacheKey, fetchedModels);\r\n } catch (e) {\r\n console.warn('Model fetch failed:', e);\r\n fetchModelError.value = 'fetchModelsFailed';\r\n models.value = resolvedConfig.value.getModels(providerId.value);\r\n // Don't cache failed results\r\n } finally {\r\n isFetchingModels.value = false;\r\n }\r\n }, 500);\r\n }, { immediate: true });\r\n\r\n // Reset test status when apiKey/baseUrl changes while in error/success state\r\n watch([apiKey, baseUrl], () => {\r\n if (testStatus.value === 'error' || testStatus.value === 'success') {\r\n testStatus.value = 'idle';\r\n testResult.value = null;\r\n }\r\n });\r\n\r\n // Actions\r\n async function runTest() {\r\n if (!provider.value) return;\r\n if (provider.value.needsApiKey && !apiKey.value) return;\r\n\r\n testStatus.value = 'testing';\r\n testResult.value = null;\r\n\r\n let result: TestConnectionResult;\r\n\r\n if (options.modelFetcher) {\r\n try {\r\n const fetcherResult = await options.modelFetcher({\r\n type: 'checkConnection',\r\n providerId: provider.value.id,\r\n baseUrl: baseUrl.value || provider.value.baseUrl,\r\n apiKey: apiKey.value,\r\n modelId: model.value\r\n });\r\n result = {\r\n success: fetcherResult.success,\r\n latencyMs: fetcherResult.latency || fetcherResult.latencyMs,\r\n message: fetcherResult.message\r\n };\r\n } catch (e: any) {\r\n result = { success: false, message: e.message || 'Unknown error' };\r\n }\r\n } else {\r\n result = await testConnection({\r\n provider: provider.value,\r\n apiKey: apiKey.value,\r\n baseUrl: baseUrl.value,\r\n model: model.value,\r\n proxyUrl: options.proxyUrl\r\n });\r\n }\r\n\r\n testResult.value = result;\r\n testStatus.value = result.success ? 'success' : 'error';\r\n\r\n // Auto-revert to idle (always 2s)\r\n setTimeout(() => {\r\n testStatus.value = 'idle';\r\n }, 2000);\r\n\r\n return result;\r\n }\r\n\r\n function save() {\r\n const foundModel = models.value.find(m => m.id === model.value);\r\n const nameToSave = foundModel?.name || modelName.value || model.value;\r\n\r\n if (foundModel?.name && foundModel.name !== modelName.value) {\r\n modelName.value = foundModel.name;\r\n }\r\n\r\n storage.save({\r\n providerId: providerId.value,\r\n apiKey: apiKey.value,\r\n model: model.value,\r\n modelName: nameToSave,\r\n baseUrl: baseUrl.value\r\n });\r\n }\r\n\r\n function clear() {\r\n storage.clear();\r\n providerId.value = '';\r\n apiKey.value = '';\r\n model.value = '';\r\n modelName.value = '';\r\n baseUrl.value = '';\r\n }\r\n\r\n // Select a model (sets both id and name)\r\n function selectModel(modelId: string, name?: string) {\r\n model.value = modelId;\r\n // 如果提供了 name 就用,否则从 models 列表查找,最后用 id\r\n if (name) {\r\n modelName.value = name;\r\n } else {\r\n const found = models.value.find(m => m.id === modelId);\r\n modelName.value = found?.name || modelId;\r\n }\r\n }\r\n\r\n const isValid = computed(() => {\r\n if (!providerId.value || !model.value) return false;\r\n if (provider.value?.needsApiKey && !apiKey.value) return false;\r\n return true;\r\n });\r\n\r\n const currentConfig = computed<AIConfig>(() => ({\r\n providerId: providerId.value,\r\n apiKey: apiKey.value,\r\n model: model.value,\r\n modelName: modelName.value,\r\n baseUrl: baseUrl.value || provider.value?.baseUrl || ''\r\n }));\r\n\r\n return {\r\n // State (Refs)\r\n providerId,\r\n apiKey,\r\n model,\r\n modelName,\r\n baseUrl,\r\n models,\r\n testStatus,\r\n testResult,\r\n isFetchingModels,\r\n fetchModelError,\r\n\r\n // Computed\r\n provider,\r\n providers: allProviders,\r\n isValid,\r\n config: currentConfig,\r\n\r\n // Actions\r\n runTest,\r\n save,\r\n clear,\r\n selectModel,\r\n };\r\n}\r\n","var __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nconst EMPTY_CHAR = \"\\0\";\nconst TickerUtils = {\n provideNumberList: () => \"0123456789\",\n provideAlphabeticalList: () => \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n};\nclass TickerCharacterList {\n constructor(characterList) {\n __publicField(this, \"numOriginalCharacters\");\n __publicField(this, \"characterList\");\n __publicField(this, \"characterIndicesMap\");\n const charsArray = [...characterList];\n const length = charsArray.length;\n this.numOriginalCharacters = length;\n this.characterIndicesMap = /* @__PURE__ */ new Map();\n for (let i = 0; i < length; i++) {\n this.characterIndicesMap.set(charsArray[i], i);\n }\n this.characterList = new Array(length * 2 + 1);\n this.characterList[0] = EMPTY_CHAR;\n for (let i = 0; i < length; i++) {\n this.characterList[1 + i] = charsArray[i];\n this.characterList[1 + length + i] = charsArray[i];\n }\n }\n getCharacterIndices(start, end, direction) {\n let startIndex = this.getIndexOfChar(start);\n let endIndex = this.getIndexOfChar(end);\n if (startIndex < 0 || endIndex < 0) return null;\n switch (direction) {\n case \"DOWN\":\n if (end === EMPTY_CHAR) {\n endIndex = this.characterList.length;\n } else if (endIndex < startIndex) {\n endIndex += this.numOriginalCharacters;\n }\n break;\n case \"UP\":\n if (startIndex < endIndex) {\n startIndex += this.numOriginalCharacters;\n }\n break;\n case \"ANY\":\n if (start !== EMPTY_CHAR && end !== EMPTY_CHAR) {\n if (endIndex < startIndex) {\n const nonWrap = startIndex - endIndex;\n const wrap = this.numOriginalCharacters - startIndex + endIndex;\n if (wrap < nonWrap) endIndex += this.numOriginalCharacters;\n } else if (startIndex < endIndex) {\n const nonWrap = endIndex - startIndex;\n const wrap = this.numOriginalCharacters - endIndex + startIndex;\n if (wrap < nonWrap) startIndex += this.numOriginalCharacters;\n }\n }\n break;\n }\n return { startIndex, endIndex };\n }\n getSupportedCharacters() {\n return new Set(this.characterIndicesMap.keys());\n }\n getCharacterList() {\n return this.characterList;\n }\n getIndexOfChar(c) {\n if (c === EMPTY_CHAR) return 0;\n if (this.characterIndicesMap.has(c)) return this.characterIndicesMap.get(c) + 1;\n return -1;\n }\n}\nconst ACTION_SAME = 0;\nconst ACTION_INSERT = 1;\nconst ACTION_DELETE = 2;\nfunction computeColumnActions(source, target, supported) {\n let si = 0, ti = 0;\n const actions = [];\n while (true) {\n const endS = si === source.length;\n const endT = ti === target.length;\n if (endS && endT) break;\n if (endS) {\n for (; ti < target.length; ti++) actions.push(ACTION_INSERT);\n break;\n }\n if (endT) {\n for (; si < source.length; si++) actions.push(ACTION_DELETE);\n break;\n }\n const sSupp = supported.has(source[si]);\n const tSupp = supported.has(target[ti]);\n if (sSupp && tSupp) {\n let se = si + 1, te = ti + 1;\n while (se < source.length && supported.has(source[se])) se++;\n while (te < target.length && supported.has(target[te])) te++;\n const sLen = se - si, tLen = te - ti;\n if (sLen === tLen) {\n for (let i = 0; i < sLen; i++) actions.push(ACTION_SAME);\n } else {\n const matrix = Array(sLen + 1).fill(null).map(() => Array(tLen + 1).fill(0));\n for (let i = 0; i <= sLen; i++) matrix[i][0] = i;\n for (let j = 0; j <= tLen; j++) matrix[0][j] = j;\n for (let r2 = 1; r2 <= sLen; r2++) {\n for (let c2 = 1; c2 <= tLen; c2++) {\n const cost = source[si + r2 - 1] === target[ti + c2 - 1] ? 0 : 1;\n matrix[r2][c2] = Math.min(matrix[r2 - 1][c2] + 1, matrix[r2][c2 - 1] + 1, matrix[r2 - 1][c2 - 1] + cost);\n }\n }\n const result = [];\n let r = sLen, c = tLen;\n while (r > 0 || c > 0) {\n if (r === 0) {\n result.push(ACTION_INSERT);\n c--;\n } else if (c === 0) {\n result.push(ACTION_DELETE);\n r--;\n } else {\n const ins = matrix[r][c - 1], del = matrix[r - 1][c], rep = matrix[r - 1][c - 1];\n if (ins < del && ins < rep) {\n result.push(ACTION_INSERT);\n c--;\n } else if (del < rep) {\n result.push(ACTION_DELETE);\n r--;\n } else {\n result.push(ACTION_SAME);\n r--;\n c--;\n }\n }\n }\n for (let i = result.length - 1; i >= 0; i--) actions.push(result[i]);\n }\n si = se;\n ti = te;\n } else if (sSupp) {\n actions.push(ACTION_INSERT);\n ti++;\n } else if (tSupp) {\n actions.push(ACTION_DELETE);\n si++;\n } else {\n actions.push(ACTION_SAME);\n si++;\n ti++;\n }\n }\n return actions;\n}\nfunction createColumn() {\n return {\n currentChar: EMPTY_CHAR,\n targetChar: EMPTY_CHAR,\n charList: null,\n startIndex: 0,\n endIndex: 0,\n sourceWidth: 0,\n currentWidth: 0,\n targetWidth: 0,\n directionAdj: 1,\n prevDelta: 0,\n currDelta: 0\n };\n}\nfunction setTarget(col, target, lists, dir) {\n const c = { ...col };\n c.targetChar = target;\n c.sourceWidth = c.currentWidth;\n c.targetWidth = target === EMPTY_CHAR ? 0 : 1;\n let found = false;\n for (const list of lists) {\n const indices = list.getCharacterIndices(c.currentChar, target, dir);\n if (indices) {\n c.charList = list.getCharacterList();\n c.startIndex = indices.startIndex;\n c.endIndex = indices.endIndex;\n found = true;\n break;\n }\n }\n if (!found) {\n c.charList = c.currentChar === target ? [c.currentChar] : [c.currentChar, target];\n c.startIndex = 0;\n c.endIndex = c.currentChar === target ? 0 : 1;\n }\n c.directionAdj = c.endIndex >= c.startIndex ? 1 : -1;\n c.prevDelta = c.currDelta;\n c.currDelta = 0;\n return c;\n}\nfunction applyProgress(col, progress, forceUpdate = false) {\n const c = { ...col };\n const total = Math.abs(c.endIndex - c.startIndex);\n const pos = progress * total;\n const offset = pos - Math.floor(pos);\n const additional = c.prevDelta * (1 - progress);\n const delta = offset * c.directionAdj + additional;\n const charIdx = c.startIndex + Math.floor(pos) * c.directionAdj;\n if (progress >= 1) {\n c.currentChar = c.targetChar;\n c.currDelta = 0;\n c.prevDelta = 0;\n } else if (forceUpdate && c.charList && charIdx >= 0 && charIdx < c.charList.length) {\n c.currentChar = c.charList[charIdx];\n c.currDelta = delta;\n }\n c.currentWidth = c.sourceWidth + (c.targetWidth - c.sourceWidth) * progress;\n return { col: c, charIdx, delta };\n}\nconst easingFunctions = {\n linear: (t) => t,\n easeIn: (t) => t * t,\n easeOut: (t) => 1 - (1 - t) * (1 - t),\n easeInOut: (t) => t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2,\n bounce: (t) => {\n const n1 = 7.5625;\n const d1 = 2.75;\n if (t < 1 / d1) {\n return n1 * t * t;\n } else if (t < 2 / d1) {\n return n1 * (t -= 1.5 / d1) * t + 0.75;\n } else if (t < 2.5 / d1) {\n return n1 * (t -= 2.25 / d1) * t + 0.9375;\n } else {\n return n1 * (t -= 2.625 / d1) * t + 0.984375;\n }\n }\n};\nexport {\n ACTION_INSERT as A,\n EMPTY_CHAR as E,\n TickerUtils as T,\n TickerCharacterList as a,\n applyProgress as b,\n computeColumnActions as c,\n createColumn as d,\n ACTION_SAME as e,\n easingFunctions as f,\n ACTION_DELETE as g,\n setTarget as s\n};\n//# sourceMappingURL=TickerCore-C7Ejc9kB.js.map\n","import { defineComponent, ref, computed, watch, onUnmounted, createElementBlock, openBlock, normalizeClass, Fragment, renderList, normalizeStyle, toDisplayString, unref } from \"vue\";\nimport { a as TickerCharacterList, b as applyProgress, c as computeColumnActions, A as ACTION_INSERT, s as setTarget, d as createColumn, e as ACTION_SAME, E as EMPTY_CHAR, f as easingFunctions } from \"./TickerCore-C7Ejc9kB.js\";\nimport { g, T } from \"./TickerCore-C7Ejc9kB.js\";\nconst charHeight = 1.2;\nconst _sfc_main = /* @__PURE__ */ defineComponent({\n __name: \"Ticker\",\n props: {\n value: { type: String, required: true },\n characterLists: { type: Array, default: () => [\"0123456789\"] },\n duration: { type: Number, default: 500 },\n direction: { type: String, default: \"ANY\" },\n easing: { type: String, default: \"easeInOut\" },\n className: { type: String, default: \"\" },\n charWidth: { type: Number, default: 1 }\n },\n setup(__props) {\n const props = __props;\n const columns = ref([]);\n const progress = ref(1);\n let animId;\n const lists = computed(() => props.characterLists.map((s) => new TickerCharacterList(s)));\n const supported = computed(() => {\n const set = /* @__PURE__ */ new Set();\n lists.value.forEach((l) => l.getSupportedCharacters().forEach((c) => set.add(c)));\n return set;\n });\n watch(() => props.value, (newValue, oldValue) => {\n if (newValue === oldValue) return;\n if (animId) {\n cancelAnimationFrame(animId);\n animId = void 0;\n }\n let currentCols = columns.value;\n if (progress.value < 1 && progress.value > 0) {\n currentCols = currentCols.map((c) => applyProgress(c, progress.value, true).col);\n }\n const targetChars = [...newValue];\n const sourceChars = currentCols.map((c) => c.currentChar);\n const actions = computeColumnActions(sourceChars, targetChars, supported.value);\n let ci = 0, ti = 0;\n const result = [];\n const validCols = currentCols.filter((c) => c.currentWidth > 0);\n for (const action of actions) {\n if (action === ACTION_INSERT) {\n result.push(setTarget(createColumn(), targetChars[ti++], lists.value, props.direction));\n } else if (action === ACTION_SAME) {\n const existing = validCols[ci++] || createColumn();\n result.push(setTarget(existing, targetChars[ti++], lists.value, props.direction));\n } else {\n const existing = validCols[ci++] || createColumn();\n result.push(setTarget(existing, EMPTY_CHAR, lists.value, props.direction));\n }\n }\n columns.value = result;\n progress.value = 0;\n const start = performance.now();\n const dur = props.duration;\n const easeFn = easingFunctions[props.easing] || easingFunctions.linear;\n let lastUpdate = 0;\n const animate = (now) => {\n const linearP = Math.min((now - start) / dur, 1);\n const p = easeFn(linearP);\n const shouldUpdate = now - lastUpdate >= 16 || linearP >= 1;\n if (shouldUpdate) {\n lastUpdate = now;\n progress.value = p;\n }\n if (linearP < 1) {\n animId = requestAnimationFrame(animate);\n } else {\n const final = columns.value.map((c) => applyProgress(c, 1).col).filter((c) => c.currentWidth > 0);\n columns.value = final;\n progress.value = 1;\n animId = void 0;\n }\n };\n animId = requestAnimationFrame(animate);\n }, { immediate: true });\n onUnmounted(() => {\n if (animId) cancelAnimationFrame(animId);\n });\n const renderedColumns = computed(() => {\n return columns.value.map((col) => {\n const { charIdx, delta } = applyProgress(col, progress.value);\n const width = col.sourceWidth + (col.targetWidth - col.sourceWidth) * progress.value;\n if (width <= 0) return { width, chars: [] };\n const chars = [];\n const list = col.charList || [];\n const deltaEm = delta * charHeight;\n const add = (idx, offsetMod, keyPrefix) => {\n if (idx >= 0 && idx < list.length) {\n chars.push({\n key: `${keyPrefix}-${idx}`,\n char: list[idx],\n offset: deltaEm + offsetMod\n });\n }\n };\n add(charIdx, 0, \"c\");\n add(charIdx + 1, -charHeight, \"n\");\n add(charIdx - 1, charHeight, \"p\");\n const isFW = (c) => c && c.length > 0 && c.charCodeAt(0) > 255;\n const getW = (c) => isFW(c) ? 1.25 : 0.8;\n const startChar = list[col.startIndex] || \"\";\n const endChar = list[col.endIndex] || \"\";\n const w1 = getW(startChar);\n const w2 = getW(endChar);\n const baseW = w1 + (w2 - w1) * progress.value;\n return { width, chars, baseW };\n }).filter((c) => c.width > 0);\n });\n return (_ctx, _cache) => {\n return openBlock(), createElementBlock(\"div\", {\n class: normalizeClass([\"ticker\", __props.className])\n }, [\n (openBlock(true), createElementBlock(Fragment, null, renderList(renderedColumns.value, (col, i) => {\n return openBlock(), createElementBlock(\"div\", {\n key: i,\n class: \"ticker-column\",\n style: normalizeStyle({ width: `${col.width * (col.baseW || 0.8) * __props.charWidth}em` })\n }, [\n (openBlock(true), createElementBlock(Fragment, null, renderList(col.chars, (charObj) => {\n return openBlock(), createElementBlock(\"div\", {\n key: charObj.key,\n class: \"ticker-char\",\n style: normalizeStyle({ transform: `translateY(${charObj.offset}em)` })\n }, toDisplayString(charObj.char === unref(EMPTY_CHAR) ? \" \" : charObj.char), 5);\n }), 128))\n ], 4);\n }), 128))\n ], 2);\n };\n }\n});\nconst _export_sfc = (sfc, props) => {\n const target = sfc.__vccOpts || sfc;\n for (const [key, val] of props) {\n target[key] = val;\n }\n return target;\n};\nconst Ticker = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"__scopeId\", \"data-v-7e47ac69\"]]);\nexport {\n g as ACTION_DELETE,\n ACTION_INSERT,\n ACTION_SAME,\n EMPTY_CHAR,\n Ticker,\n TickerCharacterList,\n T as TickerUtils,\n applyProgress,\n computeColumnActions,\n createColumn,\n easingFunctions,\n setTarget\n};\n//# sourceMappingURL=vue.js.map\n","<script setup lang=\"ts\">\r\nimport { Ticker as SmartTicker } from '@tombcato/smart-ticker/vue';\r\nimport '@tombcato/smart-ticker/style.css';\r\n\r\nconst props = defineProps<{\r\n text?: string;\r\n className?: string;\r\n placeholder?: string;\r\n}>();\r\n</script>\r\n\r\n<template>\r\n <span v-if=\"!text && placeholder\" :class=\"['apmsu-placeholder', className]\">\r\n {{ placeholder }}\r\n </span>\r\n <span v-else-if=\"text\" :class=\"['inline-flex min-w-0', className]\">\r\n <SmartTicker :value=\"text\" :char-width=\"0.8\" :duration=\"300\" />\r\n </span>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed, onMounted, onUnmounted } from 'vue';\r\nimport { I18N, type Language, type Provider } from '@tombcato/ai-selector-core';\r\nimport SmartText from './SmartText.vue';\r\n\r\ninterface Props {\r\n providers: Provider[];\r\n selectedProviderId: string;\r\n disabled?: boolean;\r\n language?: Language;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n select: [providerId: string];\r\n}>();\r\n\r\nconst isOpen = ref(false);\r\nconst triggerRef = ref<HTMLDivElement | null>(null);\r\nconst t = computed(() => I18N[props.language]);\r\nconst selectedProvider = computed(() => props.providers.find(p => p.id === props.selectedProviderId));\r\n\r\nfunction handleClickOutside(e: MouseEvent) {\r\n if (triggerRef.value && !triggerRef.value.contains(e.target as Node)) {\r\n isOpen.value = false;\r\n }\r\n}\r\n\r\nonMounted(() => {\r\n document.addEventListener('mousedown', handleClickOutside);\r\n});\r\n\r\nonUnmounted(() => {\r\n document.removeEventListener('mousedown', handleClickOutside);\r\n});\r\n\r\nfunction handleSelect(id: string) {\r\n emit('select', id);\r\n isOpen.value = false;\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"apmsu-field\" ref=\"triggerRef\">\r\n <label class=\"apmsu-label\">{{ t.providerLabel }}</label>\r\n <div class=\"relative\">\r\n <button\r\n type=\"button\"\r\n @click=\"!disabled && (isOpen = !isOpen)\"\r\n :disabled=\"disabled\"\r\n class=\"apmsu-select-trigger\"\r\n >\r\n <div v-if=\"selectedProvider\" class=\"flex items-center gap-2 min-w-0\">\r\n <img :src=\"selectedProvider.icon\" :alt=\"selectedProvider.name\" class=\"apmsu-provider-icon\" />\r\n <SmartText :text=\"selectedProvider.name\" />\r\n </div>\r\n <span v-else class=\"apmsu-placeholder\">{{ t.selectProvider }}</span>\r\n <svg \r\n :class=\"['apmsu-chevron', isOpen ? 'rotate-180' : '']\" \r\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\r\n >\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </button>\r\n\r\n <div :class=\"['apmsu-dropdown max-h-[300px] overflow-auto p-1 origin-top', isOpen ? 'apmsu-dropdown-open' : '']\">\r\n <button\r\n v-for=\"p in providers\"\r\n :key=\"p.id\"\r\n type=\"button\"\r\n @click=\"handleSelect(p.id)\"\r\n :class=\"['apmsu-dropdown-item rounded-sm', selectedProviderId === p.id && 'apmsu-dropdown-item-active']\"\r\n >\r\n <div class=\"flex items-center gap-2 flex-shrink-0\">\r\n <img :src=\"p.icon\" :alt=\"p.name\" class=\"apmsu-provider-icon\" />\r\n <span class=\"font-medium whitespace-nowrap\">{{ p.name }}</span>\r\n </div>\r\n <span class=\"apmsu-hint-text ml-auto text-right truncate flex-1 min-w-0\">\r\n {{ p.baseUrl.replace('https://', '') }}\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed } from 'vue';\r\nimport { I18N, type Language, type Provider } from '@tombcato/ai-selector-core';\r\n\r\ninterface Props {\r\n provider: Provider | null;\r\n apiKey: string;\r\n testStatus: 'idle' | 'testing' | 'success' | 'error';\r\n disabled?: boolean;\r\n language?: Language;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n 'update:apiKey': [value: string];\r\n}>();\r\n\r\nconst isVisible = ref(false);\r\nconst t = computed(() => I18N[props.language]);\r\n\r\nconst inputClass = computed(() => {\r\n if (props.testStatus === 'success') return 'apmsu-input apmsu-input-success';\r\n return 'apmsu-input apmsu-input-default';\r\n});\r\n</script>\r\n\r\n<template>\r\n <div v-if=\"provider && provider.needsApiKey\" class=\"apmsu-field\">\r\n <label class=\"apmsu-label\">{{ t.apiKeyLabel }}</label>\r\n <div class=\"relative\">\r\n <input\r\n :type=\"isVisible ? 'text' : 'password'\"\r\n :value=\"apiKey\"\r\n @input=\"emit('update:apiKey', ($event.target as HTMLInputElement).value)\"\r\n @focus=\"isVisible = true\"\r\n @blur=\"isVisible = false\"\r\n :placeholder=\"t.apiKeyPlaceholder\"\r\n :disabled=\"disabled\"\r\n :class=\"[inputClass, 'pr-10']\"\r\n />\r\n <span class=\"absolute right-3 top-1/2 -translate-y-1/2 flex items-center justify-center\">\r\n <svg v-if=\"isVisible\" class=\"w-4 h-4 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z\" />\r\n </svg>\r\n <svg v-else class=\"w-4 h-4 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed, onMounted, onUnmounted } from 'vue';\r\nimport { I18N, type Language, type Provider, type Model } from '@tombcato/ai-selector-core';\r\nimport SmartText from './SmartText.vue';\r\n\r\ninterface Props {\r\n provider: Provider | null;\r\n models: Model[];\r\n selectedModelId: string;\r\n hasApiKey: boolean;\r\n disabled?: boolean;\r\n language?: Language;\r\n isFetchingModels?: boolean;\r\n fetchModelError?: string | null;\r\n selectedModelName?: string;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n select: [modelId: string, modelName?: string];\r\n}>();\r\n\r\nconst isOpen = ref(false);\r\nconst modelSearch = ref('');\r\nconst triggerRef = ref<HTMLDivElement | null>(null);\r\nconst t = computed(() => I18N[props.language]);\r\n\r\nconst filteredModels = computed(() =>\r\n props.models.filter(m =>\r\n m.name.toLowerCase().includes(modelSearch.value.toLowerCase()) ||\r\n m.id.toLowerCase().includes(modelSearch.value.toLowerCase())\r\n )\r\n);\r\n\r\nconst activeModelName = computed(() => \r\n props.models.find(m => m.id === props.selectedModelId)?.name || props.selectedModelName || props.selectedModelId\r\n);\r\n\r\nfunction handleClickOutside(e: MouseEvent) {\r\n if (triggerRef.value && !triggerRef.value.contains(e.target as Node)) {\r\n isOpen.value = false;\r\n modelSearch.value = '';\r\n }\r\n}\r\n\r\nonMounted(() => {\r\n document.addEventListener('mousedown', handleClickOutside);\r\n});\r\n\r\nonUnmounted(() => {\r\n document.removeEventListener('mousedown', handleClickOutside);\r\n});\r\n\r\nfunction handleSelect(id: string, name?: string) {\r\n emit('select', id, name);\r\n isOpen.value = false;\r\n modelSearch.value = '';\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"apmsu-field\" ref=\"triggerRef\">\r\n <label class=\"apmsu-label flex items-center justify-between\">\r\n <span>{{ t.modelLabel }}</span>\r\n </label>\r\n <div class=\"relative\">\r\n <button\r\n type=\"button\"\r\n @click=\"!disabled && provider && (isOpen = !isOpen)\"\r\n :disabled=\"disabled || !provider\"\r\n class=\"apmsu-select-trigger\"\r\n >\r\n <SmartText \r\n :text=\"activeModelName ? activeModelName : ''\"\r\n :placeholder=\"t.selectModel\"\r\n />\r\n <svg \r\n :class=\"['apmsu-chevron', isOpen ? 'rotate-180' : '']\" \r\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\r\n >\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </button>\r\n\r\n <div :class=\"['apmsu-dropdown origin-top', isOpen ? 'apmsu-dropdown-open' : '']\">\r\n <div class=\"p-1.5 border-b border-gray-100 dark:border-zinc-800\">\r\n <input\r\n type=\"text\"\r\n v-model=\"modelSearch\"\r\n :placeholder=\"t.searchModel\"\r\n class=\"apmsu-select-trigger\"\r\n :autofocus=\"isOpen\"\r\n />\r\n </div>\r\n <div class=\"max-h-60 overflow-auto\">\r\n <button\r\n v-if=\"modelSearch && !filteredModels.some(m => m.id === modelSearch)\"\r\n type=\"button\"\r\n @click=\"handleSelect(modelSearch)\"\r\n class=\"apmsu-dropdown-item bg-blue-50 dark:bg-blue-900/20 border-b\"\r\n >\r\n <span class=\"text-blue-500\">{{ t.useCustom }}: {{ modelSearch }}</span>\r\n </button>\r\n <button\r\n v-for=\"m in filteredModels\"\r\n :key=\"m.id\"\r\n type=\"button\"\r\n @click=\"handleSelect(m.id, m.name)\"\r\n :class=\"['apmsu-dropdown-item', selectedModelId === m.id && 'apmsu-dropdown-item-active']\"\r\n >\r\n <span>{{ m.name }}</span>\r\n </button>\r\n <div v-if=\"filteredModels.length === 0 && !modelSearch\" class=\"p-4 text-center apmsu-hint-text\">\r\n {{ t.noModels }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- Status Messages Container - only for supportsModelsApi providers -->\r\n <div v-if=\"provider?.supportsModelsApi\" class=\"min-h-[20px] flex items-center\">\r\n <p v-if=\"isFetchingModels\" class=\"apmsu-hint-text animate-pulse\">\r\n {{ t.refreshingModels }}\r\n </p>\r\n \r\n <p v-else-if=\"fetchModelError\" class=\"apmsu-hint-text dark:text-zinc-500\">\r\n {{ (t as any)[fetchModelError] || fetchModelError }}\r\n </p>\r\n\r\n <p v-else-if=\"provider?.needsApiKey && !hasApiKey\" class=\"apmsu-hint-text\">\r\n {{ t.apiKeyTip }}\r\n </p>\r\n\r\n <p v-else class=\"apmsu-hint-text\">\r\n {{ t.modelListUpdated }}\r\n </p>\r\n </div>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed } from 'vue';\r\nimport { I18N, type Language, type Provider } from '@tombcato/ai-selector-core';\r\n\r\ninterface Props {\r\n provider: Provider | null;\r\n baseUrl: string;\r\n disabled?: boolean;\r\n language?: Language;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n 'update:baseUrl': [value: string];\r\n}>();\r\n\r\nconst isOpen = ref(false);\r\nconst t = computed(() => I18N[props.language]);\r\n</script>\r\n\r\n<template>\r\n <template v-if=\"provider\">\r\n <button\r\n type=\"button\"\r\n @click=\"isOpen = !isOpen\"\r\n class=\"text-xs text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 flex items-center gap-1 transition-colors\"\r\n >\r\n <svg \r\n :class=\"['w-3 h-3 transition-transform', isOpen && 'rotate-90']\" \r\n fill=\"none\" \r\n stroke=\"currentColor\" \r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\" />\r\n </svg>\r\n {{ t.customBaseUrl }}\r\n </button>\r\n\r\n <div\r\n class=\"grid transition-all duration-200 ease-out\"\r\n :style=\"{ gridTemplateRows: isOpen ? '1fr' : '0fr' }\"\r\n >\r\n <div class=\"overflow-hidden\">\r\n <input\r\n type=\"text\"\r\n :value=\"baseUrl\"\r\n @input=\"emit('update:baseUrl', ($event.target as HTMLInputElement).value)\"\r\n :placeholder=\"provider.baseUrl\"\r\n :disabled=\"disabled\"\r\n class=\"apmsu-input apmsu-input-default\"\r\n />\r\n </div>\r\n </div>\r\n </template>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed, watch } from 'vue';\r\nimport { useAIConfig } from './useAIConfig';\r\n\r\nimport { I18N, type Language, type AIConfig, type ProviderConfig, type TestConnectionResult, type ModelFetcher } from '@tombcato/ai-selector-core';\r\n\r\n// Sub-components\r\nimport ProviderSelect from './ProviderSelect.vue';\r\nimport AuthInput from './AuthInput.vue';\r\nimport ModelSelect from './ModelSelect.vue';\r\nimport BaseUrlInput from './BaseUrlInput.vue';\r\n\r\ninterface Props {\r\n proxyUrl: string;\r\n config?: ProviderConfig;\r\n initialConfig?: Partial<AIConfig>;\r\n title?: string;\r\n showPreview?: boolean;\r\n saveButtonText?: string;\r\n disabled?: boolean;\r\n onSerialize?: (data: any) => string;\r\n onDeserialize?: (data: string) => any;\r\n language?: Language;\r\n modelFetcher?: ModelFetcher;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n showPreview: false,\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n save: [config: AIConfig];\r\n testResult: [result: TestConnectionResult];\r\n change: [config: Partial<AIConfig>];\r\n}>();\r\n\r\nconst {\r\n providerId,\r\n apiKey,\r\n model,\r\n modelName,\r\n baseUrl,\r\n models,\r\n testStatus,\r\n testResult,\r\n provider,\r\n providers,\r\n isValid,\r\n config: currentConfig,\r\n runTest,\r\n save,\r\n selectModel,\r\n isFetchingModels,\r\n fetchModelError,\r\n} = useAIConfig({\r\n proxyUrl: props.proxyUrl,\r\n providerConfig: props.config,\r\n initialConfig: props.initialConfig,\r\n onSerialize: props.onSerialize,\r\n onDeserialize: props.onDeserialize,\r\n modelFetcher: props.modelFetcher,\r\n});\r\n\r\nconst t = computed(() => I18N[props.language]);\r\nconst saveStatus = ref<'idle' | 'saved'>('idle');\r\nconst isPreviewOpen = ref(false);\r\n\r\n// Watch for changes\r\nwatch([providerId, apiKey, model, baseUrl], () => {\r\n emit('change', {\r\n providerId: providerId.value,\r\n apiKey: apiKey.value,\r\n model: model.value,\r\n baseUrl: baseUrl.value,\r\n });\r\n});\r\n\r\n// Watch test result\r\nwatch(testResult, (result) => {\r\n if (result) emit('testResult', result);\r\n});\r\n\r\n// Handle save\r\nfunction handleSave() {\r\n save();\r\n saveStatus.value = 'saved';\r\n emit('save', currentConfig.value);\r\n setTimeout(() => { saveStatus.value = 'idle'; }, 2000);\r\n}\r\n\r\n// Handler wrappers for vue events\r\nfunction updateProvider(id: string) {\r\n providerId.value = id;\r\n}\r\n\r\nfunction updateApiKey(val: string) {\r\n apiKey.value = val;\r\n}\r\n\r\nfunction updateModel(id: string, name?: string) {\r\n selectModel(id, name);\r\n}\r\n\r\nfunction updateBaseUrl(val: string) {\r\n baseUrl.value = val;\r\n}\r\n\r\n</script>\r\n\r\n<template>\r\n <div class=\"apmsu-card\">\r\n <h2 v-if=\"title\" class=\"text-lg font-semibold mb-4\">{{ title }}</h2>\r\n\r\n <div class=\"space-y-3\">\r\n <ProviderSelect\r\n :providers=\"providers\"\r\n :selectedProviderId=\"providerId\"\r\n @select=\"updateProvider\"\r\n :disabled=\"disabled\"\r\n :language=\"language\"\r\n />\r\n\r\n <BaseUrlInput\r\n :provider=\"provider\"\r\n :baseUrl=\"baseUrl\"\r\n @update:baseUrl=\"updateBaseUrl\"\r\n :disabled=\"disabled\"\r\n :language=\"language\"\r\n />\r\n\r\n <!-- Auth & Model Collapsible Section -->\r\n <div :class=\"['transition-all duration-500 ease-in-out', providerId ? 'max-h-[1000px] opacity-100 overflow-visible' : 'max-h-0 opacity-0 overflow-hidden']\">\r\n <div class=\"space-y-4\">\r\n <AuthInput\r\n :provider=\"provider\"\r\n :apiKey=\"apiKey\"\r\n @update:apiKey=\"updateApiKey\"\r\n :testStatus=\"testStatus\"\r\n :disabled=\"disabled\"\r\n :language=\"language\"\r\n :isFetchingModels=\"isFetchingModels\"\r\n :fetchModelError=\"fetchModelError\"\r\n />\r\n\r\n <ModelSelect\r\n :provider=\"provider\"\r\n :models=\"models\"\r\n :selectedModelId=\"model\"\r\n @select=\"updateModel\"\r\n :hasApiKey=\"!!apiKey\"\r\n :disabled=\"disabled\"\r\n :language=\"language\"\r\n :isFetchingModels=\"isFetchingModels\"\r\n :fetchModelError=\"fetchModelError\"\r\n :selectedModelName=\"modelName\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- Action Buttons -->\r\n <div class=\"pt-2 space-y-2\">\r\n <div class=\"flex gap-2\">\r\n <button\r\n type=\"button\"\r\n @click=\"runTest()\"\r\n :disabled=\"!providerId || !apiKey || !model || disabled || testStatus === 'testing'\"\r\n :class=\"['apmsu-btn flex-1', \r\n testStatus === 'success' ? 'apmsu-btn-success' : \r\n testStatus === 'error' ? 'bg-red-100 dark:bg-red-900/30 text-red-600 dark:text-red-400 hover:bg-red-200 dark:hover:bg-red-900/40' : \r\n 'apmsu-btn-ghost border border-gray-200 dark:border-zinc-700'\r\n ]\"\r\n >\r\n <span v-if=\"testStatus === 'testing'\" class=\"flex items-center justify-center gap-2\">\r\n <svg class=\"apmsu-icon-spin\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\" />\r\n <path class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\" />\r\n </svg>\r\n {{ t.testing }}\r\n </span>\r\n <span v-else-if=\"testStatus === 'success'\" class=\"flex items-center justify-center gap-2\">\r\n <svg class=\"apmsu-icon-success\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\" />\r\n </svg>\r\n {{ t.testSuccess }} {{ testResult?.latencyMs ? `${testResult.latencyMs}ms` : '' }}\r\n </span>\r\n <span v-else-if=\"testStatus === 'error'\" class=\"flex items-center justify-center gap-2\">\r\n <svg class=\"apmsu-icon-error\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\" />\r\n </svg>\r\n {{ t.testFailed }}\r\n </span>\r\n <template v-else>{{ t.testConnection }}</template>\r\n </button>\r\n\r\n <button\r\n @click=\"handleSave\"\r\n :disabled=\"!isValid || disabled\"\r\n :class=\"['apmsu-btn flex-1', saveStatus === 'saved' ? 'apmsu-btn-success' : 'apmsu-btn-primary']\"\r\n >\r\n <span v-if=\"saveStatus === 'saved'\" class=\"flex items-center justify-center gap-2\">\r\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" d=\"M5 13l4 4L19 7\" />\r\n </svg>\r\n {{ t.saved }}\r\n </span>\r\n <template v-else>{{ saveButtonText || t.save }}</template>\r\n </button>\r\n </div>\r\n\r\n <!-- Error Message -->\r\n <div\r\n class=\"grid transition-all duration-200 ease-out\"\r\n :style=\"{ gridTemplateRows: (!testResult?.success && testResult?.message && testStatus !== 'testing' && testStatus !== 'success') ? '1fr' : '0fr' }\"\r\n >\r\n <div class=\"overflow-hidden\">\r\n <div class=\"p-2 rounded-md bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800\">\r\n <p class=\"text-xs text-red-600 dark:text-red-400 line-clamp-3 text-left\">{{ testResult?.message }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Config Preview - Collapsible -->\r\n <div v-if=\"showPreview && provider\" class=\"mt-6 border border-gray-200/50 dark:border-zinc-800 rounded-lg overflow-hidden\">\r\n <button\r\n type=\"button\"\r\n @click=\"isPreviewOpen = !isPreviewOpen\"\r\n class=\"w-full flex items-center justify-between px-4 py-3 bg-zinc-50 dark:bg-zinc-900/50 hover:bg-zinc-100 dark:hover:bg-zinc-800/50 transition-colors\"\r\n >\r\n <h3 class=\"text-xs font-medium text-gray-500 dark:text-zinc-500 uppercase tracking-wider\">{{ t.preview }}</h3>\r\n <svg \r\n :class=\"['w-4 h-4 text-gray-400 transition-transform duration-200', isPreviewOpen ? 'rotate-180' : '']\"\r\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\r\n >\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </button>\r\n <div \r\n class=\"grid transition-all duration-200 ease-out\"\r\n :style=\"{ gridTemplateRows: isPreviewOpen ? '1fr' : '0fr' }\"\r\n >\r\n <div class=\"overflow-hidden\">\r\n <pre class=\"text-xs text-gray-600 dark:text-zinc-400 font-mono overflow-x-auto leading-relaxed p-4 bg-zinc-50 dark:bg-zinc-900/50\">\r\n{{ JSON.stringify({\r\n provider: provider.name,\r\n apiFormat: provider.apiFormat,\r\n baseUrl: baseUrl || provider.baseUrl,\r\n model: model || t.unselected,\r\n hasApiKey: !!apiKey\r\n}, null, 2) }}\r\n </pre>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style>\r\n/* 样式已在 main.ts 中通过 style.css 导入 */\r\n</style>\r\n"],"names":["I18N","ICON_CDN_BASE","PROVIDER_ID","PROVIDERS","STATIC_MODELS","getStaticModels","providerId","defaultParseModelsResponse","data","m","name","c","b","openaiStrategy","baseUrl","apiKey","model","messages","maxTokens","_c","_b","_a","anthropicStrategy","geminiStrategy","_model","_e","_d","cohereStrategy","lastMessage","chatHistory","strategyRegistry","getStrategy","format","testConnection","options","provider","proxyUrl","actualBaseUrl","startTime","strategy","targetModel","headers","testPayload","endpoint","response","latencyMs","errorText","error","fetchModels","fallbackToStatic","e","STORAGE_KEY","localStorageAdapter","key","value","createConfigStorage","adapter","serialize","deserialize","config","serialized","raw","resolveProviderConfig","mode","include","exclude","custom","providers","builtInProviders","p","customModelsMap","id","def","customProvider","existingIndex","useAIConfig","ref","modelName","models","testStatus","testResult","isFetchingModels","fetchModelError","resolvedConfig","computed","allProviders","storage","isLoaded","onMounted","saved","watch","fetchTimer","modelCache","shouldFetch","cacheKey","cachedModels","staticModels","fetchedModels","runTest","result","fetcherResult","save","foundModel","nameToSave","clear","selectModel","modelId","found","isValid","currentConfig","__defProp","__defNormalProp","obj","__publicField","EMPTY_CHAR","TickerCharacterList","characterList","charsArray","length","i","start","end","direction","startIndex","endIndex","nonWrap","ACTION_SAME","ACTION_INSERT","ACTION_DELETE","computeColumnActions","source","target","supported","si","ti","actions","endS","endT","sSupp","tSupp","se","te","sLen","tLen","matrix","j","r2","c2","cost","r","ins","del","rep","createColumn","setTarget","col","lists","dir","list","indices","applyProgress","progress","forceUpdate","total","pos","offset","additional","delta","charIdx","easingFunctions","t","charHeight","_sfc_main","defineComponent","__props","props","columns","animId","s","set","l","newValue","oldValue","currentCols","targetChars","sourceChars","ci","validCols","action","existing","dur","easeFn","lastUpdate","animate","now","linearP","final","onUnmounted","renderedColumns","width","chars","deltaEm","add","idx","offsetMod","keyPrefix","isFW","getW","startChar","endChar","w1","w2","baseW","_ctx","_cache","openBlock","createElementBlock","normalizeClass","Fragment","renderList","normalizeStyle","charObj","toDisplayString","unref","_export_sfc","sfc","val","Ticker","_createElementBlock","_createVNode","_unref","SmartTicker","emit","__emit","isOpen","triggerRef","selectedProvider","handleClickOutside","handleSelect","_createElementVNode","_hoisted_1","_toDisplayString","_hoisted_2","$event","_openBlock","_hoisted_4","SmartText","_hoisted_6","_Fragment","_renderList","_normalizeClass","_hoisted_8","_hoisted_10","_hoisted_11","isVisible","inputClass","_hoisted_3","_hoisted_5","_hoisted_7","modelSearch","filteredModels","activeModelName","_hoisted_9","_hoisted_12","_hoisted_13","_hoisted_14","saveStatus","isPreviewOpen","handleSave","updateProvider","updateApiKey","updateModel","updateBaseUrl","ProviderSelect","BaseUrlInput","AuthInput","ModelSelect","_createTextVNode","_normalizeStyle","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19"],"mappings":"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","x_google_ignoreList":[8,9]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
(function(V,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue")):typeof define=="function"&&define.amd?define(["exports","vue"],e):(V=typeof globalThis<"u"?globalThis:V||self,e(V.AISelectorVue={},V.Vue))})(this,(function(V,e){"use strict";const $={zh:{save:"保存配置",saved:"保存成功",providerLabel:"Provider",modelLabel:"Model",selectProvider:"选择 Provider...",customBaseUrl:"自定义 Base URL",apiKeyLabel:"API Key",apiKeyPlaceholder:"输入 API Key...",testConnection:"测试模型连接",testing:"测试中...",testSuccess:"连接成功",testFailed:"测试连通性失败",selectModel:"选择 Model...",searchModel:"搜索或自定义模型...",useCustom:"使用自定义",noModels:"暂无模型数据",apiKeyTip:"输入 API Key 后可获取完整模型列表",fetchModelsFailed:"拉取模型列表失败,已使用离线模型列表",refreshingModels:"列表刷新中...",modelListUpdated:"模型列表已刷新",preview:"配置预览",unselected:"(未选择)"},en:{save:"Save Config",saved:"Saved",providerLabel:"Provider",modelLabel:"Model",selectProvider:"Select Provider...",customBaseUrl:"Custom Base URL",apiKeyLabel:"API Key",apiKeyPlaceholder:"Enter API Key...",testConnection:"Test Model Connection",testing:"Testing...",testSuccess:"Connection Successful",testFailed:"Connection Failed",selectModel:"Select Model...",searchModel:"Search or custom models...",useCustom:"Use custom",noModels:"No models found",apiKeyTip:"Enter API Key to fetch full model list",fetchModelsFailed:"Failed to fetch model list, using offline models",refreshingModels:"Refreshing models...",modelListUpdated:"Model list updated",preview:"Config Preview",unselected:"(Unselected)"}},v="https://registry.npmmirror.com/@lobehub/icons-static-svg/1.77.0/files/icons",d={OPENAI:"openai",ANTHROPIC:"anthropic",GEMINI:"gemini",DEEPSEEK:"deepseek",OPENROUTER:"openrouter",GROQ:"groq",MISTRAL:"mistral",MOONSHOT:"moonshot",QWEN:"qwen",ZHIPU:"zhipu",SILICONFLOW:"siliconflow",XAI:"xai",TOGETHER:"together",FIREWORKS:"fireworks",DEEPINFRA:"deepinfra",PERPLEXITY:"perplexity",COHERE:"cohere",OLLAMA:"ollama",DOUBAO:"doubao",MINIMAX:"minimax"},X={[d.OPENAI]:{id:d.OPENAI,name:"OpenAI",baseUrl:"https://api.openai.com/v1",needsApiKey:!0,apiFormat:"openai",supportsModelsApi:!0,icon:`${v}/openai.svg`},[d.ANTHROPIC]:{id:d.ANTHROPIC,name:"Anthropic (Claude)",baseUrl:"https://api.anthropic.com/v1",needsApiKey:!0,apiFormat:"anthropic",supportsModelsApi:!1,icon:`${v}/anthropic.svg`},[d.GEMINI]:{id:d.GEMINI,name:"Google Gemini",baseUrl:"https://generativelanguage.googleapis.com/v1beta",needsApiKey:!0,apiFormat:"gemini",supportsModelsApi:!0,icon:`${v}/gemini.svg`},[d.OPENROUTER]:{id:d.OPENROUTER,name:"OpenRouter",baseUrl:"https://openrouter.ai/api/v1",needsApiKey:!0,apiFormat:"openai",supportsModelsApi:!0,icon:`${v}/openrouter.svg`},[d.DEEPSEEK]:{id:d.DEEPSEEK,name:"DeepSeek",baseUrl:"https://api.deepseek.com",needsApiKey:!0,apiFormat:"openai",supportsModelsApi:!0,icon:`${v}/deepseek.svg`},[d.MOONSHOT]:{id:d.MOONSHOT,name:"Moonshot (Kimi)",baseUrl:"https://api.moonshot.cn/v1",needsApiKey:!0,apiFormat:"openai",supportsModelsApi:!0,icon:`${v}/moonshot.svg`},[d.QWEN]:{id:d.QWEN,name:"通义千问 (Qwen)",baseUrl:"https://dashscope.aliyuncs.com/compatible-mode/v1",needsApiKey:!0,apiFormat:"openai",supportsModelsApi:!0,icon:`${v}/qwen.svg`},[d.ZHIPU]:{id:d.ZHIPU,name:"智谱 AI (GLM)",baseUrl:"https://open.bigmodel.cn/api/paas/v4",needsApiKey:!0,apiFormat:"openai",supportsModelsApi:!0,icon:`${v}/zhipu.svg`},[d.SILICONFLOW]:{id:d.SILICONFLOW,name:"硅基流动 (siliconflow)",baseUrl:"https://api.siliconflow.cn/v1",needsApiKey:!0,apiFormat:"openai",supportsModelsApi:!0,icon:`${v}/siliconcloud.svg`},[d.DOUBAO]:{id:d.DOUBAO,name:"火山方舟 (Doubao)",baseUrl:"https://ark.cn-beijing.volces.com/api/v3",needsApiKey:!0,apiFormat:"openai",supportsModelsApi:!0,icon:`${v}/doubao.svg`},[d.MINIMAX]:{id:d.MINIMAX,name:"MiniMax",baseUrl:"https://api.minimax.io/v1",needsApiKey:!0,apiFormat:"openai",supportsModelsApi:!1,icon:`${v}/minimax.svg`},[d.XAI]:{id:d.XAI,name:"xAI (Grok)",baseUrl:"https://api.x.ai/v1",needsApiKey:!0,apiFormat:"openai",supportsModelsApi:!0,icon:`${v}/grok.svg`},[d.GROQ]:{id:d.GROQ,name:"Groq",baseUrl:"https://api.groq.com/openai/v1",needsApiKey:!0,apiFormat:"openai",supportsModelsApi:!0,icon:`${v}/groq.svg`},[d.MISTRAL]:{id:d.MISTRAL,name:"Mistral AI",baseUrl:"https://api.mistral.ai/v1",needsApiKey:!0,apiFormat:"openai",supportsModelsApi:!0,icon:`${v}/mistral.svg`},[d.TOGETHER]:{id:d.TOGETHER,name:"Together AI",baseUrl:"https://api.together.xyz/v1",needsApiKey:!0,apiFormat:"openai",supportsModelsApi:!0,icon:`${v}/together.svg`},[d.FIREWORKS]:{id:d.FIREWORKS,name:"Fireworks AI",baseUrl:"https://api.fireworks.ai/inference/v1",needsApiKey:!0,apiFormat:"openai",supportsModelsApi:!0,icon:`${v}/fireworks.svg`},[d.DEEPINFRA]:{id:d.DEEPINFRA,name:"DeepInfra",baseUrl:"https://api.deepinfra.com/v1/openai",needsApiKey:!0,apiFormat:"openai",supportsModelsApi:!0,icon:`${v}/deepinfra.svg`},[d.PERPLEXITY]:{id:d.PERPLEXITY,name:"Perplexity",baseUrl:"https://api.perplexity.ai",needsApiKey:!0,apiFormat:"openai",supportsModelsApi:!1,icon:`${v}/perplexity.svg`},[d.COHERE]:{id:d.COHERE,name:"Cohere",baseUrl:"https://api.cohere.com/v2",needsApiKey:!0,apiFormat:"cohere",supportsModelsApi:!0,icon:`${v}/cohere.svg`},[d.OLLAMA]:{id:d.OLLAMA,name:"Ollama (Local)",baseUrl:"http://localhost:11434/v1",needsApiKey:!1,apiFormat:"openai",supportsModelsApi:!0,icon:`${v}/ollama.svg`}},ne={[d.OPENAI]:[{id:"gpt-5.2-pro",name:"GPT-5.2 Pro"},{id:"gpt-5.2",name:"GPT-5.2"},{id:"gpt-5",name:"GPT-5"},{id:"gpt-5-mini",name:"GPT-5 Mini"},{id:"gpt-5-nano",name:"GPT-5 Nano"},{id:"gpt-4.1",name:"GPT-4.1"}],[d.ANTHROPIC]:[{id:"claude-opus-4.5-20251101",name:"Claude Opus 4.5"},{id:"claude-opus-4.5-20251101-thinking",name:"Claude Opus 4.5 Thinking"},{id:"claude-sonnet-4.5-20250929",name:"Claude Sonnet 4.5"},{id:"claude-sonnet-4.5-20250929-thinking",name:"Claude Sonnet 4.5 Thinking"},{id:"claude-haiku-4.5-20251001",name:"Claude Haiku 4.5"},{id:"claude-haiku-4.5-20251001-thinking",name:"Claude Haiku 4.5 Thinking"},{id:"claude-opus-4.1-20250805",name:"Claude Opus 4.1"},{id:"claude-opus-4.1-20250805-thinking",name:"Claude Opus 4.1 Thinking"}],[d.GEMINI]:[{id:"gemini-3-flash-preview",name:"Gemini 3 Flash Preview"},{id:"gemini-3-pro-preview",name:"Gemini 3 Pro Preview"},{id:"gemini-2.5-pro",name:"Gemini 2.5 Pro"},{id:"gemini-2.5-flash",name:"Gemini 2.5 Flash"},{id:"gemini-2.5-flash-lite",name:"Gemini 2.5 Flash-Lite"}],[d.DEEPSEEK]:[{id:"deepseek-chat",name:"Deepseek Chat"},{id:"deepseek-reasoner",name:"Deepseek Reasoner"}],[d.MISTRAL]:[{id:"mistral-large-latest",name:"Mistral Large"},{id:"mistral-medium-latest",name:"Mistral Medium"},{id:"mistral-small-latest",name:"Mistral Small"},{id:"codestral-latest",name:"Codestral"},{id:"devstral-latest",name:"Devstral"},{id:"magistral-medium-latest",name:"Magistral Medium"},{id:"pixtral-large-latest",name:"Pixtral Large"},{id:"pixtral-12b-latest",name:"Pixtral 12B"},{id:"ministral-8b-latest",name:"Ministral 8B"},{id:"ministral-3b-latest",name:"Ministral 3B"}],[d.GROQ]:[{id:"canopylabs/orpheus-v1-english",name:"Orpheus V1 English"},{id:"canopylabs/orpheus-arabic-saudi",name:"Orpheus Arabic Saudi"},{id:"moonshotai/kimi-k2-instruct",name:"Kimi K2 Instruct"},{id:"groq/compound-mini",name:"Compound Mini"},{id:"llama-3.3-70b-versatile",name:"Llama 3.3 70B Versatile"},{id:"openai/gpt-oss-120b",name:"Gpt Oss 120B"},{id:"qwen/qwen3-32b",name:"Qwen3 32B"},{id:"groq/compound",name:"Compound"},{id:"meta-llama/llama-4-maverick-17b-128e-instruct",name:"Llama 4 Maverick 17B 128E Instruct"}],[d.XAI]:[{id:"grok-4",name:"Grok 4"},{id:"grok-4-fast",name:"Grok 4 Fast"},{id:"grok-3-latest",name:"Grok 3"},{id:"grok-3-fast",name:"Grok 3 Fast"},{id:"grok-3-mini-latest",name:"Grok 3 Mini"},{id:"grok-3-mini-fast",name:"Grok 3 Mini Fast"},{id:"grok-vision-beta",name:"Grok Vision (Beta)"}],[d.TOGETHER]:[{id:"Qwen/Qwen2.5-72B-Instruct-Turbo",name:"Qwen2.5 72B Instruct Turbo"},{id:"Qwen/Qwen3-235B-A22B-Thinking-2507",name:"Qwen3 235B A22B Thinking 2507"},{id:"deepseek-ai/DeepSeek-R1",name:"Deepseek R1"},{id:"deepseek-ai/DeepSeek-V3.1",name:"Deepseek V3.1"},{id:"meta-llama/Llama-3.2-3B-Instruct-Turbo",name:"Llama 3.2 3B Instruct Turbo"},{id:"meta-llama/Llama-3.3-70B-Instruct-Turbo",name:"Llama 3.3 70B Instruct Turbo"},{id:"meta-llama/Llama-3.3-70B-Instruct-Turbo-Free",name:"Llama 3.3 70B Instruct Turbo Free"}],[d.FIREWORKS]:[{id:"accounts/fireworks/models/llama4-scout-instruct-basic",name:"Llama4 Scout Instruct Basic"},{id:"accounts/fireworks/models/qwen3-vl-235b-a22b-thinking",name:"Qwen3 Vl 235B A22B Thinking"},{id:"accounts/fireworks/models/deepseek-v3p2",name:"Deepseek V3P2"},{id:"accounts/fireworks/models/qwen3-vl-30b-a3b-thinking",name:"Qwen3 Vl 30B A3B Thinking"},{id:"accounts/fireworks/models/qwen3-8b",name:"Qwen3 8B"},{id:"accounts/fireworks/models/qwen3-vl-30b-a3b-instruct",name:"Qwen3 Vl 30B A3B Instruct"},{id:"accounts/fireworks/models/qwen2p5-vl-32b-instruct",name:"Qwen2P5 Vl 32B Instruct"},{id:"accounts/fireworks/models/llama4-maverick-instruct-basic",name:"Llama4 Maverick Instruct Basic"},{id:"accounts/fireworks/models/qwen3-235b-a22b-thinking-2507",name:"Qwen3 235B A22B Thinking 2507"},{id:"accounts/fireworks/models/qwen3-coder-480b-a35b-instruct",name:"Qwen3 Coder 480B A35B Instruct"}],[d.DEEPINFRA]:[{id:"meta-llama/Llama-3.2-11B-Vision-Instruct",name:"Llama 3.2 11B Vision Instruct"},{id:"Qwen/Qwen3-32B",name:"Qwen3 32B"},{id:"NousResearch/Hermes-3-Llama-3.1-70B",name:"Hermes 3 Llama 3.1 70B"},{id:"Qwen/Qwen2.5-72B-Instruct",name:"Qwen2.5 72B Instruct"},{id:"deepseek-ai/DeepSeek-V3-0324",name:"Deepseek V3 0324"},{id:"Qwen/Qwen3-VL-235B-A22B-Instruct",name:"Qwen3 Vl 235B A22B Instruct"},{id:"meta-llama/Llama-3.2-3B-Instruct",name:"Llama 3.2 3B Instruct"},{id:"Qwen/Qwen2.5-VL-32B-Instruct",name:"Qwen2.5 Vl 32B Instruct"},{id:"meta-llama/Meta-Llama-3.1-8B-Instruct",name:"Meta Llama 3.1 8B Instruct"},{id:"Qwen/Qwen3-Coder-480B-A35B-Instruct-Turbo",name:"Qwen3 Coder 480B A35B Instruct Turbo"}],[d.OPENROUTER]:[{id:"google/gemini-3-flash-preview",name:"Gemini 3 Flash Preview"},{id:"mistralai/mistral-small-creative",name:"Mistral Small Creative"},{id:"openai/gpt-5.2-chat",name:"Gpt 5.2 Chat"},{id:"openai/gpt-5.2-pro",name:"Gpt 5.2 Pro"},{id:"openai/gpt-5.2",name:"Gpt 5.2"},{id:"mistralai/devstral-2512",name:"Devstral 2512"},{id:"openai/gpt-5.1-codex-max",name:"Gpt 5.1 Codex Max"},{id:"mistralai/ministral-14b-2512",name:"Ministral 14B 2512"},{id:"mistralai/ministral-8b-2512",name:"Ministral 8B 2512"},{id:"mistralai/ministral-3b-2512",name:"Ministral 3B 2512"},{id:"mistralai/mistral-large-2512",name:"Mistral Large 2512"},{id:"deepseek/deepseek-v3.2-speciale",name:"Deepseek V3.2 Speciale"}],[d.PERPLEXITY]:[{id:"codellama-34b-instruct",name:"Codellama 34B Instruct"},{id:"codellama-70b-instruct",name:"Codellama 70B Instruct"},{id:"llama-2-70b-chat",name:"Llama 2 70B Chat"},{id:"llama-3.1-70b-instruct",name:"Llama 3.1 70B Instruct"},{id:"llama-3.1-8b-instruct",name:"Llama 3.1 8B Instruct"},{id:"llama-3.1-sonar-huge-128k-online",name:"Llama 3.1 Sonar Huge 128K Online"},{id:"llama-3.1-sonar-large-128k-chat",name:"Llama 3.1 Sonar Large 128K Chat"},{id:"llama-3.1-sonar-large-128k-online",name:"Llama 3.1 Sonar Large 128K Online"},{id:"llama-3.1-sonar-small-128k-chat",name:"Llama 3.1 Sonar Small 128K Chat"}],[d.COHERE]:[{id:"command-a-vision-07-2025",name:"Command A Vision 07 2025"},{id:"command-a-reasoning-08-2025",name:"Command A Reasoning 08 2025"},{id:"command-r-08-2024",name:"Command R 08 2024"},{id:"command-r7b-arabic-02-2025",name:"Command R7B Arabic 02 2025"},{id:"command-r7b-12-2024",name:"Command R7B 12 2024"}],[d.MOONSHOT]:[{id:"moonshot-v1-128k",name:"Moonshot 128K"},{id:"moonshot-v1-32k",name:"Moonshot 32K"},{id:"moonshot-v1-8k",name:"Moonshot 8K"},{id:"kimi-k2-0711-chat",name:"Kimi K2 Chat"},{id:"moonshot-v1-auto",name:"Moonshot Auto"}],[d.QWEN]:[{id:"qwen-flash",name:"Qwen Flash"},{id:"qwen3-vl-plus-2025-12-19",name:"Qwen3 Vl Plus 2025 12 19"},{id:"qwen3-tts-vd-realtime-2025-12-16",name:"Qwen3 Tts Vd Realtime 2025 12 16"},{id:"qwen-image-edit-plus-2025-12-15",name:"Qwen Image Edit Plus 2025 12 15"},{id:"qwen3-omni-flash-2025-12-01",name:"Qwen3 Omni Flash 2025 12 01"},{id:"qwen3-omni-flash-realtime-2025-12-01",name:"Qwen3 Omni Flash Realtime 2025 12 01"},{id:"qwen3-livetranslate-flash-2025-12-01",name:"Qwen3 Livetranslate Flash 2025 12 01"},{id:"qwen3-livetranslate-flash",name:"Qwen3 Livetranslate Flash"},{id:"qwen-plus-2025-12-01",name:"Qwen Plus 2025 12 01"},{id:"qwen3-tts-vc-realtime-2025-11-27",name:"Qwen3 Tts Vc Realtime 2025 11 27"}],[d.ZHIPU]:[{id:"glm-4.5",name:"Glm 4.5"},{id:"glm-4.5-air",name:"Glm 4.5 Air"},{id:"glm-4.6",name:"Glm 4.6"},{id:"glm-4.7",name:"Glm 4.7"}],[d.SILICONFLOW]:[{id:"deepseek-ai/DeepSeek-V3.2",name:"Deepseek V3.2"},{id:"deepseek-ai/DeepSeek-V3.1-Terminus",name:"Deepseek V3.1 Terminus"},{id:"deepseek-ai/DeepSeek-R1",name:"Deepseek R1"},{id:"deepseek-ai/DeepSeek-V3",name:"Deepseek V3"},{id:"zai-org/GLM-4.6V",name:"Glm 4.6V"},{id:"zai-org/GLM-4.6",name:"Glm 4.6"},{id:"Pro/zai-org/GLM-4.7",name:"Glm 4.7"},{id:"Qwen/Qwen3-VL-32B-Instruct",name:"Qwen3 Vl 32B Instruct"}],[d.OLLAMA]:[{id:"llama3.3",name:"Llama 3.3"},{id:"llama3.2",name:"Llama 3.2"},{id:"qwq",name:"QwQ (推理)"},{id:"qwen3:32b",name:"Qwen3 32B"},{id:"deepseek-r1:32b",name:"DeepSeek R1 32B"},{id:"deepseek-coder-v2",name:"DeepSeek Coder V2"},{id:"gemma3:27b",name:"Gemma 3 27B"},{id:"mistral:7b",name:"Mistral 7B"},{id:"phi4",name:"Phi 4"},{id:"codellama",name:"Code Llama"}],[d.DOUBAO]:[{id:"doubao-seed-1-8-251215",name:"Doubao 1.8"},{id:"doubao-seed-1-6-251015",name:"Doubao 1.6"},{id:"doubao-seed-1-6-lite-251015",name:"Doubao 1.6 Lite"},{id:"doubao-seed-1-6-flash-250828",name:"Doubao 1.6 Flash"},{id:"doubao-seed-1-6-thinking-250615",name:"Doubao 1.6 Thinking"}],[d.MINIMAX]:[{id:"MiniMax-M2.1",name:"MiniMax M2.1"},{id:"MiniMax-M2.1-lightning",name:"MiniMax M2.1 Lightning"},{id:"MiniMax-M2",name:"MiniMax M2"}]};function _(t){return ne[t]||[]}const se=t=>Array.isArray(t==null?void 0:t.data)?t.data.filter(n=>n.id).map(n=>{const s=n.name||(n.id.split("/").pop()??"").replace(/[-_]/g," ").replace(/\b\w/g,i=>i.toUpperCase());return{id:n.id,name:s,created:n.created||0}}).sort((n,s)=>(s.created||0)-(n.created||0)):[],Y={format:"openai",getModelsEndpoint:t=>`${t}/models`,getChatEndpoint:t=>`${t}/chat/completions`,buildHeaders:t=>({"Content-Type":"application/json",Authorization:`Bearer ${t}`}),buildChatPayload:(t,n,s)=>({model:t,messages:n,max_tokens:s}),parseChatResponse:t=>{var n,s,i;return((i=(s=(n=t.choices)==null?void 0:n[0])==null?void 0:s.message)==null?void 0:i.content)||""}},oe={openai:Y,anthropic:{format:"anthropic",getChatEndpoint:t=>`${t}/messages`,buildHeaders:t=>({"Content-Type":"application/json","x-api-key":t,"anthropic-version":"2023-06-01"}),buildChatPayload:(t,n,s)=>({model:t,messages:n,max_tokens:s}),parseChatResponse:t=>{var n,s;return((s=(n=t.content)==null?void 0:n[0])==null?void 0:s.text)||""}},gemini:{format:"gemini",getModelsEndpoint:(t,n)=>`${t}/models?key=${n}`,getChatEndpoint:(t,n,s)=>`${t}/models/${s}:generateContent?key=${n}`,buildHeaders:()=>({"Content-Type":"application/json"}),buildChatPayload:(t,n,s)=>({contents:n.map(a=>({role:a.role==="assistant"?"model":"user",parts:[{text:a.content}]})),generationConfig:{maxOutputTokens:s}}),parseChatResponse:t=>{var n,s,i,a,o;return((o=(a=(i=(s=(n=t.candidates)==null?void 0:n[0])==null?void 0:s.content)==null?void 0:i.parts)==null?void 0:a[0])==null?void 0:o.text)||""},parseModelsResponse:t=>Array.isArray(t.models)?t.models.filter(n=>{var s;return(s=n.supportedGenerationMethods)==null?void 0:s.includes("generateContent")}).map(n=>({id:n.name.replace("models/",""),name:n.displayName||n.name.replace("models/",""),created:n.created||0})).sort((n,s)=>(s.created||0)-(n.created||0)):[]},cohere:{format:"cohere",getModelsEndpoint:t=>`${t}/models`,getChatEndpoint:t=>`${t}/chat`,buildHeaders:t=>({"Content-Type":"application/json",Authorization:`Bearer ${t}`}),buildChatPayload:(t,n,s)=>{const i=n[n.length-1],a=n.slice(0,-1).map(o=>({role:o.role==="assistant"?"CHATBOT":"USER",message:o.content}));return{model:t,message:i.content,chat_history:a,max_tokens:s}},parseChatResponse:t=>t.text||""}};function J(t){return oe[t]||Y}async function ie(t){const{provider:n,apiKey:s,model:i,baseUrl:a,proxyUrl:o}=t,h=a||n.baseUrl,l=Date.now();try{if(o){const k=await(await fetch(`${o}/test`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider_id:n.id,api_key:s,model:i||"",base_url:a||n.baseUrl,api_format:n.apiFormat})})).json();return{success:k.success,latencyMs:k.latency_ms||Date.now()-l,message:k.message}}const r=J(n.apiFormat),m=i||"";if(!m)return{success:!1,latencyMs:0,message:"请先选择模型 (Please select a model)"};const c=r.buildHeaders(s),g=r.buildChatPayload(m,[{role:"user",content:"Hi"}],5),u=r.getChatEndpoint(h,s,m),f=await fetch(u,{method:"POST",headers:c,body:JSON.stringify(g)}),M=Date.now()-l;if(f.ok)return{success:!0,latencyMs:M,message:"连接成功"};{const E=await f.text();return{success:!1,latencyMs:M,message:`HTTP ${f.status}: ${E.slice(0,200)}`}}}catch(r){return{success:!1,latencyMs:Date.now()-l,message:r instanceof Error?r.message:String(r)}}}async function re(t){var h;const{provider:n,apiKey:s,baseUrl:i,proxyUrl:a,fallbackToStatic:o=!0}=t;if(a)try{const r=await(await fetch(`${a}/models`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider_id:n.id,api_key:s||void 0,base_url:i||n.baseUrl})})).json();if(r.success&&((h=r.models)==null?void 0:h.length)>0)return r.models}catch(l){if(console.warn("Failed to fetch models via proxy:",l),!o)throw l}if(!a&&n.supportsModelsApi)try{const l=J(n.apiFormat);if(l.getModelsEndpoint){const r=l.getModelsEndpoint(i||n.baseUrl,s||""),m=l.buildHeaders(s||""),c=await fetch(r,{method:"GET",headers:m});if(c.ok){const g=await c.json();return(l.parseModelsResponse||se)(g)}else if(!o)throw new Error(`HTTP ${c.status}`)}}catch(l){if(console.warn("Failed to fetch models directly:",l),!o)throw l}if(!o&&n.supportsModelsApi)throw new Error("Failed to fetch models");return _(n.id)}const G="ai_provider_config",le={get:t=>typeof window>"u"?null:localStorage.getItem(t),set:(t,n)=>{typeof window>"u"||localStorage.setItem(t,n)},remove:t=>{typeof window>"u"||localStorage.removeItem(t)}};function de(t=le,n={}){const s=n.serialize||JSON.stringify,i=n.deserialize||JSON.parse;return{save(a){try{const o=s(a);t.set(G,o)}catch(o){console.error("Failed to save config:",o)}},load(){const a=t.get(G);if(!a)return null;try{return i(a)}catch(o){return console.error("Failed to load config:",o),null}},clear(){t.remove(G)}}}function ce(t){if(!t)return{providers:Object.values(X),getModels:r=>_(r)};const{mode:n,include:s,exclude:i,custom:a}=t;let o=[];if(n==="default"){let r=Object.values(X);s&&s.length>0&&(r=r.filter(m=>s.includes(m.id))),i&&i.length>0&&(r=r.filter(m=>!i.includes(m.id))),o=[...r]}const h={};if(a)for(const[r,m]of Object.entries(a)){const c={id:r,name:m.name,baseUrl:m.baseUrl,needsApiKey:m.needsApiKey,apiFormat:m.apiFormat,supportsModelsApi:m.supportsModelsApi??!1,icon:m.icon},g=o.findIndex(u=>u.id===r);g>=0?o[g]={...o[g],...c,icon:c.icon||o[g].icon}:o.push(c),m.models&&m.models.length>0&&(h[r]=m.models)}return{providers:o,getModels:r=>h[r]?h[r]:_(r)}}function Z(t={}){var A,O,K,U,P;const n=e.ref(((A=t.initialConfig)==null?void 0:A.providerId)||""),s=e.ref(((O=t.initialConfig)==null?void 0:O.apiKey)||""),i=e.ref(((K=t.initialConfig)==null?void 0:K.model)||""),a=e.ref(((U=t.initialConfig)==null?void 0:U.modelName)||""),o=e.ref(((P=t.initialConfig)==null?void 0:P.baseUrl)||""),h=e.ref([]),l=e.ref("idle"),r=e.ref(null),m=e.ref(!1),c=e.ref(null),g=e.computed(()=>ce(t.providerConfig)),u=e.computed(()=>g.value.providers),f=e.computed(()=>u.value.find(p=>p.id===n.value)||null),M=de(void 0,{serialize:t.onSerialize,deserialize:t.onDeserialize}),E=e.ref(!1);e.onMounted(()=>{const p=M.load();p&&p.providerId&&u.value.some(y=>y.id===p.providerId)&&(n.value=p.providerId,p.apiKey&&(s.value=p.apiKey),p.model&&(i.value=p.model),p.modelName&&(a.value=p.modelName),p.baseUrl&&(o.value=p.baseUrl)),setTimeout(()=>{E.value=!0},0)}),e.watch(n,()=>{E.value&&(s.value="",i.value="",a.value="",o.value="",l.value="idle",r.value=null)});let k=null;const C=new Map;e.watch([n,s,o],()=>{if(k&&clearTimeout(k),!n.value||!f.value){h.value=[],c.value=null,m.value=!1;return}const p=f.value.supportsModelsApi&&(!f.value.needsApiKey||!!s.value),y=o.value||f.value.baseUrl,N=`${n.value}|${y}|${s.value}`,F=C.get(N);if(F){h.value=F,c.value=null,m.value=!1;return}if(!p){const S=g.value.getModels(n.value);h.value=S,C.set(N,S),c.value=null,m.value=!1;return}m.value=!0,c.value=null,h.value.length===0&&(h.value=g.value.getModels(n.value)),k=setTimeout(async()=>{try{let S;t.modelFetcher?S=await t.modelFetcher({type:"fetchModels",providerId:f.value.id,baseUrl:y,apiKey:s.value}):S=await re({provider:f.value,apiKey:s.value,baseUrl:y,proxyUrl:t.proxyUrl,fallbackToStatic:!1}),h.value=S,C.set(N,S)}catch(S){console.warn("Model fetch failed:",S),c.value="fetchModelsFailed",h.value=g.value.getModels(n.value)}finally{m.value=!1}},500)},{immediate:!0}),e.watch([s,o],()=>{(l.value==="error"||l.value==="success")&&(l.value="idle",r.value=null)});async function b(){if(!f.value||f.value.needsApiKey&&!s.value)return;l.value="testing",r.value=null;let p;if(t.modelFetcher)try{const y=await t.modelFetcher({type:"checkConnection",providerId:f.value.id,baseUrl:o.value||f.value.baseUrl,apiKey:s.value,modelId:i.value});p={success:y.success,latencyMs:y.latency||y.latencyMs,message:y.message}}catch(y){p={success:!1,message:y.message||"Unknown error"}}else p=await ie({provider:f.value,apiKey:s.value,baseUrl:o.value,model:i.value,proxyUrl:t.proxyUrl});return r.value=p,l.value=p.success?"success":"error",setTimeout(()=>{l.value="idle"},2e3),p}function B(){const p=h.value.find(N=>N.id===i.value),y=(p==null?void 0:p.name)||a.value||i.value;p!=null&&p.name&&p.name!==a.value&&(a.value=p.name),M.save({providerId:n.value,apiKey:s.value,model:i.value,modelName:y,baseUrl:o.value})}function x(){M.clear(),n.value="",s.value="",i.value="",a.value="",o.value=""}function I(p,y){if(i.value=p,y)a.value=y;else{const N=h.value.find(F=>F.id===p);a.value=(N==null?void 0:N.name)||p}}const T=e.computed(()=>{var p;return!(!n.value||!i.value||(p=f.value)!=null&&p.needsApiKey&&!s.value)}),w=e.computed(()=>{var p;return{providerId:n.value,apiKey:s.value,model:i.value,modelName:a.value,baseUrl:o.value||((p=f.value)==null?void 0:p.baseUrl)||""}});return{providerId:n,apiKey:s,model:i,modelName:a,baseUrl:o,models:h,testStatus:l,testResult:r,isFetchingModels:m,fetchModelError:c,provider:f,providers:u,isValid:T,config:w,runTest:b,save:B,clear:x,selectModel:I}}var me=Object.defineProperty,pe=(t,n,s)=>n in t?me(t,n,{enumerable:!0,configurable:!0,writable:!0,value:s}):t[n]=s,Q=(t,n,s)=>pe(t,typeof n!="symbol"?n+"":n,s);const L="\0";class ue{constructor(n){Q(this,"numOriginalCharacters"),Q(this,"characterList"),Q(this,"characterIndicesMap");const s=[...n],i=s.length;this.numOriginalCharacters=i,this.characterIndicesMap=new Map;for(let a=0;a<i;a++)this.characterIndicesMap.set(s[a],a);this.characterList=new Array(i*2+1),this.characterList[0]=L;for(let a=0;a<i;a++)this.characterList[1+a]=s[a],this.characterList[1+i+a]=s[a]}getCharacterIndices(n,s,i){let a=this.getIndexOfChar(n),o=this.getIndexOfChar(s);if(a<0||o<0)return null;switch(i){case"DOWN":s===L?o=this.characterList.length:o<a&&(o+=this.numOriginalCharacters);break;case"UP":a<o&&(a+=this.numOriginalCharacters);break;case"ANY":if(n!==L&&s!==L){if(o<a){const h=a-o;this.numOriginalCharacters-a+o<h&&(o+=this.numOriginalCharacters)}else if(a<o){const h=o-a;this.numOriginalCharacters-o+a<h&&(a+=this.numOriginalCharacters)}}break}return{startIndex:a,endIndex:o}}getSupportedCharacters(){return new Set(this.characterIndicesMap.keys())}getCharacterList(){return this.characterList}getIndexOfChar(n){return n===L?0:this.characterIndicesMap.has(n)?this.characterIndicesMap.get(n)+1:-1}}const R=0,D=1,z=2;function he(t,n,s){let i=0,a=0;const o=[];for(;;){const h=i===t.length,l=a===n.length;if(h&&l)break;if(h){for(;a<n.length;a++)o.push(D);break}if(l){for(;i<t.length;i++)o.push(z);break}const r=s.has(t[i]),m=s.has(n[a]);if(r&&m){let c=i+1,g=a+1;for(;c<t.length&&s.has(t[c]);)c++;for(;g<n.length&&s.has(n[g]);)g++;const u=c-i,f=g-a;if(u===f)for(let M=0;M<u;M++)o.push(R);else{const M=Array(u+1).fill(null).map(()=>Array(f+1).fill(0));for(let b=0;b<=u;b++)M[b][0]=b;for(let b=0;b<=f;b++)M[0][b]=b;for(let b=1;b<=u;b++)for(let B=1;B<=f;B++){const x=t[i+b-1]===n[a+B-1]?0:1;M[b][B]=Math.min(M[b-1][B]+1,M[b][B-1]+1,M[b-1][B-1]+x)}const E=[];let k=u,C=f;for(;k>0||C>0;)if(k===0)E.push(D),C--;else if(C===0)E.push(z),k--;else{const b=M[k][C-1],B=M[k-1][C],x=M[k-1][C-1];b<B&&b<x?(E.push(D),C--):B<x?(E.push(z),k--):(E.push(R),k--,C--)}for(let b=E.length-1;b>=0;b--)o.push(E[b])}i=c,a=g}else r?(o.push(D),a++):m?(o.push(z),i++):(o.push(R),i++,a++)}return o}function H(){return{currentChar:L,targetChar:L,charList:null,startIndex:0,endIndex:0,sourceWidth:0,currentWidth:0,targetWidth:0,directionAdj:1,prevDelta:0,currDelta:0}}function W(t,n,s,i){const a={...t};a.targetChar=n,a.sourceWidth=a.currentWidth,a.targetWidth=n===L?0:1;let o=!1;for(const h of s){const l=h.getCharacterIndices(a.currentChar,n,i);if(l){a.charList=h.getCharacterList(),a.startIndex=l.startIndex,a.endIndex=l.endIndex,o=!0;break}}return o||(a.charList=a.currentChar===n?[a.currentChar]:[a.currentChar,n],a.startIndex=0,a.endIndex=a.currentChar===n?0:1),a.directionAdj=a.endIndex>=a.startIndex?1:-1,a.prevDelta=a.currDelta,a.currDelta=0,a}function q(t,n,s=!1){const i={...t},a=Math.abs(i.endIndex-i.startIndex),o=n*a,h=o-Math.floor(o),l=i.prevDelta*(1-n),r=h*i.directionAdj+l,m=i.startIndex+Math.floor(o)*i.directionAdj;return n>=1?(i.currentChar=i.targetChar,i.currDelta=0,i.prevDelta=0):s&&i.charList&&m>=0&&m<i.charList.length&&(i.currentChar=i.charList[m],i.currDelta=r),i.currentWidth=i.sourceWidth+(i.targetWidth-i.sourceWidth)*n,{col:i,charIdx:m,delta:r}}const ee={linear:t=>t,easeIn:t=>t*t,easeOut:t=>1-(1-t)*(1-t),easeInOut:t=>t<.5?2*t*t:1-Math.pow(-2*t+2,2)/2,bounce:t=>t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},j=1.2,fe=((t,n)=>{const s=t.__vccOpts||t;for(const[i,a]of n)s[i]=a;return s})(e.defineComponent({__name:"Ticker",props:{value:{type:String,required:!0},characterLists:{type:Array,default:()=>["0123456789"]},duration:{type:Number,default:500},direction:{type:String,default:"ANY"},easing:{type:String,default:"easeInOut"},className:{type:String,default:""},charWidth:{type:Number,default:1}},setup(t){const n=t,s=e.ref([]),i=e.ref(1);let a;const o=e.computed(()=>n.characterLists.map(r=>new ue(r))),h=e.computed(()=>{const r=new Set;return o.value.forEach(m=>m.getSupportedCharacters().forEach(c=>r.add(c))),r});e.watch(()=>n.value,(r,m)=>{if(r===m)return;a&&(cancelAnimationFrame(a),a=void 0);let c=s.value;i.value<1&&i.value>0&&(c=c.map(w=>q(w,i.value,!0).col));const g=[...r],u=c.map(w=>w.currentChar),f=he(u,g,h.value);let M=0,E=0;const k=[],C=c.filter(w=>w.currentWidth>0);for(const w of f)if(w===D)k.push(W(H(),g[E++],o.value,n.direction));else if(w===R){const A=C[M++]||H();k.push(W(A,g[E++],o.value,n.direction))}else{const A=C[M++]||H();k.push(W(A,L,o.value,n.direction))}s.value=k,i.value=0;const b=performance.now(),B=n.duration,x=ee[n.easing]||ee.linear;let I=0;const T=w=>{const A=Math.min((w-b)/B,1),O=x(A);if((w-I>=16||A>=1)&&(I=w,i.value=O),A<1)a=requestAnimationFrame(T);else{const U=s.value.map(P=>q(P,1).col).filter(P=>P.currentWidth>0);s.value=U,i.value=1,a=void 0}};a=requestAnimationFrame(T)},{immediate:!0}),e.onUnmounted(()=>{a&&cancelAnimationFrame(a)});const l=e.computed(()=>s.value.map(r=>{const{charIdx:m,delta:c}=q(r,i.value),g=r.sourceWidth+(r.targetWidth-r.sourceWidth)*i.value;if(g<=0)return{width:g,chars:[]};const u=[],f=r.charList||[],M=c*j,E=(w,A,O)=>{w>=0&&w<f.length&&u.push({key:`${O}-${w}`,char:f[w],offset:M+A})};E(m,0,"c"),E(m+1,-j,"n"),E(m-1,j,"p");const k=w=>w&&w.length>0&&w.charCodeAt(0)>255,C=w=>k(w)?1.25:.8,b=f[r.startIndex]||"",B=f[r.endIndex]||"",x=C(b),I=C(B),T=x+(I-x)*i.value;return{width:g,chars:u,baseW:T}}).filter(r=>r.width>0));return(r,m)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["ticker",t.className])},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.value,(c,g)=>(e.openBlock(),e.createElementBlock("div",{key:g,class:"ticker-column",style:e.normalizeStyle({width:`${c.width*(c.baseW||.8)*t.charWidth}em`})},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(c.chars,u=>(e.openBlock(),e.createElementBlock("div",{key:u.key,class:"ticker-char",style:e.normalizeStyle({transform:`translateY(${u.offset}em)`})},e.toDisplayString(u.char===e.unref(L)?" ":u.char),5))),128))],4))),128))],2))}}),[["__scopeId","data-v-7e47ac69"]]),te=e.defineComponent({__name:"SmartText",props:{text:{},className:{},placeholder:{}},setup(t){return(n,s)=>!t.text&&t.placeholder?(e.openBlock(),e.createElementBlock("span",{key:0,class:e.normalizeClass(["apmsu-placeholder",t.className])},e.toDisplayString(t.placeholder),3)):t.text?(e.openBlock(),e.createElementBlock("span",{key:1,class:e.normalizeClass(["inline-flex min-w-0",t.className])},[e.createVNode(e.unref(fe),{value:t.text,"char-width":.8,duration:300},null,8,["value"])],2)):e.createCommentVNode("",!0)}}),ge={class:"apmsu-label"},ke={class:"relative"},ye=["disabled"],be={key:0,class:"flex items-center gap-2 min-w-0"},we=["src","alt"],Me={key:1,class:"apmsu-placeholder"},Ee=["onClick"],Ce={class:"flex items-center gap-2 flex-shrink-0"},ve=["src","alt"],Be={class:"font-medium whitespace-nowrap"},Ie={class:"apmsu-hint-text ml-auto text-right truncate flex-1 min-w-0"},xe=e.defineComponent({__name:"ProviderSelect",props:{providers:{},selectedProviderId:{},disabled:{type:Boolean,default:!1},language:{default:"zh"}},emits:["select"],setup(t,{emit:n}){const s=t,i=n,a=e.ref(!1),o=e.ref(null),h=e.computed(()=>$[s.language]),l=e.computed(()=>s.providers.find(c=>c.id===s.selectedProviderId));function r(c){o.value&&!o.value.contains(c.target)&&(a.value=!1)}e.onMounted(()=>{document.addEventListener("mousedown",r)}),e.onUnmounted(()=>{document.removeEventListener("mousedown",r)});function m(c){i("select",c),a.value=!1}return(c,g)=>(e.openBlock(),e.createElementBlock("div",{class:"apmsu-field",ref_key:"triggerRef",ref:o},[e.createElementVNode("label",ge,e.toDisplayString(h.value.providerLabel),1),e.createElementVNode("div",ke,[e.createElementVNode("button",{type:"button",onClick:g[0]||(g[0]=u=>!t.disabled&&(a.value=!a.value)),disabled:t.disabled,class:"apmsu-select-trigger"},[l.value?(e.openBlock(),e.createElementBlock("div",be,[e.createElementVNode("img",{src:l.value.icon,alt:l.value.name,class:"apmsu-provider-icon"},null,8,we),e.createVNode(te,{text:l.value.name},null,8,["text"])])):(e.openBlock(),e.createElementBlock("span",Me,e.toDisplayString(h.value.selectProvider),1)),(e.openBlock(),e.createElementBlock("svg",{class:e.normalizeClass(["apmsu-chevron",a.value?"rotate-180":""]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...g[1]||(g[1]=[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 9l-7 7-7-7"},null,-1)])],2))],8,ye),e.createElementVNode("div",{class:e.normalizeClass(["apmsu-dropdown max-h-[300px] overflow-auto p-1 origin-top",a.value?"apmsu-dropdown-open":""])},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.providers,u=>(e.openBlock(),e.createElementBlock("button",{key:u.id,type:"button",onClick:f=>m(u.id),class:e.normalizeClass(["apmsu-dropdown-item rounded-sm",t.selectedProviderId===u.id&&"apmsu-dropdown-item-active"])},[e.createElementVNode("div",Ce,[e.createElementVNode("img",{src:u.icon,alt:u.name,class:"apmsu-provider-icon"},null,8,ve),e.createElementVNode("span",Be,e.toDisplayString(u.name),1)]),e.createElementVNode("span",Ie,e.toDisplayString(u.baseUrl.replace("https://","")),1)],10,Ee))),128))],2)])],512))}}),Ae={key:0,class:"apmsu-field"},Ne={class:"apmsu-label"},Se={class:"relative"},Te=["type","value","placeholder","disabled"],Le={class:"absolute right-3 top-1/2 -translate-y-1/2 flex items-center justify-center"},Ve={key:0,class:"w-4 h-4 text-gray-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},Oe={key:1,class:"w-4 h-4 text-gray-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},Pe=e.defineComponent({__name:"AuthInput",props:{provider:{},apiKey:{},testStatus:{},disabled:{type:Boolean,default:!1},language:{default:"zh"}},emits:["update:apiKey"],setup(t,{emit:n}){const s=t,i=n,a=e.ref(!1),o=e.computed(()=>$[s.language]),h=e.computed(()=>s.testStatus==="success"?"apmsu-input apmsu-input-success":"apmsu-input apmsu-input-default");return(l,r)=>t.provider&&t.provider.needsApiKey?(e.openBlock(),e.createElementBlock("div",Ae,[e.createElementVNode("label",Ne,e.toDisplayString(o.value.apiKeyLabel),1),e.createElementVNode("div",Se,[e.createElementVNode("input",{type:a.value?"text":"password",value:t.apiKey,onInput:r[0]||(r[0]=m=>i("update:apiKey",m.target.value)),onFocus:r[1]||(r[1]=m=>a.value=!0),onBlur:r[2]||(r[2]=m=>a.value=!1),placeholder:o.value.apiKeyPlaceholder,disabled:t.disabled,class:e.normalizeClass([h.value,"pr-10"])},null,42,Te),e.createElementVNode("span",Le,[a.value?(e.openBlock(),e.createElementBlock("svg",Ve,[...r[3]||(r[3]=[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15 12a3 3 0 11-6 0 3 3 0 016 0z"},null,-1),e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"},null,-1)])])):(e.openBlock(),e.createElementBlock("svg",Oe,[...r[4]||(r[4]=[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21"},null,-1)])]))])])])):e.createCommentVNode("",!0)}}),Fe={class:"apmsu-label flex items-center justify-between"},Ue={class:"relative"},$e=["disabled"],De={class:"p-1.5 border-b border-gray-100 dark:border-zinc-800"},Ke=["placeholder","autofocus"],Re={class:"max-h-60 overflow-auto"},ze={class:"text-blue-500"},_e=["onClick"],Ge={key:1,class:"p-4 text-center apmsu-hint-text"},Qe={key:0,class:"min-h-[20px] flex items-center"},He={key:0,class:"apmsu-hint-text animate-pulse"},We={key:1,class:"apmsu-hint-text dark:text-zinc-500"},qe={key:2,class:"apmsu-hint-text"},je={key:3,class:"apmsu-hint-text"},Xe=e.defineComponent({__name:"ModelSelect",props:{provider:{},models:{},selectedModelId:{},hasApiKey:{type:Boolean},disabled:{type:Boolean,default:!1},language:{default:"zh"},isFetchingModels:{type:Boolean},fetchModelError:{},selectedModelName:{}},emits:["select"],setup(t,{emit:n}){const s=t,i=n,a=e.ref(!1),o=e.ref(""),h=e.ref(null),l=e.computed(()=>$[s.language]),r=e.computed(()=>s.models.filter(u=>u.name.toLowerCase().includes(o.value.toLowerCase())||u.id.toLowerCase().includes(o.value.toLowerCase()))),m=e.computed(()=>{var u;return((u=s.models.find(f=>f.id===s.selectedModelId))==null?void 0:u.name)||s.selectedModelName||s.selectedModelId});function c(u){h.value&&!h.value.contains(u.target)&&(a.value=!1,o.value="")}e.onMounted(()=>{document.addEventListener("mousedown",c)}),e.onUnmounted(()=>{document.removeEventListener("mousedown",c)});function g(u,f){i("select",u,f),a.value=!1,o.value=""}return(u,f)=>{var M,E;return e.openBlock(),e.createElementBlock("div",{class:"apmsu-field",ref_key:"triggerRef",ref:h},[e.createElementVNode("label",Fe,[e.createElementVNode("span",null,e.toDisplayString(l.value.modelLabel),1)]),e.createElementVNode("div",Ue,[e.createElementVNode("button",{type:"button",onClick:f[0]||(f[0]=k=>!t.disabled&&t.provider&&(a.value=!a.value)),disabled:t.disabled||!t.provider,class:"apmsu-select-trigger"},[e.createVNode(te,{text:m.value?m.value:"",placeholder:l.value.selectModel},null,8,["text","placeholder"]),(e.openBlock(),e.createElementBlock("svg",{class:e.normalizeClass(["apmsu-chevron",a.value?"rotate-180":""]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...f[3]||(f[3]=[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 9l-7 7-7-7"},null,-1)])],2))],8,$e),e.createElementVNode("div",{class:e.normalizeClass(["apmsu-dropdown origin-top",a.value?"apmsu-dropdown-open":""])},[e.createElementVNode("div",De,[e.withDirectives(e.createElementVNode("input",{type:"text","onUpdate:modelValue":f[1]||(f[1]=k=>o.value=k),placeholder:l.value.searchModel,class:"apmsu-select-trigger",autofocus:a.value},null,8,Ke),[[e.vModelText,o.value]])]),e.createElementVNode("div",Re,[o.value&&!r.value.some(k=>k.id===o.value)?(e.openBlock(),e.createElementBlock("button",{key:0,type:"button",onClick:f[2]||(f[2]=k=>g(o.value)),class:"apmsu-dropdown-item bg-blue-50 dark:bg-blue-900/20 border-b"},[e.createElementVNode("span",ze,e.toDisplayString(l.value.useCustom)+": "+e.toDisplayString(o.value),1)])):e.createCommentVNode("",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.value,k=>(e.openBlock(),e.createElementBlock("button",{key:k.id,type:"button",onClick:C=>g(k.id,k.name),class:e.normalizeClass(["apmsu-dropdown-item",t.selectedModelId===k.id&&"apmsu-dropdown-item-active"])},[e.createElementVNode("span",null,e.toDisplayString(k.name),1)],10,_e))),128)),r.value.length===0&&!o.value?(e.openBlock(),e.createElementBlock("div",Ge,e.toDisplayString(l.value.noModels),1)):e.createCommentVNode("",!0)])],2)]),(M=t.provider)!=null&&M.supportsModelsApi?(e.openBlock(),e.createElementBlock("div",Qe,[t.isFetchingModels?(e.openBlock(),e.createElementBlock("p",He,e.toDisplayString(l.value.refreshingModels),1)):t.fetchModelError?(e.openBlock(),e.createElementBlock("p",We,e.toDisplayString(l.value[t.fetchModelError]||t.fetchModelError),1)):(E=t.provider)!=null&&E.needsApiKey&&!t.hasApiKey?(e.openBlock(),e.createElementBlock("p",qe,e.toDisplayString(l.value.apiKeyTip),1)):(e.openBlock(),e.createElementBlock("p",je,e.toDisplayString(l.value.modelListUpdated),1))])):e.createCommentVNode("",!0)],512)}}}),Ye={class:"overflow-hidden"},Je=["value","placeholder","disabled"],Ze=e.defineComponent({__name:"BaseUrlInput",props:{provider:{},baseUrl:{},disabled:{type:Boolean,default:!1},language:{default:"zh"}},emits:["update:baseUrl"],setup(t,{emit:n}){const s=t,i=n,a=e.ref(!1),o=e.computed(()=>$[s.language]);return(h,l)=>t.provider?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[e.createElementVNode("button",{type:"button",onClick:l[0]||(l[0]=r=>a.value=!a.value),class:"text-xs text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 flex items-center gap-1 transition-colors"},[(e.openBlock(),e.createElementBlock("svg",{class:e.normalizeClass(["w-3 h-3 transition-transform",a.value&&"rotate-90"]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...l[2]||(l[2]=[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 5l7 7-7 7"},null,-1)])],2)),e.createTextVNode(" "+e.toDisplayString(o.value.customBaseUrl),1)]),e.createElementVNode("div",{class:"grid transition-all duration-200 ease-out",style:e.normalizeStyle({gridTemplateRows:a.value?"1fr":"0fr"})},[e.createElementVNode("div",Ye,[e.createElementVNode("input",{type:"text",value:t.baseUrl,onInput:l[1]||(l[1]=r=>i("update:baseUrl",r.target.value)),placeholder:t.provider.baseUrl,disabled:t.disabled,class:"apmsu-input apmsu-input-default"},null,40,Je)])],4)],64)):e.createCommentVNode("",!0)}}),et={class:"apmsu-card"},tt={key:0,class:"text-lg font-semibold mb-4"},at={class:"space-y-3"},nt={class:"space-y-4"},st={class:"pt-2 space-y-2"},ot={class:"flex gap-2"},it=["disabled"],rt={key:0,class:"flex items-center justify-center gap-2"},lt={key:1,class:"flex items-center justify-center gap-2"},dt={key:2,class:"flex items-center justify-center gap-2"},ct=["disabled"],mt={key:0,class:"flex items-center justify-center gap-2"},pt={class:"overflow-hidden"},ut={class:"p-2 rounded-md bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800"},ht={class:"text-xs text-red-600 dark:text-red-400 line-clamp-3 text-left"},ft={key:1,class:"mt-6 border border-gray-200/50 dark:border-zinc-800 rounded-lg overflow-hidden"},gt={class:"text-xs font-medium text-gray-500 dark:text-zinc-500 uppercase tracking-wider"},kt={class:"overflow-hidden"},yt={class:"text-xs text-gray-600 dark:text-zinc-400 font-mono overflow-x-auto leading-relaxed p-4 bg-zinc-50 dark:bg-zinc-900/50"},bt=e.defineComponent({__name:"AIConfigForm",props:{proxyUrl:{},config:{},initialConfig:{},title:{},showPreview:{type:Boolean,default:!1},saveButtonText:{},disabled:{type:Boolean,default:!1},onSerialize:{},onDeserialize:{},language:{default:"zh"},modelFetcher:{}},emits:["save","testResult","change"],setup(t,{emit:n}){const s=t,i=n,{providerId:a,apiKey:o,model:h,modelName:l,baseUrl:r,models:m,testStatus:c,testResult:g,provider:u,providers:f,isValid:M,config:E,runTest:k,save:C,selectModel:b,isFetchingModels:B,fetchModelError:x}=Z({proxyUrl:s.proxyUrl,providerConfig:s.config,initialConfig:s.initialConfig,onSerialize:s.onSerialize,onDeserialize:s.onDeserialize,modelFetcher:s.modelFetcher}),I=e.computed(()=>$[s.language]),T=e.ref("idle"),w=e.ref(!1);e.watch([a,o,h,r],()=>{i("change",{providerId:a.value,apiKey:o.value,model:h.value,baseUrl:r.value})}),e.watch(g,p=>{p&&i("testResult",p)});function A(){C(),T.value="saved",i("save",E.value),setTimeout(()=>{T.value="idle"},2e3)}function O(p){a.value=p}function K(p){o.value=p}function U(p,y){b(p,y)}function P(p){r.value=p}return(p,y)=>{var N,F,S,ae;return e.openBlock(),e.createElementBlock("div",et,[t.title?(e.openBlock(),e.createElementBlock("h2",tt,e.toDisplayString(t.title),1)):e.createCommentVNode("",!0),e.createElementVNode("div",at,[e.createVNode(xe,{providers:e.unref(f),selectedProviderId:e.unref(a),onSelect:O,disabled:t.disabled,language:t.language},null,8,["providers","selectedProviderId","disabled","language"]),e.createVNode(Ze,{provider:e.unref(u),baseUrl:e.unref(r),"onUpdate:baseUrl":P,disabled:t.disabled,language:t.language},null,8,["provider","baseUrl","disabled","language"]),e.createElementVNode("div",{class:e.normalizeClass(["transition-all duration-500 ease-in-out",e.unref(a)?"max-h-[1000px] opacity-100 overflow-visible":"max-h-0 opacity-0 overflow-hidden"])},[e.createElementVNode("div",nt,[e.createVNode(Pe,{provider:e.unref(u),apiKey:e.unref(o),"onUpdate:apiKey":K,testStatus:e.unref(c),disabled:t.disabled,language:t.language,isFetchingModels:e.unref(B),fetchModelError:e.unref(x)},null,8,["provider","apiKey","testStatus","disabled","language","isFetchingModels","fetchModelError"]),e.createVNode(Xe,{provider:e.unref(u),models:e.unref(m),selectedModelId:e.unref(h),onSelect:U,hasApiKey:!!e.unref(o),disabled:t.disabled,language:t.language,isFetchingModels:e.unref(B),fetchModelError:e.unref(x),selectedModelName:e.unref(l)},null,8,["provider","models","selectedModelId","hasApiKey","disabled","language","isFetchingModels","fetchModelError","selectedModelName"])])],2),e.createElementVNode("div",st,[e.createElementVNode("div",ot,[e.createElementVNode("button",{type:"button",onClick:y[0]||(y[0]=wt=>e.unref(k)()),disabled:!e.unref(a)||!e.unref(o)||!e.unref(h)||t.disabled||e.unref(c)==="testing",class:e.normalizeClass(["apmsu-btn flex-1",e.unref(c)==="success"?"apmsu-btn-success":e.unref(c)==="error"?"bg-red-100 dark:bg-red-900/30 text-red-600 dark:text-red-400 hover:bg-red-200 dark:hover:bg-red-900/40":"apmsu-btn-ghost border border-gray-200 dark:border-zinc-700"])},[e.unref(c)==="testing"?(e.openBlock(),e.createElementBlock("span",rt,[y[2]||(y[2]=e.createElementVNode("svg",{class:"apmsu-icon-spin",viewBox:"0 0 24 24",fill:"none"},[e.createElementVNode("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"}),e.createElementVNode("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"})],-1)),e.createTextVNode(" "+e.toDisplayString(I.value.testing),1)])):e.unref(c)==="success"?(e.openBlock(),e.createElementBlock("span",lt,[y[3]||(y[3]=e.createElementVNode("svg",{class:"apmsu-icon-success",fill:"currentColor",viewBox:"0 0 24 24"},[e.createElementVNode("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"})],-1)),e.createTextVNode(" "+e.toDisplayString(I.value.testSuccess)+" "+e.toDisplayString((N=e.unref(g))!=null&&N.latencyMs?`${e.unref(g).latencyMs}ms`:""),1)])):e.unref(c)==="error"?(e.openBlock(),e.createElementBlock("span",dt,[y[4]||(y[4]=e.createElementVNode("svg",{class:"apmsu-icon-error",fill:"currentColor",viewBox:"0 0 24 24"},[e.createElementVNode("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"})],-1)),e.createTextVNode(" "+e.toDisplayString(I.value.testFailed),1)])):(e.openBlock(),e.createElementBlock(e.Fragment,{key:3},[e.createTextVNode(e.toDisplayString(I.value.testConnection),1)],64))],10,it),e.createElementVNode("button",{onClick:A,disabled:!e.unref(M)||t.disabled,class:e.normalizeClass(["apmsu-btn flex-1",T.value==="saved"?"apmsu-btn-success":"apmsu-btn-primary"])},[T.value==="saved"?(e.openBlock(),e.createElementBlock("span",mt,[y[5]||(y[5]=e.createElementVNode("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2.5",d:"M5 13l4 4L19 7"})],-1)),e.createTextVNode(" "+e.toDisplayString(I.value.saved),1)])):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createTextVNode(e.toDisplayString(t.saveButtonText||I.value.save),1)],64))],10,ct)]),e.createElementVNode("div",{class:"grid transition-all duration-200 ease-out",style:e.normalizeStyle({gridTemplateRows:!((F=e.unref(g))!=null&&F.success)&&((S=e.unref(g))!=null&&S.message)&&e.unref(c)!=="testing"&&e.unref(c)!=="success"?"1fr":"0fr"})},[e.createElementVNode("div",pt,[e.createElementVNode("div",ut,[e.createElementVNode("p",ht,e.toDisplayString((ae=e.unref(g))==null?void 0:ae.message),1)])])],4)])]),t.showPreview&&e.unref(u)?(e.openBlock(),e.createElementBlock("div",ft,[e.createElementVNode("button",{type:"button",onClick:y[1]||(y[1]=wt=>w.value=!w.value),class:"w-full flex items-center justify-between px-4 py-3 bg-zinc-50 dark:bg-zinc-900/50 hover:bg-zinc-100 dark:hover:bg-zinc-800/50 transition-colors"},[e.createElementVNode("h3",gt,e.toDisplayString(I.value.preview),1),(e.openBlock(),e.createElementBlock("svg",{class:e.normalizeClass(["w-4 h-4 text-gray-400 transition-transform duration-200",w.value?"rotate-180":""]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...y[6]||(y[6]=[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 9l-7 7-7-7"},null,-1)])],2))]),e.createElementVNode("div",{class:"grid transition-all duration-200 ease-out",style:e.normalizeStyle({gridTemplateRows:w.value?"1fr":"0fr"})},[e.createElementVNode("div",kt,[e.createElementVNode("pre",yt,""+e.toDisplayString(JSON.stringify({provider:e.unref(u).name,apiFormat:e.unref(u).apiFormat,baseUrl:e.unref(r)||e.unref(u).baseUrl,model:e.unref(h)||I.value.unselected,hasApiKey:!!e.unref(o)},null,2))+`
|
|
2
|
+
`,1)])],4)])):e.createCommentVNode("",!0)])}}});V.AIConfigForm=bt,V.useAIConfig=Z,Object.defineProperty(V,Symbol.toStringTag,{value:"Module"})}));
|
|
3
|
+
//# sourceMappingURL=index.umd.cjs.map
|