Skip to content

fix:修复 goroutine 泄漏、简化装配层依赖、补全工具调用流式事件#83

Merged
minorcell merged 3 commits into
1024XEngineer:mainfrom
phantom5099:main
Mar 30, 2026
Merged

fix:修复 goroutine 泄漏、简化装配层依赖、补全工具调用流式事件#83
minorcell merged 3 commits into
1024XEngineer:mainfrom
phantom5099:main

Conversation

@phantom5099

@phantom5099 phantom5099 commented Mar 29, 2026

Copy link
Copy Markdown
Collaborator

变更说明

本 PR 包含四项独立修复,分别解决 runtime 事件通道 goroutine 泄漏、provider 装配层冗余依赖、流式事件缺少工具调用过渡信号以及openll存在冗余API解析函数的问题。

主要改动

  1. 修复 emit/forwardProviderEvents goroutine 泄漏(runtime)
  • emit 方法增加 ctx context.Context 参数,采用两阶段 select:先非阻塞尝试发送,仅在通道满时才等待 ctx.Done() 退出
  • forwardProviderEvents 将 for-range 改为 select 同时监听输入通道和 ctx.Done(),context 取消时立即退出 goroutine
  • handleRunError 增加 ctx 参数,所有调用点同步更新
  • 文件:internal/runtime/runtime.go
  1. Service 暴露 Build 方法,简化 bootstrap 装配(provider)
  • provider.Service 新增 Build(ctx, cfg) 方法,委托内部 registry.Build,满足 runtime.ProviderFactory 接口
  • bootstrap.go 的 NewWithFactory 第四个参数从 providerRegistry 改为 providerService,消除装配层冗余对象
  • 文件:internal/provider/service.go、internal/app/bootstrap.go
  1. 扩展 StreamEvent 支持工具调用事件(provider + runtime)
  • provider.StreamEvent 新增 StreamEventToolCallStart 类型及 ToolName/ToolCallID 字段
  • runtime 新增 EventToolCallThinking 事件常量,forwardProviderEvents 增加对应转发分支
  • OpenAI 驱动 mergeToolCallDeltas 返回新发现的 tool call 列表,flushEvent 中推送 StreamEventToolCallStart 事件
  • 新增 emitToolCallStart 函数,与 emitTextDelta 保持一致的 context 感知模式
  • 文件:internal/provider/provider.go、internal/runtime/events.go、internal/runtime/runtime.go、internal/provider/openai/openai.go、internal/provider/openai/openai_test.go

预期收益

改动 收益
goroutine 泄漏修复 用户 Ctrl+C 取消后不再产生无法回收的后台 goroutine,避免内存持续增长
emit 两阶段 select 终端事件(EventRunCanceled、EventError)在 context 取消后仍可投递,TUI 能正确响应取消操作
Service.Build 装配层只需持有一个 providerService,降低 bootstrap.go 的复杂度,符合单一职责原则
tool_call 事件 TUI 可在模型发起工具调用时立即展示过渡提示(如"正在调用 filesystem_edit..."),消除文本输出突然中断的体验断层

测试验证

全部 14 个 internal 包测试通过(go test ./internal/... -count=1):

  • runtime 包:全部 12 个测试用例通过,包括 6 个取消场景测试(TestServiceCancelActiveRun、TestServiceRunCanceledByProvider、TestServiceRunCanceledDuringToolExecution、TestServiceRunPreservesProviderErrorAfterCancel、TestServiceRunPreservesToolErrorAfterCancel、TestServiceRunPreservesSessionSaveErrorAfterCancel)
  • provider/openai 包:TestMergeToolCallDeltas 新增 assertDisc 验证发现列表,覆盖单工具调用和多索引隔离场景
  • 其余包(app、config、provider、provider/builtin、provider/gemini、provider/openll、tools、tools/bash、tools/filesystem、tools/webfetch、tui)均无回归

Fixes #82

@codecov

codecov Bot commented Mar 29, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 73.41772% with 21 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
internal/runtime/runtime.go 69.23% 16 Missing ⚠️
internal/provider/openai/openai.go 81.81% 2 Missing and 2 partials ⚠️
internal/provider/service.go 75.00% 1 Missing ⚠️

📢 Thoughts on this report? Let us know!

@phantom5099 phantom5099 force-pushed the main branch 2 times, most recently from 8c8f881 to 6998e04 Compare March 29, 2026 15:07
Comment thread README.md Outdated
Comment thread README.md
@minorcell minorcell merged commit 9523d69 into 1024XEngineer:main Mar 30, 2026
1 of 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.

fix:修复 goroutine 泄漏、简化装配层依赖、补全工具调用流式事件

2 participants