11import asyncio
22import warnings
3- from typing import List , Union
3+ from typing import List
44
55from ldai import log
66from ldai .models import AICompletionConfig , LDMessage
7- from ldai .providers .model_runner import ModelRunner
87from ldai .providers .runner import Runner
9- from ldai .providers .types import JudgeResult , ManagedResult , ModelResponse , RunnerResult
8+ from ldai .providers .types import JudgeResult , LDAIMetrics , ManagedResult , ModelResponse
109from ldai .tracker import LDAIConfigTracker
1110
1211
1312class ManagedModel :
1413 """
1514 LaunchDarkly managed wrapper for AI model invocations.
1615
17- Holds a Runner (or legacy ModelRunner) . Handles conversation management,
18- judge evaluation dispatch, and tracking automatically via ``create_tracker()``.
16+ Holds a Runner. Handles conversation management, judge evaluation
17+ dispatch, and tracking automatically via ``create_tracker()``.
1918 Obtain an instance via ``LDAIClient.create_model()``.
2019 """
2120
2221 def __init__ (
2322 self ,
2423 ai_config : AICompletionConfig ,
25- model_runner : Union [ Runner , ModelRunner ] ,
24+ model_runner : Runner ,
2625 ):
2726 self ._ai_config = ai_config
2827 self ._model_runner = model_runner
@@ -48,50 +47,27 @@ async def run(self, prompt: str) -> ManagedResult:
4847 config_messages = self ._ai_config .messages or []
4948 all_messages = config_messages + self ._messages
5049
51- result : Union [ RunnerResult , ModelResponse ] = await tracker .track_metrics_of_async (
50+ result = await tracker .track_metrics_of_async (
5251 lambda r : r .metrics ,
53- lambda : self ._invoke_runner (all_messages ),
52+ lambda : self ._model_runner . run (all_messages ),
5453 )
5554
56- # Support both new RunnerResult and legacy ModelResponse
57- if isinstance (result , RunnerResult ):
58- content = result .content
59- raw = result .raw
60- parsed = result .parsed
61- assistant_message = LDMessage (role = 'assistant' , content = content )
62- else :
63- content = result .message .content
64- raw = getattr (result , 'raw' , None )
65- parsed = getattr (result , 'parsed' , None )
66- assistant_message = result .message
55+ assistant_message = LDMessage (role = 'assistant' , content = result .content )
6756
6857 input_text = '\r \n ' .join (m .content for m in self ._messages ) if self ._messages else ''
6958
70- evaluations_task = self ._track_judge_results (tracker , input_text , content )
59+ evaluations_task = self ._track_judge_results (tracker , input_text , result . content )
7160
7261 self ._messages .append (assistant_message )
7362
7463 return ManagedResult (
75- content = content ,
64+ content = result . content ,
7665 metrics = tracker .get_summary (),
77- raw = raw ,
78- parsed = parsed ,
66+ raw = result . raw ,
67+ parsed = result . parsed ,
7968 evaluations = evaluations_task ,
8069 )
8170
82- async def _invoke_runner (
83- self , all_messages : List [LDMessage ]
84- ) -> Union [RunnerResult , ModelResponse ]:
85- """
86- Delegate to the runner. Supports both the new ``Runner`` protocol
87- (``run(messages) → RunnerResult``) and the legacy ``ModelRunner``
88- (``invoke_model(messages) → ModelResponse``).
89- """
90- if isinstance (self ._model_runner , Runner ):
91- return await self ._model_runner .run (all_messages )
92- # Legacy ModelRunner path
93- return await self ._model_runner .invoke_model (all_messages ) # type: ignore[union-attr]
94-
9571 async def invoke (self , prompt : str ) -> ModelResponse :
9672 """
9773 Invoke the model with a prompt string.
@@ -108,26 +84,16 @@ async def invoke(self, prompt: str) -> ModelResponse:
10884 DeprecationWarning ,
10985 stacklevel = 2 ,
11086 )
111- tracker = self ._ai_config .create_tracker ()
112-
113- user_message = LDMessage (role = 'user' , content = prompt )
114- self ._messages .append (user_message )
115-
116- config_messages = self ._ai_config .messages or []
117- all_messages = config_messages + self ._messages
118-
119- response : ModelResponse = await tracker .track_metrics_of_async (
120- lambda result : result .metrics ,
121- lambda : self ._model_runner .invoke_model (all_messages ), # type: ignore[union-attr]
87+ result = await self .run (prompt )
88+ return ModelResponse (
89+ message = LDMessage (role = 'assistant' , content = result .content ),
90+ metrics = LDAIMetrics (
91+ success = bool (result .metrics .success ),
92+ usage = result .metrics .usage ,
93+ ),
94+ evaluations = result .evaluations ,
12295 )
12396
124- input_text = '\r \n ' .join (m .content for m in self ._messages ) if self ._messages else ''
125- output_text = response .message .content
126- response .evaluations = self ._track_judge_results (tracker , input_text , output_text )
127-
128- self ._messages .append (response .message )
129- return response
130-
13197 def _track_judge_results (
13298 self ,
13399 tracker : LDAIConfigTracker ,
@@ -169,11 +135,11 @@ def append_messages(self, messages: List[LDMessage]) -> None:
169135 """
170136 self ._messages .extend (messages )
171137
172- def get_model_runner (self ) -> Union [ Runner , ModelRunner ] :
138+ def get_model_runner (self ) -> Runner :
173139 """
174140 Return the underlying runner for advanced use.
175141
176- :return: The Runner or legacy ModelRunner instance.
142+ :return: The Runner instance.
177143 """
178144 return self ._model_runner
179145
0 commit comments