diff --git a/tests/gateway/test_compress_command.py b/tests/gateway/test_compress_command.py index 91627f92b9..91b3eeac42 100644 --- a/tests/gateway/test_compress_command.py +++ b/tests/gateway/test_compress_command.py @@ -123,3 +123,61 @@ async def test_compress_command_explains_when_token_estimate_rises(): assert "denser summaries" in result agent_instance.shutdown_memory_provider.assert_called_once() agent_instance.close.assert_called_once() + + +@pytest.mark.asyncio +async def test_compress_command_appends_warning_when_summary_generation_fails(): + """When the auxiliary summariser fails and the compressor inserts a static + fallback placeholder, /compress must append a visible ⚠️ warning to its + reply. Otherwise the failure is silently logged and the user has no idea + earlier context is unrecoverable.""" + history = _make_history() + # Compressed shape is irrelevant for this test — we only care that the + # warning surfaces. Drop one message so the headline is non-noop. + compressed = [ + history[0], + {"role": "assistant", "content": "[fallback placeholder]"}, + history[-1], + ] + runner = _make_runner(history) + agent_instance = MagicMock() + agent_instance.shutdown_memory_provider = MagicMock() + agent_instance.close = MagicMock() + agent_instance.context_compressor.has_content_to_compress.return_value = True + # Simulate summary-generation failure: fallback flag set, dropped count + # populated, error string captured. + agent_instance.context_compressor._last_summary_fallback_used = True + agent_instance.context_compressor._last_summary_dropped_count = 7 + agent_instance.context_compressor._last_summary_error = ( + "404 model not found: gemini-3-flash-preview" + ) + agent_instance.session_id = "sess-1" + agent_instance._compress_context.return_value = (compressed, "") + + def _estimate(messages): + if messages == history: + return 100 + if messages == compressed: + return 60 + raise AssertionError(f"unexpected transcript: {messages!r}") + + with ( + patch("gateway.run._resolve_runtime_agent_kwargs", return_value={"api_key": "***"}), + patch("gateway.run._resolve_gateway_model", return_value="test-model"), + patch("run_agent.AIAgent", return_value=agent_instance), + patch("agent.model_metadata.estimate_messages_tokens_rough", side_effect=_estimate), + ): + result = await runner._handle_compress_command(_make_event()) + + # The compress reply itself still goes through (the transcript was rewritten). + assert "Compressed:" in result + # ...but a clearly-marked warning must be appended. + assert "⚠️" in result + assert "Summary generation failed" in result + # Underlying error must surface so users can fix their config. + assert "404 model not found" in result + # Dropped count must be visible — silently losing N messages is the bug. + assert "7" in result + assert "historical message(s) were removed" in result + agent_instance.shutdown_memory_provider.assert_called_once() + agent_instance.close.assert_called_once()