Files
nanobot/tests/agent/test_context_governance.py
T

65 lines
2.3 KiB
Python

from nanobot.agent.context_governance import ContextGovernor
def _image_result(label: str) -> list[dict]:
return [
{"type": "image_url", "image_url": {"url": f"data:image/png;base64,{label}"}},
{"type": "text", "text": label},
]
def _assistant_tool_call(call_id: str) -> dict:
return {
"role": "assistant",
"content": "",
"tool_calls": [{
"id": call_id,
"type": "function",
"function": {"name": "exec", "arguments": "{}"},
}],
}
def test_drop_orphan_tool_results_drops_missing_tool_call_id() -> None:
messages = [
_assistant_tool_call("call_1"),
{"role": "tool", "name": "exec", "content": "missing id"},
{"role": "tool", "tool_call_id": "call_1", "name": "exec", "content": "ok"},
]
result = ContextGovernor.drop_orphan_tool_results(messages)
assert [m.get("tool_call_id") for m in result if m.get("role") == "tool"] == ["call_1"]
def test_drop_orphan_tool_results_drops_duplicate_tool_result() -> None:
messages = [
_assistant_tool_call("call_1"),
{"role": "tool", "tool_call_id": "call_1", "name": "exec", "content": "first"},
{"role": "tool", "tool_call_id": "call_1", "name": "exec", "content": "duplicate"},
]
result = ContextGovernor.drop_orphan_tool_results(messages)
tool_results = [m for m in result if m.get("role") == "tool"]
assert len(tool_results) == 1
assert tool_results[0]["content"] == "first"
def test_drop_stale_visual_tool_images_keeps_latest_per_tool() -> None:
messages = [
{"role": "tool", "name": "computer_use", "content": _image_result("history")},
{"role": "tool", "name": "computer_use", "content": _image_result("old")},
{"role": "tool", "name": "browser", "content": _image_result("browser")},
{"role": "tool", "name": "computer_use", "content": _image_result("latest")},
]
result = ContextGovernor.drop_stale_visual_tool_images(messages, start_index=1)
assert result is not messages
assert result[0]["content"] == messages[0]["content"]
assert [block["type"] for block in result[1]["content"]] == ["text", "text"]
assert result[2]["content"] == messages[2]["content"]
assert result[3]["content"] == messages[3]["content"]
assert messages[1]["content"][0]["type"] == "image_url"