Skip to content
1 change: 1 addition & 0 deletions agent/codex_runtime.py
Original file line number Diff line number Diff line change
Expand Up @@ -290,6 +290,7 @@ def run_codex_app_server_turn(
original_user_message=original_user_message,
final_response=turn.final_text,
interrupted=False,
messages=messages,
)
except Exception:
logger.debug("external memory sync raised", exc_info=True)
Expand Down
50 changes: 50 additions & 0 deletions agent/message_content.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
from __future__ import annotations

from collections.abc import Mapping
from typing import Any


_NON_TEXT_PART_TYPES = {"image", "image_url", "input_image", "audio", "input_audio"}
_TEXT_KEYS = ("text", "content", "input_text", "output_text", "summary_text")


def _field(value: Any, key: str) -> Any:
if isinstance(value, Mapping):
return value.get(key)
return getattr(value, key, None)


def _text_from_part(part: Any) -> str:
if part is None:
return ""
if isinstance(part, str):
return part

part_type = str(_field(part, "type") or "").strip().lower()
if part_type in _NON_TEXT_PART_TYPES:
return ""

for key in _TEXT_KEYS:
text = _field(part, key)
if isinstance(text, str):
return text
return ""


def flatten_message_text(content: Any, *, sep: str = "\n") -> str:
"""Return the visible text from common chat/Responses message content shapes."""
if content is None:
return ""
if isinstance(content, str):
return content
if isinstance(content, list):
chunks = [_text_from_part(part) for part in content]
return sep.join(chunk for chunk in chunks if chunk)

text = _text_from_part(content)
if text:
return text
try:
return str(content)
except Exception:
return ""
Loading
Loading