Ask flow fails with two distinct issues on OpenAI-compatible / Anthropic-compatible providers: hanging SSE streams and invalid tool-call arguments
还没有人认领这个 Issue。
评估
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 新手友好度
- 35/100
- Issue 类型
- 缺陷
- 描述清晰度
- 需要澄清
- 活跃度
- 冷清
- 技术栈
- typescript
调研方向
Start by reproducing the Ask workflow with the documented OpenAI-compatible and Anthropic-compatible provider modes, focusing on the streaming consumer and tool-call handling paths. Compare the captured SSE termination and malformed arguments with Sourcebot's diagnostics, title-generation requests, and conversation state; done means the failure boundaries and any existing safeguards are clearly identified.
由索引模型根据 Issue 内容生成。
描述
Summary
We investigated repeated Ask failures in Sourcebot and captured the real upstream model traffic with a transparent proxy. We found two separate failure modes:
-
Streaming/network failure
Some model requests return200 OKwithtext/event-stream, start streaming, but never terminate correctly. Eventually the client fails with:TypeError: terminatedTLSSocket.onHttpSocketCloseread ETIMEDOUT
-
Tool-call argument failure
In OpenAI-compatible mode, the model sometimes emits invalid function arguments JSON for tool calls, which leads to:invalid function arguments json string- upstream
400 Bad Request
These are not the same failure.
Environment
- Sourcebot: current Docker image as of 2026-04-10
- Runtime: Node 24 inside container
- Deployment: local Docker on WSL2
- Provider modes tested:
openai-compatibleanthropic
What we ruled out
We ruled out the following as the primary root cause:
- WSL general outbound connectivity
- Docker general outbound connectivity
- basic long-lived
fetch/undiciSSE streaming in both host and container - host proxy env leakage into the Sourcebot container
Using the same sourcebot container and Node fetch/undici, an independent long streaming request to the same model endpoint completed successfully:
- host:
49 chunks,23594 bytes,38.4s - container:
52 chunks,25029 bytes,43.6s
This narrowed the failures to Sourcebot's real Ask workflow rather than general WSL/Docker outbound connectivity.
Failure mode 1: hanging SSE stream
Symptom
Frontend remains stuck in generating, and backend eventually reports:
TypeError: terminatedTLSSocket.onHttpSocketClose
Captured behavior
For some Ask requests, upstream responds with:
200 OKcontent-type: text/event-stream
But the stream never ends normally. Our proxy later records:
message: "terminated"cause_code: "ETIMEDOUT"cause_message: "read ETIMEDOUT"
This happened in both Anthropic-compatible and OpenAI-compatible runs.
Example evidence
OpenAI-compatible sample:
- request body size about
45 KB - stream starts successfully
- then hangs until timeout
Anthropic-compatible sample:
- request to
/anthropic/v1/messages stream=truethinking.enabledtool_choice={"type":"auto"}tools_count=8- stream starts, then never cleanly finishes
See sanitized evidence: https://gist.github.com/leozhengliu-pixel/6252d9b8415ab65dd106d11e2bf59da0
Failure mode 2: invalid tool-call arguments
Symptom
Frontend error:
Failed after 2 attempts with non-retryable error: 'invalid params, invalid function arguments json string ...'
Captured behavior
In an OpenAI-compatible request, the assistant produced this tool call:
{
"id": "call_function_j32rtdm8f446_1",
"type": "function",
"function": {
"name": "read_file",
"arguments": "\"{\""
}
}
The arguments field is not a JSON object string like:
{"path":"...","repo":"..."}
It is just a malformed string literal.
The same request also contains the tool error returned into conversation state:
{
"role": "tool",
"tool_call_id": "call_function_j32rtdm8f446_1",
"content": "Invalid input for tool read_file: JSON parsing failed: Text: {.\nError message: Expected property name or '}' in JSON at position 1 (line 1 column 2)"
}
That request ultimately receives 400 Bad Request.
Why I believe this is relevant to Sourcebot
Even if some instability may be provider-side, Sourcebot is the shared client here, and these failures happen specifically under Sourcebot Ask orchestration:
- tool-rich multi-step interaction
- title-generation subrequests
- conversation accumulation
- streaming consumer path
At minimum, it would help if Sourcebot:
- handled hanging SSE streams more defensively
- surfaced raw upstream request/response diagnostics more clearly
- isolated title-generation failure from main answer flow
- degraded more safely on malformed tool arguments
Requested guidance
Please help clarify:
- Is this a known limitation of Ask with OpenAI-compatible / Anthropic-compatible providers?
- Are there recommended settings to disable or simplify:
- title generation
- thinking
- tool streaming
- multi-step Ask behavior
- Is there an existing safeguard for malformed
tool_calls[].function.arguments? - Is there a supported way to capture Sourcebot's exact model payloads without patching Sourcebot?
I can provide more sanitized payloads if useful.
- 主要语言
- TypeScript
- 星标
- 3.9k
- 派生
- 374
- 平均合并
- 21 小时 18 分钟
- 30 天内合并 PR
- 39
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
sourcebot-dev/sourcebot 的其他 Issue
-
bug triage needed
难度 2/5 1-3 小时 新手友好度 84/100
sourcebot-dev/sourcebot#1681 · 1 条评论 ·
-
难度 2/5 1-3 小时 新手友好度 84/100
sourcebot-dev/sourcebot#1633 ·
-
bug
难度 2/5 1-3 小时 新手友好度 78/100
sourcebot-dev/sourcebot#1384 · 4 条评论 ·
-
ask_sb bug
难度 2/5 1-3 小时 新手友好度 76/100
sourcebot-dev/sourcebot#1137 · 4 条评论 ·
-
bug triage needed
难度 3/5 1-2 天 新手友好度 48/100
sourcebot-dev/sourcebot#1661 · 1 条评论 ·
查看 sourcebot-dev/sourcebot 的全部 Issue
相似的 Issue
-
难度 2/5 1-3 小时 新手友好度 75/100
safetrustcr/dApp-SafeTrust#426 ·
-
area:workflow bug ready-for-agent
难度 2/5 1-3 小时 新手友好度 75/100
fil-donadoni/tolaria#4409 ·
-
难度 2/5 1-3 小时 新手友好度 70/100
Fission-AI/OpenSpec#1960 ·
-
Add dependabot 未关闭
难度 2/5 1-3 小时 新手友好度 70/100
-
难度 2/5 1-3 小时 新手友好度 75/100
corsairdev/corsair#1764 ·