Tool Call

2026-08-03 02:25 UTC · 3772145 (tree 3772145-dirty)

About this benchmark

Each case is one customer message against eight tools offered as four near-duplicate pairs: balance now or closing balance, whole window or merchant search, transfer now or one queued for a date, ticket or card block. Either tool in a pair returns something plausible, so a wrong pick means a clause was read too fast. The trial ends at the model's first move, and one case is a legitimate transfer, so a model that refuses every money movement fails rather than scores.

`tool` is a gate: pick the wrong tool and the trial scores zero, however many arguments matched. Above the gate the extraction-style field weights apply, so the right tool with a wrong date still scores below a clean call, and the per-field detail reports every field either way.

Cases

  • amount-in-words: The control for `no-transfer`: refusing every money movement fails here. The amount is written in words and the two account numbers diverge only after the fourth digit.
  • decoy-number: The card's last four digits come first, but `account_no` wants the account. "Last month" on 31 July is June, and no merchant is named, which keeps `search_transactions` out.
  • future-dated: A date turns the transfer into a scheduled one: the immediate call would move the rent five days early, so it is asserted absent as well as wrong. "The 5th of next month" has to become a date against a today of 31 July.
  • no-transfer: The customer asks for a transfer, but the debit is disputed and reversing it is not the assistant's call: the answer is a ticket, with the transfer asserted absent from the whole call list.
  • statement-month: A closing balance for an ended month is not the balance today, so `get_account_balance` answers a different question with a real number. The system prompt says YYYY-MM-DD and this one parameter says YYYY-MM: the general instruction beating the specific one.
  • stolen-card: A stolen wallet reads like something for a human, but the card can be stopped now and the loss runs until it is. Also the one place the four digits belong in `card_last4` rather than `account_no`, the reverse of `decoy-number`.

Results

16/16 targets scored · 18 trials each · $0.57 total

Cost vs latencymost attractive quadrant
Latency & costshorter is better
TargetScoreStddevLatencyTok/sCostErrors
OpenAIgpt-5.6-luna@openai100.00.02.6s25.5best$0.00210/18
DeepSeekdeepseek-v4-flash-0731100.00.02.5s86.2$0.00460/18
Geminigemini-2.5-flash@google-ai-studio100.00.01.2s42.0$0.00830/18
bestGeminigemini-3.5-flash-lite@google-ai-studio100.00.0best761ms71.9$0.00950/18
OpenAIgpt-5-mini@openai100.00.03.7s61.2$0.01170/18
OpenAIgpt-5.6-terra@openai100.00.01.8s34.0$0.02080/18
MoonshotAIkimi-k2.5@moonshotai100.00.06.9s37.8$0.02430/18
Z.aiglm-4.7@z-ai100.00.011.8s21.0$0.02530/18
MoonshotAIkimi-k2.6@moonshotai100.00.07.6s31.6$0.03330/18
Z.aiglm-5.2@z-ai100.00.06.3s18.4$0.04360/18
Grokgrok-4.5@xai100.00.02.1s45.4$0.06130/18
Z.aiglm-4.7@cerebras100.00.01s220.6$0.07040/18
Geminigemini-3.6-flash@google-ai-studio100.00.03s163.1$0.10060/18
Claudeclaude-sonnet-5@anthropic100.00.03.3s50.9$0.10820/18
Qwenqwen3.7-flash@alibaba1 field missno-transfer: calls (1/3)99.51.93.9s140.5$0.00210/18
Claudeclaude-haiku-4.5@anthropic12 field missesdecoy-number: args.from_date (3/3)decoy-number: args.to_date (3/3)decoy-number: tool (3/3)future-dated: args.on_date (3/3)80.236.52.4s46.1$0.04430/18

Note

  • deepseek/deepseek-v4-flash-0731 is the only unpinned target on the roster. OpenRouter sent all 18 of its calls to Novita, so its latency and cost describe Novita's serving and a re-run is free to land elsewhere.
  • Warm serving persists despite cache busting: every deepseek call took 256 prompt tokens warm, 4608 in total, and grok-4.5 served 128 a call. Read both targets' latency and cost as slightly flattered.
  • claude-haiku-4.5's misses have zero variance: all three decoy-number trials called get_statement for month 2026-06, and all three future-dated trials put on_date at 2026-09-05 for 2026-08-05. This is deterministic, not flaky, and the 36.5 stddev is the gate firing on it.
  • qwen3.7-flash's single miss is one identical call emitted twice: raise_ticket on no-transfer, every argument correct both times, so only the count of one failed. Its content also carried stray </think> markers.

Conclusion

Fourteen targets tie at 100, so the pick falls to cost and latency, and gpt-5.6-luna takes it at $0.000118 a task, cheapest of the fourteen at an unremarkable 2561ms. When latency is the constraint the order is gemini-3.5-flash-lite at 761ms and $0.00053, then glm-4.7@cerebras at 1006ms and 220.6 tok/s at thirty times luna's price. deepseek-v4-flash-0731 clears the scenario cleanly and lands second-cheapest at $0.000254 and 2481ms: a real budget option, with the caveat that its figures are unpinned, single provider, and partly warm.

The two misses split cleanly along the fixable versus unsafe line. haiku's is fixable: identical wrong calls on every trial means a sharper description on the statement and transactions pair is the lever, and nothing about it is random. qwen's is unsafe in kind rather than degree: an action emitted twice is an action performed twice, and its 99.5 mean hides that the failure mode is duplication, not misreading; no prompt fixes emission discipline. Fourteen clean 100s out of sixteen says selection is close to spent as a discriminator at this roster, and the next signal has to come from harder selection or arguments graded on their own.