"""agent_logging: DEBUG 下载荷、hash_only、去重。""" from __future__ import annotations import app.core.agent_logging as agent_logging from app.core.runtime_constants import agent_log_defaults class _StubLogger: def __init__(self) -> None: self.debug_calls: list[tuple[str, tuple[object, ...]]] = [] def debug(self, msg: str, *args: object, **kwargs: object) -> None: self.debug_calls.append((msg, args)) def _clear_dedup() -> None: with agent_logging._dedup_lock: agent_logging._last_prompt_sha256_by_label.clear() def test_log_agent_payload_skips_when_not_verbose(monkeypatch: object) -> None: monkeypatch.setattr("app.core.config.settings.log_level", "INFO") log = _StubLogger() agent_logging.log_agent_payload(log, "x.prompt", "hello") assert log.debug_calls == [] def test_log_agent_payload_preview_includes_sha12(monkeypatch: object) -> None: monkeypatch.setattr("app.core.config.settings.log_level", "DEBUG") monkeypatch.setattr("app.core.runtime_constants.agent_log_defaults.prompt_mode", "preview") monkeypatch.setattr("app.core.runtime_constants.agent_log_defaults.prompt_dedup", False) monkeypatch.setattr("app.core.runtime_constants.agent_log_defaults.max_chars", 100) _clear_dedup() log = _StubLogger() agent_logging.log_agent_payload(log, "Unit.prompt", "hello world") assert len(log.debug_calls) == 1 msg, args = log.debug_calls[0] assert "agent_payload" in msg assert "sha12=" in msg assert args[0] == "Unit.prompt" assert args[4] == "hello world" def test_log_agent_payload_hash_only_no_preview(monkeypatch: object) -> None: monkeypatch.setattr("app.core.config.settings.log_level", "DEBUG") monkeypatch.setattr("app.core.runtime_constants.agent_log_defaults.prompt_mode", "hash_only") monkeypatch.setattr("app.core.runtime_constants.agent_log_defaults.prompt_dedup", False) _clear_dedup() log = _StubLogger() body = "x" * 500 agent_logging.log_agent_payload(log, "Unit.prompt", body) assert len(log.debug_calls) == 1 msg, args = log.debug_calls[0] assert "mode=hash_only" in msg assert args[0] == "Unit.prompt" assert args[1] == 500 assert isinstance(args[2], str) and len(args[2]) == 12 def test_log_agent_payload_dedup_second_call_skipped(monkeypatch: object) -> None: monkeypatch.setattr("app.core.config.settings.log_level", "DEBUG") monkeypatch.setattr("app.core.runtime_constants.agent_log_defaults.prompt_mode", "preview") monkeypatch.setattr("app.core.runtime_constants.agent_log_defaults.prompt_dedup", True) monkeypatch.setattr("app.core.runtime_constants.agent_log_defaults.max_chars", 200) _clear_dedup() log = _StubLogger() agent_logging.log_agent_payload(log, "DedupLabel.prompt", "same text") agent_logging.log_agent_payload(log, "DedupLabel.prompt", "same text") assert len(log.debug_calls) == 2 assert "agent_payload_skipped" in log.debug_calls[1][0] skip_args = log.debug_calls[1][1] assert skip_args[0] == "DedupLabel.prompt" assert skip_args[2] == len("same text")