Skip to content

Commit c5ec681

Browse files
committed
refactor(proxy): extract ccr golden replay policy
1 parent 41af39d commit c5ec681

3 files changed

Lines changed: 109 additions & 18 deletions

File tree

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
"""Policy helpers for replaying CCR golden tool definitions."""
2+
3+
from __future__ import annotations
4+
5+
import json
6+
from dataclasses import dataclass
7+
from typing import Any, Literal, cast
8+
9+
from headroom.ccr.tool_injection import create_ccr_tool_definition
10+
11+
12+
@dataclass(frozen=True)
13+
class CcrToolDefinitionReplay:
14+
"""CCR tool definition selected for sticky replay or fresh injection."""
15+
16+
tool_definition: dict[str, Any]
17+
canonical_bytes: bytes
18+
used_golden_bytes: bool
19+
20+
21+
def serialize_ccr_tool_definition_canonical(tool_definition: dict[str, Any]) -> bytes:
22+
"""Return stable canonical bytes for a CCR tool definition."""
23+
24+
return json.dumps(
25+
tool_definition,
26+
ensure_ascii=False,
27+
separators=(",", ":"),
28+
).encode("utf-8")
29+
30+
31+
def replay_golden_ccr_tool_definition(golden_tool_bytes: bytes) -> CcrToolDefinitionReplay:
32+
"""Decode a stored CCR tool definition and preserve its original bytes."""
33+
34+
tool_definition = json.loads(golden_tool_bytes.decode("utf-8"))
35+
return CcrToolDefinitionReplay(
36+
tool_definition=cast(dict[str, Any], tool_definition),
37+
canonical_bytes=golden_tool_bytes,
38+
used_golden_bytes=True,
39+
)
40+
41+
42+
def create_fresh_ccr_tool_definition(
43+
provider: Literal["anthropic", "openai", "google"],
44+
) -> CcrToolDefinitionReplay:
45+
"""Create and canonicalize a fresh CCR tool definition for ``provider``."""
46+
47+
tool_definition = create_ccr_tool_definition(provider)
48+
return CcrToolDefinitionReplay(
49+
tool_definition=tool_definition,
50+
canonical_bytes=serialize_ccr_tool_definition_canonical(tool_definition),
51+
used_golden_bytes=False,
52+
)

headroom/proxy/helpers.py

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@
3737
prepare_outbound_body_bytes as prepare_outbound_body_bytes, # noqa: F401 - compatibility export
3838
)
3939
from headroom.proxy.body_forwarding import serialize_body_canonical
40+
from headroom.proxy.ccr_golden_policy import (
41+
create_fresh_ccr_tool_definition,
42+
replay_golden_ccr_tool_definition,
43+
)
4044

4145
if TYPE_CHECKING:
4246
import httpx
@@ -2624,7 +2628,7 @@ def apply_session_sticky_ccr_tool(
26242628
Returns ``(updated_tools, was_injected)``. ``updated_tools`` is a
26252629
fresh list (caller-safe).
26262630
"""
2627-
from headroom.ccr.tool_injection import CCR_TOOL_NAME, create_ccr_tool_definition
2631+
from headroom.ccr.tool_injection import CCR_TOOL_NAME
26282632

26292633
if provider not in ("anthropic", "openai", "google"):
26302634
raise ValueError(f"unsupported provider: {provider!r}")
@@ -2658,14 +2662,13 @@ def apply_session_sticky_ccr_tool(
26582662
request_id=request_id,
26592663
)
26602664
return tools_out, False
2661-
tool_def = create_ccr_tool_definition(provider)
2662-
canonical = serialize_tool_definition_canonical(tool_def)
2663-
tools_out.append(tool_def)
2665+
replay = create_fresh_ccr_tool_definition(provider)
2666+
tools_out.append(replay.tool_definition)
26642667
log_tool_injection_decision(
26652668
provider=provider,
26662669
session_id=None,
26672670
decision="inject_first_time",
2668-
tool_definition_bytes_count=len(canonical),
2671+
tool_definition_bytes_count=len(replay.canonical_bytes),
26692672
request_id=request_id,
26702673
)
26712674
return tools_out, True
@@ -2682,13 +2685,13 @@ def apply_session_sticky_ccr_tool(
26822685
golden = tracker.get_golden_tool_bytes(provider, session_id)
26832686
if golden is not None:
26842687
try:
2685-
tool_def = json.loads(golden.decode("utf-8"))
2686-
tools_out.append(tool_def)
2688+
replay = replay_golden_ccr_tool_definition(golden)
2689+
tools_out.append(replay.tool_definition)
26872690
log_tool_injection_decision(
26882691
provider=provider,
26892692
session_id=session_id,
26902693
decision="inject_sticky_replay",
2691-
tool_definition_bytes_count=len(golden),
2694+
tool_definition_bytes_count=len(replay.canonical_bytes),
26922695
request_id=request_id,
26932696
)
26942697
return tools_out, True
@@ -2702,15 +2705,14 @@ def apply_session_sticky_ccr_tool(
27022705
# Fall through to fresh creation below
27032706
# Tracker says "done CCR" but has no golden bytes (or they were corrupt). Pin
27042707
# them now so future turns are stable.
2705-
tool_def = create_ccr_tool_definition(provider)
2706-
canonical = serialize_tool_definition_canonical(tool_def)
2707-
tracker.record_ccr_done(provider, session_id, canonical)
2708-
tools_out.append(tool_def)
2708+
replay = create_fresh_ccr_tool_definition(provider)
2709+
tracker.record_ccr_done(provider, session_id, replay.canonical_bytes)
2710+
tools_out.append(replay.tool_definition)
27092711
log_tool_injection_decision(
27102712
provider=provider,
27112713
session_id=session_id,
27122714
decision="inject_sticky_replay",
2713-
tool_definition_bytes_count=len(canonical),
2715+
tool_definition_bytes_count=len(replay.canonical_bytes),
27142716
request_id=request_id,
27152717
)
27162718
return tools_out, True
@@ -2726,15 +2728,14 @@ def apply_session_sticky_ccr_tool(
27262728
)
27272729
return tools_out, False
27282730

2729-
tool_def = create_ccr_tool_definition(provider)
2730-
canonical = serialize_tool_definition_canonical(tool_def)
2731-
tracker.record_ccr_done(provider, session_id, canonical)
2732-
tools_out.append(tool_def)
2731+
replay = create_fresh_ccr_tool_definition(provider)
2732+
tracker.record_ccr_done(provider, session_id, replay.canonical_bytes)
2733+
tools_out.append(replay.tool_definition)
27332734
log_tool_injection_decision(
27342735
provider=provider,
27352736
session_id=session_id,
27362737
decision="inject_first_time",
2737-
tool_definition_bytes_count=len(canonical),
2738+
tool_definition_bytes_count=len(replay.canonical_bytes),
27382739
request_id=request_id,
27392740
)
27402741
return tools_out, True

tests/test_ccr_golden_policy.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
from __future__ import annotations
2+
3+
import pytest
4+
5+
from headroom.ccr.tool_injection import CCR_TOOL_NAME, create_ccr_tool_definition
6+
from headroom.proxy.ccr_golden_policy import (
7+
create_fresh_ccr_tool_definition,
8+
replay_golden_ccr_tool_definition,
9+
serialize_ccr_tool_definition_canonical,
10+
)
11+
12+
13+
def test_replays_golden_definition_without_reserializing() -> None:
14+
golden = b'{ "name" : "headroom_retrieve" , "description" : "client bytes" }'
15+
16+
replay = replay_golden_ccr_tool_definition(golden)
17+
18+
assert replay.tool_definition["name"] == CCR_TOOL_NAME
19+
assert replay.canonical_bytes == golden
20+
assert replay.used_golden_bytes is True
21+
22+
23+
def test_rejects_invalid_golden_json() -> None:
24+
with pytest.raises(ValueError):
25+
replay_golden_ccr_tool_definition(b"not-json")
26+
27+
28+
def test_rejects_non_utf8_golden_bytes() -> None:
29+
with pytest.raises(UnicodeDecodeError):
30+
replay_golden_ccr_tool_definition(b"\x80\x81")
31+
32+
33+
def test_fresh_definition_uses_canonical_bytes() -> None:
34+
replay = create_fresh_ccr_tool_definition("anthropic")
35+
36+
assert replay.tool_definition == create_ccr_tool_definition("anthropic")
37+
assert replay.canonical_bytes == serialize_ccr_tool_definition_canonical(replay.tool_definition)
38+
assert replay.used_golden_bytes is False

0 commit comments

Comments
 (0)