Skip to content

Commit 1b3a1ba

Browse files
committed
refactor: remove deprecated ModelResponse, StructuredResponse, AgentResult and compat shims
1 parent 1aa1069 commit 1b3a1ba

12 files changed

Lines changed: 89 additions & 310 deletions

File tree

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
from ldai.providers import (
3535
AgentGraphResult,
3636
AgentGraphRunner,
37-
AgentResult,
3837
AgentRunner,
3938
ManagedResult,
4039
Runner,
@@ -49,7 +48,6 @@
4948
'Evaluator',
5049
'AgentRunner',
5150
'AgentGraphRunner',
52-
'AgentResult',
5351
'AgentGraphResult',
5452
'ManagedResult',
5553
'Runner',

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ def create_judge(
329329
if not provider:
330330
return None
331331

332-
return Judge(judge_config, provider)
332+
return Judge(judge_config, provider) # type: ignore[arg-type]
333333
except Exception as error:
334334
return None
335335

@@ -443,7 +443,7 @@ async def create_model(
443443
if not runner:
444444
return None
445445

446-
return ManagedModel(config, runner)
446+
return ManagedModel(config, runner) # type: ignore[arg-type]
447447

448448
async def create_chat(
449449
self,

packages/sdk/server-ai/src/ldai/judge/__init__.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
from ldai import log
99
from ldai.judge.evaluation_schema_builder import EvaluationSchemaBuilder
1010
from ldai.models import AIJudgeConfig, LDMessage
11-
from ldai.providers.model_runner import ModelRunner
12-
from ldai.providers.types import JudgeResult, ModelResponse
11+
from ldai.providers.runner import Runner
12+
from ldai.providers.types import JudgeResult, RunnerResult
1313

1414

1515
class Judge:
@@ -23,13 +23,13 @@ class Judge:
2323
def __init__(
2424
self,
2525
ai_config: AIJudgeConfig,
26-
model_runner: ModelRunner,
26+
model_runner: Runner,
2727
):
2828
"""
2929
Initialize the Judge.
3030
3131
:param ai_config: The judge AI configuration
32-
:param model_runner: The model runner to use for evaluation
32+
:param model_runner: The runner to use for evaluation
3333
"""
3434
self._ai_config = ai_config
3535
self._model_runner = model_runner
@@ -76,10 +76,10 @@ async def evaluate(
7676

7777
response = await tracker.track_metrics_of_async(
7878
lambda result: result.metrics,
79-
lambda: self._model_runner.invoke_structured_model(messages, self._evaluation_response_structure),
79+
lambda: self._model_runner.run(messages, output_type=self._evaluation_response_structure),
8080
)
8181

82-
parsed = self._parse_evaluation_response(response.data)
82+
parsed = self._parse_evaluation_response(response.parsed)
8383

8484
if parsed is None:
8585
log.warning('Judge evaluation did not return the expected evaluation')
@@ -99,7 +99,7 @@ async def evaluate(
9999
async def evaluate_messages(
100100
self,
101101
messages: list[LDMessage],
102-
response: ModelResponse,
102+
response: RunnerResult,
103103
sampling_ratio: float = 1.0,
104104
) -> JudgeResult:
105105
"""
@@ -111,7 +111,7 @@ async def evaluate_messages(
111111
:return: The result of the judge evaluation.
112112
"""
113113
input_text = '\r\n'.join([msg.content for msg in messages]) if messages else ''
114-
output_text = response.message.content
114+
output_text = response.content
115115

116116
return await self.evaluate(input_text, output_text, sampling_ratio)
117117

@@ -123,11 +123,11 @@ def get_ai_config(self) -> AIJudgeConfig:
123123
"""
124124
return self._ai_config
125125

126-
def get_model_runner(self) -> ModelRunner:
126+
def get_model_runner(self) -> Runner:
127127
"""
128-
Returns the model runner used by this judge.
128+
Returns the runner used by this judge.
129129
130-
:return: The model runner
130+
:return: The runner
131131
"""
132132
return self._model_runner
133133

@@ -164,7 +164,7 @@ def _interpolate_message(self, content: str, variables: Dict[str, str]) -> str:
164164
# Use chevron (Mustache) for templating, with no escaping
165165
return chevron.render(content, variables)
166166

167-
def _parse_evaluation_response(self, data: Dict[str, Any]) -> Optional[Tuple[float, str]]:
167+
def _parse_evaluation_response(self, data: Optional[Dict[str, Any]]) -> Optional[Tuple[float, str]]:
168168
"""
169169
Parses the structured evaluation response. Expects {"score": n, "reasoning": "..."}.
170170

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

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from typing import Union
44

55
from ldai.models import AIAgentConfig
6-
from ldai.providers import AgentResult, AgentRunner
6+
from ldai.providers import AgentRunner
77
from ldai.providers.runner import Runner
88
from ldai.providers.types import ManagedResult, RunnerResult
99

@@ -33,14 +33,12 @@ async def run(self, input: str) -> ManagedResult:
3333
:return: ManagedResult containing the agent's output and metric summary
3434
"""
3535
tracker = self._ai_config.create_tracker()
36-
result: Union[RunnerResult, AgentResult] = await tracker.track_metrics_of_async(
36+
result: RunnerResult = await tracker.track_metrics_of_async(
3737
lambda r: r.metrics,
3838
lambda: self._agent_runner.run(input),
3939
)
40-
# Support both RunnerResult (content) and legacy AgentResult (output)
41-
content = result.content if isinstance(result, RunnerResult) else result.output # type: ignore[union-attr]
4240
return ManagedResult(
43-
content=content,
41+
content=result.content,
4442
metrics=tracker.get_summary(),
4543
raw=result.raw,
4644
)

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

Lines changed: 14 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,26 @@
11
import asyncio
2-
import warnings
3-
from typing import List, Union
2+
from typing import List
43

54
from ldai import log
65
from ldai.models import AICompletionConfig, LDMessage
7-
from ldai.providers.model_runner import ModelRunner
86
from ldai.providers.runner import Runner
9-
from ldai.providers.types import JudgeResult, ManagedResult, ModelResponse, RunnerResult
7+
from ldai.providers.types import JudgeResult, ManagedResult, RunnerResult
108
from ldai.tracker import LDAIConfigTracker
119

1210

1311
class ManagedModel:
1412
"""
1513
LaunchDarkly managed wrapper for AI model invocations.
1614
17-
Holds a Runner (or legacy ModelRunner). Handles conversation management,
18-
judge evaluation dispatch, and tracking automatically via ``create_tracker()``.
15+
Holds a Runner. Handles conversation management, judge evaluation
16+
dispatch, and tracking automatically via ``create_tracker()``.
1917
Obtain an instance via ``LDAIClient.create_model()``.
2018
"""
2119

2220
def __init__(
2321
self,
2422
ai_config: AICompletionConfig,
25-
model_runner: Union[Runner, ModelRunner],
23+
model_runner: Runner,
2624
):
2725
self._ai_config = ai_config
2826
self._model_runner = model_runner
@@ -48,86 +46,27 @@ async def run(self, prompt: str) -> ManagedResult:
4846
config_messages = self._ai_config.messages or []
4947
all_messages = config_messages + self._messages
5048

51-
result: Union[RunnerResult, ModelResponse] = await tracker.track_metrics_of_async(
49+
result: RunnerResult = await tracker.track_metrics_of_async(
5250
lambda r: r.metrics,
53-
lambda: self._invoke_runner(all_messages),
51+
lambda: self._model_runner.run(all_messages),
5452
)
5553

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
54+
assistant_message = LDMessage(role='assistant', content=result.content)
6755

6856
input_text = '\r\n'.join(m.content for m in self._messages) if self._messages else ''
6957

70-
evaluations_task = self._track_judge_results(tracker, input_text, content)
58+
evaluations_task = self._track_judge_results(tracker, input_text, result.content)
7159

7260
self._messages.append(assistant_message)
7361

7462
return ManagedResult(
75-
content=content,
63+
content=result.content,
7664
metrics=tracker.get_summary(),
77-
raw=raw,
78-
parsed=parsed,
65+
raw=result.raw,
66+
parsed=result.parsed,
7967
evaluations=evaluations_task,
8068
)
8169

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-
95-
async def invoke(self, prompt: str) -> ModelResponse:
96-
"""
97-
Invoke the model with a prompt string.
98-
99-
.. deprecated::
100-
Use :meth:`run` instead. This method will be removed in a future
101-
release once the migration to :class:`ManagedResult` is complete.
102-
103-
:param prompt: The user prompt to send to the model
104-
:return: ModelResponse containing the model's response and metrics
105-
"""
106-
warnings.warn(
107-
"ManagedModel.invoke() is deprecated. Use run() instead.",
108-
DeprecationWarning,
109-
stacklevel=2,
110-
)
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]
122-
)
123-
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-
13170
def _track_judge_results(
13271
self,
13372
tracker: LDAIConfigTracker,
@@ -169,11 +108,11 @@ def append_messages(self, messages: List[LDMessage]) -> None:
169108
"""
170109
self._messages.extend(messages)
171110

172-
def get_model_runner(self) -> Union[Runner, ModelRunner]:
111+
def get_model_runner(self) -> Runner:
173112
"""
174113
Return the underlying runner for advanced use.
175114
176-
:return: The Runner or legacy ModelRunner instance.
115+
:return: The Runner instance.
177116
"""
178117
return self._model_runner
179118

packages/sdk/server-ai/src/ldai/providers/__init__.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,30 +6,24 @@
66
from ldai.providers.runner_factory import RunnerFactory
77
from ldai.providers.types import (
88
AgentGraphResult,
9-
AgentResult,
109
JudgeResult,
1110
LDAIMetrics,
1211
ManagedResult,
13-
ModelResponse,
1412
RunnerResult,
15-
StructuredResponse,
1613
ToolRegistry,
1714
)
1815

1916
__all__ = [
2017
'AIProvider',
2118
'AgentGraphResult',
2219
'AgentGraphRunner',
23-
'AgentResult',
2420
'AgentRunner',
2521
'JudgeResult',
2622
'LDAIMetrics',
2723
'ManagedResult',
28-
'ModelResponse',
2924
'ModelRunner',
3025
'Runner',
3126
'RunnerFactory',
3227
'RunnerResult',
33-
'StructuredResponse',
3428
'ToolRegistry',
3529
]

packages/sdk/server-ai/src/ldai/providers/agent_runner.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from typing import Any, Protocol, runtime_checkable
22

3-
from ldai.providers.types import AgentResult
3+
from ldai.providers.types import RunnerResult
44

55

66
@runtime_checkable
@@ -18,11 +18,11 @@ class AgentRunner(Protocol):
1818
the caller just passes input.
1919
"""
2020

21-
async def run(self, input: Any) -> AgentResult:
21+
async def run(self, input: Any) -> RunnerResult:
2222
"""
2323
Run the agent with the given input.
2424
2525
:param input: The input to the agent (string prompt or structured input)
26-
:return: AgentResult containing the output, raw response, and metrics
26+
:return: RunnerResult containing the agent's content, metrics, and optional raw/parsed fields
2727
"""
2828
...

0 commit comments

Comments
 (0)