feat(web): AI 立项方案生成+预填(种子门控 + 按字段接受)
向导阶段(project 未建)一键推演结构化书级蓝图预填立项向导。 - 新 SPEC project_plan_spec(analyst 档,纯预览 reads/writes=())+ schema ProjectPlanResult(书名候选 + 时空背景/叙事结构/故事核心/结局设计/基调, 全字段默认值守解析韧性)+ 注册 SCHEMA_CATALOG;计数三处 21→22 + regen golden。 - 端点 POST /skills/project-plan/generate(不带 project 前缀,绕开 toolbox 404): 请求体序列化向导草稿为 project_context,复用 build_brief_context + run_generator; 种子门控(缺 genre/logline→422);请求 schema 加 max_length 上界。 - run_generator/_build_request 的 project_id 放宽 uuid.UUID|None(向导无 project)。 - 前端 wizard.ts 加 mapPlanResultToWizardForm(错配字段折进 premise 不静默丢)+ applyPlanPatch(仅回填空字段、保护已编辑)+ useProjectPlan hook + PlanAssistant。
This commit is contained in:
@@ -48,13 +48,14 @@ def _build_request(
|
||||
*,
|
||||
context: str,
|
||||
user_id: uuid.UUID,
|
||||
project_id: uuid.UUID,
|
||||
project_id: uuid.UUID | None,
|
||||
) -> LlmRequest:
|
||||
"""据 spec + 注入材料构造生成请求(纯函数,worldbuilder/character-gen 共用)。
|
||||
|
||||
`spec.system_prompt` → `system` 缓存断点前块(cache=True,不变量 #9);
|
||||
`context`(序列化的需求/约束/已有/已生成文本)→ `input`(断点后)。
|
||||
生成用 `run()` 非 `stream()`(要结构化产物,非流式正文)。
|
||||
`project_id` 可空——立项方案(⑤)在向导阶段跑,project 尚未建(usage_ledger.project_id 可空)。
|
||||
"""
|
||||
return LlmRequest(
|
||||
tier=spec.tier, # 不变量 #2:只传档位,不传 model
|
||||
@@ -138,12 +139,13 @@ async def run_generator(
|
||||
context: str,
|
||||
gateway: GatewayRun,
|
||||
user_id: uuid.UUID,
|
||||
project_id: uuid.UUID,
|
||||
project_id: uuid.UUID | None = None,
|
||||
) -> BaseModel:
|
||||
"""通用生成器执行器(T6):构请求 → `gateway.run` → 按 `spec.output_schema` 校验 parsed。
|
||||
|
||||
任一声明式生成器共用此路径(不绑定具体产物类型,据 spec 的 output_schema 校验)。
|
||||
**只读、不写库**(纯预览,不变量 #3);独立生成——网关失败直接上抛(端点处理),不静默吞。
|
||||
`project_id` 可空——立项方案(⑤)在向导阶段跑,project 尚未建(usage_ledger.project_id 可空)。
|
||||
"""
|
||||
expected = spec.output_schema
|
||||
if expected is None:
|
||||
|
||||
Reference in New Issue
Block a user