Higiene de la transcripción
OpenClaw aplica correcciones específicas del proveedor a las transcripciones antes de una ejecución (construyendo el contexto del modelo). La mayoría de estos son ajustes en memoria utilizados para satisfacer los requisitos estrictos del proveedor. Una pasada de reparación separada del archivo de sesión también puede reescribir el JSONL almacenado antes de que se cargue la sesión, pero solo para líneas con formato incorrecto o turnos persistidos que sean registros duraderos no válidos. Las respuestas del asistente entregadas se conservan en el disco; la eliminación específica del proveedor del relleno previo del asistente ocurre solo al construir cargas útiles de salida. Cuando ocurre una reparación, el archivo original se escribe en un *.bak-<pid>-<ts> hermano transitorio antes del reemplazo atómico y se elimina una vez que el reemplazo tiene éxito; la copia de seguridad solo se retiene si la limpieza misma falla (en cuyo caso se reporta la ruta).
El alcance incluye:
- El contexto del prompt solo en tiempo de ejecución que no se incluye en los turnos de la transcripción visibles para el usuario
- Saneamiento del id de llamada de herramienta
- Validación de entrada de llamada de herramienta
- Reparación del emparejamiento de resultados de herramienta
- Validación / ordenamiento de turnos
- Limpieza de firma de pensamiento
- Limpieza de la firma de pensamiento
- Saneamiento de la carga de imagen
- Limpieza de bloques de texto en blanco antes de la reproducción del proveedor
- Etiquetado de procedencia de entrada de usuario (para avisos enrutados entre sesiones)
- Reparación de turnos de error de asistente vacíos para la reproducción de Bedrock Converse
Si necesita detalles sobre el almacenamiento de transcripciones, consulte:
Regla global: el contexto de tiempo de ejecución no es la transcripción del usuario
Sección titulada «Regla global: el contexto de tiempo de ejecución no es la transcripción del usuario»El contexto de tiempo de ejecución/sistema se puede añadir al prompt del modelo para un turno, pero no es contenido creado por el usuario final. OpenClaw mantiene un cuerpo de prompt separado orientado a la transcripción para las respuestas de Gateway, seguimientos en cola, ACP, CLI y ejecuciones integradas de OpenClaw. Los turnos de usuario visibles almacenados utilizan ese cuerpo de transcripción en lugar del prompt enriquecido en tiempo de ejecución.
Para las sesiones heredadas que ya persistieron envoltorios de tiempo de ejecución, las superficies de historial de Gateway aplican una proyección de visualización antes de devolver mensajes a los clientes de WebChat, TUI, REST o SSE.
Dónde se ejecuta esto
Sección titulada «Dónde se ejecuta esto»Toda la higiene de la transcripción está centralizada en el ejecutor integrado:
- Selección de política:
src/agents/transcript-policy.ts - Aplicación de saneamiento/reparación:
sanitizeSessionHistoryensrc/agents/embedded-agent-runner/replay-history.ts
La política usa provider, modelApi y modelId para decidir qué aplicar.
Independientemente de la higiene de la transcripción, los archivos de sesión se reparan (si es necesario) antes de la carga:
repairSessionFileIfNeededensrc/agents/session-file-repair.ts- Llamado desde
run/attempt.tsycompact.ts(ejecutor integrado)
Regla global: saneamiento de imágenes
Sección titulada «Regla global: saneamiento de imágenes»Las cargas útiles de imágenes siempre se sanean para evitar el rechazo del lado del proveedor debido a límites de tamaño (reducir/recomprimir imágenes base64 de tamaño excesivo).
Esto también ayuda a controlar la presión de tokens generados por imágenes para modelos con capacidad de visión. Dimensiones máximas más bajas generalmente reducen el uso de tokens; dimensiones más altas preservan el detalle.
Implementación:
sanitizeSessionMessagesImagesensrc/agents/embedded-agent-helpers/images.tssanitizeContentBlocksImagesensrc/agents/tool-images.ts- El lado máximo de la imagen es configurable vía
agents.defaults.imageMaxDimensionPx(predeterminado:1200). - Los bloques de texto en blanco se eliminan mientras este paso recorre el contenido de la repetición. Los turnos del asistente que quedan vacíos se eliminan de la copia de la repetición; los turnos de usuario y de resultados de herramientas que quedan vacíos reciben un marcador de posición de contenido omitido no vacío.
Regla global: llamadas a herramientas con formato incorrecto
Sección titulada «Regla global: llamadas a herramientas con formato incorrecto»Los bloques de llamadas a herramientas del asistente que carecen tanto de input como de arguments se descartan
antes de que se construya el contexto del modelo. Esto evita rechazos del proveedor por llamadas a herramientas
parcialmente persistidas (por ejemplo, después de un fallo por límite de tasa).
Implementación:
sanitizeToolCallInputsensrc/agents/session-transcript-repair.ts- Aplicado en
sanitizeSessionHistoryensrc/agents/embedded-agent-runner/replay-history.ts
Regla global: procedencia de entrada entre sesiones
Sección titulada «Regla global: procedencia de entrada entre sesiones»Cuando un agente envía un mensaje a otra sesión vía sessions_send (incluyendo
pasos de respuesta/anuncio de agente a agente), OpenClaw persiste el turno de usuario creado con:
message.provenance.kind = "inter_session"
OpenClaw también antepone un marcador [Inter-session message ... isUser=false] del mismo turno antes del texto del mensaje enrutado para que la llamada del modelo activo pueda distinguir el resultado de una sesión externa de las instrucciones del usuario final externo. Este marcador incluye la sesión de origen, el canal y la herramienta, cuando están disponibles. La transcripción sigue utilizando role: "user" para la compatibilidad con el proveedor, pero tanto el texto visible como los metadatos de procedencia marcan el turno como datos entre sesiones.
Durante la reconstrucción del contexto, OpenClaw aplica el mismo marcador a los turnos de usuario entre sesiones antiguos persistidos que solo tienen metadatos de procedencia.
Matriz de proveedores (comportamiento actual)
Sección titulada «Matriz de proveedores (comportamiento actual)»OpenAI / OpenAI Codex
- Solo saneamiento de imágenes.
- Descartar firmas de razonamiento huérfanas (elementos de razonamiento independientes sin un bloque de contenido siguiente) para las transcripciones de OpenAI Responses/Codex, y descartar el razonamiento reproducible de OpenAI después de un cambio de ruta del modelo.
- Conservar las cargas útiles de elementos de razonamiento de OpenAI Responses reproducibles, incluidos los elementos de resumen vacío cifrados, para que la reproducción manual/WebSocket mantenga el estado
rs_*requerido emparejado con los elementos de salida del asistente. - Las respuestas nativas de ChatGPT Codex siguen la paridad de cable de Codex al reproducir cargas útiles previas de razonamiento/mensaje/función de Responses sin ID de elementos previos, preservando al mismo tiempo
prompt_cache_keyde la sesión. - La reproducción de la familia Responses de OpenAI conserva los pares de razonamiento del mismo modelo canónicos
call_*|fc_*, pero normaliza de manera determinista los ids de elementos de llamadas a funciones/sobrealargados o malformadoscall_idantes de la conversión de carga útil pi-ai. - La reparación del emparejamiento de resultados de herramientas puede mover las salidas coincidentes reales y sintetizar salidas estilo Codex
abortedpara llamadas a herramientas faltantes. - Sin validación o reordenamiento de turnos.
- Las salidas de herramientas faltantes de la familia Responses de OpenAI se sintetizan como
abortedpara coincidir con la normalización de reproducción de Codex. - Sin eliminación de firmas de pensamiento.
Completaciones de Chat compatibles con OpenAI
- Los bloques de pensamiento/razonamiento históricos del asistente se eliminan antes de la reproducción para que los servidores compatibles con OpenAI locales y de estilo proxy no reciban campos de razonamiento de turnos anteriores como
reasoningoreasoning_content. - Las continuaciones de llamadas a herramientas del mismo turno mantienen el bloque de razonamiento del asistente adjunto a la llamada a herramienta hasta que se haya reproducido el resultado de la herramienta.
- Las entradas de modelos personalizados/autoalojados con
reasoning: trueconservan los metadatos de razonamiento reproducidos. - Las excepciones propiedad del proveedor pueden optar por no participar cuando su protocolo de cable requiere metadatos de razonamiento reproducidos.
Google (Generative AI / Gemini CLI / Antigravity)
- Saneamiento del id de llamada a herramienta: solo alfanumérico estricto.
- Reparación del emparejamiento de resultados de herramientas y resultados de herramientas sintéticos.
- Validación de turnos (alternancia de turnos estilo Gemini).
- Corrección del orden de turnos de Google (anteceder un pequeño arranque de usuario si el historial comienza con el asistente).
- Antigravity Claude: normalizar firmas de pensamiento; descartar bloques de pensamiento sin firmar.
Anthropic / Minimax (compatible con Anthropic)
- Reparación del emparejamiento de resultados de herramientas y resultados de herramientas sintéticos.
- Validación de turnos (fusionar turnos de usuario consecutivos para satisfacer la alternancia estricta).
- Los turnos de relleno previos del asistente finales se eliminan de las cargas útiles de Messages de Anthropic salientes cuando el pensamiento está habilitado, incluidas las rutas de Cloudflare AI Gateway.
- Los bloques de pensamiento con firmas de repetición faltantes, vacías o en blanco se eliminan antes de la conversión del proveedor. Si eso vacía un turno de asistente, OpenClaw mantiene la forma del turno con texto de razonamiento omitido no vacío.
- Los turnos de asistente anteriores de solo pensamiento que deben eliminarse se reemplazan con texto de razonamiento omitido no vacío para que los adaptadores del proveedor no eliminen el turno de repetición.
Amazon Bedrock (API de Converse)
- Los turnos de error de flujo del asistente vacíos se reparan con un bloque de texto de respaldo no vacío antes de la repetición. Bedrock Converse rechaza los mensajes del asistente con
content: [], por lo que los turnos de asistente persistidos constopReason: "error"y contenido vacío también se reparan en el disco antes de la carga. - Los turnos de error de flujo del asistente que contienen solo bloques de texto en blanco se eliminan del la copia de reproducción en memoria en lugar de reproducir un bloque en blanco no válido.
- Los bloques de pensamiento de Claude con firmas de reproducción faltantes, vacías o en blanco se eliminan antes de la reproducción de Converse. Si eso vacía un turno del asistente, OpenClaw mantiene la forma del turno con texto de razonamiento omitido no vacío.
- Los turnos de asistente más antiguos que son solo de pensamiento y que deben eliminarse se reemplazan con texto de razonamiento omitido no vacío para que la reproducción de Converse mantenga una forma estricta del turno.
- La reproducción filtra los turnos del asistente inyectados por el reflejo de entrega de OpenClaw y la puerta de enlace.
- La limpieza de imágenes se aplica a través de la regla global.
Mistral (incluida la detección basada en el ID del modelo)
- Limpieza del ID de llamada de herramienta: strict9 (alfanumérico de longitud 9).
OpenRouter Gemini
- Limpieza de la firma de pensamiento: eliminar los valores
thought_signatureque no sean base64 (mantener base64).
OpenRouter Anthropic
- Los turnos de relleno previo del asistente finales se eliminan de las cargas útiles del modelo Anthropic compatibles con OpenAI verificadas de OpenRouter cuando el razonamiento está habilitado, coincidiendo con el comportamiento de repetición directa de Anthropic y Anthropic de Cloudflare.
Todo lo demás
- Solo saneamiento de imágenes.
Comportamiento histórico (antes del 22.1.2026)
Sección titulada «Comportamiento histórico (antes del 22.1.2026)»Antes del lanzamiento 2026.1.22, OpenClaw aplicaba múltiples capas de higiene de transcripciones:
- Una extensión de saneamiento de transcripciones se ejecutaba en cada construcción de contexto y podía:
- Reparar el emparejamiento de uso/resultado de herramientas.
- Saneamiento de identificadores de llamadas a herramientas (incluyendo un modo no estricto que conservaba
_/-).
- El ejecutor también realizaba un saneamiento específico del proveedor, lo que duplicaba el trabajo.
- Ocurrieron mutaciones adicionales fuera de la política del proveedor, incluyendo:
- Eliminar las etiquetas
<final>del texto del asistente antes de la persistencia. - Eliminando los turnos de error del asistente vacíos.
- Recortando el contenido del asistente después de las llamadas a herramientas.
- Eliminar las etiquetas
Esta complejidad causó regresiones entre proveedores (notablemente el emparejamiento openai-responses
call_id|fc_id). La limpieza del 22 de enero de 2026 eliminó la extensión, centralizó
la lógica en el ejecutor y dejó a OpenAI sin tocar más allá de la sanitización de imágenes.