Уровни модели и кэш начала запроса
Два механизма, решающих, во что обходится ход, и ни один из них не меняет того, что говорит агент. Первый берёт модель подешевле для работы, которую никто не читает как ответ. Второй перестаёт платить на каждом сообщении за ту часть запроса, которая никогда не меняется.
Два уровня
Вызов может сказать, какого класса модели работа заслуживает, вместо того чтобы называть модель:
| уровень | модель | для чего |
|---|---|---|
| simple | ANTHROPIC_MODEL_SIMPLE — claude-haiku-4-5 | обычный вопрос и служебная работа: сжатие длинного разговора, оценка того, чего вопрос заслуживает |
| smart (по умолчанию для вызова без уровня) | ANTHROPIC_MODEL — claude-opus-4-8 | настоящая многошаговая работа |
| genius | ANTHROPIC_MODEL_GENIUS — claude-opus-5 | редкий вопрос, где вся задача — глубокое рассуждение |
С AGNT2-367 эти же три уровня видит команда: в её настройках — самый высокий уровень, до которого могут дойти её агенты, в пределах тарифа. Каждый ход человека оценивается на simple, и вердикт опускается до этого потолка — потолок, а не точка старта.
Явно названная модель бьёт уровень: модель — это утверждение про один вызов, а уровень — про вид работы.
Уровень, который не удалось разрешить, отказывает. Он не берёт тихо основную модель: такой сбой возвращает совершенно правильный ответ, ничего не пишет в лог, не роняет ни одного теста и всплывает только в счёте, месяцы спустя. Поэтому у дешёвого уровня есть значение по умолчанию, и установка, обнулившая его, получает отказ на первом же вызове вместо молчаливого счёта.
Расход записывается на ту модель, которая реально сработала, а не на ту, которую вызывающий назвал бы. Цена — за модель, так что только там экономия вообще видна.
Кэш начала запроса — больший из двух
Каждое сообщение агенту раньше пересылало заново одно и то же: описание всех его инструментов, правила площадки и то, что он умеет. На настоящем разговоре это почти девять десятых всего, за что мы платим, и от сообщения к сообщению оно не меняется.
Поставщик умеет запомнить это начало и отдавать его примерно в десять раз дешевле. Возможность была написана здесь месяцами раньше и включалась ровно для одного вызывающего — индексации знаний. Ход самого агента, который случается на каждое сообщение и несёт самый большой промпт в продукте, не пользовался ею никогда. Теперь пользуется.
Сколько это экономит
Измерено дважды, независимо, на одном и том же разговоре из четырёх ходов, настоящими вызовами claude-haiku-4-5, по ценам, посчитанным из собственных строк расхода продукта:
| вход | запись в кэш | чтение из кэша | выход | цена | |
|---|---|---|---|---|---|
| до | 58 367 | 0 | 0 | 313 | $0,0599 |
| после, кэш холодный | 5 949 | 10 447 | 41 788 | 268 | $0,0245 — −59,1 % |
| после, кэш тёплый | 5 923 | 0 | 52 235 | 240 | $0,0123 — −79,4 % |
Оба числа настоящие, и означают они разное. Холодный — это разговор, начинающийся с пустого кэша: он один раз платит надбавку за запись. Тёплый — это каждый следующий разговор, пока сохранённое начало ещё живо. Называть только второе — значит унести оптимистичную половину.
Ловушка и где стоит метка
Запись в кэш стоит дороже обычного ввода. Поэтому, если бы начало промпта менялось от хода к ходу, мы платили бы надбавку за запись каждый раз и никогда ничего не считывали бы обратно — стало бы дороже, а не дешевле.
Поэтому метка стоит ровно на границе между тем, что повторяется, и тем, что нет:
| выше метки — сохраняется | ниже метки — уходит заново каждый ход |
|---|---|
| собственные инструкции площадки | заметки, которые ход вспомнил |
| как устроена машинерия этого агента — следует из его типа и того, что открыл владелец | отрывки знаний, подтянутые под этот вопрос |
| что известно про собеседника | |
| местное время человека | |
| личность агента, всегда последней |
Личность агента — НИЖЕ метки, и это удивляет. Внутри разговора она не меняется, поэтому кажется, что ей место наверху, — но у промпта один порядок, и личность лежит под слоями, которые ход вспоминает, а они меняются. Метка не умеет перепрыгнуть через то, что между. Значит, правка личности агента кэш не сбрасывает. Стоит это примерно 230 токенов из ~10 600, которые держит голова, — около 2 %, потому что набор инструментов, который поставщик хранит перед системным промптом, — это 9 700 из них.
Промпт, который видит модель, побайтово одинаков в обоих случаях: метка его разрезает, а не переписывает. На первом ходу того же замера старое плечо насчитало 10 927 токенов входа, а новое — 480 входа плюс 10 447 записи: те же 10 927.
Чего это стоит, честно
Одиночный ход, после которого ничего не происходит, стал дороже примерно на 22 %: он платит надбавку за запись, и результат никто никогда не считывает. Это свойство механизма, а не дефект. Нормальный случай — разговоры, и выигрывает именно он.
Откуда эти числа
Стоит знать, прежде чем на них ссылаться. Три цифры выше измерены дважды на одном и том же разговоре из четырёх ходов — автором изменения и, независимо, его ревьюером, — и оба прогона лежат в отчётах на AGNT2-376, которые прилинкованы с той карточки и в репозитории их нет. 3,4× для ротации на каждый запрос — из отчёта AGNT2-366, тем же порядком.
Что в репозитории есть — это место, откуда началось исследование: specs/AGNT2-369-openrouter-or-own-keys/research.md, где возможность нашли написанной и невключённой и спрогнозировали 56,4 %. Это прогноз, а не замер, и он ниже обеих цифр выше — читайте его ради рассуждения, а не ради чисел.
Что это значит для карусели ключей
Кэш у поставщика принадлежит той рабочей области, которой принадлежит ключ, а каждый ключ — это рабочая область. Значит, ротация на другой ключ означает холодный старт.
Это по карману, и это измерено, а не предположено: одна ротация — это один холодный старт, примерно четверть цента, и он окупается на следующем же вызове. Ротация выигрыш не обнуляет, а откладывает на один вызов.
Порядок, в котором эти два механизма делались, не случаен: сначала кэш, потом ротация.
Что ограничивает вызов
Четыре числа, каждое ограничивает своё. Ничто здесь не позволяет поставщику решать, сколько мы ждём.
| настройка | по умолчанию | ограничивает |
|---|---|---|
ANTHROPIC_STREAM_STALL_MS | 60 с | молчание в потоковом ответе |
ANTHROPIC_REQUEST_TIMEOUT_MS | 300 с | одну попытку блокирующего вызова |
ANTHROPIC_RETRY_WAIT_MAX_MS | 10 с | паузу между двумя попытками |
ANTHROPIC_CALL_BUDGET_MS | 300 с | весь блокирующий вызов, вместе с паузами |
Где проходит граница между «медленно, но живо» и «больше не ждём» — потому что потолок, режущий честные медленные ответы, это уже другой баг:
- Поток судят по прогрессу. Каждое событие взводит бюджет молчания заново, поэтому ответ, который продолжает говорить, не прерывают, сколько бы он ни говорил.
- У блокирующего вызова прогресса не видно, поэтому его граница — время; при этом бюджет всего вызова равен одной полной попытке, так что один честный медленный ответ получает весь потолок себе. Кончается место на повтор после него.
- Пауза — это не ответ, поэтому она ограничена отдельно и жёстко.
Проверить
Все четыре счётчика токенов записываются на каждый вызов, поэтому вся эта страница проверяется по собственным данным продукта, а не по консоли поставщика.
Проведите с агентом разговор — из четырёх ходов и больше. На первом ходу кэша нет по определению, поэтому одиночное сообщение измерит только надбавку за запись.
Прочтите строки расхода этого разговора:
sqlSELECT unit, SUM(quantity) FROM "BillingEvent" WHERE "threadId" = '<разговор>' GROUP BY unit;cache_write_tokensненулевой на первом ходу и падает в ноль дальше;cache_read_tokensбольшой и примерно постоянный на каждом ходу после первого.По ценам поставщика итог за ходы 2–4 — доля от того, во что эти ходы обошлись бы обычным вводом: строка
input_tokensпоказывает, как мало от него осталось.
Контроль — тот самый шаг, который ловит пустой замер: проведите тот же разговор со снятой меткой. Все строки cache_* — ноль, input_tokens примерно в шесть раз больше, а цена возвращается к прежней.