form-generatro / schema.py
GitHub Action
Deploy form-generator from GitHub: eef63a23b3bc1ffad4a0dc85f8592e8481938620
62065d2
Raw
History Blame Contribute Delete
4.56 kB
"""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")