From a11fd709fabda9bd5aba0c8a52b2033a33177ceb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Mon, 21 Sep 2026 13:11:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E6=AD=A5external=5Fgeneration=5Fjob?= =?UTF-8?q?=E8=A1=A8=E7=9B=AE=E5=BD=95=E7=9A=84provider=20checkpoint?= =?UTF-8?q?=E5=8F=A3=E5=BE=84=20-=20=E8=A1=A5=E8=AE=B0=20provider=5Fkind?= =?UTF-8?q?=20=E4=B8=8E=20provider=5Ftask=5Fid=20=E7=9A=84=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0=E5=AD=97=E6=AE=B5=E3=80=81=E7=A7=9F=E7=BA=A6=E6=A0=85?= =?UTF-8?q?=E6=A0=8F=E4=B8=8E=E7=A6=81=E6=AD=A2=E8=A6=86=E7=9B=96=E8=AF=AD?= =?UTF-8?q?=E4=B9=89=20-=20=E8=AF=B4=E6=98=8E=20checkpoint=20=E4=B8=8D?= =?UTF-8?q?=E8=BF=9B=20payload=E3=80=81read=20model=E3=80=81BFF=20?= =?UTF-8?q?=E5=93=8D=E5=BA=94=E4=B8=8E=E5=85=AC=E5=BC=80=E5=A5=91=E7=BA=A6?= =?UTF-8?q?=20-=20=E4=BA=8B=E4=BB=B6=E8=A1=A8=E7=9B=AE=E5=BD=95=E8=A1=A5?= =?UTF-8?q?=E5=85=85=20provider=5Fcheckpoint=20=E4=BA=8B=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/【后端架构】server-rs与SpacetimeDB数据契约-2026-05-15.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/【后端架构】server-rs与SpacetimeDB数据契约-2026-05-15.md b/docs/【后端架构】server-rs与SpacetimeDB数据契约-2026-05-15.md index dfab9a03e..694ea1dea 100644 --- a/docs/【后端架构】server-rs与SpacetimeDB数据契约-2026-05-15.md +++ b/docs/【后端架构】server-rs与SpacetimeDB数据契约-2026-05-15.md @@ -359,6 +359,8 @@ Responses 的终态载荷既是工具调用的恢复源,也是正文的恢复 - 2026-08-06 原子提交对上述 source-only / slice 条款的修正:“provider 原图已持久化”只能解释为 OSS 对象已上传并验证,不再表示 project resource / account asset 已先行入库。source-only、透明整图和成功切片必须先完成最终选择,再作为一份 prepared commit 连同 canvas/job/receipt 一次提交;未选中或失败分支不得留下正式 resource / asset 部分记录。 +- 2026-09-21 provider checkpoint 追加:主表末尾追加可选 `provider_kind` / `provider_task_id`,只服务外部 provider 异步任务的 at-most-once submit。`set_external_generation_job_provider_checkpoint_and_return` 复用与 phase 完全相同的 `job_id + worker_id + lease_token` running 租约栅栏,写入成功时追加一条 `provider_checkpoint` 事件;目标行已有 checkpoint 时直接拒绝覆盖,因此崩溃后重新 claim 的 attempt 只能读到既有 provider task id 继续查询与落库,不会二次 submit、二次扣费。checkpoint 不写入 `request_payload_json`,也不进入任何用户可见 read model、BFF 响应或公开契约,provider task id 只作服务端 checkpoint 与对账;`external_generation_job_summary` 不投影这两个字段,轻量摘要按无 checkpoint 返回。 + ### `external_generation_job_summary` - Rust 结构体:`ExternalGenerationJobSummary` @@ -374,6 +376,8 @@ Responses 的终态载荷既是工具调用的恢复源,也是正文的恢复 - 用途:外部生成任务审计事件表,按 `job_id` 和 `owner_user_id` 记录 `enqueued`、`claimed`、`lease_renewed`、`completed`、`failed`、`acknowledged` 等状态转换事实。状态转换只能由 SpacetimeDB procedure 写入,不由前端或 worker 直接改表;该表用于追溯任务生命周期和排障,不替代 `external_generation_job` 当前状态。 - 保留策略:事件只会随已确认通知的终态任务由 `prune_external_generation_job_history_and_return` 原子删除,不支持按事件单独清理,以保持任务、摘要和审计链一致。单次事务最多删除 256 条事件;若事件未删完,任务和摘要暂不删除,维护脚本用同一个 job cursor 重试剩余事件。 +- 2026-09-21 事件类型追加:provider 异步任务在 submit 成功后落 checkpoint 时追加一条 `provider_checkpoint` 事件,记录 provider task id 与写入 worker;该事件只作服务端追溯与对账,不进入用户可见 read model。 + ### `ai_text_chunk` - Rust 结构体:`AiTextChunk`