fix(anthropic): support automatic compaction (Opus 4.6) (#35034)

This commit is contained in:
ccurme
2026-02-05 16:41:25 -05:00
committed by GitHub
parent d181a59ebe
commit 74b3344679
6 changed files with 151 additions and 9 deletions

View File

@@ -2409,3 +2409,112 @@ def test_fine_grained_tool_streaming() -> None:
assert write_doc_block is not None
assert write_doc_block["name"] == "write_document"
assert "args" in write_doc_block
@pytest.mark.vcr
def test_compaction() -> None:
"""Test the compation beta feature."""
llm = ChatAnthropic(
model="claude-opus-4-6", # type: ignore[call-arg]
betas=["compact-2026-01-12"],
max_tokens=4096,
context_management={
"edits": [
{
"type": "compact_20260112",
"trigger": {"type": "input_tokens", "value": 50000},
"pause_after_compaction": True,
}
]
},
)
input_message = {
"role": "user",
"content": f"Generate a one-sentence summary of this:\n\n{'a' * 100000}",
}
messages: list = [input_message]
first_response = llm.invoke(messages)
messages.append(first_response)
second_message = {
"role": "user",
"content": f"Generate a one-sentence summary of this:\n\n{'b' * 100000}",
}
messages.append(second_message)
second_response = llm.invoke(messages)
messages.append(second_response)
content_blocks = second_response.content_blocks
compaction_block = next(
(block for block in content_blocks if block["type"] == "non_standard"),
None,
)
assert compaction_block
assert compaction_block["value"].get("type") == "compaction"
third_message = {
"role": "user",
"content": "What are we talking about?",
}
messages.append(third_message)
third_response = llm.invoke(messages)
content_blocks = third_response.content_blocks
assert [block["type"] for block in content_blocks] == ["text"]
@pytest.mark.vcr
def test_compaction_streaming() -> None:
"""Test the compation beta feature."""
llm = ChatAnthropic(
model="claude-opus-4-6", # type: ignore[call-arg]
betas=["compact-2026-01-12"],
max_tokens=4096,
context_management={
"edits": [
{
"type": "compact_20260112",
"trigger": {"type": "input_tokens", "value": 50000},
"pause_after_compaction": False,
}
]
},
streaming=True,
)
input_message = {
"role": "user",
"content": f"Generate a one-sentence summary of this:\n\n{'a' * 100000}",
}
messages: list = [input_message]
first_response = llm.invoke(messages)
messages.append(first_response)
second_message = {
"role": "user",
"content": f"Generate a one-sentence summary of this:\n\n{'b' * 100000}",
}
messages.append(second_message)
second_response = llm.invoke(messages)
messages.append(second_response)
content_blocks = second_response.content_blocks
compaction_block = next(
(block for block in content_blocks if block["type"] == "non_standard"),
None,
)
assert compaction_block
assert compaction_block["value"].get("type") == "compaction"
third_message = {
"role": "user",
"content": "What are we talking about?",
}
messages.append(third_message)
third_response = llm.invoke(messages)
content_blocks = third_response.content_blocks
assert [block["type"] for block in content_blocks] == ["text"]

View File

@@ -1564,6 +1564,13 @@ def test_context_management_in_payload() -> None:
}
def test_inference_geo_in_payload() -> None:
llm = ChatAnthropic(model=MODEL_NAME, inference_geo="us")
input_message = HumanMessage("Hello, world!")
payload = llm._get_request_payload([input_message])
assert payload["inference_geo"] == "us"
def test_anthropic_model_params() -> None:
llm = ChatAnthropic(model=MODEL_NAME)