import datetime from sqlalchemy import ( Column, String, Float, Integer, Boolean, DateTime, Text, JSON, ForeignKey, ) from sqlalchemy.orm import declarative_base, relationship Base = declarative_base() class ModelRecord(Base): __tablename__ = "models" id = Column(String(100), primary_key=True) name = Column(String(200), nullable=False) provider = Column(String(50), nullable=False) # mock, ollama, openai, anthropic, gemini type = Column(String(50), default="LOCAL") # LOCAL, CLOUD, MOCK context_window = Column(Integer, default=8192) supports_coding = Column(Boolean, default=False) supports_reasoning = Column(Boolean, default=False) supports_vision = Column(Boolean, default=False) supports_tools = Column(Boolean, default=False) quality_score = Column(Float, default=0.7) speed_score = Column(Float, default=0.7) reliability_score = Column(Float, default=0.95) cost_per_input_token = Column(Float, default=0.0) cost_per_output_token = Column(Float, default=0.0) availability = Column(String(50), default="AVAILABLE") is_active = Column(Boolean, default=True) tier = Column(String(50), default="BALANCED") # FAST, BALANCED, POWER created_at = Column(DateTime, default=datetime.datetime.utcnow) updated_at = Column(DateTime, default=datetime.datetime.utcnow, onupdate=datetime.datetime.utcnow) class ProviderRecord(Base): __tablename__ = "providers" id = Column(String(50), primary_key=True) name = Column(String(100), nullable=False) status = Column(String(50), default="READY") # READY, CONNECTED, NOT_CONFIGURED, ERROR is_enabled = Column(Boolean, default=True) base_url = Column(String(500), nullable=True) updated_at = Column(DateTime, default=datetime.datetime.utcnow, onupdate=datetime.datetime.utcnow) class RoutingPolicyRecord(Base): __tablename__ = "routing_policies" id = Column(String(50), primary_key=True) name = Column(String(100), nullable=False) description = Column(String(500), nullable=True) quality_weight = Column(Float, default=0.35) cost_weight = Column(Float, default=0.25) speed_weight = Column(Float, default=0.20) capability_weight = Column(Float, default=0.15) reliability_weight = Column(Float, default=0.05) is_default = Column(Boolean, default=False) class RoutingRuleRecord(Base): __tablename__ = "routing_rules" id = Column(String(100), primary_key=True) name = Column(String(200), nullable=False) description = Column(String(500), nullable=True) priority = Column(Integer, default=0) is_enabled = Column(Boolean, default=True) condition_field = Column(String(100), nullable=False) # task_type, complexity, budget_percent, context_size condition_operator = Column(String(50), nullable=False) # ==, !=, >, <, >=, <=, contains condition_value = Column(String(200), nullable=False) action_type = Column(String(50), nullable=False) # ROUTE_TO, PREFER, FORCE_TIER, SET_POLICY action_target = Column(String(100), nullable=False) created_at = Column(DateTime, default=datetime.datetime.utcnow) class RequestRecord(Base): __tablename__ = "requests" request_id = Column(String(100), primary_key=True) timestamp = Column(DateTime, default=datetime.datetime.utcnow) prompt = Column(Text, nullable=False) task_type = Column(String(50), nullable=False) complexity = Column(Float, default=0.5) context_size = Column(Integer, default=0) reasoning_required = Column(Boolean, default=False) coding_required = Column(Boolean, default=False) routing_policy = Column(String(50), default="balanced") selected_model = Column(String(100), nullable=False) provider = Column(String(50), nullable=False) status = Column(String(50), default="SUCCESS") # SUCCESS, FAILED, FALLBACK fallback_used = Column(Boolean, default=False) original_model = Column(String(100), nullable=True) fallback_reason = Column(String(500), nullable=True) input_tokens = Column(Integer, default=0) output_tokens = Column(Integer, default=0) total_tokens = Column(Integer, default=0) estimated_cost = Column(Float, default=0.0) baseline_cost = Column(Float, default=0.0) cost_saved = Column(Float, default=0.0) routing_latency_ms = Column(Float, default=0.0) provider_latency_ms = Column(Float, default=0.0) total_latency_ms = Column(Float, default=0.0) time_to_first_token_ms = Column(Float, nullable=True) class RoutingDecisionRecord(Base): __tablename__ = "routing_decisions" decision_id = Column(String(100), primary_key=True) request_id = Column(String(100), ForeignKey("requests.request_id"), nullable=False) timestamp = Column(DateTime, default=datetime.datetime.utcnow) selected_model = Column(String(100), nullable=False) confidence = Column(Float, default=0.9) reasons = Column(JSON, default=list) candidate_scores = Column(JSON, default=dict) rejected_candidates = Column(JSON, default=dict) policy_used = Column(String(50), default="balanced") class ResponseRecord(Base): __tablename__ = "responses" response_id = Column(String(100), primary_key=True) request_id = Column(String(100), ForeignKey("requests.request_id"), nullable=False) timestamp = Column(DateTime, default=datetime.datetime.utcnow) model_id = Column(String(100), nullable=False) provider = Column(String(50), nullable=False) content = Column(Text, nullable=False) finish_reason = Column(String(50), default="stop") is_mock = Column(Boolean, default=False) class FeedbackRecord(Base): __tablename__ = "feedback" id = Column(String(100), primary_key=True) request_id = Column(String(100), ForeignKey("requests.request_id"), nullable=False) model_id = Column(String(100), nullable=False) task_type = Column(String(50), nullable=False) rating = Column(Integer, nullable=False) # 1 for thumbs up, -1 for thumbs down comment = Column(Text, nullable=True) timestamp = Column(DateTime, default=datetime.datetime.utcnow) class BudgetRecord(Base): __tablename__ = "budgets" id = Column(String(50), primary_key=True, default="default") daily_limit = Column(Float, default=10.0) monthly_limit = Column(Float, default=100.0) per_request_limit = Column(Float, default=1.0) current_daily_spend = Column(Float, default=0.0) current_monthly_spend = Column(Float, default=0.0) intervention_mode = Column(String(50), default="OPTIMIZE") # NORMAL, OPTIMIZE_80, CHEAP_95, BLOCK_100 updated_at = Column(DateTime, default=datetime.datetime.utcnow, onupdate=datetime.datetime.utcnow) class ExperimentRecord(Base): __tablename__ = "experiments" id = Column(String(100), primary_key=True) name = Column(String(200), nullable=False) description = Column(String(500), nullable=True) policy_a = Column(String(50), nullable=False) policy_b = Column(String(50), nullable=False) status = Column(String(50), default="ACTIVE") # ACTIVE, PAUSED, COMPLETED sample_count = Column(Integer, default=0) created_at = Column(DateTime, default=datetime.datetime.utcnow) class ExperimentRunRecord(Base): __tablename__ = "experiment_runs" id = Column(String(100), primary_key=True) experiment_id = Column(String(100), ForeignKey("experiments.id"), nullable=False) request_id = Column(String(100), ForeignKey("requests.request_id"), nullable=False) assigned_policy = Column(String(50), nullable=False) selected_model = Column(String(100), nullable=False) cost = Column(Float, default=0.0) latency_ms = Column(Float, default=0.0) feedback_rating = Column(Integer, nullable=True) timestamp = Column(DateTime, default=datetime.datetime.utcnow)