From 1d584a301eb8c6feb43831ca5da82e8273590336 Mon Sep 17 00:00:00 2001 From: briandevans <252620095+briandevans@users.noreply.github.com> Date: Sat, 13 Jun 2026 13:53:58 -0700 Subject: [PATCH] fix(agent): treat Codex reasoning items as thinking-only --- run_agent.py | 10 ++++++ .../run_agent/test_thinking_only_sanitizer.py | 32 +++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/run_agent.py b/run_agent.py index 0be8b1763fa..b793f0e6b5d 100644 --- a/run_agent.py +++ b/run_agent.py @@ -3297,6 +3297,16 @@ class AIAgent: rd = msg.get("reasoning_details") if isinstance(rd, list) and rd: return True + # Codex Responses stores encrypted reasoning state under a separate + # assistant-message key. Treat only real reasoning items as + # thinking-only; empty/junk lists should fall through to the generic + # empty-turn handling instead of being dropped here. + codex_items = msg.get("codex_reasoning_items") + if isinstance(codex_items, list): + return any( + isinstance(item, dict) and item.get("type") == "reasoning" + for item in codex_items + ) return False @staticmethod diff --git a/tests/run_agent/test_thinking_only_sanitizer.py b/tests/run_agent/test_thinking_only_sanitizer.py index 83cf35f6d1a..23184d0186d 100644 --- a/tests/run_agent/test_thinking_only_sanitizer.py +++ b/tests/run_agent/test_thinking_only_sanitizer.py @@ -104,6 +104,38 @@ class TestIsThinkingOnlyAssistant: } assert AIAgent._is_thinking_only_assistant(msg) + def test_codex_reasoning_items_list_form_detected(self): + msg = { + "role": "assistant", + "content": "", + "codex_reasoning_items": [ + {"type": "reasoning", "id": "rs_123", "encrypted_content": "enc_blob"} + ], + } + assert AIAgent._is_thinking_only_assistant(msg) + + def test_codex_reasoning_items_with_visible_text_is_not_thinking_only(self): + msg = { + "role": "assistant", + "content": "Visible answer", + "codex_reasoning_items": [ + {"type": "reasoning", "id": "rs_123", "encrypted_content": "enc_blob"} + ], + } + assert not AIAgent._is_thinking_only_assistant(msg) + + def test_empty_codex_reasoning_items_list_is_not_thinking_only(self): + msg = {"role": "assistant", "content": "", "codex_reasoning_items": []} + assert not AIAgent._is_thinking_only_assistant(msg) + + def test_non_reasoning_codex_items_are_not_thinking_only(self): + msg = { + "role": "assistant", + "content": "", + "codex_reasoning_items": [None, "x", {"type": "other"}], + } + assert not AIAgent._is_thinking_only_assistant(msg) + def test_user_message_never_thinking_only(self): assert not AIAgent._is_thinking_only_assistant({"role": "user", "content": ""})