A practical walkthrough that takes you from a single-model team baseline to a mixed-provider production setup with live cost and latency monitoring, using : different hosted models per agent.
: token usage and cost comparison across model tiers.
Claude Sonnet 4.6
$3.00
$15.00
same
Claude Haiku 4.5
$1.00
$5.00
same
GPT-5.5
$5.00
$30.00
Local model via Ollama
$0 marginal
$0 marginal
electricity + amortized hardware
How to Run a Mixed-Model AI Agent Team in TypeScript?
- ▸ What "mixed-model" actually means here
- ▸ The four pieces, in order
- ↳ Step 1: All-Opus baseline (the cost ceiling)
- ↳ Step 2: Dual-model (Opus plans, OpenAI executes)
- ↳ Step 3: Triple-model with a local reviewer
- ↳ Step 4: Live cost and latency monitoring
- ▸ Pricing snapshot (2026-05-16)
- ▸ A worked cost comparison on a recurring workload
- ▸ When mixed-model is the wrong call
- ▸ What the cookbook example looks like in mixed-model form
- ▸ Why this lives in the TypeScript ecosystem
- ▸ Wrap-up: what to take from here
A reasonable starting reading of the table: the cloud frontier models charge 4x to 8x more on the output side than on the input side. That is the inversion you want to design against. Push input-heavy agents (research, summarization, retrieval grounding) onto the cheaper models. Reserve the expensive models for agents that produce a lot of high-stakes output.
A worked cost comparison on a recurring workload
Suppose your team runs the same three-agent task 100 times a day (real-world cadence for an automation that fires on inbound webhooks, scheduled batches, or per-customer pipelines). A representative run uses roughly:
- Coordinator: 1.1K input, 0.6K output tokens (Opus 4.7 in all variants)
- Architect: 1.6K input, 1.1K output
- Developer: 2.2K input, 2.1K output
- Reviewer: 2.7K input, 0.5K output
Use this as a representative shape, not a benchmark. Your numbers will differ; the math below shows how to do it. If you want to measure your own workload, start with that runs three agents on Claude Sonnet 4.6: an interviewer, an observer, and a reporter. It is a nice match for the mixed-model pattern.
The interviewer does deep, candidate-specific question generation across many turns. That role earns Opus.
The observer reads the transcript after each turn and writes 3-6 short flags. The role is short-output, repeatable, and structurally simple. Push it to a cheaper hosted model or even a local model.
The reporter runs once at the end of the session against a strict Zod schema (recommendation: 'strong-hire' | 'hire' | ..., plus structured arrays). Structured-output agents are sensitive to the underlying model's JSON adherence. Keep that on a frontier model.
The migration is two provider and model edits, two AgentConfig blocks. You do not touch the orchestration logic. You do not refactor the prompts. You read the schema and decide where the consistency requirements actually live.
Why this lives in the TypeScript ecosystem
A small note on positioning since this is the question I get asked most.
CrewAI established the team-of-agents shape that this post leans on: an agent has a role, agents form crews, a crew has a goal, and the framework orchestrates the goal into work. CrewAI is Python-only, and the TypeScript options for the same pattern have been thin until recently. open-multi-agent treats the TypeScript ecosystem as a first-class target: 100% TypeScript runtime, three runtime dependencies (@anthropic-ai/sdk, openai, zod), and the same Goal → Result one-call surface (runTeam) that you would get from CrewAI's Crew.kickoff(). The mixed-model team is, by design, a first-class pattern rather than a custom adapter you write yourself.
If you are coming from CrewAI and looking for the team-of-roles model in TypeScript, the examples above are the migration target.
Wrap-up: what to take from here
Mixed-model agent teams are not a clever trick. They are the right default once your team grows beyond two agents and the workload starts running on a real cadence. The savings can be material, often 40-70% against an all-frontier baseline depending on token shape, the operational cost is real (more failure modes, more variance), and the design choice that matters most is which agent gets the expensive model.
Three takeaways:
Per-agent model assignment is a design lever, not an optimization. Decide it when you decide the team. Retrofitting it later means rewriting prompts that have already drifted to match the wrong model.
Start with two providers, then add local. Step 2 captures most of the savings with two API keys and zero infrastructure. Step 3 is incremental and depends on whether you can spare the local-model latency.
onProgressis the cheapest insurance you can buy. Twenty lines of TypeScript turn token counts into dollar numbers per run. Without it, mixed-model teams silently regress and you find out from the bill.
Start with the existing repo examples: , and . The framework treats the TypeScript ecosystem as a first-class target rather than a secondary port from Python.
Edits and corrections. If a price has moved since 2026-05-16 or a model has been renamed, please open an issue against the OMA repo and I will refresh the constants in the examples.
SOCIAL SHARE CARD GENERATOR