fix: keep tool-call output runs intact during compression
This commit is contained in:
parent
3830bbda41
commit
fcde9be10d
1 changed files with 90 additions and 0 deletions
|
|
@ -176,3 +176,93 @@ class TestCompressWithClient:
|
||||||
contents = [m.get("content", "") for m in result]
|
contents = [m.get("content", "") for m in result]
|
||||||
assert any("CONTEXT SUMMARY" in c for c in contents)
|
assert any("CONTEXT SUMMARY" in c for c in contents)
|
||||||
assert len(result) < len(msgs)
|
assert len(result) < len(msgs)
|
||||||
|
|
||||||
|
def test_summarization_does_not_split_tool_call_pairs(self):
|
||||||
|
mock_client = MagicMock()
|
||||||
|
mock_response = MagicMock()
|
||||||
|
mock_response.choices = [MagicMock()]
|
||||||
|
mock_response.choices[0].message.content = "[CONTEXT SUMMARY]: compressed middle"
|
||||||
|
mock_client.chat.completions.create.return_value = mock_response
|
||||||
|
|
||||||
|
with patch("agent.context_compressor.get_model_context_length", return_value=100000), \
|
||||||
|
patch("agent.context_compressor.get_text_auxiliary_client", return_value=(mock_client, "test-model")):
|
||||||
|
c = ContextCompressor(
|
||||||
|
model="test",
|
||||||
|
quiet_mode=True,
|
||||||
|
protect_first_n=3,
|
||||||
|
protect_last_n=4,
|
||||||
|
)
|
||||||
|
|
||||||
|
msgs = [
|
||||||
|
{"role": "user", "content": "Could you address the reviewer comments in PR#71"},
|
||||||
|
{
|
||||||
|
"role": "assistant",
|
||||||
|
"content": "",
|
||||||
|
"tool_calls": [
|
||||||
|
{"id": "call_a", "type": "function", "function": {"name": "skill_view", "arguments": "{}"}},
|
||||||
|
{"id": "call_b", "type": "function", "function": {"name": "skill_view", "arguments": "{}"}},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{"role": "tool", "tool_call_id": "call_a", "content": "output a"},
|
||||||
|
{"role": "tool", "tool_call_id": "call_b", "content": "output b"},
|
||||||
|
{"role": "user", "content": "later 1"},
|
||||||
|
{"role": "assistant", "content": "later 2"},
|
||||||
|
{"role": "tool", "tool_call_id": "call_x", "content": "later output"},
|
||||||
|
{"role": "assistant", "content": "later 3"},
|
||||||
|
{"role": "user", "content": "later 4"},
|
||||||
|
]
|
||||||
|
|
||||||
|
result = c.compress(msgs)
|
||||||
|
|
||||||
|
answered_ids = {
|
||||||
|
msg.get("tool_call_id")
|
||||||
|
for msg in result
|
||||||
|
if msg.get("role") == "tool" and msg.get("tool_call_id")
|
||||||
|
}
|
||||||
|
for msg in result:
|
||||||
|
if msg.get("role") == "assistant" and msg.get("tool_calls"):
|
||||||
|
for tc in msg["tool_calls"]:
|
||||||
|
assert tc["id"] in answered_ids
|
||||||
|
|
||||||
|
def test_summarization_does_not_start_tail_with_tool_outputs(self):
|
||||||
|
mock_client = MagicMock()
|
||||||
|
mock_response = MagicMock()
|
||||||
|
mock_response.choices = [MagicMock()]
|
||||||
|
mock_response.choices[0].message.content = "[CONTEXT SUMMARY]: compressed middle"
|
||||||
|
mock_client.chat.completions.create.return_value = mock_response
|
||||||
|
|
||||||
|
with patch("agent.context_compressor.get_model_context_length", return_value=100000), \
|
||||||
|
patch("agent.context_compressor.get_text_auxiliary_client", return_value=(mock_client, "test-model")):
|
||||||
|
c = ContextCompressor(
|
||||||
|
model="test",
|
||||||
|
quiet_mode=True,
|
||||||
|
protect_first_n=2,
|
||||||
|
protect_last_n=3,
|
||||||
|
)
|
||||||
|
|
||||||
|
msgs = [
|
||||||
|
{"role": "user", "content": "earlier 1"},
|
||||||
|
{"role": "assistant", "content": "earlier 2"},
|
||||||
|
{"role": "user", "content": "earlier 3"},
|
||||||
|
{
|
||||||
|
"role": "assistant",
|
||||||
|
"content": "",
|
||||||
|
"tool_calls": [
|
||||||
|
{"id": "call_c", "type": "function", "function": {"name": "search_files", "arguments": "{}"}},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{"role": "tool", "tool_call_id": "call_c", "content": "output c"},
|
||||||
|
{"role": "user", "content": "latest user"},
|
||||||
|
]
|
||||||
|
|
||||||
|
result = c.compress(msgs)
|
||||||
|
|
||||||
|
called_ids = {
|
||||||
|
tc["id"]
|
||||||
|
for msg in result
|
||||||
|
if msg.get("role") == "assistant" and msg.get("tool_calls")
|
||||||
|
for tc in msg["tool_calls"]
|
||||||
|
}
|
||||||
|
for msg in result:
|
||||||
|
if msg.get("role") == "tool" and msg.get("tool_call_id"):
|
||||||
|
assert msg["tool_call_id"] in called_ids
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue