Skip to content

fix(provider):模型流式输出中途截断但界面无错误提示#191

Merged
phantom5099 merged 5 commits into
1024XEngineer:mainfrom
phantom5099:main
Apr 9, 2026
Merged

fix(provider):模型流式输出中途截断但界面无错误提示#191
phantom5099 merged 5 commits into
1024XEngineer:mainfrom
phantom5099:main

Conversation

@phantom5099

Copy link
Copy Markdown
Collaborator

变更说明

本次变更修复了一个主链路可观测性问题:

  • 当模型流式输出在中途被截断时,系统此前会把这次异常结束误判为正常完成;
  • UI 因此显示 Ready,但回答内容实际上只输出了一半;
  • 现在这类场景会被标记为中断错误,并进入统一错误处理分支。

本次 PR 聚焦于“流式结束判定错误”这一主因,不包含对历史坏 session 文件的自动修复。

主要改动

1. provider 层严格校验 [DONE]

  • 更新 internal/provider/openai/response.go
  • 当 SSE 流以 EOF 结束但未收到 [DONE] 时,返回 provider.ErrStreamInterrupted
  • 不再把该场景伪装成正常 message_done

2. runtime 层要求必须收到 message_done

  • 更新 internal/runtime/runtime.go
  • 在流式累积状态中记录是否收到 message_done
  • provider.Chat() 返回 nil 但没有 message_done 时,runtime 直接按中断错误处理
  • 避免继续持久化半成品 assistant 消息并发出 EventAgentDone

3. 补充回归测试

  • 更新 internal/provider/openai/openai_test.go
    • 覆盖 EOF 且缺失 [DONE] 时应返回中断错误
  • 更新 internal/runtime/runtime_test.go
    • 覆盖 provider 缺失 message_done 时 runtime 应报错而非完成
    • 调整测试辅助 provider,默认补齐合法结束事件,避免把不完整流误当作正常样例

预期收益

  • 用户遇到流式输出被截断时,可以看到明确错误,而不是“Ready + 半截回答”
  • runtime 对 provider 流协议的成功条件更严格,减少半成品消息进入 session 的风险
  • provider 与 runtime 的完成语义更一致,后续扩展其他 provider 时更容易复用同一套约束
  • 回归测试覆盖关键边界,降低同类问题再次出现的概率

@codecov

codecov Bot commented Apr 7, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 85.71429% with 2 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
internal/provider/openai/response.go 75.00% 1 Missing and 1 partial ⚠️

📢 Thoughts on this report? Let us know!

@phantom5099 phantom5099 merged commit 3bb67f8 into 1024XEngineer:main Apr 9, 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.

1 participant