Introduce ModelPurpose.ANALYSIS and a globally-unique is_analysis_default marker on chat model configs so campaign analysis can resolve its model. Service rejects disabled or non-chat configs; repo clears the previous holder on set. Documented the analysis role in CONTEXT.md.
105 lines
3.5 KiB
Python
105 lines
3.5 KiB
Python
"""Request and response schemas for the model configuration center."""
|
|
|
|
from datetime import datetime
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
from agenteval.models import ModelCapability, ModelModality, ModelProtocol
|
|
from agenteval.storage.db import ModelConfigDB, iso_utc
|
|
|
|
|
|
class ModelConfigCreate(BaseModel):
|
|
name: str = Field(min_length=1, max_length=100)
|
|
provider: ModelProtocol = ModelProtocol.OPENAI_COMPATIBLE
|
|
capability: ModelCapability
|
|
endpoint_url: str
|
|
model_name: str | None = None
|
|
vendor_name: str = ""
|
|
input_modalities: list[ModelModality] = Field(default_factory=lambda: [ModelModality.TEXT], min_length=1)
|
|
output_modalities: list[ModelModality] = Field(default_factory=lambda: [ModelModality.TEXT], min_length=1)
|
|
context_window: int | None = Field(default=None, gt=0)
|
|
max_output_tokens: int | None = Field(default=None, gt=0)
|
|
supports_streaming: bool = False
|
|
supports_tool_calling: bool = False
|
|
supports_structured_output: bool = False
|
|
supports_reasoning: bool = False
|
|
region: str = ""
|
|
documentation_url: str | None = None
|
|
api_key: str | None = None
|
|
enabled: bool = True
|
|
is_default: bool = False
|
|
is_analysis_default: bool = False
|
|
description: str = ""
|
|
|
|
|
|
class ModelConfigUpdate(ModelConfigCreate):
|
|
clear_api_key: bool = False
|
|
|
|
|
|
class ModelConfigResponse(BaseModel):
|
|
id: str
|
|
name: str
|
|
provider: ModelProtocol
|
|
capability: ModelCapability
|
|
endpoint_url: str
|
|
model_name: str | None
|
|
vendor_name: str
|
|
input_modalities: list[ModelModality]
|
|
output_modalities: list[ModelModality]
|
|
context_window: int | None
|
|
max_output_tokens: int | None
|
|
supports_streaming: bool
|
|
supports_tool_calling: bool
|
|
supports_structured_output: bool
|
|
supports_reasoning: bool
|
|
region: str
|
|
documentation_url: str | None
|
|
has_api_key: bool
|
|
enabled: bool
|
|
is_default: bool
|
|
is_analysis_default: bool
|
|
description: str
|
|
created_at: str | None
|
|
updated_at: str | None
|
|
|
|
@classmethod
|
|
def from_db(cls, config: ModelConfigDB) -> "ModelConfigResponse":
|
|
return cls(
|
|
id=config.id or "",
|
|
name=config.name,
|
|
provider=ModelProtocol(config.provider),
|
|
capability=ModelCapability(config.capability),
|
|
endpoint_url=config.endpoint_url,
|
|
model_name=config.model_name,
|
|
vendor_name=config.vendor_name,
|
|
input_modalities=[ModelModality(item) for item in config.get_input_modalities()],
|
|
output_modalities=[ModelModality(item) for item in config.get_output_modalities()],
|
|
context_window=config.context_window,
|
|
max_output_tokens=config.max_output_tokens,
|
|
supports_streaming=config.supports_streaming,
|
|
supports_tool_calling=config.supports_tool_calling,
|
|
supports_structured_output=config.supports_structured_output,
|
|
supports_reasoning=config.supports_reasoning,
|
|
region=config.region,
|
|
documentation_url=config.documentation_url,
|
|
has_api_key=bool(config.api_key_encrypted),
|
|
enabled=config.enabled,
|
|
is_default=config.is_default,
|
|
is_analysis_default=config.is_analysis_default,
|
|
description=config.description,
|
|
created_at=iso_utc(config.created_at),
|
|
updated_at=iso_utc(config.updated_at),
|
|
)
|
|
|
|
|
|
class ModelConfigReference(BaseModel):
|
|
scenario_id: str
|
|
scenario_name: str
|
|
purpose: str
|
|
|
|
|
|
class ModelConnectionTestResponse(BaseModel):
|
|
ok: bool
|
|
message: str
|
|
tested_at: datetime
|