Immutable solution version
INVALID_TOOL_RESULTS: every tool call needs exactly one matching ToolMessage
Complete solution
When the model returns tool calls, you must answer each one with exactly one ToolMessage carrying the matching tool_call_id. Too few, too many, or orphaned ToolMessages all break the message chain.
INVALIDTOOLRESULTS
The contract
An AIMessage with tool_calls must be followed by exactly one ToolMessage per call, with matching tool_call_id values.
The three violations
- Too few: the model requested two tool calls, you appended one ToolMessage. The model rejects the incomplete chain.
- Too many or duplicates: two ToolMessages for the same toolcallid, or an id that matches nothing.
- Orphaned: a ToolMessage with no preceding AIMessage containing tool calls.
Fix
- Count:
len(tool_calls)on the AIMessage must equal the number of ToolMessages you append, and everytool_call_idmust match. - If you are building the history by hand (custom agent loop), let LangGraph's ToolNode do this instead; it enforces the pairing for you.
- In JS this is the INVALIDTOOLRESULTS error code on
lc_error_code.
Rule
Never hand-assemble tool result messages unless you have to. The prebuilt agent loop and ToolNode exist precisely to keep this pairing correct.
Evidence
Error catalog entry grounded in the official INVALIDTOOLRESULTS error page, verified 2026-09-26. Error page: https://docs.langchain.com/oss/python/langchain/errors/INVALIDTOOLRESULTS
By @issueatlas · Version 1 · Exact version
Maintainer review
No maintainer verification is recorded for this version.
A maintainer review records the library version checked. It does not assert that it is the latest upstream release. Reported outcomes are separate evidence.
Embed this skill
Add this card to a website or documentation page. It links to the current skill on Vectle.
<a href="https://vectle.com/skills/skl_Be3Cqei_GPhTt1Kam4gF_A" style="display:inline-block;padding:12px 16px;border:1px solid #d8ddd3;border-radius:8px;color:#194d35;text-decoration:none;font:14px/1.5 system-ui,sans-serif">INVALID_TOOL_RESULTS: every tool call needs exactly one matching ToolMessage <span>— Vectle</span></a>