feat: T6.1 创作工具箱通用生成器框架地基 — 脑洞生成器 + run_generator

- schemas: Idea/IdeaListResult(脑洞生成器结构化产出,纯预览不入库)
- specs: brainstorm_spec(light 档,reads=[projects] writes=[])
- orchestrator: build_brief_context(brief_only 策略)+ 通用 run_generator
  (据 spec.output_schema 校验 parsed,不绑定具体类型,任一声明式生成器共用)
- 新增 13 测;两包 ruff/format/mypy 干净、252 passed 无回归

P1 第一波(@llm):证实「加生成器=加一份声明」。@backend T6.2/T6.3 待续。
This commit is contained in:
Yaojia Wang
2026-06-20 11:31:59 +02:00
parent 9b893a6c61
commit e8cccf7389
8 changed files with 308 additions and 1 deletions

View File

@@ -298,3 +298,30 @@ class CharacterGenResult(BaseModel):
default_factory=list,
description="生成的角色卡清单;无则空列表",
)
# ---- 创作工具箱 · 脑洞生成器结构化输出T6 通用生成器框架 · brainstorm----
class Idea(BaseModel):
"""单条脑洞:前提 + 钩子 + 适配题材(创作工具箱最简生成器产物)。
纯预览产物——不映射任何业务表、不入库(`brainstorm_spec.writes=[]`,不变量 #3
`genre_fit` 可缺(作者未限定赛道时由模型留空)。
"""
premise: str = Field(description="一句话脑洞/设定前提")
hook: str = Field(description="抓人钩子:为何让读者想追读")
genre_fit: str | None = Field(default=None, description="适配题材/赛道(可缺)")
class IdeaListResult(BaseModel):
"""脑洞生成器结构化产出一组脑洞T6 · 通用生成器框架首个最简生成器)。
声明式只读(不变量 #3纯预览端点同步返回不写任何业务表仅记 ledger
"""
ideas: list[Idea] = Field(
default_factory=list,
description="生成的脑洞清单;无则空列表",
)