from __future__ import annotations from typing import Any, Literal, Optional from pydantic import BaseModel, ConfigDict, Field class FeedbackAssetPromoteRequest(BaseModel): model_config = ConfigDict(extra="ignore") asset_type: Literal["golden", "failure"] prompt_key: Optional[str] = None workflow_type: Optional[str] = None notes: Optional[str] = None pair_with_asset_id: Optional[int] = None pair_role: Optional[Literal["chosen", "rejected"]] = None pair_reason: Optional[str] = None class ReplyIterationJudgeRunCreateRequest(BaseModel): model_config = ConfigDict(extra="ignore") asset_id: int class ReplyIterationCandidateCreateRequest(BaseModel): model_config = ConfigDict(extra="ignore") judge_run_id: int class PromptReleaseCreateRequest(BaseModel): model_config = ConfigDict(extra="ignore") prompt_key: str body_snapshot: str notes: Optional[str] = None class PromptTrialCreateRequest(BaseModel): model_config = ConfigDict(extra="ignore") title: str hypothesis: str target_metric: str prompt_key: str baseline_release_id: int candidate_release_id: int scope_json: dict[str, Any] = Field(default_factory=dict) class PromptTrialDecisionRequest(BaseModel): model_config = ConfigDict(extra="ignore") decision: Literal["accepted", "rejected", "rolled_back"] result_summary: dict[str, Any] = Field(default_factory=dict)