/** * LLM 配置组件 */ app.component('llm-config-page', { props: ['config'], emits: ['save'], setup(props, { emit }) { const { ref, reactive, watch } = Vue; // 表单数据 const form = reactive({ default_provider: '', default_model: '', anthropic_api_key: '', openai_api_key: '', deepseek_api_key: '', zhipu_api_key: '', minimax_api_key: '', minimax_group_id: '', moonshot_api_key: '', gemini_api_key: '' }); // 监听 props 变化 watch(() => props.config, (newVal) => { if (newVal) { Object.assign(form, newVal); } }, { immediate: true, deep: true }); // 提供商列表 const providers = [ { value: 'anthropic', label: 'Anthropic (Claude)', region: 'overseas', models: ['claude-sonnet-4-20250514', 'claude-3-5-sonnet-20241022', 'claude-3-opus-20240229'] }, { value: 'openai', label: 'OpenAI (GPT)', region: 'overseas', models: ['gpt-4o', 'gpt-4-turbo', 'gpt-3.5-turbo'] }, { value: 'gemini', label: 'Google Gemini', region: 'overseas', models: ['gemini-2.0-flash', 'gemini-1.5-pro'] }, { value: 'deepseek', label: 'DeepSeek', region: 'domestic', models: ['deepseek-chat', 'deepseek-coder'] }, { value: 'zhipu', label: '智谱 (GLM)', region: 'domestic', models: ['glm-4-flash', 'glm-4', 'glm-3-turbo'] }, { value: 'minimax', label: 'MiniMax', region: 'domestic', models: ['abab6.5s-chat', 'abab5.5-chat'] }, { value: 'moonshot', label: 'Moonshot (Kimi)', region: 'domestic', models: ['moonshot-v1-8k', 'moonshot-v1-32k', 'moonshot-v1-128k'] } ]; // 当前选中提供商的模型列表 const currentModels = Vue.computed(() => { const provider = providers.find(p => p.value === form.default_provider); return provider ? provider.models : []; }); // 测试连接 const testing = ref(null); async function testConnection(provider) { testing.value = provider; try { const res = await fetch(`/api/llm/test/${provider}`, { method: 'POST' }); const data = await res.json(); if (data.success) { ElementPlus.ElMessage.success(`${provider} 连接成功`); } else { ElementPlus.ElMessage.error(`${provider} 连接失败: ${data.error}`); } } catch (e) { ElementPlus.ElMessage.error(`测试失败: ${e.message}`); } testing.value = null; } // 保存配置 function handleSave() { emit('save', { ...form }); } return { form, providers, currentModels, testing, testConnection, handleSave }; }, template: `
{{ p.label }} {{ p.region === 'domestic' ? '国内' : '境外' }}
🤖 Anthropic (Claude)
测试连接
💬 OpenAI (GPT)
测试连接
Google Gemini
测试连接
🔍 DeepSeek 推荐
测试连接
🧠 智谱 (GLM)
测试连接
🎯 MiniMax
测试连接
🌙 Moonshot (Kimi)
测试连接
保存配置
` });