第11环裂变重写:对齐上线版 split.js 一次LLM出N套完整笔记包
架构从"扇出N个GenerationTask各跑完整管道"改为"一次LLM调用直接出N套
完整笔记包(N=1~5)",落 FissionNote 表 + 独立展示页。
后端:
- 018迁移:fission_notes 表(文案JSON+score+passed+imagePlan+images+status)
- fission_prompt:FISSION_SYSTEM+三档参考度(low/mid/high)+normalize_tags+品类兜底
- fission_pipeline:一次LLM出N套→各评分(@80合格线)→排序→落库,不达标标
needs_optimization 非丢弃;apiports 503 回落 codeproxy gpt-5.5 强档兜底
- fission_images:每套串行调现有生图接口(零改动image_gen/storyboard)
- tasks.py:run_fission_pipeline Celery task,删旧扇出注入
- api/v1/fission:进度聚合FissionNote + GET /fission/{id}/notes(剥内部字段)
前端:FissionProgress对齐状态机 + N套独立展示页 + FissionNoteCard
测试:test_fission_engine(19)+test_fission_pipeline(5) 全过;104 全量回归绿
实测task5(fanout=2,mid)端到端跑通:一次出2套→seq0=85过/seq1=79标优化→
生图codeproxy/edits→1024×1536去AI化→task completed→notes端点返完整数据
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -51,3 +51,53 @@ class FissionTask(Base):
|
||||
__table_args__ = (
|
||||
Index("idx_fission_tasks_workspace_id", "workspace_id"),
|
||||
)
|
||||
|
||||
|
||||
class FissionNote(Base):
|
||||
"""裂变产出的单套完整笔记包(一次LLM出N套,每套落一行)。
|
||||
|
||||
对齐上线版 split.js handleContentSplit:每套含 标题/正文/标签/封面/imagePlan,
|
||||
带评分+裂变维度+生图结果。北哥在独立展示页查看。
|
||||
"""
|
||||
__tablename__ = "fission_notes"
|
||||
|
||||
id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=True)
|
||||
fission_id: Mapped[int] = mapped_column(
|
||||
BigInteger, ForeignKey("fission_tasks.id", ondelete="CASCADE"), nullable=False
|
||||
)
|
||||
workspace_id: Mapped[int] = mapped_column(
|
||||
BigInteger, ForeignKey("workspaces.id", ondelete="CASCADE"), nullable=False
|
||||
)
|
||||
seq: Mapped[int] = mapped_column(
|
||||
Integer, default=0, nullable=False, comment="第几套(0起)"
|
||||
)
|
||||
# 完整笔记包 JSON:title/content/tags/coverTitle/imagePlan/dimension/audience/scene/painPoint/keywords
|
||||
note_json: Mapped[str | None] = mapped_column(
|
||||
Text, comment="完整笔记包JSON"
|
||||
)
|
||||
# 生图结果 JSON:[{role,name,image_url,error}...]
|
||||
images_json: Mapped[str | None] = mapped_column(
|
||||
Text, comment="生图结果JSON"
|
||||
)
|
||||
score: Mapped[int] = mapped_column(Integer, default=0, nullable=False)
|
||||
passed: Mapped[bool] = mapped_column(
|
||||
Integer, default=0, nullable=False, comment="是否过线(>=80)"
|
||||
)
|
||||
needs_optimization: Mapped[bool] = mapped_column(
|
||||
Integer, default=0, nullable=False, comment="不达标降级草稿标记"
|
||||
)
|
||||
dimension: Mapped[str | None] = mapped_column(
|
||||
String(64), comment="裂变维度: 换角度/换痛点/换人群"
|
||||
)
|
||||
status: Mapped[str] = mapped_column(
|
||||
String(20), default="pending", nullable=False,
|
||||
comment="状态: pending/scored/image_done/failed"
|
||||
)
|
||||
created_at: Mapped[datetime] = mapped_column(
|
||||
DateTime, server_default=func.now(), nullable=False
|
||||
)
|
||||
|
||||
__table_args__ = (
|
||||
Index("idx_fission_notes_fission_id", "fission_id"),
|
||||
Index("idx_fission_notes_workspace_id", "workspace_id"),
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user