schemas.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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. prerequisite: Optional[str] = Field(None, description="变量前提条件,如 rerank_reason=PIN_CONSECUTIVE")
  15. preview_value: Optional[str] = Field(None, description="预览时的示例值")
  16. data_type: str = Field(
  17. "string",
  18. description="变量类型, 例如 string/number/boolean/options",
  19. )
  20. required: bool = Field(False, description="是否为必填字段")
  21. default: Optional[str] = Field(None, description="默认值")
  22. class TemplateBase(BaseModel):
  23. name: str
  24. category: str
  25. device_type: str = Field(..., description="设备类型:wash(洗涤)/dry(干衣)")
  26. machine_model: str = Field(..., description="机型标识,如 x11/hplus/ultra/f2_multi/seeker/x11_ultra")
  27. template_type: str = Field(..., description="模板类型:common/time_popular/time_custom/time_season/time_care/time_environmental/time_weather/time_health")
  28. type_id: Optional[str] = Field(None, description="机型硬件ID,如 201c51890c31c3080501002180083900000000000000000000000000000040")
  29. zone_ids: List[str] = Field(default_factory=list, description="区域ID列表,如 ['2','3']")
  30. card_type: str = Field("single_card", description="卡片类型:single_card/multi_card")
  31. redis_key_second: Optional[str] = Field(None, description="Redis二级key,如 broadcast-template-jinja:single_card:wash:common")
  32. redis_keys_first: List[str] = Field(default_factory=list, description="Redis一级key列表(由type_id+zone_id+card_type+recommend_type组合生成)")
  33. reusable_from: Optional[str] = Field(None, description="复用来源模板ID,如果为空则为独立模板")
  34. reuse_targets: List[str] = Field(default_factory=list, description="被哪些模板复用(目标模板ID列表)")
  35. description: Optional[str] = None
  36. output_description: Optional[str] = None
  37. call_method: Optional[str] = None
  38. input_variables: List[VariableDefinition] = Field(default_factory=list)
  39. template_body: str = Field(..., description="Jinja2 模板正文")
  40. class TemplateCreate(TemplateBase):
  41. pass
  42. class TemplateUpdate(BaseModel):
  43. name: Optional[str] = None
  44. category: Optional[str] = None
  45. device_type: Optional[str] = None
  46. machine_model: Optional[str] = None
  47. template_type: Optional[str] = None
  48. type_id: Optional[str] = None
  49. zone_ids: Optional[List[str]] = None
  50. card_type: Optional[str] = None
  51. description: Optional[str] = None
  52. output_description: Optional[str] = None
  53. call_method: Optional[str] = None
  54. input_variables: Optional[List[VariableDefinition]] = None
  55. template_body: Optional[str] = None
  56. class TemplateRecord(TemplateBase):
  57. id: str = Field(default_factory=generate_id)
  58. created_at: datetime = Field(default_factory=datetime.utcnow)
  59. updated_at: datetime = Field(default_factory=datetime.utcnow)
  60. class TemplateRenderRequest(BaseModel):
  61. template_id: str
  62. parameters: dict
  63. class TemplatePreviewRequest(BaseModel):
  64. template_body: str
  65. parameters: dict = Field(default_factory=dict)
  66. analyze_only: bool = Field(False, description="是否只分析变量,不渲染")
  67. common_body: Optional[str] = Field(None, description="关联的common模板正文(用于合并宏定义和列表变量)")
  68. class TemplateRenderResponse(BaseModel):
  69. rendered_text: str
  70. class MachineConfig(BaseModel):
  71. """机型硬件配置"""
  72. label: str = Field(..., description="显示名称,如 X11")
  73. type_ids: dict = Field(..., description="设备类型到type_id的映射,如 {'wash': 'xxx', 'dry': 'xxx'}")
  74. zone_ids: dict = Field(..., description="设备类型到zone_ids的映射,如 {'wash': ['2','3'], 'dry': ['0']}")
  75. card_type: str = Field("single_card", description="卡片类型:single_card/multi_card")
  76. class MachineConfigCreate(BaseModel):
  77. model_key: str = Field(..., description="机型标识,如 x12")
  78. label: str = Field(..., description="显示名称")
  79. type_ids: dict = Field(..., description="设备类型到type_id的映射")
  80. zone_ids: dict = Field(..., description="设备类型到zone_ids的映射")
  81. card_type: str = Field("single_card", description="卡片类型")
  82. reuse_from: Optional[str] = Field(None, description="复用来源机型,如 x11")
  83. class MachineConfigUpdate(BaseModel):
  84. label: Optional[str] = None
  85. type_ids: Optional[dict] = None
  86. zone_ids: Optional[dict] = None
  87. card_type: Optional[str] = None
  88. reuse_from: Optional[str] = None