refactor: 实现 ConversionEngine 协议转换引擎,替代旧 protocol 包
引入 Canonical Model 和 ProtocolAdapter 架构,支持 OpenAI/Anthropic 协议间 无缝转换,统一 ProxyHandler 替代分散的 OpenAI/Anthropic Handler,简化 ProviderClient 为协议无关的 HTTP 发送器,Provider 新增 protocol 字段。
This commit is contained in:
@@ -180,14 +180,14 @@ type ProviderClient interface {
|
||||
- 路由时需要知道 providerProtocol 以选择正确的 Adapter
|
||||
- 默认值 `'openai'` 确保现有数据兼容
|
||||
|
||||
### D7: 删除旧 `internal/protocol/` 包,在 `internal/conversion/` 中重建
|
||||
### D7: 删除旧 `internal/protocol/` 包,在 `internal/conversion/` 中全新实现
|
||||
|
||||
**选择**:直接删除 `internal/protocol/openai/` 和 `internal/protocol/anthropic/`,在 `internal/conversion/` 下从零构建新架构
|
||||
**选择**:直接删除 `internal/protocol/openai/` 和 `internal/protocol/anthropic/`,在 `internal/conversion/` 下对照设计文档全新编写所有代码
|
||||
|
||||
**理由**:
|
||||
- 旧代码的设计模式(OpenAI 类型为枢纽)与新架构根本不同
|
||||
- 旧代码的设计模式(OpenAI 类型为枢纽)与新架构根本不同,无法复用
|
||||
- 保留旧代码容易导致混用两种模式,引入隐蔽 bug
|
||||
- 旧代码中的类型定义可以迁移(copy-paste),但组织方式需重建
|
||||
- 旧代码中的类型定义不迁移,直接根据设计文档重新定义,确保与新架构一致
|
||||
|
||||
### D8: 目标包结构
|
||||
|
||||
@@ -206,7 +206,7 @@ internal/conversion/
|
||||
engine.go # ConversionEngine 门面 + HTTPRequestSpec/HTTPResponseSpec
|
||||
|
||||
openai/
|
||||
types.go # OpenAI 线路格式类型(从旧 protocol/openai/types.go 迁移并补全)
|
||||
types.go # OpenAI 线路格式类型(对照 conversion_openai.md 全新定义)
|
||||
adapter.go # ProtocolAdapter 实现(detectInterfaceType/buildUrl/buildHeaders/supportsInterface/encodeError)
|
||||
decoder.go # decodeRequest/decodeResponse/扩展层 decode 方法
|
||||
encoder.go # encodeRequest/encodeResponse/扩展层 encode 方法
|
||||
@@ -214,7 +214,7 @@ internal/conversion/
|
||||
stream_encoder.go # OpenAIStreamEncoder(缓冲策略)
|
||||
|
||||
anthropic/
|
||||
types.go # Anthropic 线路格式类型(从旧 protocol/anthropic/types.go 迁移并补全)
|
||||
types.go # Anthropic 线路格式类型(对照 conversion_anthropic.md 全新定义)
|
||||
adapter.go # ProtocolAdapter 实现(detectInterfaceType/buildUrl/buildHeaders/supportsInterface/encodeError)
|
||||
decoder.go # decodeRequest/decodeResponse/扩展层 decode 方法
|
||||
encoder.go # encodeRequest/encodeResponse/扩展层 encode 方法
|
||||
@@ -260,14 +260,14 @@ internal/conversion/
|
||||
### 步骤
|
||||
|
||||
1. **创建 `internal/conversion/` 包**:实现 Layer 1-3(Canonical Model、接口定义、Engine),不改动现有代码
|
||||
2. **实现 OpenAI Adapter 和 Anthropic Adapter**:Layer 4-5,在 conversion 包内自包含
|
||||
2. **全新实现 OpenAI Adapter 和 Anthropic Adapter**:Layer 4-5,对照设计文档在 conversion 包内全新编写,不沿用旧 protocol 包代码
|
||||
3. **编写全面测试**:覆盖编解码、流式转换、错误处理、同协议透传
|
||||
4. **改造 `domain.Provider`**:新增 `Protocol` 字段
|
||||
5. **创建数据库迁移**:`ALTER TABLE providers ADD COLUMN protocol TEXT DEFAULT 'openai'`
|
||||
6. **改造 `ProviderClient`**:简化为接受 `HTTPRequestSpec` 的 HTTP 发送器
|
||||
7. **创建 `ProxyHandler`**:统一代理入口,集成 ConversionEngine
|
||||
8. **更新 `cmd/server/main.go`**:注册 Adapter、创建 Engine、配置新路由
|
||||
9. **删除旧 `internal/protocol/` 包**:确认新架构完全替代后删除
|
||||
9. **删除旧 `internal/protocol/` 包**:直接删除,不迁移代码,确认新架构完全替代
|
||||
10. **更新 README.md**:项目结构、API 接口、路由说明
|
||||
|
||||
### 兼容策略
|
||||
@@ -279,7 +279,7 @@ internal/conversion/
|
||||
### 回滚策略
|
||||
|
||||
- Git 分支隔离:在新分支开发,合并前充分测试
|
||||
- 旧 `internal/protocol/` 包在确认新架构稳定后再删除
|
||||
- 旧 `internal/protocol/` 包在删除前确认新架构所有测试通过,删除后不可恢复旧代码(从 git 历史仍可找回)
|
||||
- 数据库迁移向下兼容(仅 ADD COLUMN)
|
||||
|
||||
## Open Questions
|
||||
|
||||
Reference in New Issue
Block a user