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
|
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
|
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
|
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 |
|
k88936
|
62bf602fb1
|
多视图请求 DTO 补齐字段级说明并重生成绑定
- Model3dMultiviewToModelRequest 每个字段补一行中文语义说明与取值范围
- 结构体补严格反序列化与组合校验归属的说明
- 重新生成 ts-rs TS 绑定,注释同步进 Model3dMultiviewToModelRequest.ts
|
2026-09-22 16:48:57 +08:00 |
|
k88936
|
2348315dba
|
3D 结果打标契约测试补齐 preview 与 imageToModel 分支
- textToModel 用例补 preview 产物的相等断言
- 新增对称的 imageToModel 用例,守住 tag 路由与分支字段
- 裸字符串 source 的负例改为点名 Model3dGenerationSource 并单独反序列化 source 值
|
2026-09-22 16:46:19 +08:00 |
|
k88936
|
bba96e18a1
|
队列状态映射改为借用记录避免提交路径整行克隆
- editor_generation_queue_state 收 &ExternalGenerationJobRecord,只克隆输出需要的三个字段
- Model3dSubmissionResponse::from_job 不再克隆整行 job,status_url 提前算好避免额外克隆
- 其余调用点改为传引用,行为不变
|
2026-09-22 16:44:47 +08:00 |
|
k88936
|
433ffb4a15
|
落库的模型版本改用严格 wire 取值
- Model3dJobRequest::model_version 改为返回 Result 并使用 wire_str
- worker 落库前取不到契约取值即按服务端问题失败,不再写 Debug 兜底名
- 新增用例断言落库取值为契约线上值 v3.1-20260211
|
2026-09-22 16:40:48 +08:00 |
|
k88936
|
4e5ff179b2
|
3D 查价拒绝 texture=false 与贴图加价项的矛盾组合
- Model3dPricingError 新增 InconsistentTextureAddOn 变体与对应文案
- price() 在命中的 add-on 含贴图类而 texture=false 时失败关闭,不再照价收费
- 补齐矛盾组合报错与 texture=true 合法组合的价格用例
|
2026-09-22 16:38:24 +08:00 |
|
k88936
|
87ca86ae6a
|
图片输入解析抽出可注入查询的解析规则并补齐行为用例
- resolve_source_object_key 拆出 resolve_source_object_key_with 与 ResolvedReference 窄结果
- 新增按 ID 定点查询、类型不符、缺对象键、4xx 收敛与基础设施错误保留状态码的用例
- 源码文本断言不再按函数签名切片,只检查本模块不出现列工程 / 列素材库
|
2026-09-22 16:36:16 +08:00 |
|
k88936
|
48cde9624c
|
operation_kind 白名单改为两 crate 共用的共享常量
- 白名单常量迁到 shared-contracts 并从 crate 根导出
- spacetime-module 的原子落库事务改为引用该常量,删除本地重复定义
- api-server 的登记测试不再解析对方源码文本,改为直接断言常量内容
- 后端架构文档补上白名单常量的位置与共用口径
|
2026-09-22 16:30:28 +08:00 |
|
k88936
|
e359158ecf
|
校验文案的版本标签改为从契约枚举推导
- validate_generation_options 的错误文案改用 wire_str_lossy 取 serde 线上值
- v3.x 家族的模型标签收敛到 v3_model_labels 助手
- 契约改名后诊断文案随之更新,不再手写重复的版本字符串
|
2026-09-22 16:19:09 +08:00 |
|
k88936
|
bcac5a7c12
|
三个提交入口的生成选项映射收敛为单一字段清单
- common::validation 用 tripo_generation_options_from! 由一份字段清单派生三个 From 实现
- multiview 手写的 TripoGenerationOptions 映射改为复用该 From 实现
- 新增共享字段时三条路径一起跟上,缺字段会在编译期报错
|
2026-09-22 16:15:38 +08:00 |
|
k88936
|
c8b4160fcd
|
3D 查价错误并入统一的定价错误枚举
- EditorGenerationPricingError 新增 Model3d 变体并实现 From<Model3dPricingError>
- model3d_price 改为返回 EditorGenerationPricingError,内层文案直通保持响应不变
- 提交路由对 3D 定价错误与定价快照错误分别映射,未配置用例改断言 Model3d(NotConfigured)
|
2026-09-22 16:11:17 +08:00 |
|
k88936
|
9800477c7c
|
模型版本清单从声明表派生避免漏加新版本
- Model3dModelVersion 的变体、线上值与 ALL 改为由 model3d_model_versions! 单一声明表生成
- ALL 类型改为 &'static [Self],新增版本只需在声明表加一行
- 定价校验与测试的遍历改用 iter().copied()
|
2026-09-22 16:03:55 +08:00 |
|
k88936
|
2e9aed3750
|
三个提交入口统一校验 provider 返回的 task id
- 新增 submitted_task_handle:空白 id 在提交调用附近以 OutputSchema 失败
- text / image / multiview 提交路径共用它,任务不再以孤儿状态等到下游查询才报错
|
2026-09-22 15:53:37 +08:00 |
|
k88936
|
09f0c51b81
|
空白视图规则收敛到单一助手
- 新增 view_input 同时服务提交前计数校验与 SDK 参数转换
- 空白 / 纯空白视图的判定不再有两份实现,避免校验与转换漂移
|
2026-09-22 15:49:34 +08:00 |
|
k88936
|
be07eb79c6
|
未知任务状态错误带上 task id
- map_status 接收 task_id,Unknown 分支改用与其它映射失败一致的 OutputSchema
- provider 异常可与具体任务对上,不再是一条无主错误
|
2026-09-22 15:47:01 +08:00 |
|
k88936
|
1749f427c1
|
任务快照只在失败终态保留 failure
- failure 改由终态判定驱动,不再只看 provider 是否留下错误字段
- 已完成的任务即使带过期错误字段也不再挂 failure,保持快照内部自洽
|
2026-09-22 15:45:45 +08:00 |
|
k88936
|
050909a0b7
|
后台定价保存不再清空 3D 段
- payload 的 model3d 缺席或为 null 统一表示沿用当前 3D 定价,显式给出时才覆盖
- 保存路径先取当前快照合并,避免改图 / 视频价格让 3D 提交一直失败关闭
- 补用例覆盖「省略保持」与「显式覆盖」两种语义
|
2026-09-22 15:27:19 +08:00 |
|
k88936
|
ee2d505eb3
|
3D 提交在扣费前预检落点归属
- 新增 target 预检模块:画布项目按 (project_id, owner) 定点确认,素材库文件夹按 owner 的库匹配
- 两个提交路由都在查价与入队之前调用;跨 owner / 不存在的落点回 400 model3d-target-unavailable
- 只剩基础设施故障保留原状态码,并补了收敛口径的单测
|
2026-09-22 15:21:25 +08:00 |
|
k88936
|
8473877bc3
|
5xx 错误响应不再回带 provider task id
- TaskFailure / OutputSchema / 上游兜底分支只回固定文案,完整错误写入服务端日志
- 补一条断言 502 details 不含 task id 与 provider 原文的用例
|
2026-09-22 15:17:50 +08:00 |
|
k88936
|
cda7724cae
|
上游瞬时状态不再回落成 400
- 408 / 425 / 429 与 platform-tripo 的 is_retryable 口径对齐,分别回 504 / 502 / 429
- 补上这三档与客户端 4xx 的分支测试
|
2026-09-22 15:15:27 +08:00 |
|
k88936
|
e18c6ee502
|
产物下载客户端不再跟随跳转
- 产物地址来自 provider 响应,禁止 reqwest 自动跳转以防 SSRF
- 需要跳转的地址会以非成功状态显式暴露,不再由服务端静默代发
|
2026-09-22 15:12:06 +08:00 |
|
k88936
|
669a08c7c2
|
产物下载失败信息补上可诊断上下文
- 传输失败带上脱敏 URL 与底层错误 source 链
- 非成功状态补上状态码文案与脱敏 URL
|
2026-09-22 13:51:29 +08:00 |
|
k88936
|
01a9941cbc
|
任务快照映射不再多余克隆字符串
- task_id 与 error_message 直接移交所有权,只保留错误路径上的必要克隆
|
2026-09-22 13:51:23 +08:00 |
|
k88936
|
fd0a37969e
|
3D 产物落盘文件名补上安全处理
- URL 无可用扩展名时按 content type 兜底,预览图不再写成 .glb
- 文件名主干中性化路径分隔符与遍历片段,避免逃出目标目录
|
2026-09-22 13:50:29 +08:00 |
|
k88936
|
7dd7bdd3c7
|
provider checkpoint 存在性校验补上 provider_kind
- at-most-once submit 的两字段不变量在数据层一起判定
|
2026-09-22 13:50:24 +08:00 |
|
k88936
|
5049c27f3d
|
3D 定价表加载时拦截加总溢出
- 底价与加价项累加改用 checked_add 校验,配置阶段即失败
- 避免结算路径 saturating_add 在异常配置下静默少收
|
2026-09-22 13:49:01 +08:00 |
|
k88936
|
129e2234f3
|
删掉 3D 引用解析里两个无人调用的宽查函数
- 两个 pub(crate) resolver 全仓无调用方,且会整表列举项目与素材
- 定点解析仍走既有按 ID 的窄查函数
|
2026-09-22 13:48:53 +08:00 |
|
k88936
|
2916e112df
|
3D provider 重试次数按上限 10 封顶
- TRIPO_RETRIES 配置异常时不再让产物下载近乎无限重试
|
2026-09-22 13:48:13 +08:00 |
|
k88936
|
c5e0c6a14d
|
去掉被丢弃的 remove 返回值告警
- 幂等指纹字段摘除改为显式丢弃返回值,表明这是 best-effort 行为
|
2026-09-22 13:48:10 +08:00 |
|
k88936
|
e2809b83c0
|
3D 冒烟示例单端点失败不再中断其余端点
- wait_for_task / get_task / download_model 失败时记录该端点错误并继续
- 保留 throw_on_failure: false 的原有语义,仅补齐传输与超时类错误
|
2026-09-22 13:45:50 +08:00 |
|
k88936
|
058d851a69
|
去掉 model3d_price 上已过期的 dead_code 豁免
- server-rs/crates/api-server/src/editor_generation_config.rs:model3d_price 现在由 tripo3d 提交路由真实消费,删掉「里程碑二的路由接上之前只有测试消费」这句已过期注释与配套的 #[allow(dead_code)]
验证:cargo check -p api-server(--locked)无该函数相关告警
|
2026-09-22 13:43:45 +08:00 |
|
k88936
|
444520b464
|
修正 storage.rs 注释错别字
- server-rs/crates/api-server/src/tripo3d/storage.rs:sniff_model_content_type 文档注释「说慌」改为「说谎」
验证:npm run check:encoding、git diff --check
|
2026-09-22 13:42:37 +08:00 |
|
k88936
|
326729a5ac
|
Idempotency-Key 校验错误保留请求上下文
- server-rs/crates/api-server/src/tripo3d/routes.rs:require_idempotency_key 增加 request_context 参数,缺失 / 格式非法的两个 400 改用 into_response_with_context(Some(..)),与同处理器其它校验、定价错误一致;此前传 None,客户端拿不到请求 ID / 关联标识
验证:cargo test -p api-server --locked idempotency_key(相关 6 个用例全绿)
|
2026-09-22 13:42:34 +08:00 |
|
k88936
|
14740e0ef6
|
3D 任务参数用例改为断言真实主张
- server-rs/crates/api-server/src/tripo3d/job.rs:把 job_request_rejects_payload_without_fingerprint_stripping_support 改名为 job_request_stays_strict_after_stripping_platform_fingerprint 并补断言——带指纹 + 其它未知字段的合法 payload 仍必须被拒(摘下平台字段不等于放宽严格解析);原用例名声称验证指纹摘除,实际只断言了「缺字段的 payload 被拒」和「未知 job kind 被拒」
验证:cargo test -p api-server --locked job_request(2 个用例全绿)、npm run check:rustfmt
|
2026-09-22 13:40:13 +08:00 |
|
k88936
|
48a5bf06d0
|
3D 产物读取不再克隆 content type
- server-rs/crates/api-server/src/tripo3d/artifacts.rs:content_type 只在本函数取一次、之后不再读句柄字段,改用 take() 转移所有权而不是 clone()
验证:cargo check -p api-server(--locked)
|
2026-09-22 13:36:28 +08:00 |
|