Skip to content

Commit a232103

Browse files
Brian KrafftCopilot
andcommitted
fix(5.7): restore subclass cap safety in _truncate_messages path
- Add cap parameter to truncate_messages() so subclass overrides of _MAX_SINGLE_CONTENT_CHARS flow through both call paths - grounding_agent.py delegate forwards self._MAX_SINGLE_CONTENT_CHARS - Add test_custom_cap_forwarded proving cap propagation - Found by Opus 4.6 + GPT-5.4 /collab review (both flagged same issue) - 1,610 passed, 127 skipped Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent d14f18d commit a232103

3 files changed

Lines changed: 21 additions & 2 deletions

File tree

openspace/agents/grounding/messages.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ def truncate_messages(
5858
messages: List[Dict[str, Any]],
5959
keep_recent: int = 8,
6060
max_tokens_estimate: int = 120_000,
61+
cap: int = _MAX_SINGLE_CONTENT_CHARS,
6162
) -> List[Dict[str, Any]]:
6263
"""Trim conversation history to fit within token budget.
6364
@@ -71,11 +72,12 @@ def truncate_messages(
7172
messages: Full message list.
7273
keep_recent: Number of recent conversation rounds to preserve.
7374
max_tokens_estimate: Approximate token budget.
75+
cap: Per-message character cap (forwarded to cap_message_content).
7476
7577
Returns:
7678
Possibly shortened message list.
7779
"""
78-
messages = cap_message_content(messages)
80+
messages = cap_message_content(messages, cap)
7981

8082
if len(messages) <= keep_recent + 2: # +2 for system and initial user
8183
return messages

openspace/agents/grounding_agent.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,9 @@ def _cap_message_content(cls, messages: List[Dict[str, Any]]) -> List[Dict[str,
122122
def _truncate_messages(
123123
self, messages: List[Dict[str, Any]], keep_recent: int = 8, max_tokens_estimate: int = 120000
124124
) -> List[Dict[str, Any]]:
125-
return _truncate_messages_impl(messages, keep_recent, max_tokens_estimate)
125+
return _truncate_messages_impl(
126+
messages, keep_recent, max_tokens_estimate, cap=self._MAX_SINGLE_CONTENT_CHARS
127+
)
126128

127129
async def process(self, context: Dict[str, Any]) -> Dict[str, Any]:
128130
"""

tests/test_grounding_messages.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,21 @@ def test_default_keep_recent_is_8(self):
139139
# system(1) + user(1) + recent(16) = 18
140140
assert len(result) == 18
141141

142+
def test_custom_cap_forwarded(self):
143+
"""Verify the cap parameter flows through to cap_message_content."""
144+
msgs = [
145+
{"role": "system", "content": "sys"},
146+
{"role": "user", "content": "go"},
147+
]
148+
# Add enough oversized messages to trigger truncation
149+
for i in range(20):
150+
msgs.append({"role": "assistant", "content": "x" * 500})
151+
result = truncate_messages(msgs, keep_recent=2, max_tokens_estimate=1, cap=200)
152+
# Messages should have been capped at 200 chars
153+
for m in result:
154+
if m["role"] != "system" and m["role"] != "user":
155+
assert len(m["content"]) <= 250 # some overhead from truncation marker
156+
142157

143158
# ── Delegation seam tests ──────────────────────────────────────────
144159

0 commit comments

Comments
 (0)