fix: address transcript tag review feedback

Preserve literal transcript-like tags in user prompts.

Strip attributed and self-closing transcript tags from non-user session messages.

RED->GREEN: new regression tests fail with the production fix reverted, then pass with 3 passed. Full suite: 145 passed, 2 warnings.
This commit is contained in:
Ousama Ben Younes 2026-07-11 00:30:25 +00:00
parent d317572f5b
commit 907fbe624a
2 changed files with 51 additions and 2 deletions

View file

@ -37,8 +37,10 @@ _CHATGPT_TRANSCRIPT_TAGS = (
"final",
"user",
)
_CHATGPT_TRANSCRIPT_TAG_ALTERNATION = "|".join(re.escape(tag) for tag in _CHATGPT_TRANSCRIPT_TAGS)
_OPTIONAL_TAG_ATTRIBUTES_PATTERN = r"(?:\s+[^>]*)?"
_CHATGPT_TRANSCRIPT_TAG_RE = re.compile(
rf"</?(?:{'|'.join(_CHATGPT_TRANSCRIPT_TAGS)})\s*>",
rf"</?(?:{_CHATGPT_TRANSCRIPT_TAG_ALTERNATION}){_OPTIONAL_TAG_ATTRIBUTES_PATTERN}\s*/?>",
flags=re.IGNORECASE,
)
@ -454,9 +456,10 @@ class AgentCoordinator:
def _message_to_session_item(self, message: dict[str, Any]) -> TResponseInputItem:
sender = str(message.get("from", "unknown"))
content = _strip_chatgpt_transcript_tags(str(message.get("content", "")))
content = str(message.get("content", ""))
if sender == "user":
return cast("TResponseInputItem", {"role": "user", "content": content})
content = _strip_chatgpt_transcript_tags(content)
sender_name = self.names.get(sender, sender)
msg_type = message.get("type", "information")
priority = message.get("priority", "normal")

View file

@ -8,6 +8,16 @@ from strix.core.agents import AgentCoordinator
CHATGPT_TRANSCRIPT_CONTENT = (
"<analysis>checked target</analysis>\n<channel>final</channel>\n<final>done</final>"
)
CHATGPT_TRANSCRIPT_CONTENT_WITH_ATTRIBUTES = (
'<analysis trace="true">checked target</analysis>\n'
'<channel name="final">final</channel>\n'
'<final reason="done">done</final>\n'
"<assistant/>"
)
USER_LITERAL_TAG_CONTENT = (
"Please preserve this XML-like snippet: "
'<analysis>literal user content</analysis> and <final reason="example">done</final>'
)
def test_message_to_session_item_strips_chatgpt_transcript_tags() -> None:
@ -33,3 +43,39 @@ def test_message_to_session_item_strips_chatgpt_transcript_tags() -> None:
assert "</final>" not in content
assert "checked target" in content
assert "done" in content
def test_message_to_session_item_preserves_user_literal_tags() -> None:
coordinator = AgentCoordinator()
item = coordinator._message_to_session_item(
{
"from": "user",
"content": USER_LITERAL_TAG_CONTENT,
}
)
assert item["content"] == USER_LITERAL_TAG_CONTENT
def test_message_to_session_item_strips_attributed_chatgpt_transcript_tags() -> None:
coordinator = AgentCoordinator()
coordinator.names["child"] = "Researcher"
item = coordinator._message_to_session_item(
{
"from": "child",
"type": "information",
"priority": "normal",
"content": CHATGPT_TRANSCRIPT_CONTENT_WITH_ATTRIBUTES,
}
)
content = str(item["content"])
assert '<analysis trace="true">' not in content
assert '<channel name="final">' not in content
assert '<final reason="done">' not in content
assert "<assistant/>" not in content
assert "checked target" in content
assert "done" in content