Tool Haystack

2026-10-08 03:22 UTC

About this benchmark

Fifty banking tools, one customer message, six cases. An earlier version offered thirty tools drawn from different corners of the bank and every target scored 100: when the answer is about a statement and the distractors are branch lookups, topic settles it without a description being read.

So the list is built in families. Ten tools take a card and its last four digits, eight report transactions, seven speak about statements, and the clause that separates them sits at the end of the description: a block is permanent, a freeze is reversible, a loss report changes nothing. Family members are scattered rather than grouped, and two cases are built so the tool whose name best fits the message is the wrong one.

`tool` is a gate, so a wrong pick scores zero however many arguments matched, and the arguments stay at transcription throughout. Three messages come from `tool-call` word for word, so the same request can be read at eight tools and at fifty.

Cases

  • hold-not-block: `stolen-card` read the other way, from the same eight card tools: the customer says not to cancel, so the answer is the hold they can lift.
  • merchant-search: The customer names the merchant, which rules out listing the window. `list_recurring_charges` answers "a double bill" rather than the request.
  • pending-not-posted: The merchant is named, so `search_transactions` looks right and is the one tool that cannot answer: it returns settled charges, and this one has not settled.
  • standing-not-scheduled: `schedule_transfer` runs once on a named day. The money moves every month.
  • statement-month: Six tools in the list speak about statements and only one returns what the month closed at.
  • stolen-card: `report_card_lost` records the loss but leaves the card chargeable, while a temporary freeze is for a card expected back. This one will not be recovered.

Results

15/15 targets scored · 18 trials each · $1.64 total · show

Cost vs latencymost attractive quadrant
Latency & costsort by
TargetScore ↓StddevLatencyTok/sCostErrors
Qwenqwen3.7-flash@alibaba100.00.05.6s75.0best$0.00500/18
OpenAIgpt-6-luna@openai100.00.02.5s22.5$0.00950/18
Claudeclaude-haiku-5.5@anthropic100.00.02s94.8$0.01890/18
OpenAIgpt-5.6-luna@openai100.00.02.6s24.0$0.01910/18
Z.aiglm-5.3-flash100.00.03s44.0$0.02190/18
bestGeminigemini-3.5-flash-lite@google-ai-studio100.00.0best1.2s43.9$0.03770/18
DeepSeekdeepseek-v4.1-flash100.00.01.2s113.4$0.03970/18
Geminigemini-3.8-flash@google-ai-studio100.00.04.8s97.4$0.12030/18
Claudeclaude-haiku-4.5@anthropic100.00.02.1s52.6$0.14830/18
OpenAIgpt-6.1-sol@openai100.00.02.4s16.0$0.18710/18
OpenAIgpt-6-sol@openai100.00.02.1s21.8$0.18750/18
OpenAIgpt-5.6-terra@openai100.00.02.3s24.2$0.19080/18
Grokgrok-4.5@xai100.00.03.1s38.8$0.25800/18
Claudeclaude-sonnet-5@anthropic100.00.02.6s53.2$0.37140/18
⚠Qwenqwen3.8-flash@alibaba19 field misseshold-not-block: args.account_no (1/2)merchant-search: args.account_no (2/3)merchant-search: args.from_date (2/3)merchant-search: args.merchant (1/3)merchant-search: args.to_date (2/3)merchant-search: calls (1/3)merchant-search: tool (2/3)pending-not-posted: args.account_no (2/3)standing-not-scheduled: args.day_of_month (1/3)standing-not-scheduled: args.from_account (1/3)standing-not-scheduled: args.start_date (1/3)standing-not-scheduled: args.to_account (1/3)stolen-card: args.account_no (1/3)stolen-card: args.card_last4 (1/3)errorPOST "https://openrouter.ai/api/v1/chat/completions": 429 Too Many Requests {"message":"Provider returned error","code":429,"metadata":{"raw":"qwen/qwen3.8-flash is temporarily rate-limited upstream. Please retry shortly, or add your own key to accumulate your rate limits: https://openrouter.ai/settings/integrations","provider_name":"Alibaba","is_byok":false,"limit_source":"upstream_provider_shared_pool","remedy_hint":"Retry shortly, add your own provider key (https://openrouter.ai/settings/integrations), or route to another provider with provider routing: https://openrouter.ai/docs/features/provider-routing"}}77.533.220.5s40.9$0.02581/18

Score by case

Every cell is that target's mean over the case's trials.

Targethold-not-blockmerchant-searchpending-not-postedstanding-not-scheduledstatement-monthstolen-card
Claudeclaude-haiku-4.5@anthropic100100100100100100
Claudeclaude-haiku-5.5@anthropic100100100100100100
Claudeclaude-sonnet-5@anthropic100100100100100100
DeepSeekdeepseek-v4.1-flash100100100100100100
Geminigemini-3.5-flash-lite@google-ai-studio100100100100100100
Geminigemini-3.8-flash@google-ai-studio100100100100100100
OpenAIgpt-5.6-luna@openai100100100100100100
OpenAIgpt-5.6-terra@openai100100100100100100
OpenAIgpt-6-luna@openai100100100100100100
OpenAIgpt-6-sol@openai100100100100100100
OpenAIgpt-6.1-sol@openai100100100100100100
Qwenqwen3.7-flash@alibaba100100100100100100
Grokgrok-4.5@xai100100100100100100
Z.aiglm-5.3-flash100100100100100100
Qwenqwen3.8-flash@alibaba9133788410083

Note

  • qwen/qwen3.8-flash was rate-limited upstream by Alibaba (429) on hold-not-block trial 2, so its mean covers 17 trials. Of the rest, merchant-search trial 3 replied that no request had come through and made no call, and trial 2 called search_transactions_all_accounts over a three-month range. Its other misses are wrong or missing account_no on four trials and every transfer field wrong on standing-not-scheduled trial 1.
  • x-ai/grok-4.5 was served 2% of its prompt tokens from cache despite cache busting, so read its latency and cost as slightly flattered.

Conclusion

Fourteen targets cleared all 18 trials, so cost and latency decide. google/gemini-3.5-flash-lite takes the crown on cost × latency² at $0.00209 a task and 1,173ms, with deepseek/deepseek-v4.1-flash close behind (1,181ms, $0.00221 a task). openai/gpt-6-luna is a quarter of the price at $0.00053 a task but takes 2,517ms, and qwen/qwen3.7-flash is cheapest at $0.0050 for the run but takes 5,626ms.

qwen3.8-flash is the only failure and it is unsafe: its misses spread across five of six cases with no single field in common, and it once ignored the request entirely. Its 77.5 mean also omits one rate-limited trial.