from __future__ import annotations from typing import Optional from pydantic import BaseModel, ConfigDict, Field class PromptAssetReleaseCreateRequest(BaseModel): model_config = ConfigDict(extra="ignore") body_snapshot: str = Field(min_length=1) notes: Optional[str] = None class PromptAssetReleaseActionRequest(BaseModel): model_config = ConfigDict(extra="ignore") reason: Optional[str] = None class PromptAssetReleaseCheckRunRequest(BaseModel): model_config = ConfigDict(extra="ignore") reason: Optional[str] = None class PromptGoldenCaseCreateRequest(BaseModel): model_config = ConfigDict(extra="ignore") case_name: str = Field(min_length=1, max_length=255) input_payload: dict = Field(default_factory=dict) expected_contract: Optional[dict] = None expected_contains: Optional[str] = None case_type: str = Field(default="regression", max_length=32) priority: str = Field(default="blocking", max_length=24) scenario_key: Optional[str] = Field(default=None, max_length=128) tags: list[str] = Field(default_factory=list) notes: Optional[str] = None class PromptGoldenCaseFromCallRequest(BaseModel): model_config = ConfigDict(extra="ignore") case_name: Optional[str] = Field(default=None, max_length=255) notes: Optional[str] = None class PromptReplayRunCreateRequest(BaseModel): model_config = ConfigDict(extra="ignore") mode: str = Field(default="contract_smoke", max_length=32) case_status: str = Field(default="active", max_length=32) max_cases: int = Field(default=20, ge=1, le=100) include_llm: bool = False judge_enabled: bool = True reason: Optional[str] = None