When you scale a crew from 2–3 agents to a dozen, the cost curve often bends up faster than the number of agents — and a big, easy-to-miss driver is tool/function schemas being re-billed as input tokens on every turn.
The mechanic: an LLM only “knows” its available tools because their JSON schemas are injected into the prompt. That injection happens on every model call in a conversation, not just the turn where a tool is actually invoked. So if each agent carries 15 tool definitions and a task takes 20 back-and-forth turns, you’re paying for those 15 schemas ~20 times per agent — even on the turns the agent just reasons or talks.
A few things that measurably helped me:
- Scope tools per agent, not per crew. Give each agent only the tools its role needs. A researcher rarely needs the file-writer’s schema. This is the single biggest lever.
- Trim verbose schema descriptions. Long per-parameter docstrings are pure input tokens re-sent every turn. Keep them tight.
- Watch for tool sprawl over time. Tools tend to get added and never removed; the cost is invisible because no single call looks expensive.
I’ve been surprised how often “the model is slow/expensive” turns out to be schema overhead rather than the actual reasoning.
Curious how others here are handling this — do you prune tools per-agent, or has anyone found a clean way to lazy-load tool schemas only when they’re likely to be used?