"""Model configuration tables.""" from datetime import datetime from typing import Optional from sqlmodel import Field, SQLModel from agenteval.storage.db.core import _json_dumps, _json_loads, new_uuid, utc_now class ModelConfigDB(SQLModel, table=True): """Reusable external model connection configuration.""" __tablename__ = "model_configs" id: Optional[str] = Field(default_factory=new_uuid, primary_key=True) name: str = Field(index=True, unique=True) provider: str = "openai_compatible" capability: str = Field(index=True) endpoint_url: str model_name: Optional[str] = None vendor_name: str = "" input_modalities: str = '["text"]' output_modalities: str = '["text"]' context_window: Optional[int] = None max_output_tokens: Optional[int] = None supports_streaming: bool = False supports_tool_calling: bool = False supports_structured_output: bool = False supports_reasoning: bool = False region: str = "" documentation_url: Optional[str] = None api_key_encrypted: Optional[str] = None enabled: bool = True is_default: bool = False is_analysis_default: bool = False description: str = "" created_at: Optional[datetime] = Field(default_factory=utc_now) updated_at: Optional[datetime] = Field(default_factory=utc_now) def get_input_modalities(self) -> list[str]: return _json_loads(self.input_modalities) def get_output_modalities(self) -> list[str]: return _json_loads(self.output_modalities) def set_modalities(self, input_modalities: list[str], output_modalities: list[str]) -> None: self.input_modalities = _json_dumps(input_modalities) self.output_modalities = _json_dumps(output_modalities) class ScenarioModelBindingDB(SQLModel, table=True): """Bind one model configuration to a purpose within a scenario.""" __tablename__ = "scenario_model_bindings" scenario_id: str = Field(foreign_key="scenarios.id", primary_key=True) purpose: str = Field(primary_key=True) model_config_id: str = Field(foreign_key="model_configs.id", index=True)