Commit Graph

4888 Commits

Author SHA1 Message Date
k88936 5ee9a1e2e2 共享记忆补记本轮 3D 收口的三条决策与一条踩坑
- decision-log:视图输入显式化并改按文档 view-key 形态发出、派生来源取自请求 source、失败态提交开新一代
- pitfalls:失败态沿用同一尝试代次会让主按钮只是重现同一次失败,以及新增提交入口时的判断口径
2026-09-23 18:59:54 +08:00
k88936 f198b7a6d0 multiview 视图输入显式化为 url / fileToken,线上按文档 view-key 形态发出
- 契约新增 Model3dViewInput(url / fileToken 的 tagged enum),views 的四个视图都改用它,裸字符串在契约层即被拒绝
- platform-tripo 不再走 SDK 的位置数组形态:按 Tripo 文档推荐的 view-key 构造 inputs,值写成显式 {url} / {file_token},种类由契约字段决定、链路上不再猜前缀
- 视图校验(front 必填、至少两张、空白按未提供)与 inputs 构造合并成一条路径,不再两处重复规则
- 新增 4 条定向用例钉住发出的 JSON 形状、空白视图、视图数量与 taskId 复用;契约用例补齐裸字符串与视图内未知字段被拒
- 重新生成 ts-rs 绑定与导出索引,技术方案同步 multiview 输入口径
2026-09-23 18:59:05 +08:00
k88936 5ebc6df6ae 3D 失败态下主按钮也开新一代,不再重现同一次失败
- Model3dGenerationModal 主按钮与「重试」共用失败态重置后的 dialog(refreshModel3dAttemptNonce),失败态点主按钮不再沿用旧幂等键
- 新增用例:失败态主按钮提交的代次必须变化、状态回到 idle,且按钮保持可点
2026-09-23 18:51:15 +08:00
k88936 df6694c4a9 图生 3D 的资源派生来源改为取自请求的 source
- job.rs 新增 Model3dJobRequest::source_resource_id():resource 来源带出画布资源 id,素材库来源与文生 3D 没有可登记的来源资源
- worker.rs 落库时资源行与素材行都改用它:资源行记派生来源,素材行优先指向本项目的资源行、只落素材库时退回请求里的来源资源
- 新增单测钉住三种来源(resource / asset / 文生)的取值,不再拿本次新生成的输出资源 id 冒充来源
2026-09-23 18:51:10 +08:00
k88936 6b1114356c 59/60/61/65 按决定不修复,改为在代码里写清取舍
- worker.rs:说明 last_error_message 是落库且前端直接展示的摘要,只取 provider message,不塞内部 reason/taskStatus(#59)
- platform-tripo error.rs:说明 ADR 0001 要求平台层不带出 SDK 错误模型,Io/Serde 只保留文本(#60)
- platform-tripo mapping.rs:说明 Tripo 文档把 generated_image_url 列为 text_to_model 固定字段,按 ADR 0001 失败关闭保留必填(#61)
- platform-tripo image_to_model/client.rs:说明 PublicUrl 只做非空白校验的边界条件与将来接外部地址时的校验位置(#65)
2026-09-23 18:04:29 +08:00
k88936 985955205c 把 checkpoint 分支写实为 at-most-once 硬约束而非续跑能力
- worker.rs 模块注释明确 Tripo job 固定 max_attempts = 1,崩溃后租约耗尽直接终态失败、不会被重新 claim,因此不存在续跑路径
- worker.rs 说明 existing_checkpoint 是防御性硬约束,checkpoint 的日常用途是人工对账
- 技术方案与 ADR 把「崩溃后重新 claim 只查询」改写为「不重新 claim,带 checkpoint 的路径绝不二次 submit」
- 实施计划与里程碑同步 checkpoint 语义,不再宣称续跑
2026-09-23 17:50:04 +08:00
k88936 85219ad1d4 提交前先判预算,耗尽时不再发起计费的 submit
- run_model3d_job 在没有 checkpoint 的分支上先走 ensure_submit_budget:
  预算已被解析 / 排队耗光时直接按 provider 超时终态失败,不去白花一次 provider 提交
- 续跑(已有 checkpoint)分支不受影响,仍然只轮询不提交
- 新增用例:预算耗尽必须拒绝提交,仍有预算必须放行
2026-09-23 17:45:22 +08:00
k88936 42b4315b4f 可重试性改为显式判定,不再由 status 缺省推断
- TripoError::Request 增加 retryable 字段:由产生错误的一方按真实分类判定
- 传输层失败按 reqwest 的 is_timeout / is_connect 分类(新增 transport_error_is_transient,
  以及状态集合 http_status_is_transient)
- SDK 的 Error::Request 只在带瞬时状态码、或底层 reqwest 错误确实瞬时时可重试;
  source 为空(空 body / 格式错误 / 缺 data 字段)不再重试
- 产物客户端构造失败标为不可重试;无数据推进、body 读取失败与长度不一致标为可重试
- 新增四组用例:显式标记、状态集合、SDK 分类,以及用真实 reqwest 错误(连接被拒 vs 非法地址)验证分类
- 同步技术方案:写明「可重试性由产生错误处判定」的口径
2026-09-23 17:40:18 +08:00
k88936 f6f41f22c3 geometry_quality 预检只拒绝 detailed,standard 按不传处理
- validate_generation_options 对非 v3.1 / v3.0 家族只在取值 detailed 时拒绝,
  与 quad / smart_low_poly / generate_parts「只拒绝启用值」的处理对称
- 新增 wire_geometry_quality:不支持的家族把 standard 收敛成不发(等价于 provider 默认档),
  三个 endpoint 的请求映射都过这一层,避免 provider 因「不支持该字段」整单拒绝
- 新增两组表驱动用例:非 v3 家族 standard 放行 / detailed 拒绝,以及映射层的收敛结果
- 同步技术方案:写明「预检只拒绝启用值」与映射层收敛 standard 的口径
2026-09-23 17:33:51 +08:00
k88936 508cf30f5d 共享记忆补记本轮 3D 收口的四条决策
- 产物 content type 不再兜底:白名单外一律按上游内容不合法失败(并作废预览条目里的回落口径)
- 两个改价字段 geometryQuality / textureQuality 允许缺省,按 standard 计价
- provider 客户端构造即校验配置(零超时 / 空白凭据)与产物重试包住整个 body 记录在同一条
2026-09-23 17:02:16 +08:00
k88936 b33a8a141c 3D 产物下载的重试改为覆盖整个响应体
- download_model / download_rendered_image 把「取响应头 + 读完 body」作为一次可重试事务,
  每次尝试都重新取响应头并整体重下,不做断点续传
- body 传输失败与长度不一致归一成可重试的传输错误(不再带 HTTP 200),HTTP 状态只留在文案里
- 新增 TripoArtifactBytes(读完的产物)并公开 download_model / download_rendered_image 的 max_bytes 上限;
  超限按 OutputSchema 失败且不重试,流式句柄 TripoDownloadedArtifact 收回 crate 内部
- api-server 的 read_artifact 改成对完整产物做落库前校验(只判空),体积上限转由调用方传入
- smoke 示例改为一次写入完整字节;新增「body 中途断开后整体重下成功」与「超限不重试」两个用例
- 同步技术方案与实施计划:把「只重试响应头」的描述改成「重试包住整个 body」
2026-09-23 17:01:40 +08:00
k88936 347d066fc5 3D 允许 projectId 为空的文档与共享记忆同步
- 实施计划(API 契约):交付验收补上「只给 assetFolderId 合法」这一条。
- 里程碑(API 契约):落点口径写成「两个都给合法、只给 assetFolderId(无画布工程)同样合法」。
- 实施计划(前端入口):发送门禁改成「两个落点至少给一个」,projectId 可空、缺失时不发该字段,没有工程时结果只落素材库。
- 共享记忆 decision-log:在 G5 条目的「代价与取舍」里把「3D 仍要求 projectId」改成「同日按用户决定改为与其它工具一致」,并追加一条收尾说明(门禁常量改名、canvasCompletion 只随 projectId 下发、无工程时的读回边界)。
- 验证:node scripts/check-doc-index.mjs(221 份 Markdown 通过)、npm run check:encoding、git diff --check 通过。
2026-09-23 16:42:15 +08:00
k88936 a4132616d8 3D 产物 content type 只认字节或槽位白名单,去掉兜底
- 删除 fallback_extension 与「未知声明原样放行 + 扩展名兜底」的归一逻辑
- 槽位白名单收敛为唯一映射表(content type ↔ 对象键扩展名),跨槽位类型返回 None
- resolve_artifact_content_type 改为返回 Result:字节认不出且声明不在白名单时按 502 失败,
  不再把 text/plain 之类的声明连同拼出来的 .glb 扩展名落进 OSS 与 asset_object
- 错误体只回显截断到 64 字符的声明值,避免把任意长度的 provider 文本带进响应
- 重写 storage 测试:新增白名单外声明、跨槽位类型与字节认不出三类用例
- 同步技术方案:说明白名单范围与「不做任何兜底」的口径
2026-09-23 16:39:15 +08:00
k88936 6a7cf294a0 3D 生成请求允许缺省 textureQuality 并按 standard 计价
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust smoke (pull_request) Has been cancelled
- PricingParamView::validate 不再要求 texture=true 时显式给出 textureQuality,缺省按 standard 计价
- 只有显式 detailed / extreme 才命中 hdTexture / ultraTexture 加价,缺省不改变报价
- v2.5 拒绝任何显式 texture_quality,必填规则会让 H25 + texture=true 永远不可达
- texture=false 仍禁止出现贴图档位,原有冲突校验与用例保持不变
- 同步技术方案:说明 geometryQuality / textureQuality 两个字段允许缺省的共同理由
2026-09-23 16:30:22 +08:00
k88936 427b9f19a1 3D 生成请求允许缺省 geometryQuality 并按 standard 计价
- PricingParamView::validate 去掉 geometryQuality 必填,缺省按 standard 计入定价
- 只有显式 detailed 才命中 hdGeometry 加价,缺省不会改变报价
- 新增缺省几何质量的定价用例(v3.1 与 v2.5 两条路径),并把它从必填字段用例里移除
- 同步技术方案:说明该字段允许缺省的原因,v2.5 / P1 / P2 因 provider 不支持该参数而必须允许缺省
2026-09-23 16:24:18 +08:00
k88936 ffee739774 platform-tripo 构造配置时拒绝零超时与空白凭据
- TripoSettings::new 改为返回 Result:request_timeout 必须大于零,api_key / base_url 不能是空白
- 新增 TripoSettings::validate 与 TripoError::Configuration,字段是公开的,因此 TripoProviderClient::new 在使用前再校验一次
- 拒绝零超时的理由是同一个值存在两种语义:tokio::time::timeout 立即超时,reqwest 却当成不超时
- api-server 构造入口把构造失败按既有 503 口径映射,并补全 TripoError 的匹配分支
- smoke 示例与 platform-tripo 测试跟进新的构造签名,新增零超时 / 空白凭据用例
2026-09-23 16:16:27 +08:00
k88936 825dde6602 3D 落点与结果引用对齐其它生成工具的文档同步
- 技术方案:落点改为「至少一个、两个可同给」,补上归一在预检之前完成并写回请求(预检值 = 队列载荷 = 落库值);完成结果读取补上双落点与平坦引用的说明。
- 技术方案素材库一节改为「素材库行已接 model3d 分支(预览图渲染 + 拖入画布)」,后台 renderer / 精选 read model / 公开 grant 仍未接。
- 里程碑与实施计划(API 契约、前端入口、结果前端预览)同步新口径:两个落点同给合法、前端同时发 projectId + assetFolderId + assetLabel、素材库行已进入。
- 共享记忆 decision-log 追加本次决策(原因、代价、影响面、验证方式),并在旧的「二选一」条目上标注 2026-09-23 追加修正。
- 验证:node scripts/check-doc-index.mjs(221 份 Markdown 通过)、npm run check:encoding、git diff --check 通过。
2026-09-23 15:55:02 +08:00
k88936 a753ac4cd8 3D 前端提交跟随其它画布生成工具同时落素材库
- buildModel3dSubmissionPlan 接收当前素材夹与素材名,与图片/图标/音效等工具一样同时发 projectId + assetFolderId + assetLabel(素材名缺省回落本次结果标题),没有素材夹时只发 projectId。
- useModel3dGenerationTask 新增 assetFolderId 入参,画布生成链路把当前素材夹透传下来;结果仍走既有画布路径读回,刷新素材库沿用 applyGeneratedProjectSnapshot 的既有行为,不新增 3D 专用刷新。
- 素材库行加 model3d 分支:缩略图按预览图(asset.src)渲染,objectKey(模型本体 .glb)不参与图片签名,与画布 3D 卡片的 objectKey={null} 口径一致,避免素材行去加载模型文件。
- 用例补齐:请求体同时带两个落点、无素材夹时不带 assetFolderId/assetLabel、素材夹只 trim 且素材名回落标题,以及素材行 3D 预览不签模型对象键 / 普通图片仍按 objectKey 换签名地址。
- 验证:npx vitest run src/components/image-editor/model3d-generation src/components/image-editor/ImageCanvasAssetRowView.test.tsx(67 passed)、npm run typecheck、check:encoding / git diff --check 通过。
2026-09-23 15:54:39 +08:00
k88936 158f9b741d 3D 落点放宽为「至少一个」并把结果引用改成平坦字段
- 校验层不再要求「projectId 与 assetFolderId 恰好一个」:两个都不给 400 点名 projectId,canvasCompletion 与「没有 projectId」同现 400 点名 canvasCompletion,两个都给按合法处理;与其它画布生成工具同一口径。
- 落点预检改成对给出的每个落点逐个定点查,出错字段只在「只给一个」时点名该键,两个都给无法归因回落到 target;去掉已经没有意义的旧用法注释。
- 结果侧 Model3dGenerationTargetRef 从 tagged enum(kind=projectResource/assetLibrary)改成与请求落点同形的平坦可选字段 resourceId / assetId,两个落点都写就两个都带;生成绑定同步变宽。
- worker 的 target_ref 改为按「写了哪条落点行」分别带 ID,完成结果用例改成断言平坦字段且只落项目资源时不得凭空出现 assetId;契约测试对称覆盖「只落素材库」形态。
- 验证:cargo test -p api-server tripo3d::(56 passed)、cargo test -p shared-contracts、npm run contracts:model3d:generate、check:rustfmt / check:encoding / git diff --check 通过。
2026-09-23 15:54:07 +08:00
k88936 c64bfc3867 3D 预览产物 content type 改为按字节识别
- storage.rs 新增 sniff_preview_content_type(PNG / JPEG / WebP),resolve_artifact_content_type 改为按槽位判定:预览与模型一样先嗅探字节,嗅不出才回落声明值(最终仍回落 image/webp)
- 修掉 provider / CDN 不写或写错 Content-Type 时 PNG 预览被写成 image/webp 并传播到 OSS metadata、asset_object.content_type 与生成结果的问题;对象键扩展名随之正确
- 定向用例重写为「字节优先 / 未知回落」两组,替换原先钉住「预览不嗅探」的用例
- 技术方案与决策记录同步该口径,并记录与其它图片链路(bgfilter / VectorEngine / 生成图落 OSS 适配器)的一致性对照
2026-09-23 15:28:23 +08:00
k88936 1fa413a352 图生 3D 图片输入的失败语义同步到文档
- 实施计划写明预检失败的状态码口径:400 只覆盖跨 owner / 未登记 / 已删除 / kind 不符,403 / 409 / 5xx 保留原状态码,缺对象键 502
- 决策记录新增同日条目,说明收窄收敛范围与缺对象键改判 502 的原因、代价与验证方式
2026-09-23 14:59:52 +08:00
k88936 11d1324857 3D 图生输入解析的测试改为断言可观察行为
- 删掉 include_str! 嵌源码、按 token 断言「没出现列工程 / 列素材库」的守卫:它测的是实现文本,改名、换格式、调顺序都会误伤
- 定点查询用例改成覆盖 resource / asset 两个分支,断言每个分支只发起一次按 ID 的查询、且对象键原样来自记录
- 模块文档写明定点查询由注入签名收口(一个 ID → 一条记录),失败语义与测试口径一并写实
2026-09-23 14:58:44 +08:00
k88936 1be77d2f99 3D 图生输入解析只收敛「引用不可用」状态码
- resolve_source_object_key_with 的 4xx 收敛从 is_client_error() 收窄为 400 / 404,不再把 403 服务身份校验失败与 409 并发冲突也说成「图片必须是已登记资源」
- 与模块注释「只有基础设施失败保留原状态码」的实际口径统一,403 / 409 / 5xx 一律按原状态码上报
- 定向用例改名 image_source_resolution_only_collapses_unavailable_references,覆盖 400 / 404 收敛与 403 / 409 / 500 保留
2026-09-23 14:51:09 +08:00
k88936 8a8c00fbb6 3D 图生输入解析把「缺对象键」改判为服务端问题
- resolve_source_object_key_with 在记录已解析但缺对象键时返回 502 与 model3d-image-source-object-key-missing,不再复用「引用不可用」的 400
- 未登记 / 跨 owner / 已删除仍收敛成同一句 400;缺对象键口径与 editor_project::validate_editor_reference_id_for_owner 的 BAD_GATEWAY 对齐
- 定向用例改名为 image_source_resolution_reports_missing_object_key_as_server_side_failure,断言状态码与 reason
2026-09-23 14:49:18 +08:00
k88936 9edb4e5f80 3D 提交侧归一落点并删掉 Standard 顶层 result 透传
- 提交侧新增归一并写回请求:项目 ID 只 trim,素材夹 ID 走其它工具同一套 normalize_generated_asset_folder_id(project / 旧 folder-* 收敛到 owner 默认素材夹),素材名走 resolve_editor_generated_asset_label(trim、截断到上限、缺省「3D 模型」),保证预检值 = 队列载荷 = 落库值。
- 队列行 sourceEntityId 改用共用 editor_generation_source_entity_id(项目 ID,缺项目回落 job kind),不再拿素材夹 ID 顶替。
- 按你的决定删掉 Standard 消费者顶层 result 逐字透传:标准消费者只回来源身份,3D 结果与图片等画布任务一样靠画布 placement / 素材行读回,连带删掉「3D 生成没有画布读回路径」这条错注释。
- 技术方案与共享记忆同步落点归一、身份口径与结果读取路径;job.rs 补归一用例(含素材名截断)。
- 验证:cargo test -p api-server(1193 passed)、cargo test -p api-server tripo3d::(55 passed)、npx vitest run src/components/image-editor/model3d-generation src/components/image-editor/model3d-preview(63 passed)、check:rustfmt / check:encoding / check-doc-index / git diff --check 通过。
2026-09-23 14:36:50 +08:00
k88936 21b9d850c7 3D 落点契约文档同步为平坦可选字段
- 技术方案的请求契约段改成平坦可选 projectId / canvasCompletion / assetFolderId / assetLabel,并把「二选一 + 同现拒绝」的口径与落点预检路径写清。
- 里程碑与实施计划把 tagged enum 的表述改成平坦字段与二选一验收口径。
- 前端入口与 Worker 计划的落点表述去掉 target 分支写法,改为只发 projectId / 素材库落点产出 assetId。
- 决策记录补一条:撤销请求侧 tagged enum、复用统一定点预检、素材名缺省回落默认名,并记下未做的目录归一与原因。
2026-09-23 14:03:13 +08:00
k88936 f659ddfcf0 3D 生成前端提交体跟随平坦落点契约
- buildModel3dSubmissionPlan 不再拼 tagged target,把 projectId 与 canvasCompletion 直接摊进请求体;画布链路仍只落项目资源。
- submitModel3dGenerationRequest 的提交体注释同步落点字段改名。
- 请求体、幂等键与排队用例改为断言扁平落点字段。
- 定向验证:npx vitest run src/components/image-editor/model3d-generation src/components/image-editor/model3d-preview(63 passed)、npm run typecheck 通过。
2026-09-23 14:02:57 +08:00
k88936 fd48829c24 3D 生成请求落点改为平坦可选字段并复用统一落点预检
- shared-contracts 的 text-to-model / image-to-model 请求用平坦可选 projectId / canvasCompletion / assetFolderId / assetLabel 取代 tagged enum target,删除 Model3dGenerationTarget 及其契约测试。
- 同步 ts-rs 生成绑定:新增四个可选字段并移除 Model3dGenerationTarget.ts 与 barrel 导出。
- api-server 校验层改按「项目资源 / 素材库二选一」校验,缺失、冲突与空白值都返回 400 并点名具体字段。
- 落点预检改用其它付费编辑器生成共用的 preflight_editor_generation_target_and_return,素材库落点不再读整库。
- worker 按平坦字段落库,素材名缺省回落到 MODEL3D_DEFAULT_ASSET_LABEL。
- 定向验证:cargo test -p shared-contracts 与 cargo test -p api-server tripo3d:: 全绿(54 passed)。
2026-09-23 14:02:44 +08:00
k88936 48ba8b3133 3D 结果序列化失败不再落「完成但 result 为空」的终态
- job_result_payload 改为返回 Result,失败按 500 上报服务端问题,去掉 result:null 兜底形状
- worker 持久化前用 ? 把失败交给既有失败链路:任务按失败终态处理并冲正扣费
- worker 测试夹具同步改为 expect,断言完成结果可序列化
2026-09-23 12:15:02 +08:00
k88936 83913785ae 补齐 Tripo 3D 错误映射的剩余分支测试
- 增补 SDK 参数错误、无状态码 Api、Api 5xx、Sdk 兜底与传输错误的 502 用例,断言只回固定文案、不回显上游报文与 task id
- 增补 map_request_error 的字段口径用例:平台字段路径、provider 字段名与字段未知时不写 field
- 增补 map_pricing_error / map_pricing_store_error / oss_unavailable 的状态码、provider 与 reason 断言
2026-09-23 12:12:26 +08:00
k88936 5b488f5a59 补齐定价版本术语与 Tripo 技术方案的乐观锁说明
- CONTEXT.md 补「定价版本(乐观锁)」术语,并在 3D 生成定价条目写明权威事实源与公开投影
- Tripo 技术方案补后台保存的版本比对与 409 语义
2026-09-23 11:51:34 +08:00
k88936 5285832acb 3D 查看器容器宽高比变化时按新比例重算取景
- framing 新增 resolveModel3dViewerReframedCameraPosition:保留朝向与相对缩放并钳进新缩放范围
- scene 的 ResizeObserver 不再只认首次尺寸,宽高比变化超过 1% 就重算取景
- resetView 改为按容器当前宽高比重算,不再复用可能过期的取景
- 首帧直接套用创建时的取景,避免重复一次顶点采样
- 补 framing 测试:朝向保留、相对缩放保留、缩放钳制与方向退化
2026-09-23 11:51:26 +08:00
k88936 f4083dcb6d 3D 查看器给签名地址的兄弟资源补回鉴权 query
- loader 新增 resolveModel3dViewerSourceQuery / resolveModel3dViewerResourceUrl,只补模型目录下的资源地址
- glTF / FBX 解析改用带 URL 修饰器的专用 LoadingManager,不动全局 DefaultLoadingManager
- 补测试:query 提取与片段剔除、目录内外的补与不补、多文件 glTF 兄弟资源解析
2026-09-23 11:48:48 +08:00
k88936 c5a718ac0e 3D 定价后台可编辑补齐实现状态、验收证据与踩坑记录
- 主规范补公开读模型投影口径、覆盖文件缺段补齐、旧形状覆盖文件的发布前置门禁与加价项一致性约束
- 实施计划补实现状态表、逐条判据的验收证据与真实环境待验收项;里程碑标记已实现待验收
- 后端架构文档补 upsert input 的期望版本与事务内 CAS 语义
- pitfalls 补「省略即沿用会静默覆盖」与「公开读模型形状不能跟着存储形状走」两条
- decision-log 补实现期的四个口径:公开投影取文生加价项、CAS 复用 updated_at、覆盖文件缺段按默认补齐、旧形状不兼容改发布门禁
2026-09-23 11:48:30 +08:00
k88936 c901f6954f 后台模型定价页新增 3D 两段编辑区块与乐观锁提示
- 新增 3D 定价区块:按端点分「文生 3D / 图生 3D」,各渲染模型版本 × {无贴图, 带贴图} 底价与加价项输入,键全部来自接口返回
- 抽出 adminEditorGenerationPricing 纯模块:数值解析、提交前 ≥1 校验、加价项中文标签、保存请求组装
- 保存整段回传 models 与 3D 两段,并带 expectedUpdatedAtMicros;409 提示重新读取且提供入口
- 后端未配置 3D 段时提示并禁用保存,不在页面新建或停用整段
- API 类型与客户端补两段、定价版本与保存请求类型;补组件与纯模块用例
2026-09-23 11:44:44 +08:00
k88936 ee4a9434fa 后台定价读取带版本、保存整段必填并做事务内乐观锁
- shared-contracts 新增定价版本冲突标记,module 与 api-server 共用一处声明
- SpacetimeDB upsert input 增加期望版本,事务内比对不一致即整笔拒绝(种子写入显式不比对)
- 定价 store 记录当前版本,读取路径带出 updated_at 微秒值
- 后台 GET 返回 models / 3D 两段 / updatedAtMicros,POST 要求两段显式给出且带期望版本
- 缺 3D 段 400、版本不匹配 409,退役 with_previous_model3d 与「省略即沿用」用例
- 绑定按 input 新字段重新生成,模块补乐观锁比对用例
2026-09-23 11:38:23 +08:00
k88936 952bc1ccaa 覆盖文件缺 3D 段时按受控默认价补齐,不再把 3D 整段算成未配置
- 新增 backfill_legacy_model3d_pricing:旧覆盖文件整段没有 3D 时补上默认 JSON 的两段并告警
- 覆盖文件继续只承担种子与兜底,避免老种子文件把 3D 生成整段关掉
- 补用例覆盖覆盖文件缺 3D 段的读取
2026-09-23 11:15:42 +08:00
k88936 5e47f0c41e 3D 定价记录转换与读取归一化接上 SpacetimeDB 两段列
- 新增 editor_generation_model3d_records 深模块:配置与两段记录行之间双向转换
- 写入方向严格:落库前按契约强校验,缺键与契约外键都不写
- 读取方向归一化:记录缺键(含整段缺失的老行)用本地配置同段补齐,契约外键剔除并告警,补齐后仍不合法才判非法
- 定价配置读取以表为准,覆盖文件降级为种子与兜底;state.rs 保存路径写入两段
- spacetime-client 补导出 3D 定价记录类型,api-server 定向用例覆盖往返、补齐、剔除与拒绝
2026-09-23 11:12:57 +08:00
k88936 ebd904e193 公开读模型 3D 段保持迁移前的旧形状
- 新增 Model3dPricingPublicView,把内部两段结构投影回 basePrices 端点判别 + addOnPrices 单表
- 公开路由改用投影视图,画布 3D 入口与前端类型不需要随本次迁移改动
- 投影取文生 3D 段的加价项,两段不一致时打告警提示前端升级前不要差异化
- 公开路由用例补断言钉住 3D 段旧形状
2026-09-23 11:04:50 +08:00
k88936 9f4a71d2e3 3D 定价段拆成端点并列的两段结构
- Model3dPricingConfig 改为 textToModelPricing / imageToModelPricing 两段并列,各持自己的 versionPrices 与 addOnPrices
- 新增 Model3dEndpointPricing 承接单端点定价,校验与查价按端点委派,溢出检查覆盖两段
- 受控默认 JSON 的 model3d 段同步改为两段结构
- 3D 定价相关用例夹具与断言更新到两段形状
2026-09-23 11:01:20 +08:00
k88936 774b74d3d6 SpacetimeDB 定价表追加 3D 两段列,记录形状先能表达端点 × 版本 × 贴图与加价项
- editor_generation_pricing_config 末尾追加 text_to_model_pricing / image_to_model_pricing 两个 Option 列并带显式默认值
- 新增模型版本底价、加价项、端点定价三个 SpacetimeType 行类型,模块侧按段校验空段、缺半段、重复键与非正价格
- upsert 输入、快照、生成绑定与客户端记录映射同步两段字段
- api-server 保存路径本次先写空值,读取仍走本地文件缓存;补模块段级归一化用例
2026-09-23 10:54:01 +08:00
k88936 1327cd53b7 3D 生成定价迁移先落文档:两段并列结构、SpacetimeDB 权威与后台编辑
- 主规范把 3D 定价改成按端点两段并列结构,事实源改为 SpacetimeDB,补契约归一化、后台保存语义与验收项
- 新增 ADR 0005,记录权威事实源迁移、公开读模型不变的取舍与四条被否决做法
- 新增里程碑规范与实施计划,列出范围、验收标准、文件切分、验证命令与两个回滚点
- 同步 Tripo 技术方案的定价段形状、后端架构表目录的两列说明、CONTEXT.md 术语与决策记录
2026-09-23 10:53:28 +08:00
k88936 caafb8baa3 3D 提交体改用端点契约类型而非 Record
- Model3dSubmissionPlan.body 与 submitModel3dGenerationRequest 的 body 收紧为两个端点请求契约
- 提交计划按端点分支分别构造 text-to-model / image-to-model 请求体
- 幂等键入参同步收紧,测试夹具按契约补全 body
2026-09-22 17:04:11 +08:00
k88936 4e46202c10 3D 提交收到无任务状态的成功响应不再静默复位
- 新增 MODEL3D_SUBMISSION_MISSING_QUEUE_STATE_MESSAGE 提示文案
- 空 body 或缺 status 的 2xx 响应改判失败态并保留提示,不再直接回 idle
- 补用例断言不再触发排队链路且对话框进入失败态
2026-09-22 17:00:13 +08:00
k88936 00eed191c5 3D 提交把兜底铸的尝试代次写回对话框状态
- 新增 resolveModel3dAttemptNonce,提交计划带出本次实际使用的代次
- 提交编排在进入 generating 时把该代次写回 dialog,缺代次的老快照不再每次换键
- 补老快照场景用例,断言幂等键前缀与写回的代次一致
2026-09-22 16:59:18 +08:00
k88936 62f1ca4537 3D 提交失败提示不再直接显示传输层英文文案
- resolveModel3dGenerationErrorMessage 对超时单独给出中文可重试提示
- fetch 失败与中断收敛到中文兜底,服务端文案仍原样透出
- 补服务端文案透出、传输层兜底与超时提示的用例
2026-09-22 16:57:55 +08:00
k88936 852e65f7d8 查看器字节来源注明引用必须稳定
- Model3DViewerSource 的 bytes 分支补充 buffer 生命周期与稳定引用要求
- 说明同内容换新引用会触发场景重建与 GPU 重传的后果
2026-09-22 16:56:19 +08:00
k88936 aa6e3b8d79 SDK 请求错误不再丢弃响应体与底层错误链
- 映射 tripo3d_sdk::Error::Request 时带上 body 与 source 字段
- 响应体截断到 512 字符,疑似带 http(s) 地址的响应体整体丢弃
- 只取错误链底层文本,避免 reqwest 顶层 Display 带出完整签名 URL
- 补错误链收集、响应体过滤与截断的用例
2026-09-22 16:55:16 +08:00
k88936 3ab7b386f1 补外部生成主表 provider checkpoint 归一化单测
- 新增 old_external_generation_job_rows_default_to_unsubmitted_provider
- 断言旧迁移行的 provider_kind 与 provider_task_id 都归一成 null
- 守住 at-most-once submit 的向后兼容路径
2026-09-22 16:52:19 +08:00
k88936 ed2eb43fe6 补 3D 生成选项校验的表驱动单测
- 覆盖最简选项全模型放行、fast 必须配 v3.5 贴图版本
- 覆盖 generate_parts 的 texture/pbr/quad/smart_low_poly 互斥组合
- 覆盖 quad 家族限制与各模式 face_limit 的 min-1/min/max/max+1 边界
- 覆盖空白 task id 按 OutputSchema 失败与 trim 行为
2026-09-22 16:50:06 +08:00