from __future__ import annotations from datetime import datetime from typing import List, Optional from uuid import uuid4 from pydantic import BaseModel, Field def generate_id() -> str: """Generate deterministic-looking ids for templates and categories.""" return uuid4().hex class VariableDefinition(BaseModel): """Schema describing each dynamic input value for a template.""" name: str = Field(..., description="变量唯一名称,用于在模板中引用") label: str = Field(..., description="变量可视化展示名称") description: Optional[str] = Field(None, description="变量说明提示") data_type: str = Field( "string", description="变量类型, 例如 string/number/boolean/options", ) required: bool = Field(False, description="是否为必填字段") default: Optional[str] = Field(None, description="默认值") class TemplateBase(BaseModel): name: str category: str description: Optional[str] = None output_description: Optional[str] = None call_method: Optional[str] = None input_variables: List[VariableDefinition] = Field(default_factory=list) template_body: str = Field(..., description="Jinja2 模板正文") class TemplateCreate(TemplateBase): pass class TemplateUpdate(BaseModel): name: Optional[str] = None category: Optional[str] = None description: Optional[str] = None output_description: Optional[str] = None call_method: Optional[str] = None input_variables: Optional[List[VariableDefinition]] = None template_body: Optional[str] = None class TemplateRecord(TemplateBase): id: str = Field(default_factory=generate_id) created_at: datetime = Field(default_factory=datetime.utcnow) updated_at: datetime = Field(default_factory=datetime.utcnow) class TemplateRenderRequest(BaseModel): template_id: str parameters: dict class TemplatePreviewRequest(BaseModel): template_body: str parameters: dict = Field(default_factory=dict) class TemplateRenderResponse(BaseModel): rendered_text: str