Technical reference
Кэширование промптов
Кэширование промптов позволяет провайдеру моделей повторно использовать неизменившийся префикс промпта (системные инструкции и инструкции разработчика, определения инструментов, другой стабильный контекст) между ходами вместо его повторной обработки при каждом запросе. Это снижает расход токенов и задержку в длительных сеансах с повторяющимся контекстом.
OpenClaw нормализует данные об использовании провайдера в cacheRead и cacheWrite везде, где вышестоящий API предоставляет эти счётчики. Сводки использования (/status и аналогичные) используют последнюю запись об использовании из транскрипта как резервный источник, если в текущем снимке сеанса отсутствуют счётчики кэша; ненулевое текущее значение всегда имеет приоритет над резервным.
Справочные материалы по провайдерам:
Основные параметры
cacheRetention
Значения: "none" | "short" | "long". Можно настроить как глобальное значение по умолчанию, отдельно для модели и отдельно для агента.
agents: defaults: params: cacheRetention: "long" # none | short | long models: "anthropic/claude-opus-4-6": params: cacheRetention: "short" # переопределяет глобальное значение по умолчанию для этой модели list: - id: "alerts" params: cacheRetention: "none" # переопределяет оба значения по умолчанию для этого агентаПорядок объединения (более позднее значение имеет приоритет):
agents.defaults.params— глобальное значение по умолчанию для всех моделейagents.defaults.models["provider/model"].params— переопределение для отдельной моделиagents.list[].params— переопределение для отдельного агента, сопоставляемое по идентификатору агента
Источник: src/agents/embedded-agent-runner/extra-params.ts (resolveExtraParams).
contextPruning.mode: "cache-ttl"
Удаляет из контекста старые результаты инструментов после истечения окна TTL кэша, чтобы запрос после периода бездействия не кэшировал повторно чрезмерно большую историю.
agents: defaults: contextPruning: mode: "cache-ttl" ttl: "1h"Полное описание поведения см. в разделе Очистка сеансов.
Поддержание кэша в прогретом состоянии с помощью Heartbeat
Heartbeat может поддерживать окна кэша в прогретом состоянии и сокращать количество повторных записей в кэш после периодов бездействия. Настраивается глобально (agents.defaults.heartbeat) или отдельно для агента (agents.list[].heartbeat).
agents: defaults: heartbeat: every: "55m"Поведение провайдеров
Anthropic (прямой API и Vertex AI)
cacheRetentionподдерживается для провайдеровanthropicиanthropic-vertex, а также для моделей Claude вamazon-bedrockи пользовательских конечных точках, совместимых сanthropic-messages, если явно заданоcacheRetention.- Если значение не задано, OpenClaw устанавливает
cacheRetention: "short"для прямого подключения к Anthropic (только для провайдеровanthropicиanthropic-vertex; другие маршруты семейства Anthropic требуют явного значения). - Ответы нативного API Anthropic Messages предоставляют
cache_read_input_tokensиcache_creation_input_tokens, которые сопоставляются сcacheReadиcacheWrite. cacheRetention: "short"соответствует эфемерному кэшу по умолчанию на 5 минут. При явной настройкеcacheRetention: "long"запрашивает TTL длительностью 1 час (cache_control: { type: "ephemeral", ttl: "1h" }). Неявное или заданное через переменную окружения длительное хранение (OPENCLAW_CACHE_RETENTION=longбез явногоcacheRetention) увеличивает TTL до 1 часа только на узлахapi.anthropic.comили Vertex AI (aiplatform.googleapis.com/*-aiplatform.googleapis.com); на остальных узлах сохраняется 5-минутный кэш.
Источник: src/agents/anthropic-payload-policy.ts (resolveAnthropicEphemeralCacheControl, isLongTtlEligibleEndpoint).
OpenAI (прямой API)
- Кэширование промптов выполняется автоматически для поддерживаемых современных моделей; OpenClaw не добавляет маркеры кэширования на уровне блоков.
- OpenClaw отправляет
prompt_cache_key, чтобы маршрутизация кэша оставалась стабильной между ходами. Узлы прямого подключенияapi.openai.comполучают это автоматически. Для прокси, совместимых с OpenAI (oMLX, llama.cpp, пользовательские конечные точки), требуетсяcompat.supportsPromptCacheKey: trueв конфигурации модели для явного включения — для прокси это никогда не определяется автоматически. prompt_cache_retention: "24h"добавляется только при выбореcacheRetention: "long"и если определённая конечная точка поддерживает как ключ кэша, так и длительное хранение (compat.supportsLongCacheRetention, по умолчанию — true; профили совместимости Together AI и Cloudflare отключают его).cacheRetention: "none"запрещает отправку обоих полей.- Попадания в кэш отображаются через
usage.prompt_tokens_details.cached_tokens(Chat Completions) илиinput_tokens_details.cached_tokens(Responses API) и сопоставляются сcacheRead. - Полезная нагрузка Responses API также может предоставлять
input_tokens_details.cache_write_tokens, который сопоставляется сcacheWriteи тарифицируется по ставке записи в кэш для модели; если полезная нагрузка Responses не содержит это поле,cacheWriteсохраняет значение0. API Chat Completions OpenAI не документирует и не возвращает счётчикcache_write_tokens, однако OpenClaw всё равно считывает тамprompt_tokens_details.cache_write_tokensдля прокси, совместимых с OpenRouter, и прокси в стиле DeepSeek, которые сообщают отдельное количество записей. - На практике OpenAI работает скорее как кэш начального префикса, чем как механизм повторного использования всей перемещающейся истории Anthropic — см. ниже раздел Ожидаемое поведение OpenAI при реальном использовании.
Amazon Bedrock
- Ссылки на модели Anthropic Claude (
amazon-bedrock/*anthropic.claude*, а также префиксы системных профилей логического вывода AWSus./eu./global.anthropic.claude*) поддерживают явную сквозную передачуcacheRetention. - Для моделей Bedrock не от Anthropic (например,
amazon.nova-*) во время выполнения всегда отключается хранение кэша независимо от настроенного значенияcacheRetention. - Для непрозрачных ARN профилей логического вывода приложений Bedrock (идентификаторов профилей, не содержащих
claude) хранение кэша также отключается, если явно не заданоcacheRetention, поскольку семейство модели невозможно определить только по ARN.
OpenRouter
Для ссылок на модели openrouter/anthropic/* OpenClaw добавляет маркеры Anthropic cache_control в блоки системного промпта и промпта разработчика, но только если запрос по-прежнему направляется по проверенному маршруту OpenRouter (openrouter на его конечной точке по умолчанию либо любой провайдер или базовый URL, разрешающийся в openrouter.ai). Перенаправление модели на произвольный URL прокси, совместимого с OpenAI, отключает добавление этих маркеров.
contextPruning.mode: "cache-ttl" разрешено для ссылок на модели openrouter/anthropic/*, openrouter/deepseek/*, openrouter/moonshot/*, openrouter/moonshotai/* и openrouter/zai/*, поскольку эти маршруты обрабатывают кэширование промптов на стороне провайдера без маркеров, добавляемых OpenClaw.
Источник: extensions/openrouter/index.ts (OPENROUTER_CACHE_TTL_MODEL_PREFIXES).
Создание кэша DeepSeek в OpenRouter выполняется по мере возможности и может занять несколько секунд; немедленный повторный запрос всё ещё может показывать cached_tokens: 0. Проверьте результат, повторив запрос с тем же префиксом после небольшой задержки и используя usage.prompt_tokens_details.cached_tokens как признак попадания в кэш.
Google Gemini (прямой API)
- Прямой транспорт Gemini (
api: "google-generative-ai") сообщает о попаданиях в кэш через вышестоящее полеcachedContentTokenCount, сопоставляемое сcacheRead. - Поддерживаемые семейства моделей:
gemini-2.5*иgemini-3*(варианты Live и предварительные версии, не соответствующие этому префиксу, исключены, напримерgemini-live-2.5-flash-preview). - Если для поддерживаемой модели задано
cacheRetention, OpenClaw автоматически создаёт, повторно использует и обновляет ресурсcachedContentsдля системного промпта — вручную указывать дескриптор кэшированного содержимого не требуется. TTL составляет300sдляcacheRetention: "short"и3600sдля"long". - Существующий дескриптор кэшированного содержимого Gemini по-прежнему можно передать как
params.cachedContent(или устаревшийparams.cached_content); при явном указании дескриптора автоматическое управление кэшем полностью пропускается. - Это отличается от кэширования префиксов промптов Anthropic и OpenAI: вместо добавления встроенных маркеров кэша OpenClaw управляет нативным ресурсом провайдера
cachedContentsдля Gemini.
Источник: src/agents/embedded-agent-runner/google-prompt-cache.ts.
Провайдеры с CLI-обвязкой (Claude Code, Gemini CLI)
Серверные части CLI, которые создают события использования в формате JSONL (jsonlDialect: "claude-stream-json" или "gemini-stream-json"), обрабатываются общим анализатором использования. Он распознаёт несколько вариантов имён полей, включая обычный счётчик cached, сопоставляемый с cacheRead. Если полезная нагрузка JSON от CLI не содержит отдельного поля количества входных токенов, OpenClaw вычисляет его как input_tokens - cached. Это только нормализация данных об использовании — она не создаёт маркеры кэширования промптов в стиле Anthropic или OpenAI для моделей, запускаемых через CLI.
Источник: src/agents/cli-output.ts (toCliUsage).
Другие провайдеры
Если провайдер не поддерживает ни один из описанных выше режимов кэширования, cacheRetention не действует.
Граница кэширования системного промпта
OpenClaw разделяет системный промпт на стабильный префикс и изменчивый суффикс по внутренней границе префикса кэша. Содержимое выше границы (определения инструментов, метаданные Skills, файлы рабочей области) упорядочивается так, чтобы оставаться побайтово идентичным между ходами. Содержимое ниже границы (например, HEARTBEAT.md, временные метки среды выполнения и другие метаданные отдельного хода) может изменяться, не делая кэшированный префикс недействительным.
Ключевые проектные решения:
- Стабильные файлы контекста проекта из рабочей области располагаются перед
HEARTBEAT.md, поэтому изменения Heartbeat не нарушают стабильный префикс. - Граница применяется при формировании транспорта семейств Anthropic и OpenAI, Google и CLI, поэтому все поддерживаемые провайдеры получают преимущества одинаковой стабильности префикса.
- Запросы Codex Responses и Anthropic Vertex маршрутизируются через формирование кэша с учётом границы, поэтому повторное использование кэша соответствует данным, которые фактически получают провайдеры.
- Отпечатки системных промптов нормализуются (пробелы, окончания строк, добавленный хуками контекст, порядок возможностей среды выполнения), поэтому семантически неизменившиеся промпты используют общий кэш между ходами.
Если после изменения конфигурации или рабочей области наблюдаются неожиданные всплески cacheWrite, проверьте, располагается ли изменение выше или ниже границы кэша. Обычно проблему решает перемещение изменчивого содержимого ниже границы или его стабилизация.
Механизмы OpenClaw для обеспечения стабильности кэша
- Каталоги встроенных инструментов MCP сортируются детерминированно (сначала по имени сервера, затем по имени инструмента) перед регистрацией инструментов, поэтому изменения порядка
listTools()не вызывают постоянных изменений блока инструментов и не нарушают префиксы кэша промптов. - В устаревших сеансах с сохранёнными блоками изображений 3 последних завершённых хода остаются без изменений (учитываются все завершённые ходы, а не только содержащие изображения). Старые, уже обработанные блоки изображений заменяются текстовым маркером, чтобы последующие запросы в сеансах с большим количеством изображений не отправляли повторно крупные устаревшие полезные нагрузки.
Варианты настройки
Смешанный трафик (рекомендуемое значение по умолчанию)
Сохраните долгоживущую базовую конфигурацию для основного агента и отключите кэширование для агентов уведомлений с неравномерной нагрузкой:
agents: defaults: model: primary: "anthropic/claude-opus-4-6" models: "anthropic/claude-opus-4-6": params: cacheRetention: "long" list: - id: "research" default: true heartbeat: every: "55m" - id: "alerts" params: cacheRetention: "none"Базовая конфигурация с приоритетом экономии
- Установите базовое значение
cacheRetention: "short". - Включите
contextPruning.mode: "cache-ttl". - Задавайте интервал Heartbeat меньше TTL только для агентов, которым полезен прогретый кэш.
Регрессионные тесты в реальной среде
OpenClaw выполняет одну объединённую проверку регрессий кэша в реальной среде, охватывающую повторяющиеся префиксы, ходы с инструментами, ходы с изображениями, транскрипты инструментов в стиле MCP и контрольный сценарий Anthropic без кэша.
src/agents/live-cache-regression.live.test.tssrc/agents/live-cache-regression-runner.tssrc/agents/live-cache-regression-baseline.ts
Запуск:
OPENCLAW_LIVE_TEST=1 OPENCLAW_LIVE_CACHE_TEST=1 pnpm test:live:cacheВ базовом файле хранятся последние наблюдавшиеся реальные значения, а также зависящие от провайдера минимальные пороги регрессии, с которыми их сравнивает тест. Каждый запуск использует новые идентификаторы сеансов и пространства имён промптов, поэтому состояние кэша от предыдущих запусков не влияет на текущую выборку. Для Anthropic и OpenAI применяются разные правила: недостижение порога Anthropic считается критической регрессией (тест завершается с ошибкой), а недостижение порога OpenAI служит только для наблюдения (регистрируется как предупреждение и не приводит к сбою запуска). Единый межпровайдерный порог не используется.
Ожидаемое поведение Anthropic в реальной среде
- Ожидайте явных записей при прогреве через
cacheWrite. - Ожидайте почти полного повторного использования истории при повторных ходах, поскольку механизм управления кешем Anthropic перемещает точку разделения кеша по мере развития диалога.
- Минимальные пороги для стабильных сценариев, сценариев с инструментами, изображениями и в стиле MCP являются строгими барьерами для выявления регрессий.
Ожидаемое поведение OpenAI в реальной среде
- Ожидайте только
cacheRead; в Chat Completions значениеcacheWriteостаётся0. - Рассматривайте повторное использование кеша при повторных ходах как специфичное для провайдера плато, а не как характерное для Anthropic перемещающееся повторное использование полной истории.
- Минимальные пороги используются только для наблюдения (недостижение регистрируется как предупреждение, а не как ошибка теста) и получены из наблюдаемого поведения в реальной среде на
gpt-5.4-mini:
| Сценарий | Минимум cacheRead |
Минимальная доля попаданий |
|---|---|---|
| Стабильный префикс | 4,608 | 0.90 |
| Транскрипт инструмента | 4,096 | 0.85 |
| Транскрипт с изображением | 3,840 | 0.82 |
| Транскрипт в стиле MCP | 4,096 | 0.85 |
Последние наблюдаемые базовые показатели (из live-cache-regression-baseline.ts) составили: стабильный префикс cacheRead=4864, доля попаданий 0.966; транскрипт инструмента cacheRead=4608, доля попаданий 0.896; транскрипт с изображением cacheRead=4864, доля попаданий 0.954; транскрипт в стиле MCP cacheRead=4608, доля попаданий 0.891.
Почему проверки различаются: Anthropic предоставляет явные точки разделения кеша и перемещающееся повторное использование истории диалога, тогда как эффективный повторно используемый префикс OpenAI в реальном трафике может выйти на плато раньше, чем будет охвачен весь промпт. Сравнение двух провайдеров по единому межпровайдерному процентному порогу приводит к ложным регрессиям.
Конфигурация diagnostics.cacheTrace
diagnostics: cacheTrace: enabled: true filePath: "~/.openclaw/logs/cache-trace.jsonl" # необязательно includeMessages: false # по умолчанию true includePrompt: false # по умолчанию true includeSystem: false # по умолчанию trueЗначения по умолчанию:
| Ключ | Значение по умолчанию |
|---|---|
filePath |
$OPENCLAW_STATE_DIR/logs/cache-trace.jsonl |
includeMessages |
true |
includePrompt |
true |
includeSystem |
true |
Переключатели среды (для разовой отладки)
| Переменная | Эффект |
|---|---|
OPENCLAW_CACHE_TRACE=1 |
Включает трассировку кеша |
OPENCLAW_CACHE_TRACE_FILE=path |
Переопределяет путь вывода |
OPENCLAW_CACHE_TRACE_MESSAGES=0|1 |
Переключает захват полной полезной нагрузки сообщений |
OPENCLAW_CACHE_TRACE_PROMPT=0|1 |
Переключает захват текста промпта |
OPENCLAW_CACHE_TRACE_SYSTEM=0|1 |
Переключает захват системного промпта |
Что проверять
- События трассировки кеша записываются в формате JSONL с поэтапными снимками, такими как
session:loaded,prompt:before,stream:contextиsession:after. - Влияние кеша на количество токенов в каждом ходе видно в обычных представлениях использования:
cacheReadиcacheWriteотображаются в/usage tokens,/status, сводках использования сеанса и пользовательских макетахmessages.usageTemplate. - Для Anthropic при активном кешировании ожидайте как
cacheRead, так иcacheWrite. - Для OpenAI при попаданиях в кеш ожидайте
cacheRead; значениеcacheWriteзаполняется только в полезных нагрузках Responses API, которые его содержат (см. раздел OpenAI выше). - OpenAI также возвращает заголовки трассировки и ограничения частоты запросов, такие как
x-request-id,openai-processing-msиx-ratelimit-*; используйте их для трассировки запросов, но данные о попаданиях в кеш следует по-прежнему получать из полезной нагрузки с информацией об использовании, а не из заголовков.
Быстрое устранение неполадок
- Высокое значение
cacheWriteв большинстве ходов: проверьте системный промпт на наличие изменчивых входных данных; убедитесь, что модель или провайдер поддерживает ваши настройки кеша. - Высокое значение
cacheWriteв Anthropic: часто означает, что точка разделения кеша приходится на содержимое, которое изменяется при каждом запросе. - Низкое значение OpenAI
cacheRead: убедитесь, что стабильный префикс находится в начале, повторяющийся префикс содержит не менее 1024 токенов и для ходов, которые должны совместно использовать кеш, повторно используется один и тот жеprompt_cache_key. - Нет эффекта от
cacheRetention: убедитесь, что ключ модели соответствуетagents.defaults.models["provider/model"]. - Запросы Bedrock Nova с настройками кеша: ожидаемое поведение — во время выполнения для них не используется хранение кеша.
Связанная документация: