# 模型服务功能实现文档 ## 📋 概述 本文档记录了模型服务功能的完整实现,包括真实的API连接、模型获取和聊天功能。 **实现日期**: 2025-10-14 **版本**: 1.0.1 --- ## 🎯 实现功能 ### ✅ 核心功能 #### 1. 真实API连接 - **HTTP请求**: 使用 Fetch API 进行实际的网络请求 - **多服务支持**: OpenAI、Claude、Gemini、Azure OpenAI、本地模型、自定义API - **超时控制**: 10秒连接超时,避免长时间等待 - **错误处理**: 完整的错误捕获和用户友好的错误信息 #### 2. 服务管理 - **添加服务**: 配置服务名称、类型、URL、API密钥 - **编辑服务**: 修改现有服务配置 - **删除服务**: 移除不需要的服务 - **连接/断开**: 实时管理服务连接状态 #### 3. 模型获取 - **自动获取**: 连接成功后自动获取可用模型列表 - **格式适配**: 支持不同服务的API响应格式 - **实时显示**: 在UI中展示可用模型 #### 4. 状态管理 - **连接状态**: connected、disconnected、connecting、error - **本地存储**: 自动保存和恢复服务配置 - **错误信息**: 详细的错误提示和诊断建议 --- ## 🏗️ 技术架构 ### 文件结构 ``` web/src/ ├── services/ │ └── modelServiceManager.ts # 模型服务管理器 ├── components/ │ └── ModelService.vue # 模型服务UI组件 └── SimpleApp.vue # 主应用(已集成) ``` ### 核心类:ModelServiceManager **职责**: - 管理所有模型服务实例 - 处理API连接和请求 - 格式转换和响应解析 - 单例模式,全局访问 **主要方法**: ```typescript // 测试连接 async testConnection(service: ModelService): Promise> // 获取模型列表 private async fetchModels(service: ModelService): Promise // 发送聊天请求 async sendChatRequest(serviceId: string, messages: any[], model: string): Promise> // 连接/断开服务 async connectService(serviceId: string): Promise disconnectService(serviceId: string): void ``` --- ## 🔌 API 集成 ### 1. OpenAI / 本地模型 **端点**: `{url}/models` **认证**: `Authorization: Bearer {apiKey}` **响应格式**: ```json { "data": [ { "id": "gpt-4", "object": "model" }, { "id": "gpt-3.5-turbo", "object": "model" } ] } ``` **聊天端点**: `{url}/chat/completions` --- ### 2. Claude (Anthropic) **端点**: 无公开模型列表API(使用预定义列表) **认证**: - `x-api-key: {apiKey}` - `anthropic-version: 2023-06-01` **预定义模型**: - claude-3-5-sonnet-20241022 - claude-3-haiku-20240307 - claude-3-sonnet-20240229 - claude-3-opus-20240229 **聊天端点**: `{url}/messages` **消息格式转换**: ```typescript // OpenAI格式 → Claude格式 messages.filter(m => m.role !== 'system') .map(m => ({ role: m.role === 'assistant' ? 'assistant' : 'user', content: m.content })) ``` --- ### 3. Google Gemini **端点**: `{url}/models?key={apiKey}` **认证**: URL参数传递 **响应格式**: ```json { "models": [ { "name": "models/gemini-pro" }, { "name": "models/gemini-1.5-pro" } ] } ``` **聊天端点**: `{url}/models/{model}:generateContent?key={apiKey}` **消息格式转换**: ```typescript messages.filter(m => m.role !== 'system') .map(m => ({ role: m.role === 'assistant' ? 'model' : 'user', parts: [{ text: m.content }] })) ``` --- ### 4. Azure OpenAI **端点**: `{url}/openai/deployments?api-version=2023-12-01-preview` **认证**: `api-key: {apiKey}` **响应格式**: ```json { "data": [ { "id": "gpt-4-deployment", "model": "gpt-4" }, { "id": "gpt-35-turbo-deployment", "model": "gpt-3.5-turbo" } ] } ``` **聊天端点**: `{url}/openai/deployments/{model}/chat/completions?api-version=2023-12-01-preview` --- ### 5. 自定义API **端点**: `{url}/models` **认证**: 通过自定义配置 JSON 指定 **自定义配置示例**: ```json { "headers": { "X-Custom-Auth": "token", "X-API-Version": "v1" }, "timeout": 30000 } ``` **支持的响应格式**: - `{ models: [...] }` - `{ data: [...] }` - `[...]` (数组格式) --- ## 💡 使用指南 ### 添加服务 1. **点击"添加服务"按钮** 2. **填写配置信息**: - 服务名称:自定义名称 - 服务类型:选择 OpenAI、Claude 等 - 服务地址:API 端点 URL - API Key:服务密钥 3. **保存配置** ### 测试连接 1. **点击服务卡片上的"连接"按钮** 2. **系统将执行**: - 发送 HTTP 请求到模型列表端点 - 验证 API 密钥 - 获取可用模型 - 显示测试结果 3. **查看结果**: - ✅ 成功:显示可用模型数量和列表 - ❌ 失败:显示错误信息和诊断建议 ### 管理服务 - **编辑**: 点击菜单 → 编辑 - **删除**: 点击菜单 → 删除 - **复制配置**: 点击菜单 → 复制配置 - **测试**: 点击菜单 → 测试连接 --- ## 🛠️ 配置示例 ### OpenAI ```json { "name": "OpenAI GPT-4", "type": "openai", "url": "https://api.openai.com/v1", "apiKey": "sk-..." } ``` ### Claude ```json { "name": "Claude 3", "type": "claude", "url": "https://api.anthropic.com/v1", "apiKey": "sk-ant-..." } ``` ### 本地 Ollama ```json { "name": "本地 Ollama", "type": "local", "url": "http://localhost:11434/v1", "apiKey": "ollama" } ``` ### Azure OpenAI ```json { "name": "Azure GPT-4", "type": "azure", "url": "https://your-resource.openai.azure.com", "apiKey": "your-azure-key" } ``` --- ## 🔍 错误处理 ### 常见错误及解决方案 #### 1. 连接超时 **错误**: `连接超时` **原因**: - 网络问题 - 服务器响应慢 - URL 错误 **解决方案**: - 检查网络连接 - 验证 URL 是否正确 - 尝试增加超时时间 --- #### 2. HTTP 401 未授权 **错误**: `HTTP 401: Unauthorized` **原因**: API 密钥无效或过期 **解决方案**: - 检查 API 密钥是否正确 - 确认密钥未过期 - 重新生成新密钥 --- #### 3. HTTP 403 禁止访问 **错误**: `HTTP 403: Forbidden` **原因**: - API 密钥权限不足 - IP 限制 - 配额超限 **解决方案**: - 检查 API 密钥权限 - 确认 IP 白名单 - 查看账户配额 --- #### 4. HTTP 404 未找到 **错误**: `HTTP 404: Not Found` **原因**: API 端点错误 **解决方案**: - 检查 URL 格式 - 确认 API 版本 - 参考官方文档 --- #### 5. CORS 错误 **错误**: `Failed to fetch` 或 CORS 相关错误 **原因**: 浏览器同源策略限制 **解决方案**: - 使用代理服务器 - 配置 CORS 头 - 使用本地开发服务器 --- ## 🎨 UI 组件 ### ModelService.vue **功能**: - 服务列表展示 - 添加/编辑/删除服务 - 连接测试 - 模型列表显示 **状态指示**: - 🟢 已连接 (绿色) - 🔴 未连接 (红色) - 🟡 连接中 (黄色) - 🔴 错误 (红色) **交互操作**: - 点击连接按钮:切换连接状态 - 点击菜单:显示操作选项 - 点击编辑:打开编辑模态框 - 点击测试:执行连接测试 --- ## 📊 数据存储 ### localStorage 键 **键名**: `model-services` **格式**: JSON 数组 **示例数据**: ```json [ { "id": "1234567890", "name": "OpenAI", "type": "openai", "url": "https://api.openai.com/v1", "apiKey": "sk-...", "status": "connected", "models": ["gpt-4", "gpt-3.5-turbo"], "lastUsed": "2025-10-14T12:00:00.000Z" } ] ``` --- ## 🔐 安全考虑 ### API 密钥保护 1. **掩码显示**: UI 中只显示前后4位 2. **本地存储**: 密钥存储在浏览器 localStorage 3. **不发送到服务器**: 仅在浏览器中使用 4. **HTTPS**: 建议使用 HTTPS 连接 **注意事项**: - ⚠️ localStorage 不是最安全的存储方式 - ⚠️ 不要在公共设备上保存密钥 - ⚠️ 定期更换 API 密钥 - ⚠️ 避免在代码中硬编码密钥 --- ## 🚀 未来改进 ### 短期计划 - [ ] 添加模型选择功能 - [ ] 实现聊天历史记录 - [ ] 支持流式响应 - [ ] 添加更多服务类型 ### 长期计划 - [ ] 加密存储 API 密钥 - [ ] 多账户管理 - [ ] 使用统计和费用跟踪 - [ ] 批量导入/导出配置 --- ## 📝 更新日志 ### v1.0.1 - 2025-10-14 #### 新增功能 - ✅ 真实API连接实现 - ✅ 多服务类型支持 (OpenAI、Claude、Gemini、Azure、Local) - ✅ 模型自动获取 - ✅ 连接状态管理 - ✅ 错误处理和诊断 #### 技术改进 - ✅ ModelServiceManager 单例类 - ✅ 类型安全的 TypeScript 实现 - ✅ 响应式 Vue 3 组件 - ✅ 本地存储持久化 #### UI优化 - ✅ 服务卡片布局 - ✅ 状态标签指示 - ✅ 测试连接模态框 - ✅ 错误信息展示 --- ## 🤝 贡献 欢迎贡献代码和提出建议! **联系方式**: - GitHub Issues: [项目地址] - Email: [联系邮箱] --- ## 📚 参考文档 - [OpenAI API 文档](https://platform.openai.com/docs/api-reference) - [Claude API 文档](https://docs.anthropic.com/claude/reference) - [Gemini API 文档](https://ai.google.dev/docs) - [Azure OpenAI 文档](https://learn.microsoft.com/azure/ai-services/openai/) --- **MCP Client Vue - 模型服务功能** 🚀