@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.
@@ -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