orchestrata_ultimate.core.protocols.providers

Reference › orchestrata_ultimate › core › protocols › providers

The provider-manager types of SPEC-011, the canonical and production-wired version that interfaces.providers re-exports. It describes how a request for a language model is shaped, routed and costed. ModelCapability lists what a model can do (reasoning, coding, vision, tool use, long context, embedding, summarisation) and RoutingStrategy how a model is chosen (cost, latency or quality optimised, round robin and others). Dataclasses cover requests and responses (Message, ProviderRequest, ProviderResponse, RawProviderResponse), accounting (TokenUsage, CostRecord, CostEstimate, BudgetStatus, UsageReport) and configuration (ModelPricing, ModelInfo, ProviderConfig).

ProviderProtocol is the contract for one provider: complete, get_models, supports_capability and health reporting. ProviderManagerProtocol is the contract for the manager: execute a request, estimate_cost, get_usage, register_provider and deregister_provider, get_remaining_budget, cancel and get_provider_health. The implementation is in the providers package.

At a glance

Source src/orchestrata_ultimate/core/protocols/providers.py
Lines of code 324
Classes 16
Functions 0
Imports (internal) orchestrata_ultimate.core.base.traces, orchestrata_ultimate.core.protocols.base
Imported by orchestrata_ultimate.core.interfaces.providers, orchestrata_ultimate.core.protocols
Tests that import it tests/generated_core/test_protocols_providers_generated.py, tests/refactor/test_agent.py, tests/scripts/test_refactor_cli.py

Class diagram

Class diagram orchestrata_ultimate.core.protocols.providers

Dependency diagram

Dependency diagram orchestrata_ultimate.core.protocols.providers

API

Classes

ModelCapability (enum)

Bases: StrEnum · Line 22

LLM model capabilities for capability-based routing.

Member Value
REASONING 'reasoning'
CODING 'coding'
VISION 'vision'
TOOL_USE 'tool_use'
LONG_CONTEXT 'long_context'
EMBEDDING 'embedding'
SUMMARIZATION 'summarization'

RoutingStrategy (enum)

Bases: StrEnum · Decorators: traces(spec='011', story='US-004', reqs=['REQ-011-011', 'REQ-011-012', 'REQ-011-013', 'REQ-011-014']) · Line 39

Strategy for provider selection.

Member Value
COST_OPTIMIZED 'cost_optimized'
LATENCY_OPTIMIZED 'latency_optimized'
QUALITY_OPTIMIZED 'quality_optimized'
ROUND_ROBIN 'round_robin'

TokenUsage (dataclass)

Decorators: dataclass · Line 49

Token usage for a provider request.

Attribute Type Default
input_tokens int 0
output_tokens int 0
total_tokens int 0

CostRecord (dataclass)

Decorators: dataclass · Line 58

Cost record for a provider request.

Attribute Type Default
input_cost float 0.0
output_cost float 0.0
total_cost float 0.0
currency str 'USD'

CostEstimate (dataclass)

Decorators: dataclass, traces(spec='011', story='US-003', reqs=['REQ-011-018']) · Line 69

Estimated cost for a provider request.

Attribute Type Default
estimated_input_tokens int 0
estimated_output_tokens int 0
estimated_cost CostRecord field(default_factory=CostRecord)
provider str ''
model str ''

Message (dataclass)

Decorators: dataclass, traces(spec='103', story='US-001', reqs=['REQ-103-001']) · Line 81

A message in a conversation.

Attribute Type Default
role str 'user'
content str ''
tool_calls list[dict[str, Any]] | None None
tool_call_id str | None None
name str | None None
reasoning_content str | None None

ProviderRequest (dataclass)

Decorators: dataclass, traces(spec='011', story='US-001', reqs=['REQ-011-004']), traces(spec='103', story='US-001', reqs=['REQ-103-002']) · Line 96

Request to the provider manager.

Attribute Type Default
request_id str field(default_factory=lambda: str(uuid.uuid4()))
messages list[Message] field(default_factory=list)
model str | None None
capabilities list[ModelCapability] | None None
parameters dict[str, Any] | None None
routing_strategy RoutingStrategy RoutingStrategy.COST_OPTIMIZED
max_tokens int | None None
volk_id str | None None
session_id str | None None
project_id str | None None
tools list[dict[str, Any]] | None None
tool_choice str | None None

ProviderResponse (dataclass)

Decorators: dataclass, traces(spec='011', story='US-001', reqs=['REQ-011-005']), traces(spec='103', story='US-001', reqs=['REQ-103-003']) · Line 118

Response from the provider manager.

Attribute Type Default
content str ''
model_used str ''
provider_used str ''
usage TokenUsage field(default_factory=TokenUsage)
cost CostRecord field(default_factory=CostRecord)
latency_ms float 0.0
metadata dict[str, Any] field(default_factory=dict)
tool_calls list[dict[str, Any]] field(default_factory=list)
reasoning_content str | None None

BudgetStatus (dataclass)

Decorators: dataclass · Line 135

Budget status for a scope.

Attribute Type Default
scope str ''
scope_id str ''
budget_limit_usd float 0.0
spent_usd float 0.0
remaining_usd float 0.0
usage_percent float 0.0
warning_threshold float 0.8
is_warning bool False
is_exceeded bool False

UsageReport (dataclass)

Decorators: dataclass · Line 150

Aggregated usage report.

Attribute Type Default
total_requests int 0
total_tokens int 0
total_cost float 0.0
by_provider dict[str, dict[str, Any]] field(default_factory=dict)
by_model dict[str, dict[str, Any]] field(default_factory=dict)

ModelPricing (dataclass)

Decorators: dataclass, traces(spec='011', story='US-005', reqs=['REQ-011-028']) · Line 162

Pricing configuration for a model.

Attribute Type Default
input_per_1m float 0.0
output_per_1m float 0.0
capabilities list[ModelCapability] field(default_factory=list)
context_window int 8192
quality_rank int 50

ModelInfo (dataclass)

Decorators: dataclass, traces(spec='011', story='US-005', reqs=['REQ-011-028']) · Line 174

Information about an available model.

Attribute Type Default
name str ''
provider str ''
capabilities list[ModelCapability] field(default_factory=list)
context_window int 8192
pricing ModelPricing field(default_factory=ModelPricing)

ProviderConfig (dataclass)

Decorators: dataclass · Line 185

Configuration for a provider adapter.

Attribute Type Default
api_key str ''
base_url str | None None
models list[str] field(default_factory=list)
rate_limit_rpm int 60
rate_limit_tpm int 100000
timeout_seconds float 30.0
max_retries int 3
pricing dict[str, ModelPricing] field(default_factory=dict)

RawProviderResponse (dataclass)

Decorators: dataclass, traces(spec='103', story='US-001', reqs=['REQ-103-003']) · Line 200

Raw response from a provider adapter before normalization.

Attribute Type Default
content str ''
input_tokens int 0
output_tokens int 0
model str ''
metadata dict[str, Any] field(default_factory=dict)
tool_calls list[dict[str, Any]] field(default_factory=list)

ProviderProtocol (protocol)

Bases: Protocol · Decorators: traces(spec='011', story='US-006', reqs=['REQ-011-029']) · Line 217

Protocol for provider adapter implementations.

Method Signature Summary
complete async complete(messages: list[Message], model: str, parameters: dict[str, Any]) -> RawProviderResponse Send completion request to provider.
get_models get_models() -> list[ModelInfo] Return available models with metadata.
supports_capability supports_capability(capability: ModelCapability) -> bool Check if provider supports a capability.

ProviderManagerProtocol (protocol)

Bases: ComponentProtocol, Protocol · Decorators: traces(spec='011', story='US-001', reqs=['REQ-011-001', 'REQ-011-003']) · Line 241

Unified LLM provider abstraction.

Method Signature Summary
execute async execute(request: ProviderRequest) -> ProviderResponse Execute an LLM request.
estimate_cost async estimate_cost(request: ProviderRequest) -> CostEstimate Estimate cost for a request without executing it.
get_usage async get_usage(*, volk_id: str | None = None, session_id: str | None = None, project_id: str | None = None, date_from: datetime | None = None, date_to: datetime | None = None) -> UsageReport Query cumulative usage and cost.
register_provider register_provider(name: str, provider: ProviderProtocol, config: ProviderConfig) -> None Register a provider adapter with configuration.
deregister_provider deregister_provider(name: str) -> bool Remove a provider.
get_remaining_budget async get_remaining_budget(*, volk_id: str | None = None, project_id: str | None = None, portfolio_id: str | None = None) -> BudgetStatus Query remaining budget for a scope.
cancel async cancel(request_id: str) -> bool Cancel an in-flight request.
get_provider_health get_provider_health() -> dict[str, Any] Return health status of all registered providers.

Source

Permalink: https://gitlab.com/MSamy/orchestrata-ultimate-architecture/-/blob/a4cbc2bdf/src/orchestrata_ultimate/core/protocols/providers.py

"""
Provider manager protocol types for Orchestrata Ultimate (SPEC-011).

Depends on :mod:`orchestrata_ultimate.core.protocols.base` for the
``ComponentProtocol`` base.
"""

import uuid
from dataclasses import dataclass, field
from datetime import datetime
from enum import StrEnum
from typing import Any, Protocol

from orchestrata_ultimate.core.base.traces import traces
from orchestrata_ultimate.core.protocols.base import ComponentProtocol

# ============================================================================
# Provider Manager Types (SPEC-011)
# ============================================================================


class ModelCapability(StrEnum):
    """LLM model capabilities for capability-based routing."""

    REASONING = "reasoning"
    CODING = "coding"
    VISION = "vision"
    TOOL_USE = "tool_use"
    LONG_CONTEXT = "long_context"
    EMBEDDING = "embedding"
    SUMMARIZATION = "summarization"


@traces(
    spec="011",
    story="US-004",
    reqs=["REQ-011-011", "REQ-011-012", "REQ-011-013", "REQ-011-014"],
)
class RoutingStrategy(StrEnum):
    """Strategy for provider selection."""

    COST_OPTIMIZED = "cost_optimized"
    LATENCY_OPTIMIZED = "latency_optimized"
    QUALITY_OPTIMIZED = "quality_optimized"
    ROUND_ROBIN = "round_robin"


@dataclass
class TokenUsage:
    """Token usage for a provider request."""

    input_tokens: int = 0
    output_tokens: int = 0
    total_tokens: int = 0


@dataclass
class CostRecord:
    """Cost record for a provider request."""

    input_cost: float = 0.0
    output_cost: float = 0.0
    total_cost: float = 0.0
    currency: str = "USD"


@dataclass
@traces(spec="011", story="US-003", reqs=["REQ-011-018"])
class CostEstimate:
    """Estimated cost for a provider request."""

    estimated_input_tokens: int = 0
    estimated_output_tokens: int = 0
    estimated_cost: CostRecord = field(default_factory=CostRecord)
    provider: str = ""
    model: str = ""


@dataclass
@traces(spec="103", story="US-001", reqs=["REQ-103-001"])
class Message:
    """A message in a conversation."""

    role: str = "user"
    content: str = ""
    # OpenAI-compatible tool-calling fields (optional, backward-compatible).
    tool_calls: list[dict[str, Any]] | None = None  # assistant: requested calls
    tool_call_id: str | None = None  # tool result: id of the call it answers
    name: str | None = None  # tool result: the tool's name
    reasoning_content: str | None = None  # thinking models must echo this back


@dataclass
@traces(spec="011", story="US-001", reqs=["REQ-011-004"])
@traces(spec="103", story="US-001", reqs=["REQ-103-002"])
class ProviderRequest:
    """Request to the provider manager."""

    request_id: str = field(default_factory=lambda: str(uuid.uuid4()))
    messages: list[Message] = field(default_factory=list)
    model: str | None = None
    capabilities: list[ModelCapability] | None = None
    parameters: dict[str, Any] | None = None
    routing_strategy: RoutingStrategy = RoutingStrategy.COST_OPTIMIZED
    max_tokens: int | None = None
    volk_id: str | None = None
    session_id: str | None = None
    project_id: str | None = None
    # Function/tool-calling (OpenAI-compatible). When set, forwarded to the
    # provider; the response may then carry tool_calls instead of/with content.
    tools: list[dict[str, Any]] | None = None
    tool_choice: str | None = None


@dataclass
@traces(spec="011", story="US-001", reqs=["REQ-011-005"])
@traces(spec="103", story="US-001", reqs=["REQ-103-003"])
class ProviderResponse:
    """Response from the provider manager."""

    content: str = ""
    model_used: str = ""
    provider_used: str = ""
    usage: TokenUsage = field(default_factory=TokenUsage)
    cost: CostRecord = field(default_factory=CostRecord)
    latency_ms: float = 0.0
    metadata: dict[str, Any] = field(default_factory=dict)
    tool_calls: list[dict[str, Any]] = field(default_factory=list)
    # Thinking models (deepseek-v4-pro) return reasoning_content that must be
    # echoed back in subsequent turns within the same conversation.
    reasoning_content: str | None = None


@dataclass
class BudgetStatus:
    """Budget status for a scope."""

    scope: str = ""
    scope_id: str = ""
    budget_limit_usd: float = 0.0
    spent_usd: float = 0.0
    remaining_usd: float = 0.0
    usage_percent: float = 0.0
    warning_threshold: float = 0.8
    is_warning: bool = False
    is_exceeded: bool = False


@dataclass
class UsageReport:
    """Aggregated usage report."""

    total_requests: int = 0
    total_tokens: int = 0
    total_cost: float = 0.0
    by_provider: dict[str, dict[str, Any]] = field(default_factory=dict)
    by_model: dict[str, dict[str, Any]] = field(default_factory=dict)


@dataclass
@traces(spec="011", story="US-005", reqs=["REQ-011-028"])
class ModelPricing:
    """Pricing configuration for a model."""

    input_per_1m: float = 0.0
    output_per_1m: float = 0.0
    capabilities: list[ModelCapability] = field(default_factory=list)
    context_window: int = 8192
    quality_rank: int = 50


@dataclass
@traces(spec="011", story="US-005", reqs=["REQ-011-028"])
class ModelInfo:
    """Information about an available model."""

    name: str = ""
    provider: str = ""
    capabilities: list[ModelCapability] = field(default_factory=list)
    context_window: int = 8192
    pricing: ModelPricing = field(default_factory=ModelPricing)


@dataclass
class ProviderConfig:
    """Configuration for a provider adapter."""

    api_key: str = ""
    base_url: str | None = None
    models: list[str] = field(default_factory=list)
    rate_limit_rpm: int = 60
    rate_limit_tpm: int = 100_000
    timeout_seconds: float = 30.0
    max_retries: int = 3
    pricing: dict[str, ModelPricing] = field(default_factory=dict)


@dataclass
@traces(spec="103", story="US-001", reqs=["REQ-103-003"])
class RawProviderResponse:
    """Raw response from a provider adapter before normalization."""

    content: str = ""
    input_tokens: int = 0
    output_tokens: int = 0
    model: str = ""
    metadata: dict[str, Any] = field(default_factory=dict)
    tool_calls: list[dict[str, Any]] = field(default_factory=list)


# ============================================================================
# Provider Manager Protocols (SPEC-011)
# ============================================================================


@traces(spec="011", story="US-006", reqs=["REQ-011-029"])
class ProviderProtocol(Protocol):
    """Protocol for provider adapter implementations."""

    async def complete(
        self,
        messages: list[Message],
        model: str,
        parameters: dict[str, Any],
    ) -> RawProviderResponse:
        """Send completion request to provider."""
        ...

    @traces(spec="011", story="US-001", reqs=["REQ-011-028"])
    def get_models(self) -> list[ModelInfo]:
        """Return available models with metadata."""
        ...

    @traces(spec="011", story="US-001", reqs=["REQ-011-007"])
    def supports_capability(self, capability: ModelCapability) -> bool:
        """Check if provider supports a capability."""
        ...


@traces(spec="011", story="US-001", reqs=["REQ-011-001", "REQ-011-003"])
class ProviderManagerProtocol(ComponentProtocol, Protocol):
    """Unified LLM provider abstraction.

    Manages multiple LLM backends, providing request routing,
    load balancing, cost tracking, fallback chains, and rate limit management.
    """

    @traces(spec="011", story="US-001", reqs=["REQ-011-006"])
    async def execute(self, request: ProviderRequest) -> ProviderResponse:
        """Execute an LLM request. Handles routing, fallback, cost tracking."""
        ...

    @traces(spec="011", story="US-001", reqs=["REQ-011-018"])
    async def estimate_cost(self, request: ProviderRequest) -> CostEstimate:
        """Estimate cost for a request without executing it."""
        ...

    @traces(spec="011", story="US-001", reqs=["REQ-011-023"])
    async def get_usage(
        self,
        *,
        volk_id: str | None = None,
        session_id: str | None = None,
        project_id: str | None = None,
        date_from: datetime | None = None,
        date_to: datetime | None = None,
    ) -> UsageReport:
        """Query cumulative usage and cost."""
        ...

    @traces(spec="011", story="US-001", reqs=["REQ-011-024", "REQ-011-025"])
    def register_provider(
        self,
        name: str,
        provider: ProviderProtocol,
        config: ProviderConfig,
    ) -> None:
        """Register a provider adapter with configuration."""
        ...

    @traces(spec="011", story="US-001", reqs=["REQ-011-024"])
    def deregister_provider(self, name: str) -> bool:
        """Remove a provider. Returns True if found and removed."""
        ...

    @traces(spec="011", story="US-001", reqs=["REQ-011-045"])
    async def get_remaining_budget(
        self,
        *,
        volk_id: str | None = None,
        project_id: str | None = None,
        portfolio_id: str | None = None,
    ) -> BudgetStatus:
        """Query remaining budget for a scope."""
        ...

    async def cancel(self, request_id: str) -> bool:
        """Cancel an in-flight request. Returns True if successfully cancelled."""
        ...

    @traces(spec="015", story="US-001", reqs=["REQ-015-055"])
    def get_provider_health(self) -> dict[str, Any]:
        """Return health status of all registered providers."""
        ...


__all__ = [
    "ModelCapability",
    "RoutingStrategy",
    "TokenUsage",
    "CostRecord",
    "CostEstimate",
    "Message",
    "ProviderRequest",
    "ProviderResponse",
    "BudgetStatus",
    "UsageReport",
    "ModelPricing",
    "ModelInfo",
    "ProviderConfig",
    "RawProviderResponse",
    "ProviderProtocol",
    "ProviderManagerProtocol",
]