Гигиена транскриптов
В этом документе описаны провайдер-специфичные исправления, применяемые к транскриптам перед запуском (построением контекста модели). Это оперативные корректировки, используемые для удовлетворения строгих требований провайдеров. Эти шаги гигиены не перезаписывают сохранённый JSONL-транскрипт на диске; однако, отдельный проход восстановления файлов сессии может перезаписать некорректные JSONL-файлы, удаляя невалидные строки перед загрузкой сессии. При восстановлении исходный файл сохраняется в резервной копии рядом с файлом сессии. Область применения включает:
- Санацию идентификаторов вызовов инструментов
- Валидацию входных данных вызовов инструментов
- Восстановление пар вызов/результат инструмента
- Валидацию / упорядочивание ходов
- Очистку сигнатур размышлений
- Санацию полезной нагрузки изображений
- Тегирование происхождения пользовательского ввода (для промптов, перенаправленных между сессиями)
Если вам нужны детали хранения транскриптов, см.:
Где это выполняется
Вся гигиена транскриптов централизована во встроенном раннере:
- Выбор политики:
src/agents/transcript-policy.ts - Применение санации/восстановления:
sanitizeSessionHistoryвsrc/agents/pi-embedded-runner/google.ts
Политика использует provider, modelApi и modelId, чтобы решить, что применять. Отдельно от гигиены транскриптов, файлы сессий восстанавливаются (при необходимости) перед загрузкой:
repairSessionFileIfNeededвsrc/agents/session-file-repair.ts- Вызывается из
run/attempt.tsиcompact.ts(встроенный раннер)
Глобальное правило: санация изображений
Полезные нагрузки изображений всегда проходят санацию, чтобы предотвратить отклонение со стороны провайдера из-за ограничений размера (уменьшение масштаба/пережатие слишком больших изображений в base64). Это также помогает контролировать нагрузку на токены, вызванную изображениями, для моделей с поддержкой зрения. Меньшие максимальные размеры обычно снижают использование токенов; большие размеры сохраняют детализацию. Реализация:
sanitizeSessionMessagesImagesвsrc/agents/pi-embedded-helpers/images.tssanitizeContentBlocksImagesвsrc/agents/tool-images.ts- Максимальная сторона изображения настраивается через
agents.defaults.imageMaxDimensionPx(по умолчанию:1200).
Глобальное правило: некорректные вызовы инструментов
Блоки вызовов инструментов ассистента, в которых отсутствуют и input, и arguments, удаляются перед построением контекста модели. Это предотвращает отклонения провайдером частично сохранённых вызовов инструментов (например, после сбоя из-за лимита запросов). Реализация:
sanitizeToolCallInputsвsrc/agents/session-transcript-repair.ts- Применяется в
sanitizeSessionHistoryвsrc/agents/pi-embedded-runner/google.ts
Глобальное правило: происхождение ввода между сессиями
Когда агент отправляет промпт в другую сессию через sessions_send (включая шаги ответа/объявления от агента к агенту), OpenClaw сохраняет созданный пользовательский ход с:
message.provenance.kind = "inter_session"
Эти метаданные записываются в момент добавления в транскрипт и не меняют роль (role: "user" остаётся для совместимости с провайдерами). Читатели транскриптов могут использовать это, чтобы не рассматривать перенаправленные внутренние промпты как инструкции от конечного пользователя. При перестроении контекста OpenClaw также добавляет в оперативную память короткий маркер [Сообщение между сессиями] к этим пользовательским ходам, чтобы модель могла отличать их от инструкций внешнего конечного пользователя.
Матрица провайдеров (текущее поведение)
OpenAI / OpenAI Codex
- Только санация изображений.
- Удаление изолированных сигнатур размышлений (отдельных элементов reasoning без последующего блока контента) для транскриптов OpenAI Responses/Codex.
- Нет санации идентификаторов вызовов инструментов.
- Нет восстановления пар вызов/результат инструмента.
- Нет валидации или переупорядочивания ходов.
- Нет синтетических результатов инструментов.
- Нет удаления сигнатур размышлений.
Google (Generative AI / Gemini CLI / Antigravity)
- Санация идентификаторов вызовов инструментов: строго буквенно-цифровые.
- Восстановление пар вызов/результат инструмента и синтетические результаты инструментов.
- Валидация ходов (чередование ходов в стиле Gemini).
- Исправление порядка ходов для Google (добавление небольшого пользовательского бутстрапа, если история начинается с ассистента).
- Antigravity Claude: нормализация сигнатур размышлений; удаление блоков размышлений без подписи.
Anthropic / Minimax (совместимые с Anthropic)
- Восстановление пар вызов/результат инструмента и синтетические результаты инструментов.
- Валидация ходов (объединение последовательных пользовательских ходов для соблюдения строгого чередования).
Mistral (включая обнаружение на основе model-id)
- Санация идентификаторов вызовов инструментов: strict9 (буквенно-цифровые, длина 9).
OpenRouter Gemini
- Очистка сигнатур размышлений: удаление значений
thought_signature, не являющихся base64 (сохраняются base64).
Все остальные
- Только санация изображений.
Историческое поведение (до 2026.1.22)
До выпуска 2026.1.22 OpenClaw применял несколько уровней гигиены транскриптов:
- Расширение transcript-sanitize запускалось при каждом построении контекста и могло:
- Восстанавливать пары использование/результат инструмента.
- Санировать идентификаторы вызовов инструментов (включая нестрогий режим, сохраняющий
_/-).
- Раннер также выполнял провайдер-специфичную санацию, что дублировало работу.
- Дополнительные мутации происходили вне политики провайдера, включая:
- Удаление тегов
<final>из текста ассистента перед сохранением. - Удаление пустых ходов ассистента с ошибками.
- Обрезку контента ассистента после вызовов инструментов.
- Удаление тегов
Эта сложность вызывала регрессии между провайдерами (особенно в openai-responses при сопоставлении call_id|fc_id). Очистка в версии 2026.1.22 удалила расширение, централизовала логику в раннере и сделала обработку OpenAI ненавязчивой (только санация изображений).