message_sanitization.close_interrupted_tool_sequence and the turn_api_call repetition-loop exit each spelled the same hidden assistant row literal (content "", display_kind hidden, api_content _INTERRUPTED_PLACEHOLDER), and the conversation loop's redirect built it field by field. Add hidden_interrupt_placeholder_row() to the leaf placeholders module and use it at all three sites so the shape cannot drift between them. Gate rP finding 6 (reuse).
27 lines
1.7 KiB
Python
27 lines
1.7 KiB
Python
"""Interrupt placeholder wording substituted into empty non-final wire rows.
|
|
|
|
Split out of ``agent/agent_runtime_helpers.py`` (code-health size ratchet); a leaf module with no
|
|
imports so every reader (runtime helpers, turn prep, the conversation loop) can import it directly.
|
|
"""
|
|
|
|
# Placeholder for an empty non-final message the provider would reject. This is the single source of
|
|
# the wording: every healing path imports it from here, so healed transcripts read consistently.
|
|
#
|
|
# Wording matters: this text is substituted into an assistant row's ``content`` on the wire copy
|
|
# (``fill_empty_non_final_wire_payload``, ``repair_empty_non_final_messages``, and the projection in
|
|
# ``run_conversation``), so the model reads it as something IT said. A short natural-language phrase
|
|
# in that position gets echoed verbatim — a clean ``finish_reason=stop`` turn answering an ordinary
|
|
# instruction with just the placeholder (#132949, and #81841 for the same hazard on the scaffold).
|
|
# Keep it a structural label the model has no conversational reason to reproduce, never prose.
|
|
_INTERRUPTED_PLACEHOLDER = "[interrupt: no assistant output for this turn]"
|
|
|
|
# The spelling shipped before #132949. Models reproduce it verbatim, so rows already carrying it
|
|
# stay poisoned after the wording change; the replay filters reference this name to retire them.
|
|
_LEGACY_INTERRUPTED_PLACEHOLDER = "[response interrupted]"
|
|
|
|
|
|
def hidden_interrupt_placeholder_row() -> dict:
|
|
"""A fresh assistant row that is invisible in transcripts but carries the placeholder as its
|
|
non-empty ``api_content``, so the pre-call sanitizer does not re-heal it every call (#88955)."""
|
|
return {"role": "assistant", "content": "", "display_kind": "hidden", "api_content": _INTERRUPTED_PLACEHOLDER}
|