Anthropic API: tool calls intermittently emitted inside `thinking` and returned as `end_turn`
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 48/100
Research direction
Start with the attached failing SSE log and trace the /v1/messages streaming path for thinking and tool-call output. Compare a failing turn with thinking enabled against a successful tool-use turn and the reported thinking-off run. Done means intended tool calls are emitted in an Anthropic tool_use block with stop_reason: "tool_use", rather than as thinking_delta followed by end_turn.
Written by the indexing model from the issue text.
Description
AI disclosure: This issue was created with the assistance of AI based on captured Pi session logs and raw SSE traffic. Im not a dev :)
System
- OS: Ubuntu 26.04.1 LTS
- Kernel: 7.0.0-34-generic
- CPU: AMD Ryzen 7 9800X3D
- RAM: 32 GB DDR5-6000
- GPU: NVIDIA GeForce RTX 3090 24 GB
- NVIDIA driver: 595.91.07
- CUDA: 13.2
- Strata: Docker, v0.1.38
- Model:
qwen3.8-flash-next-coder-iq1_m - Context: 262144
- API: Anthropic-compatible
/v1/messages - Client: Pi 1.0.2
- Pi thinking mode:
low(budget_tokens: 2048)
Setup
- Strata: current Docker build / v0.1.38-era code
- Model:
qwen3.8-flash-next-coder-iq1_m - API:
/v1/messages - Client: Pi 1.0.2
- Pi thinking:
low - Request thinking budget:
2048 - Context: well below 262K
With thinking enabled, Strata intermittently emits a complete intended tool call inside the Anthropic thinking block instead of producing a structured tool_use.
Raw SSE from a failing request:
event: content_block_delta
data: {"type":"content_block_delta","index":0,
"delta":{"type":"thinking_delta","thinking":"<tool_call>"}}
...
event: content_block_delta
data: {"type":"content_block_delta","index":0,
"delta":{"type":"thinking_delta","thinking":"</tool_call>"}}
Immediately afterwards:
event: content_block_stop
data: {"type":"content_block_stop","index":0}
event: message_delta
data: {"type":"message_delta",
"delta":{"stop_reason":"end_turn","stop_sequence":null},
"usage":{"input_tokens":243,
"cache_read_input_tokens":28792,
"output_tokens":79}}
event: message_stop
data: {"type":"message_stop"}
There is no Anthropic tool_use content block in the failed turn.
Successful turns in the same session correctly produce:
event: content_block_start
data: {"type":"content_block_start","index":2,
"content_block":{"type":"tool_use", ...}}
event: message_delta
data: {"type":"message_delta",
"delta":{"stop_reason":"tool_use", ...}}
Reproduction
Using the same multi-step tool workload:
thinking low: C1 FAIL / C2 FAIL / C3 FAIL
thinking off: C4 PASS
Failures occurred at different context sizes (~21K–34K), so this does not appear to be a context-limit or timeout issue.
Expected
When the model transitions from reasoning to a tool call, Strata should emit a structured Anthropic tool_use block and stop_reason: "tool_use".
Actual
The intended tool call is sometimes streamed as thinking_delta, followed by a clean end_turn, causing the client agent loop to stop.
- Dominant language
- C++
- Stars
- 11.6k
- Forks
- 1k
- Avg merge
- 7h 46m
- Merged PRs (30d)
- 30
Getting set up
This project ships no dev container, Dockerfile or contributing guide, so setting up is up to you: start from its README, and see our first-contribution guide for the general steps.
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from Niko1221/Strata
-
Difficulty 1/5 Under an hour Newbie friendliness 82/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 62/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 80/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 64/100
Niko1221/Strata#1248 · 1 comment ·
Maintainers usually reply within 1 day
Similar issues
-
8-membered-ring atrop stereo lost in 2026.09.1Possibly taken A pull request linked to this issue is open or already merged. Openbug
Difficulty 2/5 Half a day Newbie friendliness 86/100
Maintainers usually reply within 2 days
-
thread safetyOpen1.0
Difficulty 1/5 Under an hour Newbie friendliness 72/100
Maintainers usually reply within 1 day
-
libasr headers?Open
Difficulty 2/5 1-3 hours Newbie friendliness 66/100
Maintainers usually reply within 1 day
-
Type: Bug :bug:
Difficulty 2/5 1-3 hours Newbie friendliness 83/100
-
llvm-trunk
Difficulty 1/5 Under an hour Newbie friendliness 88/100
Maintainers usually reply within 1 day