Anthropic server-side managed context¶
Anthropic's context_management field lets the server compact a long conversation before generating, with no client-side compute. convopack is still useful as the client-side budget enforcer; the server handles whatever survives.
import anthropic
from convopack import Packer, Recency
client = anthropic.Anthropic()
packer = Packer(
budget=80_000, # generous client-side cap
tokenizer="anthropic:claude-sonnet-4-6",
strategy=Recency(),
pin=("system", "last_user"),
cache=True, # mark stable prefix
)
payload, context_mgmt = packer.pack_anthropic_managed(
history,
system="Be concise.",
trigger_tokens=30_000, # server compresses if input > 30k
keep_tool_uses=3, # keep the 3 most recent tool exchanges
)
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
system=payload.system,
messages=payload.messages,
context_management=context_mgmt,
)
Roles of the two layers¶
| Layer | What it does | Where it runs |
|---|---|---|
Packer.pack_anthropic_managed |
Decide which messages to send. Pin system + last user. Emit cache markers. | Client (your machine). |
context_management (Anthropic) |
Drop oldest tool exchanges once input crosses a threshold. | Server (Anthropic). |
You can use both, either, or neither. The library default is to use neither (cache=False, no context_management), so existing code keeps working.
Custom edits¶
ContextManagementConfig.with_edit(...) lets you add edits that aren't modelled yet:
from convopack.anthropic_managed import ContextManagementConfig
cm = (
ContextManagementConfig.empty()
.with_edit({"type": "future_edit_type", "trigger": {"type": "input_tokens", "value": 50_000}})
)
That keeps the wrapper useful as Anthropic ships new edit types without requiring a convopack release.