Skip to content
Insights · AI Agents

Which tool result did the model see?

Name the tool result stored for that call, matched to its id. A different call can hold another result, and the model does not get to recall it.

Scroll
AI AgentsOct 20, 202611 min readBy Salman Naqvi, Founder & CEO
Which tool result did the model see?

A customer says the assistant checked the record and then answered. Do not send the sentence again, and do not ask the model what the tool said, until you can name the tool result stored for that call. The tool use id. The payload you sent back. A different call whose result is not this one, or a call that has no result at all. And a line that you stored the result, rather than the model reporting it. If the log does not keep the result, write that. If any of the three needs the person who wired the tool, you have not shown what the model saw. You have a fluent answer and a rumor.

This is the payload on one tool use. It is not the name of the tool. Name the tool the model called is which function ran, and with which arguments. A name can be right while the result you returned was a different customer's row, and a result can be stored while you still cannot say which tool produced it. It is not the prompt that was sent. Which prompt did that request send? is the instruction. A prompt is not a tool payload. It is not the temperature on the call. Which temperature did that call use? is a sampling field. A temperature is not a result. It is not the stop reason. Name the stop the response carried is why the turn ended. tool_use as a stop is the moment before the result, not the result. And it is not the embedding on a passage. Which embedding did that passage use? is a model and a vector length. A dimension is not a tool payload.

None of what follows is a score for your product, and none of it is legal advice. The rules below are one vendor's current shape for a tool result. The accuracies below that are a 2025 leaderboard of other models on other questions. An accuracy is not the text your tool returned. A paper from a conference is not the call you opened tonight. They do tell you which numbers people mix up when they try to sound precise about a result they have not stored.

Anthropic's tool-use guide splits tools by where the code runs. A client tool, including one you defined, comes back with stop_reason tool_use and one or more tool_use blocks. You run the tool and send a tool_result. A server tool, such as web search or code execution, runs on their infrastructure, and you see the result without handling it, unless the model called that server tool in the same parallel group as one of your client tools. A client tool is not a server tool. The sample response uses model claude-opus-5-5, id msg_01Aq9w938a90dw8q, and a tool_use id toolu_01A09q90qw90lq917835lq9, name get_weather, input location San Francisco, CA, unit celsius. The illustrative result content is the string 15 degrees. 15 is a sample sentence. It is not a score, and it is not a temperature. The id on the tool_use is the id the tool_result must repeat as tool_use_id. A result whose id does not match is not a result for that call (Anthropic, Handle tool calls).

The formatting rules are where a 400 is not a stop reason. Tool result blocks must immediately follow the assistant's tool use. You cannot put another message between them. In the user message, the tool_result blocks come first. Any text comes after all of them. The page shows a 400 for text placed before the tool_result, and it shows the correct order as the result first and the text after, for a turn that called only client tools. A 400 is not tool_use. It is a refusal to accept the request. A second 400 is different: if the assistant also called a server tool that has no result yet, and your user message ends the turn with text after the client results, the request fails with a 400 that names the unresolved server tool. Text-before is one 400. Text-after, when a server tool is still open, is another 400. The error string "tool_use ids were found without tool_result blocks immediately after" is the missing-result case. A missing block is not a wrong id, and a wrong id is not a 400 you should answer by asking the model to remember.

Parallel calls add a count the single sample does not have. The API does not prescribe an order. You may run client tools concurrently or in the order they appeared. You still return one tool_result per tool_use, all of them in the next user message, every tool_result before any text. If you choose not to run one call, you still return a tool_result for it, with is_error set to true and a short explanation. Skipping without a result is not a skip. The computer-use tool and the browser-use tool are stricter. Their member calls in one turn run in order, and you stop at the first failure. Each tool defines the text you return for the calls you skip. Stricter is not the client-tool rule. A member result must echo toolset_name. A member result that omits it is rejected. Rejected is not is_error. A browser result may add one browser_state block. One block is not a second tool_use (Anthropic, Parallel tool use).

The leaderboard people quote when they want a function-calling score is a different document, and it is not this call. Shishir G. Patil, Huanzhi Mao, Fanjia Yan, Charlie Cheng-Jie Ji, Vishnu Suresh, Ion Stoica, and Joseph E. Gonzalez, all at the University of California, Berkeley. Proceedings of the 42nd International Conference on Machine Learning, Vancouver, PMLR 267, 2025. The contribution line says BFCL is 5,551 question-function-answer pairs, across Python, Java, JavaScript, REST APIs, and SQL. Five named kinds. The introduction splits the benchmark into four parts. Four parts is not five languages. Part two, crowd-sourced, is 2,251 items curated from more than 67,000 community datapoints. Section 3.2 says the crowd-sourced set contains 64,517 real single-turn queries, collected from 26 February 2024 to 1 April 2024. 64,517 is not 67,000. 2,251 curated is not 64,517 collected. More than 67,000 is the introduction's phrase. Do not replace it with 64,517, and do not replace 64,517 with 67,000. Multi-turn is eight curated API suites and 1,000 queries. Eight is not four. 1,000 is not 5,551. The single-turn set and the crowd-sourced set were released six months apart. Six months is not the collection window from February to April (Patil and others, The Berkeley Function Calling Leaderboard).

Table 1 is where an overall accuracy is not the parallel column, and where the same model name is two rows. gpt-4o-2024-11-20 in prompt mode: overall 66.4. The same model in function-calling mode: overall 65.8. 66.4 is not 65.8. The memory column on those two rows is 6.0 and 0.0. 6.0 is not 66.4. 0.0 is not 65.8. A higher overall is not a win in the memory column. Section 5.6 says even the benchmark leader, openai o1-2024-12-17 in function-calling mode, reaches only 12% accuracy on memory. Table 1 prints that row's memory cell as 12.0 and its overall as 52.8. 12% is the prose. 12.0 is the cell. 52.8 is not 12. The first overall in the table is 66.4, which is not 12%, and calling o1 the leader does not make 66.4 into 12. Claude-3.5-Sonnet-20241022 in function-calling mode: overall 53.8, AST parallel 3.5, parallel multiple 5.0, execute parallel 4.0, execute parallel-multiple 0.0. The same model in prompt mode: overall 49.4, AST parallel 70.5, parallel multiple 46.0, execute parallel 68.0, execute parallel-multiple 60.0. 53.8 is higher than 49.4. 3.5 is not higher than 70.5. 0.0 is not 60.0. The prose says Claude cannot execute parallel function calls in the native mode, and that more capable models often do better in prompt mode on complex calls. The parallel cells agree with that sentence. The overall cells do not say the prompt row won. Do not quote 53.8 as a parallel score, and do not quote 3.5 as the overall. The sample's claude-opus-5-5 is not this row. This row is Claude-3.5-Sonnet-20241022. A weather string of 15 degrees is not the overall 15.4 printed for Llama-3.2-1B-Instruct in prompt mode. 15 is not 15.4, and neither is a tool payload.

The decoding sentence and the cells do not use the same multiple. Prompting models, they write, exhibit on average three times more decoding issues than function-calling models: 412.93 versus 182.5, out of 4,251 total entries. Three times 182.5 is not 412.93. The prose says three times. The parenthesis prints 412.93 and 182.5. Do not replace three with the quotient, and do not replace the parenthesis with three. 4,251 is not 5,551. Among successfully decoded responses in the multiple-function category, function-calling models show more incorrect function-call counts on average: 77.5 versus 21. 77.5 is not 21. 77.5 is not 412.93. 21 is not 182.5. A decoding failure is not an incorrect count, and an incorrect count is not the text a tool returned. Other benchmarks, they say, with narrow coverage under 150 entries, are easier to overfit. Under 150 is a criticism of someone else's set. It is not a row in Table 1.

Do the three proofs on one real call, in the log you administer. First, the binding. Copy the tool use id, the tool name, and the tool_result content you sent, including whether is_error was set. If the log shows a name and no result, write that the result was not stored. Do not infer the payload from the answer the customer read. Second, the other call. A different tool use, with a different id or with no result block, is not this one. A leaderboard cell is not that second call. Third, the authorship. The result is a string you placed in the next user message, not a sentence the model produced when you asked it what the tool said. If the only copy is the model's later summary, write that. A summary is not the block.

Three moves feel like the proof and are a second problem. Pasting the customer's question back into the model and asking which tool result it used. That is a new call. It does not open the old one. Quoting 66.4 because it is the top overall, or 3.5 because it is small, while the call you were asked about is one id. 66.4 is a share of someone else's questions. It is not a payload. Putting a paragraph of explanation before the tool_result so the log "reads better," which is the shape the page says returns 400. A readable log that the API rejects is not a result the model saw.

The path is ordinary when one person's generation is not the next person's. ReUniting AI turns a recording into an interactive companion, with the voice and the video produced for that recording. The shape that matters here is one result you can point at, distinct from the next recording's result. That case is not a tool-result ledger. Nothing in the description is a headcount, a duration, or a result figure. If the only screen is the sentence the model spoke, and it will not show the block you returned, you do not have this proof. You have a transcript.

There is a version of this night where hiring the path is the wrong purchase. Nothing is in production. No model is being called, so there is no block to read. The user sent two questions and got two answers. That pair is a different article, and it is not a missing tool result. A customer has already seen another customer's data. A stored payload does not close a leak. The wrong value was already a write. The block tells you what you sent back. It does not undo the row. Or no metric was ever named, so there is nothing a later eval can fail. The questions for that gap are not this page.

When the call is real and the log cannot show the result, the missing object is specific. The tool use id, the payload you returned, and a second call that is not this one. An AI pilot failed to reach production engagement is for the system that is already in front of customers and cannot yet show those three. The audit is weeks one and two. The engagement runs 8 to 12 weeks, scoped after the audit, not before it. If the agreed metric is missed, you do not pay for the build. Rollout sits behind a human-review gate. The call you cannot name is the kind of case the harness has to include, or the next release will answer just as fluently and just as unlogged. The harness is AI evaluation and observability. An AI integration sprint is the shape where the acceptance sentence can require the tool result on every stored tool use. If you do not yet know whether the pilot can be saved, a two-week AI readiness assessment hands you the findings either way. The findings are yours. They are not 66.4, and they are not 3.5.

A webhook delivery, and the image a deploy ran, are different objects: which webhook did that event hit? and which image did that deploy run?. Do not record either on this page. An event id is not a tool use id. A digest is not a payload.

Before you send the next sentence as something the tool returned, open the log and write the id. The result, or the sentence that the result was not stored. A different call that is not this one. Do not ask the model what the tool said, and do not put your explanation in front of the block. A leaderboard can tell you how other models scored in 2025. The binding is the page you can defend.

Questions

You stop treating the answer as something the tool returned, and you stop asking the model what the tool said, until you can show the tool result stored for that call, matched to the tool use id, show a different call whose result is not this one, and show that you stored the result rather than the model reporting it. If the log does not keep the result, write that.

No. An accuracy is a share of someone else's questions. A result you can defend is the payload stored against that tool use id, or a written line that the request was not kept. 66.4 overall is not 3.5 on a parallel column, and neither number is the text the tool returned.

When nothing is in production, when no model is being called, when the request was not logged, when a customer has already seen another customer's data, when the wrong value was already a write, or when no metric was ever named.

Find this useful? Tell Google to show you more of it.

Let's put AI to work in your business.

A 30-minute call. You bring the workflow or the roadmap — we'll tell you what's feasible, what it costs, and what we'd build first.

Book a call→