Skip to content

Commit 6283966

Browse files
author
Mateusz
committed
fix(compression): mark compressed outputs with _compacted metadata to prevent re-processing
Set metadata._compacted=True on messages whose content was modified by compression, so the already-processed fast-path recognizes them on subsequent requests. This ensures each tool output is only logged once (when first compressed) rather than on every request in the session.
1 parent 035b2a8 commit 6283966

2 files changed

Lines changed: 41 additions & 1 deletion

File tree

src/core/services/tool_output_compression_service.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -566,8 +566,12 @@ async def compress_messages(
566566
)
567567
continue
568568

569+
updated_metadata = dict(message.metadata) if message.metadata else {}
570+
updated_metadata["_compacted"] = True
569571
updated_messages.append(
570-
message.model_copy(update={"content": final_content})
572+
message.model_copy(
573+
update={"content": final_content, "metadata": updated_metadata}
574+
)
571575
)
572576
self._log_output_evaluation(
573577
record=record,

tests/unit/core/services/test_tool_output_compression_service.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,42 @@ async def test_service_skips_outputs_marked_compacted_in_metadata() -> None:
402402
assert "skipped_already_processed_compaction" in result.records[0].warnings
403403

404404

405+
@pytest.mark.asyncio
406+
async def test_service_sets_compacted_metadata_on_first_compression() -> None:
407+
registry = CompressionStrategyRegistry()
408+
registry.register("half_trim", _HalfTrimStrategy())
409+
service = ToolOutputCompressionService(
410+
strategy_registry=registry,
411+
identity_resolver=ToolIdentityResolver(),
412+
selector=RuleBasedStrategySelector(),
413+
)
414+
messages = _build_tool_messages("git status", "x" * 200)
415+
cfg = DynamicCompressionConfig(
416+
enabled=True,
417+
min_bytes=0,
418+
marker=CompressionMarkerConfig(enabled=False),
419+
methods={"half_trim": True},
420+
rules=[
421+
CompressionRule(
422+
name="default",
423+
priority=1,
424+
when=CompressionRulePredicate(command_signature="git"),
425+
pipeline=["half_trim"],
426+
)
427+
],
428+
)
429+
430+
first = await service.compress_messages(messages=messages, config=cfg)
431+
432+
assert first.records[0].applied is True
433+
assert first.messages[1].metadata == {"_compacted": True}
434+
435+
second = await service.compress_messages(messages=first.messages, config=cfg)
436+
437+
assert second.records[0].applied is False
438+
assert "skipped_already_processed_compaction" in second.records[0].warnings
439+
440+
405441
@pytest.mark.asyncio
406442
async def test_service_skips_artifact_preview_system_reminder_outputs() -> None:
407443
registry = CompressionStrategyRegistry()

0 commit comments

Comments
 (0)