models.py 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. """流水线各环节的数据结构(pydantic)。字段对齐业务设计 创作知识-重构设计.md。"""
  2. from __future__ import annotations
  3. from typing import Literal, Optional
  4. from pydantic import BaseModel, Field
  5. KnowledgeType = Literal["what", "why", "how"]
  6. ScopeType = Literal["substance", "form", "feeling", "effect", "intent"]
  7. Stage = Literal["灵感", "选题", "脚本"]
  8. class Post(BaseModel):
  9. """fetch_post_detail 的产物:一条帖子的原始内容(文本 + 图片 + 视频)。"""
  10. id: str # xhs_<content_id>,复用为 ingest source.id
  11. platform: str = "xiaohongshu"
  12. url: str
  13. content_id: str
  14. title: str = ""
  15. content_type: str = "" # video / 图文
  16. body_text: str = ""
  17. topic_list: list[str] = Field(default_factory=list)
  18. image_urls: list[str] = Field(default_factory=list)
  19. video_urls: list[str] = Field(default_factory=list)
  20. author_id: Optional[str] = None
  21. author_name: Optional[str] = None
  22. raw: dict = Field(default_factory=dict) # 原始响应,整体落 ck_post.raw
  23. class ExtractedContent(BaseModel):
  24. """extract_content 的产物:多模态汇总后的真实内容。不直接用 body_text。"""
  25. text: str = "" # 汇总后的正文/讲解
  26. from_image: str = "" # 图片里提取到的知识要点
  27. from_video: str = "" # 视频里提取到的知识要点
  28. is_empty: bool = False # 多模态提取后仍无有效内容
  29. class ScreeningResult(BaseModel):
  30. """screen_post 的产物。"""
  31. passed: bool
  32. score: int = 0
  33. reason: str = ""
  34. class KnowledgeItem(BaseModel):
  35. """split_post 拆出的一个知识片段。knowledge_types 必须与非空的 what/why/how 一致。"""
  36. title: str
  37. knowledge_types: list[KnowledgeType]
  38. what: Optional[str] = None
  39. why: Optional[str] = None
  40. how: Optional[str] = None
  41. evidence: list[str] = Field(default_factory=list)
  42. class Scope(BaseModel):
  43. scope_type: ScopeType
  44. value: str # 具体标签,不只是大类名
  45. class Deconstruction(BaseModel):
  46. """deconstruct_item 的产物:阶段 + 作用域。"""
  47. stages: list[Stage] = Field(default_factory=list)
  48. scopes: list[Scope] = Field(default_factory=list)
  49. stage_reason: str = ""
  50. scope_reason: str = ""
  51. class IngestPayload(BaseModel):
  52. """build_ingest_payload 的产物:对齐 创作知识-重构设计.md §6 的 ingest 请求体。"""
  53. source: dict
  54. title: str
  55. content: str # JSON 字符串 {"what":...,"why":...,"how":...}
  56. dim_attributes: list[str]
  57. dim_creations: list[str]
  58. scopes: list[dict]
  59. custom_ext: list[dict] = Field(default_factory=list)