diff --git a/run_agent.py b/run_agent.py index ba0a9f93d..b65a8574a 100644 --- a/run_agent.py +++ b/run_agent.py @@ -3446,6 +3446,7 @@ class AIAgent: def _chat_messages_to_responses_input(self, messages: List[Dict[str, Any]]) -> List[Dict[str, Any]]: """Convert internal chat-style messages to Responses input items.""" items: List[Dict[str, Any]] = [] + seen_item_ids: set = set() for msg in messages: if not isinstance(msg, dict): @@ -3466,7 +3467,12 @@ class AIAgent: if isinstance(codex_reasoning, list): for ri in codex_reasoning: if isinstance(ri, dict) and ri.get("encrypted_content"): + item_id = ri.get("id") + if item_id and item_id in seen_item_ids: + continue items.append(ri) + if item_id: + seen_item_ids.add(item_id) has_codex_reasoning = True if content_text.strip(): @@ -3546,6 +3552,7 @@ class AIAgent: raise ValueError("Codex Responses input must be a list of input items.") normalized: List[Dict[str, Any]] = [] + seen_ids: set = set() for idx, item in enumerate(raw_items): if not isinstance(item, dict): raise ValueError(f"Codex Responses input[{idx}] must be an object.") @@ -3598,8 +3605,12 @@ class AIAgent: if item_type == "reasoning": encrypted = item.get("encrypted_content") if isinstance(encrypted, str) and encrypted: - reasoning_item = {"type": "reasoning", "encrypted_content": encrypted} item_id = item.get("id") + if isinstance(item_id, str) and item_id: + if item_id in seen_ids: + continue + seen_ids.add(item_id) + reasoning_item = {"type": "reasoning", "encrypted_content": encrypted} if isinstance(item_id, str) and item_id: reasoning_item["id"] = item_id summary = item.get("summary")