Годы назад я начал задаваться вопросом, почему ИИ никогда не казался хорошо знающим дату и время. Спрашивать в разговоре, какой сегодня день, могло занять секунды, и я ожидал мгновенного ответа. Компьютер, запускающий разговор, знает, какое сейчас время.
С тех пор я пришёл к пониманию части причины. Человек может вернуться к разговору на следующий день, и любое время, которое было дано в начале разговора, устарело. Что‑то должно снова его предоставить. Хранилище, программа вокруг модели, которая собирает каждый запрос и запускает цикл, может сделать это, записывая текущее время в инструкции модели перед каждым запросом. Агент‑раннер, который мы используем в продакшене, делал именно это.
Я давно знал о кэшировании запросов. Поставщики хранят начало запроса и выставляют счёт по доле цены, когда следующий запрос начинается тем же способом. Я не знал механики достаточно хорошо, чтобы увидеть, что делает строка вроде времени. Мы наткнулись на ответ в собственных расходах на продакшене, и я направил серию экспериментов, чтобы измерить это правильно, через одну текущую модель из каждой из 4 лабораторий и по публичным данным OpenRouter о том, за что платят остальные.
Ответ дорогой. На GPT-6 Luna время, записанное в неправильном месте, заставило каждый ход разговора стоить 5.7× того, что нужно было, и ничего не вызвало ошибку. Через организации трафика отправляются эти модели, входные данные – 96–99% токенов и 66–87% долларов фактически уплаченных, поэтому кэш решает большую часть счета. Для организации, создающей собственный harness, работающей внутренней AI-платформой или поставляющей AI-продукты, ошибка, подобная этой, умножает стоимость каждого оборота, молча, пока она работает.
Каждый показатель за оборот здесь измерялся 23 сентября 2026 года, через OpenRouter. Рыночные данные – собственные OpenRouter, прочитаны в тот же день.

Кэш подсказки хранит начало запроса и начисляет оплату за десять

Каждый вызов модели отправляет весь разговор снова: определения инструментов, системный запрос (постоянные инструкции, которые пишет крепление), каждый предыдущий ход и новое сообщение.
Поставщики сохраняют обработанное начало недавних запросов. Когда следующий запрос начинается с того же текста, поставщик читает сохранённый префикс вместо повторной обработки. На GPT-6 Luna OpenRouter начислял чтение по 0.10× от указанной цены входа и первую запись по 1.25×. Подсказка, которая записывается снова на каждом ходе, поэтому стоит дороже, чем подсказка без кэша.
Только начало запроса может быть повторно использовано. Изменение в любой точке аннулирует всё после него:
Diagram source
graph LR
    A[Определения инструментов] --> B[Системный запрос]
    B --> C[Предыдущие ходы]
    C --> D[Новое сообщение пользователя]
    B -. a changed line here voids B, C and D .-> D
Любое, что крепление пишет рядом с началом и меняется на каждом ходе, ставит весь разговор под угрозу. Текущее время — самый простой пример.

Мы нашли это в нашем собственном счёте, скрытом в нашем собственном журнале расходов

Открытие началось в агенте, который мы запускаем в продакшене. Его журнал расходов оценивал каждый вызов по розничной цене и не показывал кэширование вовсе. Я поднял тревогу и начал оценивать переход на другую модель.
Агент, с которым я работал, сначала обнаружил, что сам журнал расходов был неверен. За 33 вызовов он оценил $0.064; поставщик выставил счёт $0.023, 2.7× меньше. Оценка каждого вызова по количеству токенов стерла все скидки, которые применял поставщик. Чтение стоимости, указанной поставщиком, показало, что кэширование работает внутри каждого хода и не работает в начале каждого нового.
Его первое объяснение было отсутствием ключа сессии, который бы держал запросы на одном сервере. Его собственный тест опроверг это: идентичные запросы уже читались из кэша между ходами на GPT-6 Luna, и добавление ключа сессии, ключа кэша или явного маркера кэша ничего не меняло. Причина заключалась в самом системном запросе. Около 95% пути внутрь, runner написал две строки, которые менялись каждый ход: рабочий каталог на каждый ход и часы до минуты. Каждый первый вызов хода записывал весь запрос снова на 1.25×.
Перемещение обеих строк в конец сообщения пользователя исправило это в продакшене. Ходы 2 и 3 теперь открываются по 0.47–0.51× вместо 1.25×. Остальное – блок контекста на каждый ход, который runner всё ещё отправляет в сообщение пользователя.

Где время решает, будет ли запрос прочитан или переписан

Моя догадка, до того как это всё измерили, была в том, что детерминированная проверка может предоставить время только тогда, когда оно устарело, как отдельное сообщение, и оставить остальную часть запроса в кэше. Это работает при одном условии, и это условие — правило, на котором опирается остальная часть статьи.
Чтобы проверить это напрямую, мы создали пробу, которая запускает ту же беседу с часами в разных местах, ставит 65 секунд разницы, чтобы минута менялась между каждой парой. GPT-6 Luna, система подсказки с 8.5K токенами, 3 реплицирует:
Где идут часыОткрытияЧтение из кэшаПереписаноЦена против указанного ввода
Без часов (контроль)121200.10×
Конец системной подсказки120121.25×
Вторая системная сообщение120121.25×
Начало пользовательского сообщения121200.10×
Конец сообщения пользователя121200.10×
Своё сообщение, каждый ход121200.11×
Своё сообщение, только когда устарело121200.10×
Мое отдельное сообщение сохранило кэш в обеих формах, каждый ход и только когда устарело. Условие — это место, где находится сообщение. После стабильных инструкций поставщик читает всё, что находится до него. Как второе системное сообщение оно размещается среди инструкций, и GPT-6 Luna переписал весь запрос снова на 12 из 12 ходов.
Правило, которое следует, короткое. Всё, что меняется между ходами, идёт после всего, что не меняется.

Часы ничего не стоят, пока их текст не меняется

Кэш сравнивает текст, поэтому часы безвредны, пока их текст остаётся тем же. В той же пробе с переключениями 4 секунд друг от друга, минутные часы в системном запросе читались из кэша каждый раз. С переключениями 65 секунд друг от друга, это заставляло полную перепись при каждом переключении.
Разрешение определяет, как часто это происходит. Часовые часы и строка даты в системном запросе оба читались из кэша при всех открытиих 12 переключений в 65-секундных запусках, потому что ни один из них не перешёл в новый период. Они тоже ломаются, раз в час и раз в день. Минутные часы ломаются при каждом переключении, которое начинается в более позднюю минуту, чем предыдущее.
Сам кэш также истекает. В однократных запущенных с таймингом GPT-6 Luna всё ещё читала свой сохранённый префикс после 30 минут бездействия и переписывала весь запрос снова через 1.25× после 60. DeepSeek V4.1 Flash читала после 10 минут и пропустила после 60. Claude Opus 5.5 уже пропустил после 10, поскольку стандартный кэш Anthropic длится 5 минут, а его 1-часовой кэш стоит 2× для записи. Человек, который возвращается к разговору на следующий день, как в случае, с которым началась эта статья, находит как устаревшее время, так и холодный кэш во всех трех. Этот первый возвратный ход оплачивает весь запрос, независимо от того, что делает система. Размещение решает, будут ли после него также повороты.

Модели 4 лабораторий дали 4 разных ответов

GPT-6 Luna — один из ответов поставщика. Чтобы увидеть, насколько общий урок, мы выполнили те же размещения на одной текущей модели от каждого из 4 лабораторий, с идентичным запросом из 2.5K токенов, каждый закреплённый за одним поставщиком:
Price of each turn's first call, by where the clock is written (median, multiple of the listed input price)
Chart data
multiple of listed input price
GPT-6 Luna (OpenAI)Claude Opus 5.5 (Anthropic)DeepSeek V4.1 Flash (DeepInfra)
No clock0.110.070.03
System prompt1.251.240.13
Second system1.250.080.04
User message0.120.080.04

Reference line, listed input price: 1

GPT-6 Luna кэширует целые сообщения. Одна изменённая строка отменяет сообщение, которое её содержит, и всё, что после.
Claude Opus 5.5 кэширует там, где вызывающий это отмечает. Модели Anthropic кэшируют только до маркера cache_control , который ставит harness. Без маркера тот же запрос биллировался полной ценой при каждом вызове. С маркером в системном запросе, часы внутри этого блока стоили 1.24×, а часы во втором системном сообщении после него читали на 0.08×. Размещение, которое GPT-6 Luna наказывает, безопасно на Opus. При ценах Opus разница за открытие хода была $0.0214 против $0.0023. Opus также считал идентичный запрос как 4,056 токенов, тогда как GPT-6 Luna считал 2,395, поэтому тот же текст стоит 1.69× больше токенов до применения цены.
DeepSeek V4.1 Flash кэширует в блоках по 256 токенов и не взимает дополнительную плату за запись. Чтения возвращались в точных множителях 256: 2 560 токенов для неизменённого запроса, 2 304 с часами в конце системного запроса. Изменённая строка стоит только блок, который её содержит. Первые вызовы биллировались по обычной цене ввода, а чтения — на 0.03–0.04×. На протяжении 8 запусков на размещение, 2 одиночных вызовов пропустили кэш при ходе, который тот же запуск затем считал, что читается как запрос, попавший на другой сервер, а не как эффект размещения. Собственный эндпоинт DeepSeek — единственный, который OpenRouter отмечает как автоматически кэширующий, и настройка конфиденциальности моего аккаунта исключает его, потому что этот эндпоинт обучается на платном трафике. Запуски проходили через DeepInfra, который кэшировал, как и Fireworks и Morph в проверке из 2 вызовов.
Muse Spark 1.3 читает свой кэш внутри цикла инструмента и пропускает при начале каждого нового хода. Наши первые пробы, которые задают новый вопрос к тому же системному запросу, обслуживали максимум 113 токенов из кэша в 10 вызовах, на 2.9K, 8.9K и 19.4K токенах. Когда последующий звонок расширил предыдущий запрос, как делает цикл инструментов агента, Muse прочитал 2,801 из 2,966 токенов и выставил счет за 0.17×. Следующий ход пользователя, имея всю историю перед собой, ничего не прочитал. OpenRouter сообщает о 86.1% уровне попаданий кэша для Muse в живом трафике, что соответствует рабочей нагрузке, доминирующей циклами инструментов. В начале хода часы не имеют значения для Muse, поскольку этот вызов пропускается в любом случае.
То же решение в рамках harness стоит разную сумму для каждой модели. Знание того, какой механизм использует ваш провайдер, предшествует настройке чего-либо.

Успех кэша принес деньги, а не скорость

Мы ожидали, что кэшированные ответы будут быстрее. На 10 последовательных парах вызовов GPT-6 Luna при 8.5K токенах, медианный первый вызов занял 437 мс из кэша и 490 мс без него. Этот разрыв находится в пределах разброса образцов. При таком размере кэширование меняет стоимость обращения и оставляет время выполнения примерно тем же самым.
Так что пауза, которую я помню, когда спрашивал время, имеет другую причину. Что стоит часовой механизм в неправильном месте — это деньги.

За разговором переписывание накапливается

Часовой механизм в системном запросе находится перед всей беседой, поэтому каждое переписывание охватывает растущую историю за ним, а также инструкции. Вот измеренная стоимость одного 12‑хода GPT-6 Luna беседы, с полной счетной записью поставщика, включая вывод и вызовы внутри каждого хода:
Cumulative cost of one 12-turn conversation on GPT-6 Luna (US cents)
Chart data
US cents, cumulative
turnClock at the end of the system promptClock at the end of the user message
10.1190.119
20.2370.14
30.3570.161
40.4770.182
50.5990.203
60.7220.225
70.8460.247
80.9710.269
91.0970.291
101.2240.313
111.3520.335
121.4820.358
Две строки делят свой первый ход, когда оба пишут кэш. С тех пор каждый ход с часовой в системном запросе стоит 5.7× того, что тот же ход стоил с часовой в конце пользовательского сообщения. К ходу 12 беседа уже стоила 4.1× столько, и разрыв расширяется с каждым ходом.
Доли цента становятся строкой позиции при масштабировании. Эта проекция оценивает первый вызов каждого хода для продукта, обслуживающего 10,000 бесед в день, каждая с системным запросом из 8.5K токенов, 20 ходов, и история растет на 1,500 токенов за ход. Каждая модель использует свою указанную цену и поведение кэша, показанное выше:
МодельПоведение кэшаЗа беседу, часовой в системном запросеЗа беседу, часовой в концеЗа год, разница
GPT-6 Lunaцелое сообщение$0.057$0.0057$187K
Claude Opus 5.5маркер вызывающего$2.28$0.14$7.8M
DeepSeek V4.1 Flash256-блоки токенов$0.042$0.0032$141K
Muse Spark 1.3пропущено при открытии ходов$0.57$0.57$0
Блоки DeepSeek сохраняют системный запрос, когда меняется часы, и модель всё равно выходит на 13× дороже, потому что история за часами растет быстрее инструкций за несколько ходов. Muse Spark показывает другую сторону: он пропустил начало каждого хода в наших запусках, поэтому размещение ничего не сэкономило, и каждый открывающий ход стоил полной цены, $2.1M в год за тот же трафик.

При живом трафике коэффициент попаданий в кэш составляет большую часть счета

Наши измерения используют контролируемое приглашение. OpenRouter публикует, сколько стоят те же модели на трафике всех, и та же механика появляется там в масштабе. Почти всё, что отправляется в эти модели, является входом: 96,3% токенов GPT-6 Luna в первый день, 98,5% Claude Opus 5.5 и DeepSeek V4.1 Flash, и 98,9% Muse Spark 1.3. Вход – это место, где применяется кэширование, поэтому коэффициент попаданий определяет большую часть того, за что платит бизнес.
Клиенты платили $0.87 за миллион входных токенов за Claude Opus 5.5 против указанного $4.00, $0.30 против $1.25 за Muse Spark 1.3, и $0.036 против $0.10 за GPT-6 Luna. На всех конечных точках, обслуживающих ту же модель в тот же день, цена, которую платят, следует за коэффициентом попаданий:
Claude Opus 5.5 on OpenRouter, input price actually paid by each endpoint's cache hit rate (USD per 1M tokens)
Chart data
USD per 1M input tokens
92.2% hit0.557
89.9% hit0.658
88.7% hit0.727
81.6% hit0.974
77.4% hit1.123
0% hit4.399

Reference line, listed input price: 4

Оценка каждой пропущенной попытки как записи кэша и каждой попадания как чтения предсказывает цены, опубликованные на каждой из 5 основных конечных точек, с точностью до 2–13%. Сам коэффициент попаданий объясняет разброс. На GPT-6 Luna та же схема начинается с $0.025 при коэффициенте попаданий 88.1% и заканчивается $0.075 при 49.4%, фактором 3.

Какую ошибку кэширования стоит организации в масштабе

То же решение о размещении по-разному влияет на каждый тип организации, строящей на этих API.
Создатели Harness устанавливают коэффициент попадания для каждого пользователя сразу. Приложения 5, которые отправили Claude Opus 5.5 наибольший трафик в первый день, были все агентами, по 2.9B и 16.3B токенов каждый. Для Harness на 10B входных токенов в день на этой модели, каждый пункт коэффициента попадания в кэш стоит $175K в год. Разрыв между конечными точками 92.2% и 77.4% выше составляет $2.07M в год при том объёме. Часы в системном запросе, которые переписывают каждый ход, открывающийся, стоят от $1.75M до $8.76M в год, в зависимости от того, открываются ли ходы 1 вызовом в 10 или 1 в 2. Решение также путешествует: каждый продукт, построенный на Harness, наследует его размещение. Пока писали это, мы нашли те же часы системного запроса во втором нашем Harness, который использует более старую сборку того же раннера.
Компании, работающие над внутренней AI-платформой, устанавливают это для каждой команды за ними. Шлюз, который добавляет к системному запросу каждого запроса отметку времени или ID запроса для аудита, превращает открытие каждого хода любого приложения в запись, независимо от того, что команды строят поверх. Бухгалтерия – это второе воздействие. Вознаграждение по списочной цене, входные расходы выглядят 2.8× больше, чем счёт на GPT-6 Luna, 4.1× на Muse Spark 1.3 и 4.6× на Claude Opus 5.5. Наш собственный реестр завышал 33 вызовы на 2.7×, и я почти переключился на модели на их основе.
Компании, выпускающие AI-продукты, платят за это за каждый разговор. Внутри одного разговора, неправильные часы стоили 5.7× за ход. На рынке ставки растут. 21 сентября Muse Spark 1.3 принял 88,5B входных токенов через OpenRouter. По списочной цене это $110.6K; клиенты заплатили $26.9K, и каждый пункт коэффициента попадания на этот трафик стоит $355K в год. DeepSeek V4.1 Flash принял 2,68T входных токенов в тот же день, и по ценам DeepInfra каждый пункт стоит $1,33M в год. Эти цифры покрывают один роутер. Трафик, отправленный напрямую поставщикам, не отображается у них.

Исправление: зафиксировать начало каждого запроса и добавить то, что меняется, в конец

Каждый из этих затрат отсылается к тому же механизму, и так же и исправление. Конвенции хорошо построенных harness‑агентов читаются как их последствия:
  1. Стабильное первое, меняющееся последнее. Определения инструментов и системный запрос остаются зафиксированными на всю беседу. Время, рабочий каталог, ID запроса и всё, что ещё меняется, помещаются в конец самого нового сообщения.
  2. Добавляйте, никогда не редактируйте. Ранее обращения отправляются ровно как они были. Редактирование, перестановка или обрезка их отменяют всё, что после изменения.
  3. Используйте рычаг, который имеет ваш провайдер. На GPT-6 Luna ключи сессии и маркеры кэша ничего не делали, потому что идентичные запросы уже попадали. На Claude Opus 5.5 маркер — это весь механизм. На DeepSeek V4.1 Flash выбор провайдера решает, существует ли кэш.
  4. Упрощайте то, что должно оставаться ранним. Строка даты в системном запросе ломается раз в день, а минутный таймер ломается каждый раз, когда ход начинается в новой минуте.
  5. Или уберите таймер. Harness может дать модели инструмент, который возвращает время, так что запрос никогда не меняется, и модель спрашивает, когда ей нужно знать. Это стоит один проход, в момент, когда задаётся вопрос.
  6. Урегулируйте из счёта. Цены звонков от заявленной стоимости провайдера. Бухгалтерия, построенная на подсчёте токенов по списочной цене, скрыла всё это от нас.

Следите за коэффициентом попаданий, потому что то, что его ломает, постоянно меняется

Исправление выше — одно редактирование. Условия вокруг него постоянно меняются. Harness получает новый хук, шлюз начинает маркировать запросы ID, команда переходит к модели с другим механизмом кэша, провайдер меняет, как долго бездействующий префикс остаётся «горячим». Четыре модели здесь кэшируют по‑разному, и Claude Opus 5.5 позволяет кэшу остыть в течение 10 минут бездействия. Второй harness, где мы нашли тот же часовой механизм, просто оставался на старой сборке. Ничто из этого не вызывает ошибку.
Каждый вызов уже возвращает то, что нужно, чтобы увидеть его: токены запроса, кэш‑токены, токены записи в кэш и начисленная стоимость. Записывается за каждый вызов, вместе с тем, открывает ли вызов новый ход или продолжает существующий, эти поля дают три числа, за которыми стоит следить для каждого маршрута и модели:
  1. Коэффициент открытия хода. Доля открытий ходов, которые читают сохранённый префикс. Часы в неправильном месте снизили его с 12 из 12 до 0 из 12 в наших запусках.
  2. Доля записи. Токены записи в кэш как доля от всего ввода. Маршрут, который пишет на каждом ходе, платит 1.25× и никогда не получает скидку.
  3. Эффективная цена ввода по сравнению с листом. Сама оценка счёта, рассчитанная на основе стоимости, сообщённой провайдером, а не на основе количества токенов.
Порог на эти числа ловит внезапное падение. Идентификация причины за недели данных — это задача классификации, и более новая класс модели подходит для неё. Jev, из TypeSafe, — то, что его создатель называет моделью System One. Он не генерирует текст. Он принимает состояние и типизированные вопросы и возвращает типизированные ответы с распределением вероятностей и уверенностью: выбор среди вариантов, вероятность «да» или позиция по упорядоченной шкале. При наличии ежедневного кэш‑профиля маршрута он может назвать шаблон, которому соответствует день (здоровый, открытие переходов, переписывание, истечение кэша между переходами, трафик достигает конечной точки, которая не кэшируется) и сказать, насколько он уверен, так что изменение категории становится сигналом. Мы используем его в продакшене для классификации документов и, в наблюдении, для оценки завершённых эпизодов агента. OpenRouter указывает его стоимость в $0.042 за миллион входных токенов без платы за вывод. По этой цене классификация ежедневного профиля из 2K токенов для каждого из 1,000 маршрутов стоит примерно $31 в год, по сравнению с $175K в год за один пункт коэффициента попадания при масштабе harness выше.
Система, которая постоянно переписывает свой кэш, платит премию за каждый ход каждой беседы, пока она работает, и счёт редко объясняет причину. Исправление может быть таким небольшим, как место, где записывается время. Удержание его в исправном состоянии требует наблюдения со стороны кого‑то.

Что мы измерили и что ещё предстоит измерить

Каждая измеренная цифра выше исходит из собственных полей вызова OpenRouter (загруженные токены, токены записи кэша и начисленная стоимость) 23 сентября 2026 г. Рыночные данные получены с публичных страниц модели OpenRouter того же дня: фактически уплаченная взвешенная цена входа, эффективная цена каждого эндпоинта и коэффициент попаданий кэша, а также один день активности токенов на модель. Claude Opus 5.5 и GPT-6 Luna были запущены 22 сентября, поэтому их показатели активности охватывают частичный первый день, и статья использует их только как доли. Эксперименты обошлись $0.63 в сумме, а датчик отказался запускаться, как только использование аккаунта приблизилось к лимиту $1. Цены — это опубликованные цены OpenRouter того же дня. Руководство по кэшированию OpenRouter перечисляет OpenAI чтений кэша по 0,25–0,50×; GPT-6 Luna начисляла за чтения 0,10×, и эта статья сообщает, что было начислено.
Остаётся открытым: точный момент, когда бездействующий кэш каждой модели истекает, какой один раз отложенный запуск только ограничивает; как часто часовой или календарный таймер ломается при реальных паузах в разговоре; почему Muse Spark пропускает начало каждого хода, когда его история не менялась; и поведение DeepSeek на собственном эндпоинте. Исправление на каждый ход уже в работе нашего продакшн‑агента, и то же открытие уже в очереди для второго крепления, которое запускает более старую сборку того же раннера.

Ключевые атрибуты

От меня. Вопрос, стоящий за статьей: почему ИИ никогда не казался точно знать дату и время, и тратил секунды, чтобы сказать их, когда это должно быть мгновенно. Идея о том, что время становится устаревшим в течение сессии и должно быть снова предоставлено, моя догадка о том, что детерминированное сообщение «только при устаревании» оставит запрос в кеше, и вызов для проверки этого экспериментом. Кадрирование стоимости: количественно для бизнесов, которые строят на этих моделях, от строителей инфраструктуры до компаний, которые управляют собственными внутренними платформами ИИ, как это выглядит сегодня и как это накапливается. Закрытие на продолжающемся наблюдении, с моделью System One, такой как Jev, классифицирующей профиль кеша со временем, потому что исправление действует только пока кто-то наблюдает.
От Claude Opus 5.5. Он обнаружил, что наш бухгалтерский журнал скрывал кеширование, 2.7× на 33 вызовах, и проследил причину до строк 2 в системном запросе, которые менялись каждый ход. Он создал исправление runner, которое теперь в продакшене, probe, анализ и модель стоимости за каждое число здесь, и сопоставил механизм с публичными рыночными цифрами OpenRouter. В рамках моделей 4 он выявил 3 различных поведений кеша, включая поведение GPT-6 Luna «весьма сообщение», и четвертую модель без пригодного кеша.
Критики, которые остались.
  • От Claude Opus 5.5, из своего первого объяснения: отсутствующий ключ сессии. Его probe опроверг её; идентичные запросы уже читались из кеша в течение ходов.
  • Из измерений Claude Opus 5.5 по моей догадке: отдельное сообщение о времени работает только когда оно следует после стабильных инструкций. Статья несёт мою идею с этим условием.
Достигнуто вместе. Открытие, что часы ничего не стоят, пока их текст не меняется, а затем стоят весь запрос. И правило, которое статья применяет: всё, что меняется между ходами, идёт после всего, что не меняется.