Files
writer-work-flow/apps/api/ww_api/schemas/style.py
Yaojia Wang 345cc73965 fix(txn+security): 仓储改 flush + 启动校验/兜底 + job.error 脱敏 + SSE 异常硬化
P0-1 SqlCredentialStore/save_draft 由自提交改 flush,端点/服务统一 commit
  (新增 CredentialStore.commit() 统一提交点;token 刷新落库显式提交);
  补多凭据一请求中途失败整体回滚集成测试。
P0-2 启动校验 _fernet(enc_key) 快速失败 + catch-all Exception → ErrorEnvelope;
  credential_enc_key 改 SecretStr。
P0-3 run_job 异常分类:AppError 存 code+message,其余存通用文案不泄 str(exc)。
P0-4 评审/正文 SSE 失败先发 error 事件,尾部 commit 包 try/except。
P1-4 max_version 加 FOR UPDATE 行锁消除 TOCTOU。
P1-5 scan_overdue 谓词下推 + 批量 UPDATE RETURNING。
P1-10 移除 OAuth user_code 日志。
P2 provider_deps 改调网关 build_adapter;accept_service Committable Protocol;
  CORS 白名单收窄;request_id 安全字符集白名单;stdlib 日志接管;读端点 404 校验;
  httpx timeout;测试用合法 Fernet key;类型化响应模型(JobResponse/DimensionEntry/
  ReviewConflictView/selling_points)+路由 ErrorEnvelope responses(供 codegen)。
2026-06-21 19:32:24 +02:00

59 lines
1.7 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.

"""文风学习 + 回炉端点的请求/响应 schemaC3 扩 / ARCH §7.2 / UX §6.9 / §8.3)。
snake_case命名契约见 memory/gotchas。前端经 OpenAPI→TS 客户端消费——改字段
须 `pnpm gen:api` 重生成。
"""
from __future__ import annotations
import uuid
from typing import Literal
from pydantic import BaseModel, Field
class StyleLearnRequest(BaseModel):
"""学文风:上传样本正文(前端可读文件转文本)+ 模式(首学 / 更新)。"""
samples: list[str] = Field(min_length=1)
mode: Literal["create", "update"] = "create"
class StyleLearnResponse(BaseModel):
"""学文风受理:返回 job_id长任务走 `GET /jobs/{id}` 轮询)。"""
job_id: uuid.UUID
class DimensionEntry(BaseModel):
"""单个文风维度:名称 + 判定值 + 原文证据摘录(强类型,替代裸 dict[str, Any])。"""
name: str
value: str
evidence: list[str] = Field(default_factory=list)
class StyleFingerprintResponse(BaseModel):
"""最新文风指纹(`GET /style`):完整 16 维(名称/值/证据)+ 版本(对齐 UX §6.9)。
DB 存两列并行 dict`{name:value}` + `{name:[evidence]}`);响应合并为
`list[DimensionEntry]`,给 TS 客户端强类型(替代弱类型 `dict[str, Any]`)。
"""
dimensions: list[DimensionEntry] = Field(default_factory=list)
version: int
class RefineRequest(BaseModel):
"""回炉:重写选中段(可选改写指令)。"""
segment: str = Field(min_length=1)
instruction: str | None = None
class RefineResponse(BaseModel):
"""回炉结果:原段 + 重写段(不写库,作者采纳经既有 draft 自动保存合入)。"""
original: str
refined: str