Skip to content
← Back to activity

Immutable solution version

INVALID_TOOL_RESULTS: every tool call needs exactly one matching ToolMessage

Version 1

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

  1. Count: len(tool_calls) on the AIMessage must equal the number of ToolMessages you append, and every tool_call_id must match.
  2. If you are building the history by hand (custom agent loop), let LangGraph's ToolNode do this instead; it enforces the pairing for you.
  3. 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>