feat(copilot): move provider configuration to settings

This commit is contained in:
2026-07-12 22:27:29 +08:00
parent f39943629f
commit df23caf7d9
29 changed files with 916 additions and 258 deletions
@@ -1,7 +1,7 @@
# Copilot 配置中心实施计划
> 日期:2026-07-12
> 状态:待实施
> 状态:已实施(当前范围:对话 Provider 配置)
> 菜单名称:`Copilot 配置`
> 目标:为 GoChat 自托管部署提供可安全管理、可测试、可运行时生效的 Copilot/LLM 配置入口,并让页面选择的模型真正作用于 LLM 请求。
@@ -14,22 +14,22 @@
3. LLM Provider、Base URL、API Key 属于**平台级配置**,对整套 GoChat 安装生效。
4. 功能开关、功能模型、回复风格属于**账户级配置**,只影响当前 Account。
5. Assistant 的提示词、Guardrails、Response Guidelines、知识文档和 Inbox 绑定继续在 Assistant 页面管理,不塞入 Copilot 配置页。
6. API Key 明文落库,不增加应用层加密;接口只返回掩码、日志禁止记录,页面不提供查看明文能力。
6. API Key 使用基于现有 JWT Secret 派生密钥的 AES-256-GCM 加密后落库;接口只返回掩码,日志禁止记录,页面不提供查看明文能力。
7. Copilot 在系统中全局永久启用,不提供总开关,也不允许通过环境变量、配置文件或页面关闭。
8. Copilot Provider 参数只从数据库读取,不定义任何 Copilot/Captain 环境变量。
9. 除 Embedding 维度变化外,配置保存后应运行时生效,不要求重启服务。
---
## 2. 当前实现缺口
## 2. 实施前缺口
当前仓库已经有 Captain/Copilot 页面、API 和 LLM Provider,但还不是一个可用的配置闭环:
实施前仓库已经有 Captain/Copilot 页面、API 和 LLM Provider,但还不是一个可用的配置闭环:
- 设置侧栏中的 Captain AI 入口被注释。
- 旧设置页仅允许 Cloud/Enterprise 安装类型访问,自托管 Community 配置为不可访问。
- 旧设置页只能保存 `captain_models` 和 `captain_features`,没有 Provider、Base URL、API Key。
- Provider 在 `bootstrap.go` 启动时一次性创建,页面配置无法替换运行中的 Provider。
- `NewProviderFromConfig` 接收 `provider` 参数,但当前实际固定创建 OpenAI-compatible Eino ChatModel。
- 旧启动配置工厂接收 `provider` 参数,但实际固定创建 OpenAI-compatible Eino ChatModel;该入口现已移除。
- 多个 Service 仍使用硬编码模型或 Provider 默认模型,账户保存的模型选择没有完整进入请求链路。
- `installation_configs` 已有平台级 CRUD,但目前是无类型字符串存储,不能直接安全暴露 LLM 密钥。
@@ -182,12 +182,12 @@ Assistant 自身的 Temperature、Guardrails、Response Guidelines 优先级高
| InstallationConfig Name | 内容 |
|---|---|
| `COPILOT_PROVIDER_CONFIG` | 不含密钥的 JSON 配置 |
| `COPILOT_API_KEY` | 明文 API Key |
| `COPILOT_API_KEY` | AES-256-GCM 加密后的 API Key |
### 8.2 API Key 处理要求
- 不对 Copilot API Key 使用 AES-256-GCM 或其他应用层加密。
- API Key 以明文写入 `installation_configs.value`;数据库访问控制、备份权限和基础设施安全由部署方负责。
- Copilot API Key 使用 AES-256-GCM 加密后写入 `installation_configs.value`,加密密钥由现有 JWT Secret 派生。
- 更换 JWT Secret 前必须先重新保存 Copilot API Key,否则旧密文将无法解密。
- API 响应只返回:`configured: true/false`、`masked_value: "sk-****abcd"`。
- 更新请求中省略 `api_key` 表示保留原值;`clear_api_key: true` 才允许清除。
- 错误日志、审计日志、连接测试响应均不得包含 Key、Authorization Header 或完整请求体。