Гигиена транскрипта (исправления провайдеров)
Этот документ описывает провайдер-специфичные исправления, применяемые к транскриптам перед запуском (построением контекста модели). Это настройки в памяти, используемые для удовлетворения строгих требований провайдеров. Эти шаги гигиены не переписывают хранимый на диске JSONL транскрипт; однако отдельный проход восстановления файла сессии может переписать неправильно оформленные JSONL файлы, удалив недействительные строки до загрузки сессии. Когда происходит восстановление, исходный файл резервируется рядом с файлом сессии.
Область включает:
- Санитизация tool call id
- Валидация входных данных tool call
- Восстановление связывания результатов tool
- Валидация/упорядочивание ходов
- Очистка сигнатур мыслей
- Санитизация payload изображений
Если вам нужны детали хранения транскрипта, см.:
Где это выполняется
Вся гигиена транскрипта централизована во встроенном раннере:
- Выбор политики: 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 (встроенный раннер)
Глобальное правило: санитизация изображений
Payload изображений всегда санитизируются для предотвращения отказа со стороны провайдера из-за ограничений размера (уменьшение масштаба/повторное сжатие слишком больших base64 изображений).
Реализация:
- sanitizeSessionMessagesImages в src/agents/pi-embedded-helpers/images.ts
- sanitizeContentBlocksImages в src/agents/tool-images.ts
Глобальное правило: неправильно оформленные tool call
Блоки tool-call ассистента, в которых отсутствуют и input, и arguments, удаляются перед построением контекста модели. Это предотвращает отказы провайдеров от частично сохраненных tool call (например, после сбоя из-за ограничения скорости).
Реализация:
- sanitizeToolCallInputs в src/agents/session-transcript-repair.ts
- Применяется в sanitizeSessionHistory в src/agents/pi-embedded-runner/google.ts
Матрица провайдеров (текущее поведение)
OpenAI / OpenAI Codex
- Только санитизация изображений
- При переключении модели на OpenAI Responses/Codex удаление осиротевших сигнатур рассуждений (отдельные элементы рассуждений без последующего блока контента)
- Нет санитизации tool call id
- Нет восстановления связывания результатов tool
- Нет валидации или переупорядочивания ходов
- Нет синтетических результатов tool
- Нет удаления сигнатур мыслей
Google (Generative AI / Gemini CLI / Antigravity)
- Санитизация tool call id: строгие буквенно-цифровые
- Восстановление связывания результатов tool и синтетические результаты tool
- Валидация ходов (чередование ходов в стиле Gemini)
- Исправление порядка ходов Google (добавление небольшого пользовательского начального хода, если история начинается с ассистента)
- Antigravity Claude: нормализация сигнатур мыслей; удаление неподписанных блоков мыслей
Anthropic / Minimax (совместимый с Anthropic)
- Восстановление связывания результатов tool и синтетические результаты tool
- Валидация ходов (объединение последовательных пользовательских ходов для удовлетворения строгого чередования)
Mistral (включая определение на основе model-id)
- Санитизация tool call id: strict9 (буквенно-цифровая длина 9)
OpenRouter Gemini
- Очистка сигнатур мыслей: удаление не-base64 значений thought_signature (сохранение base64)
Все остальное
- Только санитизация изображений
Историческое поведение (до 2026.1.22)
До релиза 2026.1.22 OpenClaw применял несколько уровней гигиены транскрипта:
-
Расширение transcript-sanitize выполнялось при каждом построении контекста и могло:
- Восстанавливать связывание tool use/result
- Санитизировать tool call id (включая нестрогий режим, сохраняющий _/-)
-
Раннер также выполнял провайдер-специфичную санитизацию, что дублировало работу
-
Дополнительные изменения происходили вне политики провайдера, включая:
- Удаление тегов из текста ассистента перед сохранением
- Удаление пустых ошибочных ходов ассистента
- Обрезка контента ассистента после tool call
Эта сложность вызвала регрессии между провайдерами (особенно связывание call_id|fc_id openai-responses). Очистка 2026.1.22 удалила расширение, централизовала логику в раннере и сделала OpenAI нетронутым, кроме санитизации изображений.