diff --git a/packages/sdk/server-ai/src/ldai/__init__.py b/packages/sdk/server-ai/src/ldai/__init__.py index 56d780d3..9255141b 100644 --- a/packages/sdk/server-ai/src/ldai/__init__.py +++ b/packages/sdk/server-ai/src/ldai/__init__.py @@ -35,8 +35,6 @@ AgentGraphResult, AgentGraphRunner, AgentGraphRunnerResult, - AgentResult, - AgentRunner, GraphMetrics, GraphMetricSummary, ManagedGraphResult, @@ -51,9 +49,7 @@ __all__ = [ 'LDAIClient', 'Evaluator', - 'AgentRunner', 'AgentGraphRunner', - 'AgentResult', 'AgentGraphResult', 'AgentGraphRunnerResult', 'GraphMetrics', diff --git a/packages/sdk/server-ai/src/ldai/managed_model.py b/packages/sdk/server-ai/src/ldai/managed_model.py index 94605eab..04db0d77 100644 --- a/packages/sdk/server-ai/src/ldai/managed_model.py +++ b/packages/sdk/server-ai/src/ldai/managed_model.py @@ -4,7 +4,7 @@ from ldai import log from ldai.models import AICompletionConfig, LDMessage from ldai.providers.runner import Runner -from ldai.providers.types import JudgeResult, ManagedResult +from ldai.providers.types import JudgeResult, ManagedResult, RunnerResult from ldai.tracker import LDAIConfigTracker @@ -46,7 +46,7 @@ async def run(self, prompt: str) -> ManagedResult: config_messages = self._ai_config.messages or [] all_messages = config_messages + self._messages - result = await tracker.track_metrics_of_async( + result: RunnerResult = await tracker.track_metrics_of_async( lambda r: r.metrics, lambda: self._model_runner.run(all_messages), ) diff --git a/packages/sdk/server-ai/src/ldai/providers/__init__.py b/packages/sdk/server-ai/src/ldai/providers/__init__.py index 22dce784..f5beb3ec 100644 --- a/packages/sdk/server-ai/src/ldai/providers/__init__.py +++ b/packages/sdk/server-ai/src/ldai/providers/__init__.py @@ -1,22 +1,17 @@ from ldai.providers.agent_graph_runner import AgentGraphRunner -from ldai.providers.agent_runner import AgentRunner from ldai.providers.ai_provider import AIProvider -from ldai.providers.model_runner import ModelRunner from ldai.providers.runner import Runner from ldai.providers.runner_factory import RunnerFactory from ldai.providers.types import ( AgentGraphResult, AgentGraphRunnerResult, - AgentResult, GraphMetrics, GraphMetricSummary, JudgeResult, LDAIMetrics, ManagedGraphResult, ManagedResult, - ModelResponse, RunnerResult, - StructuredResponse, ToolRegistry, ) @@ -25,19 +20,14 @@ 'AgentGraphResult', 'AgentGraphRunner', 'AgentGraphRunnerResult', - 'AgentResult', - 'AgentRunner', 'GraphMetrics', 'GraphMetricSummary', 'JudgeResult', 'LDAIMetrics', 'ManagedGraphResult', 'ManagedResult', - 'ModelResponse', - 'ModelRunner', 'Runner', 'RunnerFactory', 'RunnerResult', - 'StructuredResponse', 'ToolRegistry', ] diff --git a/packages/sdk/server-ai/src/ldai/providers/agent_runner.py b/packages/sdk/server-ai/src/ldai/providers/agent_runner.py deleted file mode 100644 index cba7e156..00000000 --- a/packages/sdk/server-ai/src/ldai/providers/agent_runner.py +++ /dev/null @@ -1,28 +0,0 @@ -from typing import Any, Protocol, runtime_checkable - -from ldai.providers.types import AgentResult - - -@runtime_checkable -class AgentRunner(Protocol): - """ - CAUTION: - This feature is experimental and should NOT be considered ready for production use. - It may change or be removed without notice and is not subject to backwards - compatibility guarantees. - - Runtime capability interface for single-agent execution. - - An AgentRunner is a focused, configured object returned by - AIProvider.create_agent(). It holds all provider wiring internally — - the caller just passes input. - """ - - async def run(self, input: Any) -> AgentResult: - """ - Run the agent with the given input. - - :param input: The input to the agent (string prompt or structured input) - :return: AgentResult containing the output, raw response, and metrics - """ - ... diff --git a/packages/sdk/server-ai/src/ldai/providers/ai_provider.py b/packages/sdk/server-ai/src/ldai/providers/ai_provider.py index 6e2cb6c0..eb3183a3 100644 --- a/packages/sdk/server-ai/src/ldai/providers/ai_provider.py +++ b/packages/sdk/server-ai/src/ldai/providers/ai_provider.py @@ -1,9 +1,8 @@ from abc import ABC -from typing import Any, Dict, List, Optional +from typing import Any, Optional from ldai import log -from ldai.models import LDMessage -from ldai.providers.types import ModelResponse, StructuredResponse, ToolRegistry +from ldai.providers.types import ToolRegistry class AIProvider(ABC): @@ -16,51 +15,6 @@ class AIProvider(ABC): create_model(), create_agent(), and create_agent_graph(). """ - async def invoke_model(self, messages: List[LDMessage]) -> ModelResponse: - """ - Invoke the chat model with an array of messages. - - Default implementation takes no action and returns a placeholder response. - Provider implementations should override this method. - - :param messages: Array of LDMessage objects representing the conversation - :return: ModelResponse containing the model's response - """ - log.warning('invoke_model not implemented by this provider') - - from ldai.models import LDMessage - from ldai.providers.types import LDAIMetrics - - return ModelResponse( - message=LDMessage(role='assistant', content=''), - metrics=LDAIMetrics(success=False, usage=None), - ) - - async def invoke_structured_model( - self, - messages: List[LDMessage], - response_structure: Dict[str, Any], - ) -> StructuredResponse: - """ - Invoke the chat model with structured output support. - - Default implementation takes no action and returns a placeholder response. - Provider implementations should override this method. - - :param messages: Array of LDMessage objects representing the conversation - :param response_structure: Dictionary of output configurations keyed by output name - :return: StructuredResponse containing the structured data - """ - log.warning('invoke_structured_model not implemented by this provider') - - from ldai.providers.types import LDAIMetrics - - return StructuredResponse( - data={}, - raw_response='', - metrics=LDAIMetrics(success=False, usage=None), - ) - def create_model(self, config: Any) -> Optional[Any]: """ Create a configured model executor for the given AI config. diff --git a/packages/sdk/server-ai/src/ldai/providers/model_runner.py b/packages/sdk/server-ai/src/ldai/providers/model_runner.py deleted file mode 100644 index 5f00887c..00000000 --- a/packages/sdk/server-ai/src/ldai/providers/model_runner.py +++ /dev/null @@ -1,38 +0,0 @@ -from typing import Any, Dict, List, Protocol, runtime_checkable - -from ldai.models import LDMessage -from ldai.providers.types import ModelResponse, StructuredResponse - - -@runtime_checkable -class ModelRunner(Protocol): - """ - Runtime capability interface for model invocation. - - A ModelRunner is a focused, configured object returned by - AIProvider.create_model(). It knows exactly which model to call - and with what parameters — the caller just passes messages. - """ - - async def invoke_model(self, messages: List[LDMessage]) -> ModelResponse: - """ - Invoke the model with an array of messages. - - :param messages: Array of LDMessage objects representing the conversation - :return: ModelResponse containing the model's response and metrics - """ - ... - - async def invoke_structured_model( - self, - messages: List[LDMessage], - response_structure: Dict[str, Any], - ) -> StructuredResponse: - """ - Invoke the model with structured output support. - - :param messages: Array of LDMessage objects representing the conversation - :param response_structure: Dictionary defining the JSON schema for output structure - :return: StructuredResponse containing the structured data - """ - ... diff --git a/packages/sdk/server-ai/src/ldai/providers/types.py b/packages/sdk/server-ai/src/ldai/providers/types.py index 5bb8ce47..b537acec 100644 --- a/packages/sdk/server-ai/src/ldai/providers/types.py +++ b/packages/sdk/server-ai/src/ldai/providers/types.py @@ -6,7 +6,6 @@ from dataclasses import dataclass, field from typing import Any, Callable, Dict, List, Optional -from ldai.models import LDMessage from ldai.tracker import LDAIMetricSummary, TokenUsage # Type alias for a registry of tools available to an agent. @@ -87,33 +86,6 @@ class ManagedResult: """Optional asyncio Task that resolves to the list of :class:`JudgeResult` instances when awaited.""" -@dataclass -class ModelResponse: - """ - Response from a model invocation. - - .. deprecated:: - Use :class:`RunnerResult` (from a runner) and :class:`ManagedResult` - (from the managed layer) instead. - """ - message: LDMessage - metrics: LDAIMetrics - evaluations: Optional[asyncio.Task[List[JudgeResult]]] = None - - -@dataclass -class StructuredResponse: - """ - Structured response from AI models. - - .. deprecated:: - Structured output is now represented by :attr:`RunnerResult.parsed`. - """ - data: Dict[str, Any] - raw_response: str - metrics: LDAIMetrics - - @dataclass class GraphMetrics: """Contains raw metrics from a single agent graph run.""" @@ -234,20 +206,6 @@ def to_dict(self) -> Dict[str, Any]: return result -@dataclass -class AgentResult: - """ - Result from a single-agent run. - - .. deprecated:: - Use :class:`ManagedResult` (managed layer) or :class:`RunnerResult` - (runner layer) instead. - """ - output: str - raw: Any - metrics: LDAIMetrics - - @dataclass class AgentGraphResult: """Contains the result of an agent graph run.""" diff --git a/packages/sdk/server-ai/tests/test_runner_abcs.py b/packages/sdk/server-ai/tests/test_runner_abcs.py index 7e8087cd..d6b7ba35 100644 --- a/packages/sdk/server-ai/tests/test_runner_abcs.py +++ b/packages/sdk/server-ai/tests/test_runner_abcs.py @@ -1,20 +1,11 @@ import pytest -from ldai.providers import AgentGraphResult, AgentGraphRunner, AgentRunner, ToolRegistry +from ldai.providers import AgentGraphResult, AgentGraphRunner, ToolRegistry from ldai.providers.types import LDAIMetrics, RunnerResult # --- Concrete test doubles --- -class ConcreteAgentRunner: - async def run(self, input): - return RunnerResult( - content=f"agent response to: {input}", - metrics=LDAIMetrics(success=True), - raw={"raw": input}, - ) - - class ConcreteAgentGraphRunner: async def run(self, input): return AgentGraphResult( @@ -28,26 +19,6 @@ class MissingRunMethod: pass -# --- AgentRunner --- - -def test_agent_runner_structural_check_passes(): - assert isinstance(ConcreteAgentRunner(), AgentRunner) - - -def test_agent_runner_structural_check_fails_when_run_missing(): - assert not isinstance(MissingRunMethod(), AgentRunner) - - -@pytest.mark.asyncio -async def test_agent_runner_run_returns_runner_result(): - runner = ConcreteAgentRunner() - result = await runner.run("hello") - assert isinstance(result, RunnerResult) - assert result.content == "agent response to: hello" - assert result.raw == {"raw": "hello"} - assert result.metrics.success is True - - @pytest.mark.asyncio async def test_runner_result_fields(): metrics = LDAIMetrics(success=True) @@ -101,7 +72,6 @@ def test_tool_registry_is_dict_of_callables(): def test_top_level_exports(): import ldai - assert hasattr(ldai, 'AgentRunner') assert hasattr(ldai, 'AgentGraphRunner') assert hasattr(ldai, 'AgentGraphResult') assert hasattr(ldai, 'RunnerResult')