Repository navigation
[Engine] Tool calls emitted as text / rejected, breaking agent processing #4751
Description
Follow-up to #4427. That issue was closed, and couldn't reopen it, so this is filed as a new issue.
The problem
In PTC mode (Deepseek Harness) but not only limited to this harness, tool calls can come back to the agent as plain text instead of being executed. The agent run never completes, and the conversation is broken in an irreparable way most of the time. This still happens in the current build.
Last known working was version 0.1.45, unsure about more recent builds.
Steps to reproduce
-
Build Strata and run with
./run-<model>.sh -
Set PTC mode (Deepseek Harness, DSH) in a new conversation.
-
Run the agent through a long agentic Blender task with a prompt like this:
I have added inside the
measurementsdirectory inangle-piecethe measurements for the 3D model you have to make in Blender. The scope is 3D printing, and the 3D printed piece needs to lock on the angle by having a vertical piece on the bottom to not move, and a flat piece on the top to ultimately lock. Recreate the measured piece for reference, and as a separate object the one that will be printed. Do not recreate everything, only the angle of interest. The scope of the 3D piece to print is to not break the clothes when hurting the angle -
After a long multi-step session (1 turn, 22 steps, 710K tok), at some point instead of executing the tool, the model writes the tool call as literal text in the response:
<tool_call>
<function=tools.write>
<parameter=file_path>/home/user/workspaces/blender/angle-piece-build/scratch/annot2.py</parameter>
<parameter=content> ... python code ... </parameter>
</function>
</tool_call>
- The strata terminal logs the block as rejected instead of executed:
[strata] 1 <tool_call> block(s) in the answer did not read as a call of a declared tool and went back as text (a name the request did not declare, or a form the template does not use); the names the model wrote: tools.write; the response carries them as strata_rejected_tool_calls, /metrics counts them
Expected vs actual
- Expected: the tool call is executed, or at least the run stays recoverable.
- Actual: the call is returned as text, the response never arrives, and the conversation is irreparably broken most of the time.
Other cases from the mother issue
Another user reports the tool call appearing in the response without the tool being called, in two shapes copied from the response body in llama-swap chat format: a call with the wrong parameter name (<parameter=input> on run_command), and a call prefixed with trailing text (Response <tool_call>...).
Environment
- Strata version:
strata 0.2.8 (build 0.1.54; python 3.14.8 at /usr/bin/python3) -
DSHversion0.2.1-rc.2,PTC mode - Graphic card: RTX 3060 (12 GB VRAM), RAM 128 GB, Operating System: Arch Linux
Activity
github-actions commentedon Oct 30, 2026
Thanks for the issue. To keep the tracker readable, every item needs an area prefix in the title and the parts of the issue form filled in. This one is missing:
Edit the issue (title and description) and this note goes away on its own. If it is still missing parts in 5 days it will be closed, which is not a rejection: fix it and comment
/reopen.Details: CONTRIBUTING.md
[-]Tool calls emitted as text / rejected, breaking agent processing[/-][+][Engine] Tool calls emitted as text / rejected, breaking agent processing[/+]github-actions commentedon Oct 30, 2026
Thanks, this follows the format now.
miscdebris commentedon Oct 31, 2026
Environment
I had a prompt running with dozens of tool calls, and initially it look good, but at the end tool calls ended up again in response: