@@ -43,7 +43,7 @@ def client(td: TestData) -> LDClient:
4343
4444def test_summary_starts_empty (client : LDClient ):
4545 context = Context .create ("user-key" )
46- tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 1 , "fakeModel" , "fakeProvider" , context )
46+ tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 1 , "fakeModel" , "fakeProvider" , context , run_id = "test-run-id" )
4747
4848 assert tracker .get_summary ().duration is None
4949 assert tracker .get_summary ().feedback is None
@@ -53,7 +53,7 @@ def test_summary_starts_empty(client: LDClient):
5353
5454def test_tracks_duration (client : LDClient ):
5555 context = Context .create ("user-key" )
56- tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context )
56+ tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context , run_id = "test-run-id" )
5757 tracker .track_duration (100 )
5858
5959 client .track .assert_called_with ( # type: ignore
@@ -68,7 +68,7 @@ def test_tracks_duration(client: LDClient):
6868
6969def test_tracks_duration_of (client : LDClient ):
7070 context = Context .create ("user-key" )
71- tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context )
71+ tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context , run_id = "test-run-id" )
7272 tracker .track_duration_of (lambda : sleep (0.01 ))
7373
7474 calls = client .track .mock_calls # type: ignore
@@ -87,7 +87,7 @@ def test_tracks_duration_of(client: LDClient):
8787
8888def test_tracks_time_to_first_token (client : LDClient ):
8989 context = Context .create ("user-key" )
90- tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context )
90+ tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context , run_id = "test-run-id" )
9191 tracker .track_time_to_first_token (100 )
9292
9393 client .track .assert_called_with ( # type: ignore
@@ -102,7 +102,7 @@ def test_tracks_time_to_first_token(client: LDClient):
102102
103103def test_tracks_duration_of_with_exception (client : LDClient ):
104104 context = Context .create ("user-key" )
105- tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context )
105+ tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context , run_id = "test-run-id" )
106106
107107 def sleep_and_throw ():
108108 sleep (0.01 )
@@ -130,7 +130,7 @@ def sleep_and_throw():
130130
131131def test_tracks_token_usage (client : LDClient ):
132132 context = Context .create ("user-key" )
133- tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context )
133+ tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context , run_id = "test-run-id" )
134134
135135 tokens = TokenUsage (300 , 200 , 100 )
136136 tracker .track_tokens (tokens )
@@ -163,7 +163,7 @@ def test_tracks_token_usage(client: LDClient):
163163
164164def test_tracks_bedrock_metrics (client : LDClient ):
165165 context = Context .create ("user-key" )
166- tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context )
166+ tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context , run_id = "test-run-id" )
167167
168168 bedrock_result = {
169169 "ResponseMetadata" : {"HTTPStatusCode" : 200 },
@@ -220,7 +220,7 @@ def test_tracks_bedrock_metrics(client: LDClient):
220220
221221def test_tracks_bedrock_metrics_with_error (client : LDClient ):
222222 context = Context .create ("user-key" )
223- tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context )
223+ tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context , run_id = "test-run-id" )
224224
225225 bedrock_result = {
226226 "ResponseMetadata" : {"HTTPStatusCode" : 500 },
@@ -277,7 +277,7 @@ def test_tracks_bedrock_metrics_with_error(client: LDClient):
277277
278278def test_tracks_openai_metrics (client : LDClient ):
279279 context = Context .create ("user-key" )
280- tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context )
280+ tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context , run_id = "test-run-id" )
281281
282282 class Result :
283283 def __init__ (self ):
@@ -330,7 +330,7 @@ def get_result():
330330
331331def test_tracks_openai_metrics_with_exception (client : LDClient ):
332332 context = Context .create ("user-key" )
333- tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context )
333+ tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context , run_id = "test-run-id" )
334334
335335 def raise_exception ():
336336 raise ValueError ("Something went wrong" )
@@ -364,7 +364,7 @@ def raise_exception():
364364)
365365def test_tracks_feedback (client : LDClient , kind : FeedbackKind , label : str ):
366366 context = Context .create ("user-key" )
367- tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context )
367+ tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context , run_id = "test-run-id" )
368368
369369 tracker .track_feedback ({"kind" : kind })
370370
@@ -379,7 +379,7 @@ def test_tracks_feedback(client: LDClient, kind: FeedbackKind, label: str):
379379
380380def test_tracks_success (client : LDClient ):
381381 context = Context .create ("user-key" )
382- tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context )
382+ tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context , run_id = "test-run-id" )
383383 tracker .track_success ()
384384
385385 calls = [
@@ -398,7 +398,7 @@ def test_tracks_success(client: LDClient):
398398
399399def test_tracks_error (client : LDClient ):
400400 context = Context .create ("user-key" )
401- tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context )
401+ tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context , run_id = "test-run-id" )
402402 tracker .track_error ()
403403
404404 calls = [
@@ -417,7 +417,7 @@ def test_tracks_error(client: LDClient):
417417
418418def test_error_after_success_is_blocked (client : LDClient ):
419419 context = Context .create ("user-key" )
420- tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context )
420+ tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context , run_id = "test-run-id" )
421421 tracker .track_success ()
422422 tracker .track_error ()
423423
@@ -446,7 +446,7 @@ def _base_td() -> dict:
446446def test_config_tracker_includes_graph_key_when_provided (client : LDClient ):
447447 context = Context .create ("user-key" )
448448 tracker = LDAIConfigTracker (
449- client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context , graph_key = "my-graph"
449+ client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context , run_id = "test-run-id" , graph_key = "my-graph"
450450 )
451451 expected = {** _base_td (), "graphKey" : "my-graph" }
452452 tracker .track_success ()
@@ -456,7 +456,7 @@ def test_config_tracker_includes_graph_key_when_provided(client: LDClient):
456456def test_config_tracker_track_tokens_with_graph_key (client : LDClient ):
457457 context = Context .create ("user-key" )
458458 tracker = LDAIConfigTracker (
459- client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context , graph_key = "g1"
459+ client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context , run_id = "test-run-id" , graph_key = "g1"
460460 )
461461 tokens = TokenUsage (10 , 4 , 6 )
462462 expected = {** _base_td (), "graphKey" : "g1" }
@@ -467,7 +467,7 @@ def test_config_tracker_track_tokens_with_graph_key(client: LDClient):
467467def test_config_tracker_track_feedback_with_graph_key (client : LDClient ):
468468 context = Context .create ("user-key" )
469469 tracker = LDAIConfigTracker (
470- client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context , graph_key = "gx"
470+ client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context , run_id = "test-run-id" , graph_key = "gx"
471471 )
472472 expected = {** _base_td (), "graphKey" : "gx" }
473473 tracker .track_feedback ({"kind" : FeedbackKind .Positive })
@@ -479,7 +479,7 @@ def test_config_tracker_track_feedback_with_graph_key(client: LDClient):
479479def test_config_tracker_track_tool_call (client : LDClient ):
480480 context = Context .create ("user-key" )
481481 tracker = LDAIConfigTracker (
482- client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context
482+ client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context , run_id = "test-run-id"
483483 )
484484 expected = {** _base_td (), "toolKey" : "search" }
485485 tracker .track_tool_call ("search" )
@@ -489,7 +489,7 @@ def test_config_tracker_track_tool_call(client: LDClient):
489489def test_config_tracker_track_tool_call_with_graph_key (client : LDClient ):
490490 context = Context .create ("user-key" )
491491 tracker = LDAIConfigTracker (
492- client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context , graph_key = "my-graph"
492+ client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context , run_id = "test-run-id" , graph_key = "my-graph"
493493 )
494494 expected = {** _base_td (), "graphKey" : "my-graph" , "toolKey" : "calc" }
495495 tracker .track_tool_call ("calc" )
@@ -499,7 +499,7 @@ def test_config_tracker_track_tool_call_with_graph_key(client: LDClient):
499499def test_config_tracker_track_tool_calls (client : LDClient ):
500500 context = Context .create ("user-key" )
501501 tracker = LDAIConfigTracker (
502- client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context , graph_key = "g"
502+ client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context , run_id = "test-run-id" , graph_key = "g"
503503 )
504504 tracker .track_tool_calls (["a" , "b" ])
505505 assert client .track .call_count == 2 # type: ignore
@@ -520,7 +520,7 @@ def test_config_tracker_track_tool_calls(client: LDClient):
520520def test_config_tracker_track_metrics_of (client : LDClient ):
521521 context = Context .create ("user-key" )
522522 tracker = LDAIConfigTracker (
523- client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context
523+ client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context , run_id = "test-run-id"
524524 )
525525
526526 def fn ():
@@ -540,7 +540,7 @@ def extract(r):
540540async def test_config_tracker_track_metrics_of_async_passes_graph_key (client : LDClient ):
541541 context = Context .create ("user-key" )
542542 tracker = LDAIConfigTracker (
543- client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context , graph_key = "gg"
543+ client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context , run_id = "test-run-id" , graph_key = "gg"
544544 )
545545
546546 async def fn ():
@@ -588,7 +588,7 @@ def test_ai_graph_tracker_track_total_tokens_tracks_when_positive(client: LDClie
588588
589589def test_duplicate_track_duration_is_ignored (client : LDClient ):
590590 context = Context .create ("user-key" )
591- tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context )
591+ tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context , run_id = "test-run-id" )
592592 tracker .track_duration (100 )
593593 tracker .track_duration (200 )
594594
@@ -598,7 +598,7 @@ def test_duplicate_track_duration_is_ignored(client: LDClient):
598598
599599def test_duplicate_track_time_to_first_token_is_ignored (client : LDClient ):
600600 context = Context .create ("user-key" )
601- tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context )
601+ tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context , run_id = "test-run-id" )
602602 tracker .track_time_to_first_token (50 )
603603 tracker .track_time_to_first_token (75 )
604604
@@ -608,7 +608,7 @@ def test_duplicate_track_time_to_first_token_is_ignored(client: LDClient):
608608
609609def test_duplicate_track_tokens_is_ignored (client : LDClient ):
610610 context = Context .create ("user-key" )
611- tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context )
611+ tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context , run_id = "test-run-id" )
612612 tokens1 = TokenUsage (300 , 200 , 100 )
613613 tokens2 = TokenUsage (600 , 400 , 200 )
614614 tracker .track_tokens (tokens1 )
@@ -621,7 +621,7 @@ def test_duplicate_track_tokens_is_ignored(client: LDClient):
621621
622622def test_duplicate_track_success_is_ignored (client : LDClient ):
623623 context = Context .create ("user-key" )
624- tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context )
624+ tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context , run_id = "test-run-id" )
625625 tracker .track_success ()
626626 tracker .track_success ()
627627
@@ -631,7 +631,7 @@ def test_duplicate_track_success_is_ignored(client: LDClient):
631631
632632def test_duplicate_track_error_is_ignored (client : LDClient ):
633633 context = Context .create ("user-key" )
634- tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context )
634+ tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context , run_id = "test-run-id" )
635635 tracker .track_error ()
636636 tracker .track_error ()
637637
@@ -641,7 +641,7 @@ def test_duplicate_track_error_is_ignored(client: LDClient):
641641
642642def test_duplicate_track_feedback_is_ignored (client : LDClient ):
643643 context = Context .create ("user-key" )
644- tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context )
644+ tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context , run_id = "test-run-id" )
645645 tracker .track_feedback ({"kind" : FeedbackKind .Positive })
646646 tracker .track_feedback ({"kind" : FeedbackKind .Negative })
647647
@@ -651,18 +651,16 @@ def test_duplicate_track_feedback_is_ignored(client: LDClient):
651651
652652def test_track_data_includes_run_id (client : LDClient ):
653653 context = Context .create ("user-key" )
654- tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context )
654+ tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context , run_id = "my-run-id" )
655655 tracker .track_success ()
656656
657657 track_data = client .track .call_args [0 ][2 ] # type: ignore
658- assert "runId" in track_data
659- assert isinstance (track_data ["runId" ], str )
660- assert len (track_data ["runId" ]) == 36 # UUID format
658+ assert track_data ["runId" ] == "my-run-id"
661659
662660
663661def test_run_id_is_consistent_across_track_calls (client : LDClient ):
664662 context = Context .create ("user-key" )
665- tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context )
663+ tracker = LDAIConfigTracker (client , "variation-key" , "config-key" , 3 , "fakeModel" , "fakeProvider" , context , run_id = "test-run-id" )
666664 tracker .track_success ()
667665 tracker .track_duration (100 )
668666
@@ -680,7 +678,7 @@ def test_resumption_token_round_trip(client: LDClient):
680678 import json
681679
682680 context = Context .create ("user-key" )
683- tracker = LDAIConfigTracker (client , "var-key" , "cfg-key" , 5 , "gpt-4" , "openai" , context )
681+ tracker = LDAIConfigTracker (client , "var-key" , "cfg-key" , 5 , "gpt-4" , "openai" , context , run_id = "test-run-id" )
684682
685683 token = tracker .resumption_token
686684 # Token has no padding — add it back before decoding
@@ -698,7 +696,7 @@ def test_resumption_token_round_trip(client: LDClient):
698696
699697def test_resumption_token_has_no_padding (client : LDClient ):
700698 context = Context .create ("user-key" )
701- tracker = LDAIConfigTracker (client , "var-key" , "cfg-key" , 1 , "model" , "provider" , context )
699+ tracker = LDAIConfigTracker (client , "var-key" , "cfg-key" , 1 , "model" , "provider" , context , run_id = "test-run-id" )
702700
703701 token = tracker .resumption_token
704702 assert "=" not in token
@@ -708,7 +706,7 @@ def test_resumption_token_is_url_safe_base64(client: LDClient):
708706 import base64
709707
710708 context = Context .create ("user-key" )
711- tracker = LDAIConfigTracker (client , "var-key" , "cfg-key" , 1 , "model" , "provider" , context )
709+ tracker = LDAIConfigTracker (client , "var-key" , "cfg-key" , 1 , "model" , "provider" , context , run_id = "test-run-id" )
712710
713711 token = tracker .resumption_token
714712 # Should decode without error using urlsafe variant (with padding restored)
@@ -740,6 +738,7 @@ def test_client_create_tracker_from_resumption_token():
740738 # Create an original tracker and get its token
741739 original = LDAIConfigTracker (
742740 mock_client , "var-abc" , "my-config" , 7 , "gpt-4" , "openai" , Context .create ("original-user" ),
741+ run_id = "original-run-id-123" ,
743742 )
744743 token = original .resumption_token
745744
0 commit comments