@@ -206,16 +206,29 @@ def test_label_parameter(self):
206206 with pytest .warns (DDTraceDeprecationWarning ):
207207 prod_prompt = LLMObs .get_prompt ("greeting" , label = "production" )
208208 assert prod_prompt .version == "v1"
209- assert all (not hasattr (prod_prompt , field ) for field in ("label" , "labels" ))
209+ with pytest .warns (DDTraceDeprecationWarning ):
210+ assert prod_prompt .label == "production"
210211
211212 LLMObs .clear_prompt_cache (hot = True , warm = True )
212213
213214 with mock_api (200 , DEV_PROMPT_RESPONSE ):
214215 with pytest .warns (DDTraceDeprecationWarning ):
215216 dev_prompt = LLMObs .get_prompt ("greeting" , label = "development" )
216217 assert dev_prompt .version == "dev-v1"
218+ with pytest .warns (DDTraceDeprecationWarning ):
219+ assert dev_prompt .label == "development"
217220 assert "DEBUG" in dev_prompt .format (name = "Test" )
218221
222+ def test_internal_label_reads_do_not_warn (self ):
223+ prompt = ManagedPrompt (id = "greeting" , version = "v1" , label = "production" , source = "registry" , template = "Hello!" )
224+
225+ with warnings .catch_warnings ():
226+ warnings .simplefilter ("error" , DDTraceDeprecationWarning )
227+ assert prompt .to_annotation_dict ()["label" ] == "production"
228+ assert "label='production'" in repr (prompt )
229+ assert prompt ._serialize ()["label" ] == "production"
230+ assert prompt ._with_source ("cache" ).source == "cache"
231+
219232 def test_string_fallback_on_error (self ):
220233 """String fallback used when API returns 500."""
221234 with mock_api (500 , "Internal Server Error" ):
@@ -498,7 +511,7 @@ def test_route_env_agent_to_ff(self):
498511
499512 def test_route_env_agentless_to_http_resolve (self ):
500513 manager = _make_manager (agentless = True )
501- sentinel = ManagedPrompt (id = "greeting" , version = "v1" , source = "resolve" , template = "Hi" )
514+ sentinel = ManagedPrompt (id = "greeting" , version = "v1" , label = "production" , source = "resolve" , template = "Hi" )
502515 with patch .object (manager , "_fetch_from_ff" ) as ff_mock :
503516 with patch .object (manager , "_get_prompt_http" , return_value = sentinel ) as http_mock :
504517 with patch ("ddtrace.llmobs._prompts.manager.config" ) as cfg :
@@ -541,6 +554,7 @@ def test_route_targeting_key_to_ff(self):
541554 ff_prompt = ManagedPrompt (
542555 id = "greeting" ,
543556 version = "ff-v1" ,
557+ label = None ,
544558 source = "ff" ,
545559 template = "Hello!" ,
546560 )
@@ -564,7 +578,7 @@ def test_route_label_targeting_conflict_warns(self):
564578 # which resolves the same env-scoped variant server-side.
565579 def test_route_not_ready_to_http_resolve (self ):
566580 manager = _make_manager ()
567- sentinel = ManagedPrompt (id = "greeting" , version = "v1" , source = "resolve" , template = "Hi" )
581+ sentinel = ManagedPrompt (id = "greeting" , version = "v1" , label = None , source = "resolve" , template = "Hi" )
568582 with _ffe_enabled ():
569583 with patch .object (manager , "_get_prompt_http" , return_value = sentinel ) as http_mock :
570584 prompt = manager .get_prompt ("greeting" )
@@ -575,7 +589,7 @@ def test_route_not_ready_to_http_resolve(self):
575589
576590 def test_route_no_flag_to_http_resolve (self ):
577591 manager = _make_manager ()
578- sentinel = ManagedPrompt (id = "greeting" , version = "v1" , source = "resolve" , template = "Hi" )
592+ sentinel = ManagedPrompt (id = "greeting" , version = "v1" , label = None , source = "resolve" , template = "Hi" )
579593 with _ffe_enabled ():
580594 _deliver_prompt_flag ("other-prompt" , {"prompt_id" : "other-prompt" , "version" : "1" , "template" : "x" })
581595 with patch .object (manager , "_get_prompt_http" , return_value = sentinel ) as http_mock :
@@ -762,7 +776,7 @@ def test_delete_prompt_evicts_cache(self):
762776 manager = _make_manager ()
763777 manager ._hot_cache .set (
764778 "my-prompt:production" ,
765- ManagedPrompt (id = "my-prompt" , version = "v1" , source = "registry" , template = []),
779+ ManagedPrompt (id = "my-prompt" , version = "v1" , label = "production" , source = "registry" , template = []),
766780 )
767781 assert len (manager ._hot_cache ) == 1
768782
@@ -860,11 +874,11 @@ def test_hot_evict_does_not_over_evict_colon_prefixed_ids(self):
860874 manager = _make_manager ()
861875 manager ._hot_cache .set (
862876 "foo:production" ,
863- ManagedPrompt (id = "foo" , version = "v1" , source = "registry" , template = []),
877+ ManagedPrompt (id = "foo" , version = "v1" , label = "production" , source = "registry" , template = []),
864878 )
865879 manager ._hot_cache .set (
866880 "foo:bar:production" ,
867- ManagedPrompt (id = "foo:bar" , version = "v1" , source = "registry" , template = []),
881+ ManagedPrompt (id = "foo:bar" , version = "v1" , label = "production" , source = "registry" , template = []),
868882 )
869883 assert len (manager ._hot_cache ) == 2
870884
@@ -876,8 +890,8 @@ def test_hot_evict_does_not_over_evict_colon_prefixed_ids(self):
876890 def test_warm_cache_distinct_ids_do_not_collide_on_path (self , tmp_path ):
877891 """Regression: 'a/b' and 'a_b' must not share a cache file (lossy sanitization served wrong prompts)."""
878892 cache = WarmCache (cache_dir = str (tmp_path ), ttl_seconds = 60 )
879- cache .set ("a/b:" , ManagedPrompt (id = "a/b" , version = "v1" , source = "registry" , template = []))
880- cache .set ("a_b:" , ManagedPrompt (id = "a_b" , version = "v2" , source = "registry" , template = []))
893+ cache .set ("a/b:" , ManagedPrompt (id = "a/b" , version = "v1" , label = None , source = "registry" , template = []))
894+ cache .set ("a_b:" , ManagedPrompt (id = "a_b" , version = "v2" , label = None , source = "registry" , template = []))
881895
882896 assert cache .get ("a/b:" )[0 ].id == "a/b"
883897 assert cache .get ("a_b:" )[0 ].id == "a_b"
@@ -909,7 +923,7 @@ def test_hot_cache_lru_eviction():
909923 cache = HotCache (ttl_seconds = 60 , maxsize = 2 )
910924
911925 def mk (v ):
912- return ManagedPrompt (id = v , version = "1" , source = "resolve" , template = "x" )
926+ return ManagedPrompt (id = v , version = "1" , label = None , source = "resolve" , template = "x" )
913927
914928 cache .set ("a" , mk ("a" ))
915929 cache .set ("b" , mk ("b" ))
0 commit comments