From 4467c22c8f097cce5b670e81852d69bfbb6aadea Mon Sep 17 00:00:00 2001 From: x7peeps Date: Wed, 17 Jun 2026 21:10:01 +0800 Subject: [PATCH] fix(chat-completions): strip timestamp from messages before sending to strict providers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Per-message timestamp metadata injected by _apply_persist_user_message_override leaks into the Chat Completions payload sent to the provider. Strict OpenAI-compatible providers (e.g. Fireworks-backed endpoints like OpenCode Go 'glm-5.2', Mistral, Kimi) reject this schema-foreign field with HTTP 400: Extra inputs are not permitted, field: 'messages[0].timestamp' The ChatCompletionsTransport.convert_messages already strips known internal-only fields (tool_name, _-prefixed scaffolding keys, codex_reasoning_items, etc.) — add timestamp to that list. Closes #47868 --- agent/transports/chat_completions.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/agent/transports/chat_completions.py b/agent/transports/chat_completions.py index c0b2a13d250..e7a7a0a133e 100644 --- a/agent/transports/chat_completions.py +++ b/agent/transports/chat_completions.py @@ -172,6 +172,7 @@ class ChatCompletionsTransport(ProviderTransport): "codex_reasoning_items" in msg or "codex_message_items" in msg or "tool_name" in msg + or "timestamp" in msg # #47868 — strict providers reject this ): needs_sanitize = True break @@ -201,6 +202,7 @@ class ChatCompletionsTransport(ProviderTransport): msg.pop("codex_reasoning_items", None) msg.pop("codex_message_items", None) msg.pop("tool_name", None) + msg.pop("timestamp", None) # #47868 — leak into strict providers # Drop all Hermes-internal scaffolding markers (``_``-prefixed). # OpenAI's message schema has no ``_``-prefixed fields, so this # is safe and future-proofs against new markers being added.