Making It Use Its Tools Made It Slow — gpt-5-mini to Haiku
The assistant couldn't use its tools well. Turning up reasoning fixed the tools but made it slow enough to time out. Switching to Claude Haiku, which uses tools well without reasoning — and keeping the pricier output profitable.
Making It Use Its Tools Made It Slow — gpt-5-mini to Haiku
fecit has a conversational assistant built in. Say “add a workout tomorrow at 3 and make it my focused task,” and it creates the task, schedules it, and pins it as your focus.
The whole point is that the assistant doesn’t just talk — it actually calls the tools. To answer “added it,” it first has to invoke the real create-task tool.
But on gpt-5-mini, the assistant couldn’t use its tools well.
The problem: it talked, but its hands didn’t move
It would often say “I’ll add that for you” and then never call the create tool. From the user’s side, it claimed success and nothing appeared. That’s the worst kind of failure.
gpt-5-mini is a reasoning model, so it has a dial for how hard it thinks. Set reasoning to minimal and it’s fast — but that’s exactly when the “talks without acting” problem showed up. To get it to reliably call the tools, I had to turn the reasoning up.
But turning reasoning up made it slow
With more reasoning, it started calling tools properly. The price was time. It got slower the more it thought, and the client cuts the connection after a stretch of silence (60 seconds) — long reasoning ran straight into that. The screen showed “The response is delayed,” and answers got truncated mid-sentence.
So this was the dead end:
- Reasoning minimal/low: fast, but doesn’t call the tools.
- Reasoning medium: calls tools properly, but so slow it times out and the answer gets cut off.
There was no setting that gave both reliable tool use and speed. The latency wasn’t the disease — it was the cost of forcing tool use out of this model.
The switch: Claude Haiku 4.5
So I moved to Anthropic’s Claude Haiku 4.5. Haiku calls tools well without reasoning — the Claude family is strong at tool use natively. So even with thinking off, it both calls tools reliably and answers instantly. There’s no reasoning to turn up, so there’s nothing to slow it down. Both walls of the dead end fell at once.
But it wasn’t a one-line rename. OpenAI and Anthropic speak different dialects for messages.
- A tool’s result is a separate
toolrole in OpenAI, but in Anthropic it’s a block inside a user message. - The system prompt is the first message in OpenAI, but a separate parameter in Anthropic.
- The tool definitions have a different shape, and prompt caching works differently too — a
cache_controlmarker instead of a cache key.
So I rewrote the agent loop end to end.
The twist: money
There was a catch. Haiku’s output tokens cost more — $5 per million, 2.5× gpt-5-mini’s $2. And fecit is bootstrapped: every AI feature has to pay for itself.
So instead of a hopeful “it’ll usually be small,” I measured the strict worst case. Output turned out to dominate the cost. So I tightened the dials — fewer rounds in the tool loop, a lower per-answer output cap, shorter tool-result snippets. At the same time, I cache the static part shared across every user (the system prompt plus the tool specs) so it’s reused nearly for free. That pushed the worst case back under what a single turn earns.
The lesson
I needed to look at the cause, not the symptom. What showed on the surface was “it’s slow,” but the real cause was “it can’t use its tools,” and the slowness was a side effect of forcing that fix. Use a model against its grain and you pay for it — gpt-5-mini needed reasoning as an expensive detour just to call tools, while Haiku did the job directly.
And the lighter your wallet, the more you budget for the worst case, not the hopeful average. Caching is what kept a pricier-per-token model in the black.
The assistant uses its tools well now, and it’s fast. Next is filling that space with delight. That’s for the next post.