---
read_when:
    - Ви налагоджуєте відхилення запитів до провайдера, пов’язані з формою транскрипту
    - Ви змінюєте санітизацію транскриптів або логіку виправлення викликів інструментів
    - Ви досліджуєте невідповідності ідентифікаторів викликів інструментів між провайдерами
summary: 'Довідка: правила санітизації та виправлення транскриптів, специфічні для провайдера'
title: Гігієна транскриптів
x-i18n:
    generated_at: "2026-06-27T18:20:30Z"
    model: gpt-5.5
    postprocess_version: locale-links-v1
    provider: openai
    source_hash: ca1c747b33dc0d6730281d6c91d28a0f8a85bcc5e5cb00dbdebdb55157871a7d
    source_path: reference/transcript-hygiene.md
    workflow: 16
---

OpenClaw застосовує **виправлення, специфічні для провайдера**, до транскриптів перед запуском (побудовою контексту моделі). Більшість із них є коригуваннями **в пам’яті**, що використовуються для виконання суворих вимог провайдера. Окремий прохід відновлення файлу сеансу також може переписати збережений JSONL до завантаження сеансу, але лише для неправильно сформованих рядків або збережених ходів, які є недійсними довготривалими записами. Доставлені відповіді асистента зберігаються на диску; специфічне для провайдера видалення попереднього заповнення асистента відбувається лише під час побудови вихідних payload. Коли виконується відновлення, початковий файл записується в тимчасовий сусідній `*.bak-<pid>-<ts>` перед атомарною заміною та видаляється після успішної заміни; резервна копія зберігається лише якщо саме очищення завершується невдало (у такому разі шлях повертається у звіті).

Обсяг охоплює:

- Контекст підказки лише для runtime, який не потрапляє до видимих користувачу ходів транскрипту
- Очищення id викликів інструментів
- Перевірку input викликів інструментів
- Відновлення зіставлення результатів інструментів
- Перевірку / впорядкування ходів
- Очищення підписів думок
- Очищення підписів thinking
- Очищення payload зображень
- Очищення порожніх текстових блоків перед повторним відтворенням для провайдера
- Очищення незавершених ходів довжини лише з reasoning перед повторним відтворенням для провайдера
- Позначення походження user-input (для підказок, маршрутизованих між сеансами)
- Відновлення порожніх error-ходів асистента для повторного відтворення Bedrock Converse

Якщо вам потрібні подробиці про зберігання транскриптів, див.:

- [Глибокий огляд керування сеансами](/uk/reference/session-management-compaction)

---

## Глобальне правило: runtime-контекст не є транскриптом користувача

Runtime/system-контекст може бути доданий до підказки моделі для ходу, але це
не вміст, створений кінцевим користувачем. OpenClaw зберігає окреме тіло
підказки, орієнтоване на транскрипт, для відповідей Gateway, поставлених у чергу followup, ACP, CLI та вбудованих запусків OpenClaw.
Збережені видимі ходи користувача використовують це тіло транскрипту замість
підказки, збагаченої runtime.

Для застарілих сеансів, які вже зберегли runtime-обгортки, поверхні історії Gateway
застосовують display projection перед поверненням повідомлень клієнтам WebChat,
TUI, REST або SSE.

---

## Де це виконується

Уся гігієна транскриптів централізована у вбудованому runner:

- Вибір політики: `src/agents/transcript-policy.ts`
- Застосування очищення/відновлення: `sanitizeSessionHistory` у `src/agents/embedded-agent-runner/replay-history.ts`

Політика використовує `provider`, `modelApi` і `modelId`, щоб визначити, що застосовувати.

Окремо від гігієни транскриптів файли сеансів відновлюються (за потреби) перед завантаженням:

- `repairSessionFileIfNeeded` у `src/agents/session-file-repair.ts`
- Викликається з `run/attempt.ts` і `compact.ts` (вбудований runner)

---

## Глобальне правило: очищення зображень

Payload зображень завжди очищуються, щоб запобігти відхиленню на стороні провайдера через обмеження
розміру (зменшення масштабу/повторне стискання завеликих base64-зображень).

Це також допомагає контролювати token pressure, спричинений зображеннями, для моделей із підтримкою vision.
Менші максимальні розміри зазвичай зменшують використання токенів; більші розміри зберігають деталі.

Реалізація:

- `sanitizeSessionMessagesImages` у `src/agents/embedded-agent-helpers/images.ts`
- `sanitizeContentBlocksImages` у `src/agents/tool-images.ts`
- Максимальна сторона зображення налаштовується через `agents.defaults.imageMaxDimensionPx` (типово: `1200`).
- Порожні текстові блоки видаляються, доки цей прохід обходить вміст replay. Ходи асистента,
  які стають порожніми, вилучаються з replay-копії; ходи користувача та tool-result,
  які стають порожніми, отримують непорожній placeholder для пропущеного вмісту.

---

## Глобальне правило: неправильно сформовані виклики інструментів

Блоки викликів інструментів асистента, у яких відсутні і `input`, і `arguments`, відкидаються
до побудови контексту моделі. Це запобігає відхиленням провайдера через частково
збережені виклики інструментів (наприклад, після збою через rate limit).

Реалізація:

- `sanitizeToolCallInputs` у `src/agents/session-transcript-repair.ts`
- Застосовується в `sanitizeSessionHistory` у `src/agents/embedded-agent-runner/replay-history.ts`

---

## Глобальне правило: незавершені ходи лише з reasoning

Ходи асистента, які досягають ліміту output провайдера лише з thinking або
redacted-thinking-вмістом, пропускаються з replay-копії в пам’яті. Такі ходи
містять незавершений стан провайдера і можуть нести частковий підпис thinking.

Порожні length-ходи залишаються без змін, як і length-ходи з видимим текстом, викликами інструментів
або невідомими блоками вмісту. Збережені транскрипти не переписуються.

Реалізація:

- `normalizeAssistantReplayContent` у `src/agents/embedded-agent-runner/replay-history.ts`

---

## Глобальне правило: походження міжсеансового input

Коли агент надсилає підказку в інший сеанс через `sessions_send` (включно
з кроками відповіді/оголошення agent-to-agent), OpenClaw зберігає створений хід користувача з:

- `message.provenance.kind = "inter_session"`

OpenClaw також додає на початок того самого ходу маркер `[Inter-session message ... isUser=false]`
перед текстом маршрутизованої підказки, щоб активний виклик моделі міг відрізнити
output чужого сеансу від зовнішніх інструкцій кінцевого користувача. Цей маркер містить
вихідний сеанс, канал та інструмент, коли вони доступні. Транскрипт усе ще використовує
`role: "user"` для сумісності з провайдером, але і видимий текст, і metadata походження
позначають хід як міжсеансові дані.

Під час перебудови контексту OpenClaw застосовує той самий маркер до старіших збережених
міжсеансових ходів користувача, які мають лише metadata походження.

---

## Матриця провайдерів (поточна поведінка)

**OpenAI / OpenAI Codex**

- Лише очищення зображень.
- Відкидати осиротілі підписи reasoning (самостійні reasoning items без наступного блоку вмісту) для транскриптів OpenAI Responses/Codex і відкидати replayable reasoning OpenAI після перемикання маршруту моделі.
- Зберігати payload replayable reasoning items OpenAI Responses, включно із зашифрованими items із порожнім summary, щоб ручний/WebSocket replay зберігав потрібний стан `rs_*` у парі з output items асистента.
- Native ChatGPT Codex Responses дотримується wire parity Codex, повторно відтворюючи попередні payload Responses reasoning/message/function без попередніх item IDs, водночас зберігаючи session `prompt_cache_key`.
- Replay сімейства OpenAI Responses зберігає канонічні пари reasoning `call_*|fc_*` для тієї самої моделі, але детерміновано нормалізує неправильно сформовані або задовгі `call_id` / ids function-call item перед перетворенням pi-ai payload.
- Відновлення зіставлення результатів інструментів може переміщувати реальні зіставлені outputs і синтезувати outputs у стилі Codex `aborted` для відсутніх викликів інструментів.
- Немає перевірки або переупорядкування ходів.
- Відсутні tool outputs сімейства OpenAI Responses синтезуються як `aborted`, щоб відповідати нормалізації replay Codex.
- Підписи думок не видаляються.

**OpenAI-сумісні Chat Completions**

- Історичні блоки thinking/reasoning асистента видаляються перед replay, щоб
  локальні та proxy-style OpenAI-сумісні сервери не отримували поля reasoning попередніх ходів,
  як-от `reasoning` або `reasoning_content`.
- Поточні продовження tool-call у тому самому ході зберігають блок reasoning асистента,
  прикріплений до виклику інструмента, доки результат інструмента не буде відтворено.
- Кастомні/самостійно розгорнуті записи моделей із `reasoning: true` зберігають відтворені
  metadata reasoning.
- Винятки, що належать провайдеру, можуть вимкнути це, коли їхній wire protocol вимагає
  відтворених metadata reasoning.

**Google (Generative AI / Gemini CLI / Antigravity)**

- Очищення id викликів інструментів: суворо алфавітно-цифрові.
- Відновлення зіставлення результатів інструментів і синтетичні результати інструментів.
- Перевірка ходів (чергування ходів у стилі Gemini).
- Виправлення впорядкування ходів Google (додавання крихітного user bootstrap на початок, якщо історія починається з асистента).
- Antigravity Claude: нормалізувати підписи thinking; відкидати непідписані блоки thinking.

**Anthropic / Minimax (Anthropic-сумісний)**

- Відновлення зіставлення результатів інструментів і синтетичні результати інструментів.
- Перевірка ходів (об’єднання послідовних ходів користувача для відповідності суворому чергуванню).
- Кінцеві ходи попереднього заповнення асистента видаляються з вихідних payload Anthropic Messages,
  коли thinking увімкнено, включно з маршрутами Cloudflare AI Gateway.
- Підписи thinking асистента до Compaction видаляються перед replay для провайдера,
  коли сеанс було стиснуто. Підписи thinking криптографічно прив’язані
  до префікса розмови під час генерації; після Compaction префікс змінюється (узагальнений вміст замінюється summary Compaction), тому replay початкових підписів змушує Anthropic відхилити
  запит із повідомленням «Недійсний підпис у блоці thinking». Текст thinking
  зберігається як непідписаний блок, а потім обробляється правилом нижче.
- Блоки thinking з відсутніми, порожніми або blank replay signatures видаляються
  перед перетворенням для провайдера. Якщо це спорожнює хід асистента, OpenClaw зберігає
  форму ходу з непорожнім omitted-reasoning-текстом.
- Старіші thinking-only ходи асистента, які потрібно видалити, замінюються
  непорожнім omitted-reasoning-текстом, щоб adapters провайдера не відкидали replay-хід.

**Amazon Bedrock (Converse API)**

- Порожні stream-error ходи асистента відновлюються до непорожнього fallback-текстового блоку
  перед replay. Bedrock Converse відхиляє повідомлення асистента з `content: []`, тому
  збережені ходи асистента з `stopReason: "error"` і порожнім вмістом також
  відновлюються на диску перед завантаженням.
- Stream-error ходи асистента, які містять лише blank text blocks, відкидаються
  з replay-копії в пам’яті замість повторного відтворення недійсного blank block.
- Підписи thinking асистента до Compaction видаляються перед replay Converse,
  коли сеанс було стиснуто, з тієї самої причини, що й для Anthropic
  вище.
- Блоки thinking Claude з відсутніми, порожніми або blank replay signatures
  видаляються перед replay Converse. Якщо це спорожнює хід асистента, OpenClaw
  зберігає форму ходу з непорожнім omitted-reasoning-текстом.
- Старіші thinking-only ходи асистента, які потрібно видалити, замінюються
  непорожнім omitted-reasoning-текстом, щоб replay Converse зберігав сувору форму ходів.
- Replay фільтрує delivery-mirror OpenClaw і gateway-injected ходи асистента.
- Очищення зображень застосовується через глобальне правило.

**Mistral (включно з виявленням на основі model-id)**

- Очищення id викликів інструментів: strict9 (алфавітно-цифрові, довжина 9).

**OpenRouter Gemini**

- Очищення підписів думок: видаляти не-base64 значення `thought_signature` (зберігати base64).

**OpenRouter Anthropic**

- Кінцеві ходи попереднього заповнення асистента видаляються з перевірених payload
  OpenAI-сумісних Anthropic-моделей OpenRouter, коли reasoning увімкнено, відповідно до
  поведінки replay безпосереднього Anthropic і Cloudflare Anthropic.

**Усе інше**

- Лише очищення зображень.

---

## Історична поведінка (до 2026.1.22)

До релізу 2026.1.22 OpenClaw застосовував кілька шарів гігієни транскриптів:

- **transcript-sanitize extension** запускався під час кожної побудови контексту і міг:
  - Відновлювати зіставлення використання інструмента/результату.
  - Очищати ids викликів інструментів (включно з нестрогим режимом, який зберігав `_`/`-`).
- Runner також виконував специфічне для провайдера очищення, що дублювало роботу.
- Додаткові мутації відбувалися поза політикою провайдера, включно з:
  - Видаленням тегів `<final>` з тексту асистента перед збереженням.
  - Відкиданням порожніх error-ходів асистента.
  - Обрізанням вмісту асистента після викликів інструментів.

Ця складність спричиняла регресії між провайдерами (особливо для зіставлення `call_id|fc_id`
в `openai-responses`). Очищення 2026.1.22 видалило extension, централізувало
логіку в runner і зробило OpenAI **без змін** за межами очищення зображень.

## Пов’язане

- [Керування сеансами](/uk/concepts/session)
- [Обрізання сеансів](/uk/concepts/session-pruning)
