omnirouter-api / src /schemas.py
sumitrwk's picture
Upload 33 files
b534a53 verified
"""
In LLMs, you are querying a probabilistic text engine.
If you ask it for an age, it might give you 25, or it might give you "Twenty-five", or it might say "Based on the data, the user is 25 years old."
If your system expects 25 but gets a whole sentence, your code crashes in production.
**Schemas act as the bouncers at the door of your application. We use Pydantic to define the exact shape of the data we expect.**
"""
from pydantic import BaseModel, Field
from typing import Dict, Any, Optional
# 1. THE CONFIGURATION SCHEMA
# This dictates how our router behaves. Notice how we set smart defaults.
class RouterConfig(BaseModel):
"""Configuration for how the OmniRouter should route the request."""
provider: str = Field(
default="openai",
description="The LLM provider to use (e.g., 'openai', 'anthropic', 'local')"
)
model: str = Field(
default="gpt-4-turbo",
description="The specific model string to use"
)
# Defensive Engineering: An LLM temperature cannot be less than 0 or greater than 2.
# ge = greater than or equal to, le = less than or equal to.
temperature: float = Field(
default=0.7,
ge=0.0,
le=2.0,
description="Creativity score for the model"
)
max_retries: int = Field(
default=3,
description="How many times to retry on API failure or rate limit"
)
# --- NEW CAPABILITY --- Added
fallback_provider: Optional[str] = Field(
default=None,
description="If the primary provider completely fails, switch to this one"
)
fallback_model: Optional[str] = Field(
default=None,
description="The model to use for the fallback provider"
)
# 2. THE STANDARDIZED OUTPUT SCHEMA
# This solves the main pain point from our README.
# Whether OpenAI or Anthropic answers, the rest of our app gets THIS exact object.
class LLMResponse(BaseModel):
"""The standardized output format returned from ANY provider."""
content: str = Field(description="The actual text response generated by the LLM")
provider_used: str = Field(description="Which provider actually generated this response")
model_used: str = Field(description="The specific model used")
# We track tokens heavily for cost optimization (Week 14 concept)
prompt_tokens: int = Field(default=0, description="Tokens used in the prompt")
completion_tokens: int = Field(default=0, description="Tokens used in the completion")
# We will calculate this automatically later
cost_estimate: float = Field(default=0.0, description="Estimated cost of this call in USD")