schemas.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. """数据模型定义"""
  2. from enum import Enum
  3. from typing import Any, Dict, List, Optional
  4. from pydantic import BaseModel, Field
  5. class ConfigRequest(BaseModel):
  6. """OpenAI配置请求"""
  7. model_config = {"protected_namespaces": ()}
  8. api_key: str = Field(..., description="OpenAI API密钥")
  9. base_url: Optional[str] = Field(None, description="Base URL")
  10. model_name: str = Field("gpt-3.5-turbo", description="模型名称")
  11. class ConfigResponse(BaseModel):
  12. """配置响应"""
  13. success: bool
  14. message: str
  15. class ModelListResponse(BaseModel):
  16. """模型列表响应"""
  17. models: List[str]
  18. success: bool
  19. message: str = ""
  20. class FileUploadResponse(BaseModel):
  21. """文件上传响应"""
  22. success: bool
  23. message: str
  24. file_content: Optional[str] = None
  25. old_outline: Optional[str] = None
  26. class AnalysisType(str, Enum):
  27. """分析类型"""
  28. OVERVIEW = "overview"
  29. REQUIREMENTS = "requirements"
  30. class OutlineMode(str, Enum):
  31. """目录生成模式。"""
  32. FREE = "free"
  33. ALIGNED = "aligned"
  34. class AnalysisRequest(BaseModel):
  35. """文档分析请求"""
  36. file_content: str = Field(..., description="文档内容")
  37. analysis_type: AnalysisType = Field(..., description="分析类型")
  38. class OutlineItem(BaseModel):
  39. """目录项"""
  40. id: str
  41. title: str
  42. description: str
  43. source_requirement_id: Optional[str] = None
  44. source_requirement_title: Optional[str] = None
  45. children: Optional[List["OutlineItem"]] = None
  46. content: Optional[str] = None
  47. # 解决循环引用
  48. OutlineItem.model_rebuild()
  49. class OutlineResponse(BaseModel):
  50. """目录响应"""
  51. outline: List[OutlineItem]
  52. class OutlineChildrenResponse(BaseModel):
  53. """指定一级目录下的子目录响应。"""
  54. children: List[OutlineItem]
  55. class OutlineReviewResponse(BaseModel):
  56. """目录审核响应。"""
  57. passed: bool
  58. suggestions: List[str] = Field(default_factory=list)
  59. class TechnicalRequirementGroup(BaseModel):
  60. """技术评分大类。"""
  61. requirement_id: str
  62. title: str
  63. description: str
  64. detail_points: List[str] = Field(default_factory=list)
  65. class TechnicalRequirementGroupResponse(BaseModel):
  66. """技术评分大类提取响应。"""
  67. groups: List[TechnicalRequirementGroup]
  68. class OutlineRequest(BaseModel):
  69. """目录生成请求"""
  70. overview: str = Field(..., description="项目概述")
  71. requirements: str = Field(..., description="技术评分要求")
  72. mode: OutlineMode = Field(OutlineMode.FREE, description="目录生成模式")
  73. uploaded_expand: Optional[bool] = Field(False, description="是否已上传方案扩写文件")
  74. old_outline: Optional[str] = Field(
  75. None, description="上传的方案扩写文件解析出的旧目录JSON"
  76. )
  77. old_document: Optional[str] = Field(
  78. None, description="上传的方案扩写文件解析出的旧文档"
  79. )
  80. class ContentGenerationRequest(BaseModel):
  81. """内容生成请求"""
  82. outline: Dict[str, Any] = Field(..., description="目录结构")
  83. project_overview: str = Field("", description="项目概述")
  84. class ChapterContentRequest(BaseModel):
  85. """单章节内容生成请求"""
  86. chapter: Dict[str, Any] = Field(..., description="章节信息")
  87. parent_chapters: Optional[List[Dict[str, Any]]] = Field(
  88. None, description="上级章节列表"
  89. )
  90. sibling_chapters: Optional[List[Dict[str, Any]]] = Field(
  91. None, description="同级章节列表"
  92. )
  93. project_overview: str = Field("", description="项目概述")
  94. class ErrorResponse(BaseModel):
  95. """错误响应"""
  96. error: str
  97. detail: Optional[str] = None
  98. class WordExportOutlineItem(BaseModel):
  99. """Word 导出用目录项。"""
  100. id: str
  101. title: str
  102. description: Optional[str] = None
  103. children: Optional[List["WordExportOutlineItem"]] = None
  104. content: Optional[str] = None
  105. WordExportOutlineItem.model_rebuild()
  106. class WordExportRequest(BaseModel):
  107. """Word导出请求"""
  108. project_name: Optional[str] = Field(None, description="项目名称")
  109. outline: List[WordExportOutlineItem] = Field(..., description="目录结构,包含内容")