"""Pydantic models for form generator API.""" from typing import Any, Dict, List, Optional from pydantic import BaseModel, Field class GenerateFormRequest(BaseModel): """Request for full form generation from description.""" description: str = Field(description="User description of the form to generate") conversation_context: Optional[List[str]] = Field(default=None, description="Recent chat messages for context") user_goals: Optional[List[str]] = Field(default=None, description="User-stated goals for the form") preferred_field_types: Optional[List[str]] = Field(default=None, description="Preferred field types to favor") must_have_logic: Optional[bool] = Field(default=None, description="Whether conditional logic is required") class FormFieldRef(BaseModel): """Minimal field representation for refine context.""" id: str = "" type: str = "" label: str = "" required: bool = False placeholder: Optional[str] = None description: Optional[str] = None options: Optional[List[Dict[str, Any]]] = None settings: Optional[Dict[str, Any]] = None validation: Optional[Dict[str, Any]] = None conditionalLogic: Optional[Dict[str, Any]] = None class RefineFormRequest(BaseModel): """Request for surgical refine (diff) of existing form.""" user_request: str = Field(description="User's edit request in plain language") current_fields: List[Dict[str, Any]] = Field(description="Current form fields as JSON-serializable list") current_title: str = Field(default="", description="Current form title") conversation_context: Optional[List[str]] = Field(default=None, description="Recent chat messages for context") class RefineDiffChange(BaseModel): """Partial update for an existing field (only include keys that changed).""" id: str label: Optional[str] = None required: Optional[bool] = None placeholder: Optional[str] = None description: Optional[str] = None options: Optional[List[Dict[str, Any]]] = None settings: Optional[Dict[str, Any]] = None validation: Optional[Dict[str, Any]] = None conditionalLogic: Optional[Dict[str, Any]] = None class RefineDiffAddition(BaseModel): """New field to add (must have id, type, label, required).""" id: str type: str label: str required: bool = False placeholder: Optional[str] = None description: Optional[str] = None options: Optional[List[Dict[str, Any]]] = None settings: Optional[Dict[str, Any]] = None validation: Optional[Dict[str, Any]] = None class RefineDiff(BaseModel): """Diff returned by refine: changes, additions, removals.""" changes: List[Dict[str, Any]] = Field(default_factory=list) additions: List[Dict[str, Any]] = Field(default_factory=list) removals: List[str] = Field(default_factory=list) class GenerateFormResponse(BaseModel): """Response from generate-form: form JSON and metadata.""" formJSON: Dict[str, Any] = Field(description="Form with title, description?, fields") metadata: Dict[str, Any] = Field(default_factory=dict) warnings: Optional[List[str]] = None class RefineFormResponse(BaseModel): """Response from refine-form: diff only.""" diff: RefineDiff = Field(description="Changes, additions, removals") class PlanFormQuestionOption(BaseModel): """Single option for a select/radio clarification question.""" value: str = Field(description="Option value") label: str = Field(description="Display label") class PlanFormQuestion(BaseModel): """One clarifying question to show before generate/refine.""" id: str = Field(description="Unique id for the question") label: str = Field(description="Question text") type: str = Field(default="single", description="single | multi | text") options: Optional[List[PlanFormQuestionOption]] = Field(default=None) required: bool = Field(default=True) class PlanFormRequest(BaseModel): """Request for plan-form-request (clarification planning).""" description: str = Field(description="User description of the form they want") current_fields: Optional[List[Dict[str, Any]]] = Field(default=None) current_title: Optional[str] = Field(default="") class PlanFormResponse(BaseModel): """Response from plan-form-request.""" should_ask_questions: bool = Field(description="Whether to show clarifying questions") questions: List[PlanFormQuestion] = Field(default_factory=list) reasoning_summary: str = Field(default="", description="Short summary for UI status")