Skip to content

refactor(provider):拆分type和openai#185

Merged
minorcell merged 1 commit into
1024XEngineer:mainfrom
phantom5099:main
Apr 7, 2026
Merged

refactor(provider):拆分type和openai#185
minorcell merged 1 commit into
1024XEngineer:mainfrom
phantom5099:main

Conversation

@phantom5099

Copy link
Copy Markdown
Collaborator

变更说明

internal/provider/types.go 拆分为独立的 internal/provider/types/ 子包,将 internal/provider/openai/openai.go 单文件按职责拆分为 8 个文件,同时修复 SSE 流消费中的多个 Bug。

主要改动

1. internal/provider/types/ 子包拆分

新文件 职责 原位置
message.go MessageToolCallToolSpec 结构体及角色常量 provider/types.go
request.go ChatRequestUsage 结构体 provider/types.go
event.go StreamEvent 及全部事件类型、载荷结构、构造函数、访问器 provider/types.go
types_test.go 子包独立单元测试(结构体字段、JSON round-trip、访问器边界) provider/types_test.go(部分迁移)
  • provider.goProvider 接口改为引用 types.ChatRequesttypes.StreamEvent
  • 原文件 internal/provider/types.gointernal/provider/types_test.go 删除。

2. internal/provider/openai/ 适配器拆分

新文件 职责 原 openai.go 行数
driver.go DriverName 常量、Driver() 驱动注册、defaultRetryTransport() ~40 行
provider.go Provider 结构体、New() 构造、Chat() 入口、DiscoverModels() ~120 行
request.go buildRequest()toOpenAIMessage()parseError() ~105 行
response.go consumeStream() SSE 流消费主循环、extractStreamUsage() ~135 行
events.go emitTextDelta/ToolCallStart/ToolCallDelta/MessageDoneemitStreamEventflushDataLines ~60 行
toolcall.go mergeToolCallDelta() 工具调用增量合并 ~43 行
discovery.go fetchModels() 模型发现 HTTP 请求 ~51 行
types.go 全部 OpenAI 协议结构体(12 个) ~90 行
  • 原文件 internal/provider/openai/openai.go 删除。
  • sse_reader.gosse_reader_test.go 保持不变。

3. Bug 修复

Bug 修复方式 影响测试
flushDataLines 拼接多 data 行产生无效 JSON 改为逐行处理,每行独立调用 processChunk TestConsumeStream_SSECommentIgnoredTestConsumeStream_MultiLineDataPayloadTestChat_BaseURLTrailingSlashHandled
data: [DONE] 与前一行 JSON 拼接导致解码失败 consumeStream 中遇到 [DONE] 时立即刷新缓冲并标记结束 TestConsumeStream_SSECommentIgnoredTestConsumeStream_FinishReasonAccumulation
测试数据工具参数为完整 JSON 导致合并后格式错误 将参数改为不完整的 JSON 分片(如 {"path":"main.go" + ,"replace_string":"new"} TestMergeToolCallDelta_MultipleIndicesTestProviderChatConsumesSSEAndMergesToolCallsTestProviderChatEmitsFullEventStream
TestBuildRequest_EmptyModelReturnsError 无法触达 buildRequest 直接构造 Provider 绕过 New() 的 Validate 校验 TestBuildRequest_EmptyModelReturnsError
TestConsumeStream_FinishReasonAccumulation 测试数据 finish_reason 位置错误 从 JSON 顶层移入 choice 内部 TestConsumeStream_FinishReasonAccumulation

预期收益

  1. 可维护性:每个文件职责单一,types 子包按领域对象分组,openai 子包按协议阶段分组,新增事件类型或协议字段时只需修改对应文件。
  2. 可读性:从 500 行单文件降低到每个文件 40-135 行,开发者可快速定位协议转换、流消费、事件发射等逻辑。
  3. 正确性:修复 5 个 SSE 流消费和测试数据相关的 Bug,全部 21 个测试包通过。
  4. 零功能变更:纯重构 + Bug 修复,Provider 接口行为、流式事件协议、OpenAI API 兼容性完全不变,上游 runtime/tui 仅需调整 import 路径。

@minorcell minorcell merged commit ae4750a into 1024XEngineer:main Apr 7, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants