1
0

writing.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. """
  2. 写作模型
  3. """
  4. from datetime import datetime
  5. from typing import Optional, List, Dict, Any
  6. from pydantic import BaseModel, Field
  7. from sqlalchemy import Column, Integer, String, DateTime, Text, Boolean, Float, JSON
  8. from sqlalchemy.ext.declarative import declarative_base
  9. Base = declarative_base()
  10. class WritingDB(Base):
  11. """写作数据库模型"""
  12. __tablename__ = "writing"
  13. id = Column(Integer, primary_key=True, index=True)
  14. title = Column(String(200), nullable=False)
  15. writing_type = Column(String(50), nullable=False) # review, summary, critique, proposal
  16. content = Column(Text)
  17. outline = Column(JSON) # 大纲结构
  18. sections = Column(JSON) # 章节内容
  19. citations = Column(JSON) # 引用信息
  20. metadata = Column(JSON) # 额外元数据
  21. quality_score = Column(Float, default=0.0)
  22. word_count = Column(Integer, default=0)
  23. status = Column(String(20), default="draft") # draft, reviewing, completed
  24. paper_ids = Column(JSON) # 参考论文ID列表
  25. user_id = Column(Integer, index=True)
  26. task_id = Column(Integer, index=True)
  27. created_at = Column(DateTime, default=datetime.utcnow)
  28. updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
  29. class Writing(BaseModel):
  30. """写作响应模型"""
  31. id: int
  32. title: str
  33. writing_type: str
  34. content: Optional[str] = None
  35. outline: List[Dict[str, Any]] = []
  36. sections: Dict[str, str] = {}
  37. citations: List[Dict[str, Any]] = []
  38. quality_score: float = 0.0
  39. word_count: int = 0
  40. status: str = "draft"
  41. created_at: datetime
  42. class Config:
  43. from_attributes = True
  44. class WritingCreate(BaseModel):
  45. """写作创建模型"""
  46. title: str = Field(..., min_length=1, max_length=200)
  47. writing_type: str = Field(..., regex=r'^(review|summary|critique|proposal)$')
  48. paper_ids: List[int] = []
  49. outline: Optional[List[Dict[str, Any]]] = None
  50. class WritingUpdate(BaseModel):
  51. """写作更新模型"""
  52. title: Optional[str] = None
  53. content: Optional[str] = None
  54. outline: Optional[List[Dict[str, Any]]] = None
  55. sections: Optional[Dict[str, str]] = None
  56. citations: Optional[List[Dict[str, Any]]] = None
  57. status: Optional[str] = None
  58. quality_score: Optional[float] = Field(None, ge=0.0, le=1.0)
  59. class LiteratureReview(BaseModel):
  60. """文献综述"""
  61. introduction: str
  62. methodology_review: str
  63. findings_synthesis: str
  64. discussion: str
  65. conclusion: str
  66. references: List[Dict[str, Any]]
  67. class PaperSummary(BaseModel):
  68. """论文总结"""
  69. background: str
  70. methods: str
  71. results: str
  72. conclusions: str
  73. significance: str
  74. class PaperCritique(BaseModel):
  75. """论文评述"""
  76. strengths: List[str]
  77. weaknesses: List[str]
  78. methodological_issues: List[str]
  79. interpretation_concerns: List[str]
  80. suggestions: List[str]
  81. class ResearchProposal(BaseModel):
  82. """研究提案"""
  83. background: str
  84. problem_statement: str
  85. research_questions: List[str]
  86. methodology: str
  87. expected_outcomes: str
  88. significance: str
  89. timeline: str
  90. class WritingSection(BaseModel):
  91. """写作章节"""
  92. title: str
  93. content: str
  94. subsections: List['WritingSection'] = []
  95. citations: List[str] = []
  96. # 解决前向引用
  97. WritingSection.model_rebuild()