fix(backlog): 修评审 3 HIGH — resume chain_key 真值 / 模板空白校验 / 续写链 resume E2E
1. resume_chain 回报真 chain_key:从 awaiting job.result 读回(run 时 _chain_result 持久化),不再按 job.kind 推断(kind 恒为通用常量 "chain",从不在 SUPPORTED_CHAINS → 总错回退 draft_volume)。continue_volume 的 resume 回执现报真值。 2. 模板 title/body 拒纯空白:StringConstraints(strip_whitespace, min_length=1), " " strip 后为空 → 422。 3. 续写链 resume 路径 E2E:continue_volume 第 1 章冲突 → interrupt → awaiting → resume 带裁决 → done,断言 resume 回执 / job result chain_key="continue_volume" (回归守卫 #1)。 测试:+resume continue_volume 单测(chain_key 真值)+2 模板空白 422 单测 +1 续写链 resume E2E。重生成 TS 客户端(仅 description 文案变化)。
This commit is contained in:
@@ -2,21 +2,25 @@
|
||||
|
||||
snake_case;前端经 OpenAPI 生成 TS 类型消费。改字段 → 前端必须 `pnpm gen:api`。
|
||||
单用户本地版:作者保存/复用提示词模板,可一键填入生成器的 brief/text。
|
||||
`title`/`body` 非空(`min_length=1`,空 → FastAPI 422)。`category`/`tool_key` 可选。
|
||||
`title`/`body` 非空(先 strip 再 `min_length=1`,纯空白 → 422)。`category`/`tool_key` 可选。
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import uuid
|
||||
from typing import Annotated
|
||||
|
||||
from pydantic import BaseModel, Field
|
||||
from pydantic import BaseModel, Field, StringConstraints
|
||||
|
||||
# 先去首尾空白再校验长度:纯空白(" ")strip 后为空 → min_length=1 不满足 → 422。
|
||||
NonBlankStr = Annotated[str, StringConstraints(strip_whitespace=True, min_length=1)]
|
||||
|
||||
|
||||
class TemplateCreateRequest(BaseModel):
|
||||
"""POST /templates:新建一条提示词模板。"""
|
||||
|
||||
title: str = Field(min_length=1, description="模板标题")
|
||||
body: str = Field(min_length=1, description="模板正文(一键填入生成器的 brief/text)")
|
||||
title: NonBlankStr = Field(description="模板标题(非空,纯空白 → 422)")
|
||||
body: NonBlankStr = Field(description="模板正文(非空,一键填入生成器的 brief/text)")
|
||||
category: str | None = Field(default=None, description="可选分类")
|
||||
tool_key: str | None = Field(default=None, description="可选关联生成器(NULL=通用)")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user