Summary
While validating DeepAgents 1.10.2 with LangGraph v3 events, we found a blocker where a run can stop before executing tools if the model emits a blank text block immediately before a tool call.
The likely root cause is in @langchain/core stream content-block assembly, so I opened the detailed core report here:
I'm opening this issue here because the user-visible failure appears in DeepAgents runs: the agent produces a tool intent, but the tools node never executes.
Tested stack
deepagents: 1.10.2
@langchain/core: 1.1.47
@langchain/openai: 1.4.6
@langchain/langgraph-sdk: 1.9.4
@langchain/react: 1.0.4
langchain: 1.4.1
Model/provider:
- OpenAI-compatible chat model
- The model can emit valid tool calls
- Direct
ChatOpenAI.bindTools().invoke() works
- Direct
ChatOpenAI.stream() aggregation works
DeepAgents failure mode
Using createDeepAgent(...).streamEvents(..., { version: "v3" }), the event stream produced this shape:
content-block-delta index=0 text="\n\n"
content-block-delta index=0 block-delta type=tool_call_chunk id=... name=ls args=...
content-block-finish index=0 content={ type: "text", text: "\n\n", id, name: "ls", args: "{\"path\":\"/\"}" }
The resulting checkpoint / values AI message had:
content=[{ type: "text", text: "\n\n", id, name, args }]
tool_calls=[]
Since tool_calls was empty, the DeepAgents graph did not execute the tool node. In the app this looked like the agent paused/stopped after one model step.
Why this matters for DeepAgents adoption
For apps trying to use the official DeepAgents/LangGraph v3 event path, this breaks a very common flow:
- model decides to call a tool,
- stream shows a tool-call-like delta,
- final checkpoint drops
tool_calls,
- tool execution never happens,
- live UI state and refreshed checkpoint state diverge.
Local workaround verified
A local patch-package patch against @langchain/core@1.1.47 made the same DeepAgents run continue:
- Treat a blank text block followed by
tool_call_chunk on the same index as a tool-call block.
- Normalize malformed blank text blocks that contain
id/name/args into tool_call_chunk before final content-block standardization.
After that patch, the same DeepAgents run emitted tool-started / tool-finished and the checkpoint contained the expected tool-call behavior.
Ask
It would be helpful for DeepAgents to either:
- track/follow the core fix in
langchainjs#10937, or
- add a regression test around
streamEvents(..., { version: "v3" }) where an OpenAI-compatible model emits leading blank text before a tool call, ensuring the tools node still executes.
Summary
While validating DeepAgents
1.10.2with LangGraph v3 events, we found a blocker where a run can stop before executing tools if the model emits a blank text block immediately before a tool call.The likely root cause is in
@langchain/corestream content-block assembly, so I opened the detailed core report here:I'm opening this issue here because the user-visible failure appears in DeepAgents runs: the agent produces a tool intent, but the tools node never executes.
Tested stack
Model/provider:
ChatOpenAI.bindTools().invoke()worksChatOpenAI.stream()aggregation worksDeepAgents failure mode
Using
createDeepAgent(...).streamEvents(..., { version: "v3" }), the event stream produced this shape:The resulting checkpoint / values AI message had:
Since
tool_callswas empty, the DeepAgents graph did not execute the tool node. In the app this looked like the agent paused/stopped after one model step.Why this matters for DeepAgents adoption
For apps trying to use the official DeepAgents/LangGraph v3 event path, this breaks a very common flow:
tool_calls,Local workaround verified
A local
patch-packagepatch against@langchain/core@1.1.47made the same DeepAgents run continue:tool_call_chunkon the same index as a tool-call block.id/name/argsintotool_call_chunkbefore final content-block standardization.After that patch, the same DeepAgents run emitted
tool-started/tool-finishedand the checkpoint contained the expected tool-call behavior.Ask
It would be helpful for DeepAgents to either:
langchainjs#10937, orstreamEvents(..., { version: "v3" })where an OpenAI-compatible model emits leading blank text before a tool call, ensuring the tools node still executes.