schemas.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. from __future__ import annotations
  2. from datetime import datetime
  3. from typing import List, Optional
  4. from uuid import uuid4
  5. from pydantic import BaseModel, Field
  6. def generate_id() -> str:
  7. """Generate deterministic-looking ids for templates and categories."""
  8. return uuid4().hex
  9. class VariableDefinition(BaseModel):
  10. """Schema describing each dynamic input value for a template."""
  11. name: str = Field(..., description="变量唯一名称,用于在模板中引用")
  12. label: str = Field(..., description="变量可视化展示名称")
  13. description: Optional[str] = Field(None, description="变量说明提示")
  14. data_type: str = Field(
  15. "string",
  16. description="变量类型, 例如 string/number/boolean/options",
  17. )
  18. required: bool = Field(False, description="是否为必填字段")
  19. default: Optional[str] = Field(None, description="默认值")
  20. class TemplateBase(BaseModel):
  21. name: str
  22. category: str
  23. description: Optional[str] = None
  24. output_description: Optional[str] = None
  25. call_method: Optional[str] = None
  26. input_variables: List[VariableDefinition] = Field(default_factory=list)
  27. template_body: str = Field(..., description="Jinja2 模板正文")
  28. class TemplateCreate(TemplateBase):
  29. pass
  30. class TemplateUpdate(BaseModel):
  31. name: Optional[str] = None
  32. category: Optional[str] = None
  33. description: Optional[str] = None
  34. output_description: Optional[str] = None
  35. call_method: Optional[str] = None
  36. input_variables: Optional[List[VariableDefinition]] = None
  37. template_body: Optional[str] = None
  38. class TemplateRecord(TemplateBase):
  39. id: str = Field(default_factory=generate_id)
  40. created_at: datetime = Field(default_factory=datetime.utcnow)
  41. updated_at: datetime = Field(default_factory=datetime.utcnow)
  42. class TemplateRenderRequest(BaseModel):
  43. template_id: str
  44. parameters: dict
  45. class TemplatePreviewRequest(BaseModel):
  46. template_body: str
  47. parameters: dict = Field(default_factory=dict)
  48. class TemplateRenderResponse(BaseModel):
  49. rendered_text: str