Старый практикум про стоимость агентов уже плохо отражает текущую экономику. Он завязан на Haiku -> Sonnet -> Opus, не учитывает GPT-5.4 / GPT-5 mini / GPT-5 nano, плохо разводит prompt caching и context caching, и почти не говорит о том, что самый дорогой агентный трафик в 2026 часто создаётся не одной моделью, а плохой orchestration logic.
Поэтому ниже не "теория про токены", а practical checklist: как считать, ограничивать и реально резать cost у agent workflows.
cost per completed task, потому что агентный run почти всегда состоит из нескольких model calls, tool calls и растущего контекста.cost per task, а не cost per callДля agent system самая полезная метрика:
cost_per_completed_task = model_costs + tool_costs + retries + failed_runs
Почему это важно:
Если вы смотрите только на среднюю цену одного model call, вы почти наверняка недооцениваете реальную стоимость automation.
Старый шаблон "всё на Sonnet" или "всё на GPT-5.4" в 2026 почти всегда слишком дорог.
Более практичная схема:
| Роль в workflow | Типичный lane |
|---|---|
| Router / classifier / guardrail | GPT-5 nano, Gemini 2.5 Flash-Lite, иногда deepseek-chat |
| Основной worker | GPT-5 mini, Claude Sonnet 4.6, Gemini 2.5 Flash |
| Premium pass | GPT-5.4, Claude Opus-lane |
| Cheapest managed bulk lane | deepseek-chat, иногда deepseek-reasoner по routing |
Идея простая: у каждого шага должна быть своя economic role.
Ниже skeleton, который:
from dataclasses import dataclass
PRICES = {
"gpt-5.4": {"input": 2.50, "output": 15.00},
"gpt-5-mini": {"input": 0.25, "output": 2.00},
"gpt-5-nano": {"input": 0.05, "output": 0.40},
"gemini-2.5-flash-lite": {"input": 0.10, "output": 0.40},
"deepseek-chat": {"input": 0.28, "output": 0.42},
}
def estimate_cost_usd(model: str, input_tokens: int, output_tokens: int) -> float:
p = PRICES[model]
return (
(input_tokens / 1_000_000) * p["input"]
+ (output_tokens / 1_000_000) * p["output"]
)
def route_model(task_type: str, high_stakes: bool = False) -> str:
if task_type in {"classification", "triage", "guardrail"}:
return "gpt-5-nano"
if task_type in {"faq", "extract", "simple_support"}:
return "gpt-5-mini"
if task_type in {"bulk_background_enrichment"}:
return "deepseek-chat"
if high_stakes:
return "gpt-5.4"
return "gpt-5-mini"
@dataclass
class RunBudget:
max_cost_usd: float
spent_usd: float = 0.0
max_steps: int = 6
steps: int = 0
def can_continue(self) -> bool:
return self.spent_usd < self.max_cost_usd and self.steps < self.max_steps
def record(self, model: str, input_tokens: int, output_tokens: int) -> float:
cost = estimate_cost_usd(model, input_tokens, output_tokens)
self.spent_usd += cost
self.steps += 1
return cost
budget = RunBudget(max_cost_usd=0.03, max_steps=4)
model = route_model("simple_support")
step_cost = budget.record(model, input_tokens=2200, output_tokens=350)
print(model, step_cost, budget.spent_usd, budget.can_continue())
Это уже полезно, потому что:
В 2026 кэширование уже нельзя подавать как один универсальный механизм. У провайдеров surface разный:
OpenAI pricing даёт отдельную строку cached input. Это значит, что повторяющийся префикс реально должен жить как стабильный prefix, а не как хаотично меняющаяся сборка инструкций.
Anthropic даёт явный prompt caching:
5m write стоит 1.25x base input;1h write стоит 2x base input;cache hit стоит 0.1x base input.То есть длинные tool specs, policies, примеры и документы нельзя каждый раз слать заново как обычный input.
Gemini поддерживает:
implicit caching для Gemini 2.5 моделей;explicit context caching с гарантированным экономическим эффектом;Практический вывод везде один: длинный системный префикс, policy bundle и повторяющиеся документы нужно выделять в cacheable layer.
И OpenAI, и Anthropic, и Gemini дают 50%-класс скидки на batch/async режимы.
Batch почти всегда подходит для:
Что не надо держать в realtime:
Многие agent systems переплачивают не потому, что выбрали не ту модель, а потому что позволяют run жить слишком долго.
Нужны простые stop conditions:
Простейший пример:
def should_stop(
step_number: int,
consecutive_failures: int,
new_facts_found: int,
cost_spent_usd: float,
) -> bool:
if step_number >= 6:
return True
if consecutive_failures >= 2:
return True
if new_facts_found == 0 and step_number >= 3:
return True
if cost_spent_usd >= 0.05:
return True
return False
Чем раньше вы ловите "run уже не приносит нового value", тем дешевле вся система.
У многих моделей output заметно дороже input. Поэтому cost control - это не только compression.
Работает лучше всего:
max_output_tokens;short, detailed, audit;Плохой запрос:
"Подробно распиши всё, что ты думаешь о задаче".
Хороший:
"Верни 3 причины, confidence и next action в JSON".
В 2026 агентный счёт может расти не только из-за токенов:
Поэтому cost logging должен видеть:
Без этого вы не поймёте, где реально горят деньги.
Если нужен короткий и реалистичный baseline на 20 марта 2026:
GPT-5 mini / GPT-5 nano уровне по умолчанию;max_cost_usd, max_steps и stop conditions на каждый run;cost per completed task, а не только cost per model call.Именно это обычно даёт первый реальный 2-5x win по стоимости.
1. Почему `cost per task` полезнее, чем `cost per model call`?
2. Какой самый сильный baseline-рычаг экономии у agent workflow?
3. Зачем нужен `budget guard`?