"""模板库端点的请求/响应 schema(F3 / 契约 §F3)。 snake_case;前端经 OpenAPI 生成 TS 类型消费。改字段 → 前端必须 `pnpm gen:api`。 单用户本地版:作者保存/复用提示词模板,可一键填入生成器的 brief/text。 `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, StringConstraints # 先去首尾空白再校验长度:纯空白(" ")strip 后为空 → min_length=1 不满足 → 422。 NonBlankStr = Annotated[str, StringConstraints(strip_whitespace=True, min_length=1)] class TemplateCreateRequest(BaseModel): """POST /templates:新建一条提示词模板。""" 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=通用)") class TemplateResponse(BaseModel): """模板视图(列出/创建后回显;snake_case)。""" id: uuid.UUID title: str body: str category: str | None = None tool_key: str | None = None