Skip to content

Commit 7050ab0

Browse files
jsonbaileyclaude
andcommitted
feat: Include graphKey in resumption token when set
Add graphKey to the resumption token following the spec key order: runId, configKey, variationKey (if set), version, graphKey (if set). The from_resumption_token classmethod now decodes and passes graphKey to the tracker constructor. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 82cb40a commit 7050ab0

2 files changed

Lines changed: 64 additions & 1 deletion

File tree

packages/sdk/server-ai/src/ldai/tracker.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ def resumption_token(self) -> str:
117117
a tracker in a different process (e.g. for deferred feedback).
118118
119119
The token contains ``runId``, ``configKey``, ``version``, and
120-
optionally ``variationKey`` (omitted when empty).
120+
optionally ``variationKey`` and ``graphKey`` (omitted when empty).
121121
``modelName`` and ``providerName`` are **not** included.
122122
"""
123123
data: dict = {
@@ -127,6 +127,8 @@ def resumption_token(self) -> str:
127127
if self._variation_key:
128128
data["variationKey"] = self._variation_key
129129
data["version"] = self._version
130+
if self._graph_key:
131+
data["graphKey"] = self._graph_key
130132
payload = json.dumps(data)
131133
return base64.urlsafe_b64encode(payload.encode("utf-8")).rstrip(b"=").decode("utf-8")
132134

@@ -170,6 +172,7 @@ def from_resumption_token(cls, token: str, ld_client: LDClient, context: Context
170172
context=context,
171173
model_name="",
172174
provider_name="",
175+
graph_key=payload.get("graphKey"),
173176
)
174177

175178
def __get_track_data(self) -> dict:

packages/sdk/server-ai/tests/test_tracker.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -737,6 +737,66 @@ def test_resumption_token_omits_variation_key_when_empty(client: LDClient):
737737
assert decoded["version"] == 1
738738

739739

740+
def test_resumption_token_includes_graph_key_when_set(client: LDClient):
741+
import base64
742+
import json
743+
744+
context = Context.create("user-key")
745+
tracker = LDAIConfigTracker(
746+
ld_client=client, run_id="test-run-id", config_key="cfg-key",
747+
variation_key="var-key", version=2, context=context,
748+
model_name="model", provider_name="provider", graph_key="my-graph",
749+
)
750+
751+
token = tracker.resumption_token
752+
padded = token + "=" * (-len(token) % 4)
753+
decoded = json.loads(base64.urlsafe_b64decode(padded.encode("utf-8")).decode("utf-8"))
754+
755+
assert decoded["runId"] == "test-run-id"
756+
assert decoded["configKey"] == "cfg-key"
757+
assert decoded["variationKey"] == "var-key"
758+
assert decoded["version"] == 2
759+
assert decoded["graphKey"] == "my-graph"
760+
# Key order: runId, configKey, variationKey, version, graphKey
761+
assert list(decoded.keys()) == ["runId", "configKey", "variationKey", "version", "graphKey"]
762+
763+
764+
def test_resumption_token_omits_graph_key_when_not_set(client: LDClient):
765+
import base64
766+
import json
767+
768+
context = Context.create("user-key")
769+
tracker = LDAIConfigTracker(
770+
ld_client=client, run_id="test-run-id", config_key="cfg-key",
771+
variation_key="var-key", version=1, context=context,
772+
model_name="model", provider_name="provider",
773+
)
774+
775+
token = tracker.resumption_token
776+
padded = token + "=" * (-len(token) % 4)
777+
decoded = json.loads(base64.urlsafe_b64decode(padded.encode("utf-8")).decode("utf-8"))
778+
779+
assert "graphKey" not in decoded
780+
781+
782+
def test_resumption_token_round_trip_with_graph_key(client: LDClient):
783+
context = Context.create("user-key")
784+
tracker = LDAIConfigTracker(
785+
ld_client=client, run_id="test-run-id", config_key="cfg-key",
786+
variation_key="var-key", version=3, context=context,
787+
model_name="model", provider_name="provider", graph_key="my-graph",
788+
)
789+
790+
token = tracker.resumption_token
791+
restored = LDAIConfigTracker.from_resumption_token(token, client, context)
792+
793+
assert restored._run_id == "test-run-id"
794+
assert restored._config_key == "cfg-key"
795+
assert restored._variation_key == "var-key"
796+
assert restored._version == 3
797+
assert restored._graph_key == "my-graph"
798+
799+
740800
def test_tracker_with_explicit_run_id(client: LDClient):
741801
context = Context.create("user-key")
742802
tracker = LDAIConfigTracker(

0 commit comments

Comments
 (0)