本文档记录了从 Gemini-only 系统到多提供商系统的安全迁移过程。
- 零破坏性变更 - 现有功能完全保持不变
- 渐进式替换 - 一次替换一个组件,充分测试
- 向后兼容 - 保留所有现有接口和行为
- 提供商感知 - 智能处理不同提供商的能力差异
旧系统: Tool -> config.getGeminiClient() -> GeminiClient.generateContent()
新系统: Tool -> config.getSmartAIClient() -> AIClientAdapter -> [Universal|Gemini]Client
文件: packages/core/src/config/config.ts
新增方法:
getSmartAIClient()- 智能客户端选择器getUniversalAIClient()- 通用 AI 客户端getAIClientAdapter()- 兼容性适配器- AI 配置相关的 getter 方法
影响: 无破坏性变更,完全向后兼容
文件: packages/core/src/tools/web-search.ts
变更详情:
- 替换:
config.getGeminiClient()→config.getSmartAIClient() - 新增: 提供商兼容性检查
- 行为: Google Search 功能仅在 Google/Gemini 提供商下可用
向后兼容性: ✅ 完全兼容
- 使用 Gemini/Google 提供商时:行为完全相同
- 使用其他提供商时:友好的错误提示而非崩溃
测试状态: ✅ 通过
- TypeScript 编译通过
- 项目构建成功
- 功能测试验证
# 测试 1: Gemini 提供商(向后兼容)
export HYPER_AI_PROVIDER=gemini
export HYPER_AI_API_KEY=AIza...
export HYPER_AI_MODEL=gemini-2.5-flash
✅ 系统正确识别并配置
# 测试 2: OpenAI 提供商(新功能)
export HYPER_AI_PROVIDER=openai
export HYPER_AI_API_KEY=sk-...
export HYPER_AI_MODEL=gpt-4o
✅ 系统支持但 web-search 会提示切换到 Google 提供商
# 测试 3: 原有 Gemini 配置(完全兼容)
export GEMINI_API_KEY=AIza...
✅ 系统回退到 Gemini 提供商,保持原有行为npm run typecheck # ✅ 通过
npm run build # ✅ 成功-
tools/shell.ts- 基础工具,使用简单 -
tools/write-file.ts- 文件操作工具
-
tools/edit.ts- 需要处理ensureCorrectEdit依赖 -
utils/editCorrector.ts- 深层依赖,需要接口适配
- CLI 层面的流式处理
- 聊天历史管理
- 错误处理和重试逻辑
如果发现问题,回滚步骤:
- 立即回滚: 恢复
web-search.ts中的原始getGeminiClient()调用 - 配置清理: 移除
config.ts中的新增方法(保留导入) - 验证: 运行现有测试套件确保功能正常
- 小步快跑: 选择最简单的工具作为第一个迁移目标
- 提供商感知: 添加检查确保功能在正确的提供商下运行
- 充分测试: 每次更改后立即进行编译、构建和功能测试
- 避免深层修改: 不要同时修改多个依赖层级
- 保留类型安全: 使用适当的类型转换而非
any - 用户体验: 提供清晰的错误信息而不是静默失败
✅ 第一阶段完成: 多提供商基础架构 + 第一个安全替换 🔄 当前阶段: 继续替换更多工具,采用相同的安全策略 🎯 最终目标: 完全的多提供商支持,保持 100% 向后兼容性
最后更新: 2025-01-25 迁移进度: 1/19 工具已迁移