Контекст інструментів і кеш промптів
Про кожен запит, який робить вбудований harness, справджуються дві речі: визначення інструментів — найбільша фіксована стаття витрат у ньому, і майже жодне з них не буде використано. Ця сторінка пояснює, що із цим робить Control Center і чому відповідь — не просто «надсилати менше інструментів».
Проблема — в увазі, а не в байтах
Розділ із назвою «Проблема — в увазі, а не в байтах»Control Center реєструє близько 126 інструментів. Надіслані повністю, їхні визначення коштують приблизно 23 000 токенів на кожен запит — витрата, якої не торкається жодне згортання, бо визначення інструментів подорожують в окремій частині запиту, ніж розмова.
Рахунок за токени — очевидна скарга, і з кешуванням промптів він також менший із двох. Справжня витрата — точність вибору. Опубліковані оцінювання виклику інструментів сходяться на тому, що моделі надійно обирають правильний інструмент приблизно до 30–50 інструментів у контексті, а далі дедалі гіршають. Названа причина — не кількість токенів, а семантичне перекриття: щойно в каталозі з’являється кілька інструментів, чиї описи читаються однаково, модель обирає між двійниками, а не пригадує можливість.
Маючи 126 інструментів, агент виходить далеко за межі цієї смуги на кожному ході — включно з багатьма ходами, де йому треба було лише прочитати файл.
Дворівнева поверхня
Розділ із назвою «Дворівнева поверхня»Тож запуску показують дві речі:
- резидентний набір — приблизно два десятки інструментів, які надсилаються з повними схемами в кожному запиті;
- індекс назв усіх решти, згрупованих під заголовками на кшталт «Tickets and projects» або «Memory and knowledge», що коштує кілька сотень токенів на весь каталог.
Виміряно на поточному каталозі: це скорочує блок інструментів з ~23,1 тис. токенів до ~5,0 тис., приблизно на 78% менше, і вкладає постійно видимий набір у смугу, де вибір надійний.
Резидентний набір — це інструменти, які запуск використовує в більшості запусків: лексика файлів і оболонки (read, write, edit, search, bash, …), інструменти пошуку, контрольний список завдань, пошук у пам’яті та те дієслово, яке поточний режим мусить викликати, щоб видати свій результат. Власне вихідне дієслово режиму завжди резидентне — запуск ніколи не має вирушати на пошуки того єдиного виклику, що продукує його результат.
Відкладений — не означає недоступний
Розділ із назвою «Відкладений — не означає недоступний»Саме ця частина робить задум безпечним, а не лише дешевим. Відкладений інструмент можна викликати вже з першого ходу. Утримують лише його схему.
Агент бачить назву у своєму промпті. Якщо він викличе цю назву напряму, harness завантажить схему й виконає інструмент тим самим кроком — без помилки, без додаткового кола. Моделі не потрібно знати, що інструмент колись був «вивантажений».
Коли агент знає завдання, але не назву, search_tools приймає опис звичайною мовою («призначити тікет комусь»), ранжує всю поверхню запуску й повертає збіги уже із завантаженими схемами, тож наступний-таки хід може щось викликати. Якщо пошук нічого не знаходить, він прямо про це каже й пропонує інше формулювання або ширший пошук — навмисно, бо агент, який читає порожній пошук як «цієї можливості не існує», вигадає замінник замість того, щоб пошукати ще раз.
search_tools існує лише у вбудованому harness. Зовнішні клієнти MCP мають натомість search_tool_bm25, який ранжує той самий індекс, але лише описує збіги — ці клієнти вже отримали всі схеми з tools/list, тож завантажувати нічого.
Чого відкладення ніколи не робить
Розділ із назвою «Чого відкладення ніколи не робить»Відкладення застосовують після фільтра інструментів режиму, а не замість нього. Воно ховає схему; воно не може відкрити інструмент, який режим відхилив. Активований інструмент усе одно проходить запит на схвалення та обмеження дій точно так само, як резидентний, і жоден інструмент не може завантажити назву, якої від початку не було на поверхні запуску.
Поверхня MCP, яку бачать зовнішні клієнти, цим не зачеплена. tools/list усе ще повертає повний каталог. Раніша спроба його підрізати зламала агентів остаточно: клієнти MCP звіряють назви інструментів зі своїм кешованим списком і відкидають усе, чого в ньому немає, навіть не питаючи сервер, тож «прихований, але доступний для виклику» інструмент був просто недосяжним. Відкладення живе в harness, де завантажити інструмент посеред запуску — це те, що harness справді вміє робити.
Як це вимкнути
Розділ із назвою «Як це вимкнути»--tool-deferral=off (або CC_SERVER_TOOL_DEFERRAL=off) знову робить резидентним кожен допущений інструмент, відтворюючи точно ті запити, які сервер робив до появи відкладення. Див. довідку з CLI cc_server.
Кешування промптів
Розділ із назвою «Кешування промптів»Робочі навантаження агентів нерівні: вони надсилають величезні промпти й отримують невеликі відповіді, хід за ходом, з однаковим префіксом щоразу. Провайдери кешують цей префікс, і читання з кешу коштує близько десятої частини свіжого. Тож частка влучань у кеш — це першокласна властивість harness, а не оптимізація — а на Anthropic вона ще й дає пропускну здатність, бо кешовані токени не зараховуються до поминутного ліміту вхідних даних.
Кешування працює за точним збігом префікса, з чого випливає одне керівне правило.
Ніколи не переписувати те, що вже надіслано
Розділ із назвою «Ніколи не переписувати те, що вже надіслано»Будь-який байт, що змінився, анулює кеш від цієї точки далі. Тож harness лише дописує: нові повідомлення в кінець, а щойно активовані схеми інструментів — після кешованого блоку інструментів, а не влитими в нього. Саме цей порядок робить активацію дешевою — кешований префікс залишається незмінним, і запуск платить лише за схеми, які тільки-но завантажив.
Цикл також обрізає застарілий вивід інструментів зі старіших ходів, щоб повернути контекст. Він чекає, доки назбирається достатньо, щоб переписування було варте себе, тож обрізання — це рідкісний глибокий перепис, а не безперервні промахи кешу.
Де стоять межі кешу
Розділ із назвою «Де стоять межі кешу»Провайдер дозволяє обмежену кількість маркерів кешу, і Control Center витрачає їх навмисно:
| Маркер | Покриває | Час життя |
|---|---|---|
| Останній резидентний інструмент | Блок інструментів | 1 година |
| Останній системний блок | Інструменти + системний промпт | 1 година |
| Хвіст попереднього ходу | Історія до останнього запиту | 5 хвилин |
| Хвіст поточного ходу | Повна історія | 5 хвилин |
Останні два — це рухома пара, і причина для пари тонка: пошук у кеші переглядає назад обмежену кількість блоків у пошуках того, що зберіг раніший запит. Один хід, що запускає багато інструментів паралельно, може видати більше блоків, ніж це вікно, і тоді один маркер хвоста тихо не влучає, а запит платить повну ціну, і у відповіді немає нічого, що про це сказало б. Позначення точного місця, де зупинився попередній запит, робить влучання структурним, а не гонкою.
Префікс «інструменти й система» отримує довгий час життя, бо він незмінний упродовж усього запуску, спільний для кожного запуску й субагента однакової форми, а ще тому, що відлік починається, коли запит починається — хід, що стрімить кілька хвилин, уже витратив більшість короткого вікна до того, як сформується наступний запит.
Субагенти ділять один префікс
Розділ із назвою «Субагенти ділять один префікс»Субагенти одного типу продукують побайтово ідентичні префікси промптів, тож мали б читати один запис кешу, а не кожен писати свій. Але запис стає читабельним лише тоді, коли запит, що його записав, починає відповідати, тож віяло, запущене все одразу, змушує кожну дитину платити надбавку за префікс, який вони всі поділяють.
Harness дає першій дитині заданої форми стартувати, а тоді випускає її братів і сестер, щойно вона почне стрімити. Очікування обмежене: повільна перша дитина коштує влучання в кеш, але ніколи — самого віялового запуску. З тієї ж причини кожен субагент отримує той самий резидентний набір інструментів незалежно від свого профілю — змінювати його за профілем означало б фрагментувати спільний префікс без жодної вигоди, адже профіль уже вирішив, що дитина може викликати.
Як це спостерігати
Розділ із назвою «Як це спостерігати»Обидві половини можна спостерігати, а не припускати:
- Оглядач контексту на розмові показує резидентні інструменти, відкладений індекс і те, скільки коштувала б кожна утримана схема, — і все це будується тим самим шляхом коду, яким користується справжній запуск.
- Кожен запуск записує, які відкладені інструменти він завантажив і що це спричинило, тож пошук, який нічого не знаходить, видно як промах пошуку, а не як зникання в агенті, що тихо робить щось сусіднє.
- Спостережуваність показує показник Частка кешу — це читання з кешу, поділені на всі опрацьовані токени промпту, включно із записами в кеш: запуск, який постійно перебудовує свій префікс, дістає низький показник, а не такий, ніби кеш йому ніколи не був потрібен.