Files
beige/backend/app/models/fission.py
yangqianqian d85dcd401b 第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>
2026-06-18 11:17:37 +08:00

104 lines
3.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
app/models/fission.py — fission_tasks
Alembic 010 第11环裂变引擎1爆款→N套完整笔记包
reference_level: low/mid/high参考程度
status: pending/generating/done/failed
"""
from datetime import datetime
from sqlalchemy import (
BigInteger, DateTime, ForeignKey,
Index, Integer, String, Text, func,
)
from sqlalchemy.orm import Mapped, mapped_column
from app.core.database import Base
class FissionTask(Base):
"""裂变任务1爆款→N套完整笔记包第11环在工作台内呈现。"""
__tablename__ = "fission_tasks"
id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=True)
workspace_id: Mapped[int] = mapped_column(
BigInteger, ForeignKey("workspaces.id", ondelete="CASCADE"), nullable=False
)
# 爆款源笔记内容(文案+图描述JSON存储
source_note: Mapped[str | None] = mapped_column(
Text, comment="爆款源笔记内容(文案+图描述JSON存储"
)
# 参考程度low/mid/high
reference_level: Mapped[str] = mapped_column(
String(10), default="mid", nullable=False,
comment="参考程度: low/mid/high"
)
# 裂变套数默认3套
fanout_count: Mapped[int] = mapped_column(
Integer, default=3, nullable=False,
comment="裂变套数默认3套"
)
# 状态机
status: Mapped[str] = mapped_column(
String(20), default="pending", nullable=False,
comment="状态: pending/generating/done/failed"
)
created_at: Mapped[datetime] = mapped_column(
DateTime, server_default=func.now(), nullable=False
)
__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起"
)
# 完整笔记包 JSONtitle/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"),
)