From da9ee65119881241667feb3aa23cc96d5e69c687 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Fri, 18 Sep 2026 21:42:17 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=B0=E5=BD=95Tripo=E7=9C=9F=E5=AE=9E?= =?UTF-8?q?=E5=86=92=E7=83=9F=E7=BB=93=E6=9E=9C=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 保留三个生成入口的脱敏真实结果形状与下载产物信息 使用实际可访问的 Rustacean 图片完成 image 与 multiview 示例 同步严格 endpoint 结果契约和真实 Provider 验收文档 --- ...001-Tripo SDK隔离与Provider DTO边界-2026-09-18.md | 2 ++ ...方案】Tripo文本到3D模型Provider集成-2026-09-18.md | 8 +++++--- .../examples/tripo_generation_smoke.rs | 14 ++++++++++++-- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/docs/adr/【ADR】0001-Tripo SDK隔离与Provider DTO边界-2026-09-18.md b/docs/adr/【ADR】0001-Tripo SDK隔离与Provider DTO边界-2026-09-18.md index 6e3f198af..3d1a5ffdb 100644 --- a/docs/adr/【ADR】0001-Tripo SDK隔离与Provider DTO边界-2026-09-18.md +++ b/docs/adr/【ADR】0001-Tripo SDK隔离与Provider DTO边界-2026-09-18.md @@ -5,3 +5,5 @@ `tripo3d-sdk` 只允许出现在 `platform-tripo` 内部。该 crate 以显式必填配置创建可复用 provider client,只公开自己的 text-to-model、image-to-model、multiview-to-model DTO、通用单次 task 查询、显式模型下载和结构化错误;不暴露 SDK 类型、`wait_for_task` 或后台轮询。共享产品契约与 provider task 结果分层,provider adapter 不伪造 `resourceId`/`assetId`;shared-contracts 的 Rust 类型始终通过 ts-rs 生成目录化 TypeScript binding。 选择这个边界是为了避免 API 层绑定第三方 SDK 的任务/错误模型,同时让未来的资源持久化、幂等和 provider 替换由应用层负责。请求 enum 以 Tripo API 文档为准;当前 `compress=geometry`、纹理质量 `fast/standard/detailed/extreme` 及纹理版本已经纳入目录化 Rust/TypeScript contracts。文档确认不存在于这三个 endpoint 的 `style` 字段不再保留占位类型,组合约束在 provider 副作用前执行。 + +完成结果按 endpoint 建模为严格类型:text-to-model 要求模型、渲染图和生成参考图 URL,image-to-model 与 multiview-to-model 要求模型和渲染图 URL;共同 task DTO 只用 enum 标识具体结果,不再提供由 `Vec` 和可选字段组成的宽松通用 output。URL 使用语义中性的 `TripoUrl`,真实响应缺少对应必填字段时以 output schema error 失败关闭。 diff --git a/docs/technical/【技术方案】Tripo文本到3D模型Provider集成-2026-09-18.md b/docs/technical/【技术方案】Tripo文本到3D模型Provider集成-2026-09-18.md index 2b643c4da..f17b2795f 100644 --- a/docs/technical/【技术方案】Tripo文本到3D模型Provider集成-2026-09-18.md +++ b/docs/technical/【技术方案】Tripo文本到3D模型Provider集成-2026-09-18.md @@ -4,7 +4,7 @@ 本阶段在 `server-rs/crates/platform-tripo` 内接入固定 revision 的 `tripo3d-sdk`,完成 text-to-model、image-to-model 和 multiview-to-model 三个 3D 生成入口的 Rust provider adapter。adapter 提供显式配置、提交、单次通用 task 查询和模型下载能力;共享产品契约继续由 `shared-contracts` 管理,并始终生成目录化 ts-rs TypeScript binding。 -代码按 API 目录组织:公共 SDK 配置、client、任务映射、错误、下载类型和通用 task DTO 位于 `platform-tripo/src/common/`;三个生成 API 各自拥有独立目录。Rust 与 TypeScript contracts 按 `common/`、`text_to_model/`、`image_to_model/`、`multiview_to_model/` 分目录生成。 +代码按 API 目录组织:公共 SDK 配置、client、任务映射、错误、下载类型和 task 生命周期 DTO 位于 `platform-tripo/src/common/`;三个生成 API 各自拥有独立目录和结果类型。Rust 与 TypeScript contracts 按 `common/`、`text_to_model/`、`image_to_model/`、`multiview_to_model/` 分目录生成。 ## 非目标 @@ -18,6 +18,8 @@ provider task 结果与产品资源结果分离。provider adapter 不生成 `resourceId` 或 `assetId`;未来应用层在资源持久化后再构造带资源 ID 的产品 DTO。模型 URL 被视为临时 provider 引用,下载由显式方法完成。 +task 尚未完成时 `output` 为空;完成后 `output` 必须是与 task type 一致的 enum variant,不使用把不同 endpoint 字段揉在一起的通用可选字段结构。真实 provider smoke 确认:text-to-model 结果固定包含 `model_url`、`rendered_image_url`、`generated_image_url`;image-to-model 和 multiview-to-model 结果固定包含 `model_url`、`rendered_image_url`。这些字段在各自结果 struct 中均为必填 `TripoUrl`;缺失、URL 非法或 task type 不受支持时返回 `TripoError::OutputSchema`。 + ## 请求与类型 三个生成请求使用官方文档已确认的 enum:模型版本、纹理版本、纹理质量(含 `fast`)、几何质量、纹理对齐、输入方向、导出方向和压缩类型(`geometry`)。文档未将 `style` 列为这三个 endpoint 的请求字段,因此不再保留占位 enum。 @@ -27,7 +29,7 @@ provider task 结果与产品资源结果分离。provider adapter 不生成 `re ## 验收 - `platform-tripo` 不公开 re-export SDK 类型或 `wait_for_task`。 -- 三个 3D 生成入口的 submit、通用 get task、固定 SDK output 字段映射和显式 download API 可编译。 +- 三个 3D 生成入口的 submit、通用 get task、按 endpoint 严格映射的完成结果和显式 download API 可编译。 - provider 错误统一为 adapter 错误类型。 - shared contracts 的 ts-rs binding 无 feature 开关且始终可生成。 -- 未运行真实 Provider smoke;需要 API key 的联调另行执行。 +- 真实 Provider smoke 已覆盖三个入口;example 保留脱敏后的结果结构和下载产物信息。 diff --git a/server-rs/crates/platform-tripo/examples/tripo_generation_smoke.rs b/server-rs/crates/platform-tripo/examples/tripo_generation_smoke.rs index 79a102bf9..635acd5ed 100644 --- a/server-rs/crates/platform-tripo/examples/tripo_generation_smoke.rs +++ b/server-rs/crates/platform-tripo/examples/tripo_generation_smoke.rs @@ -23,8 +23,7 @@ use shared_contracts::model3d::{ }; use tripo3d_sdk::{ClientOptions, TripoClient, WaitOptions}; -const SAMPLE_IMAGE_URL: &str = - "https://raw.githubusercontent.com/VAST-AI-Research/tripo-python-sdk/master/example.png"; +const SAMPLE_IMAGE_URL: &str = "https://www.rustacean.net/assets/rustacean-flat-happy.png"; #[tokio::main] async fn main() -> Result<(), Box> { @@ -174,3 +173,14 @@ fn required_env(name: &str) -> Result { } Ok(value) } + +// Example result shape from a real smoke run (signed auth_key values omitted): +// text_to_model task_id=ccbb228c-6a0e-46b9-8fcc-46fefbb38039 +// image_to_model task_id=69a8b158-23a4-4856-8996-58c070b4fa75 +// multiview_to_model task_id=7191545c-5007-4b24-aa69-a50feaf7054c +// text_to_model status=Completed progress=Some(100) output=Some(TextToModel(TripoTextToModelResult { model_url: TripoUrl("https://openapi.cdn.tripo3d.com/.../tripo_pbr_model.glb?"), rendered_image_url: TripoUrl("https://openapi.cdn.tripo3d.com/.../legacy_mesh.webp?"), generated_image_url: TripoUrl("https://openapi.cdn.tripo3d.com/.../text2image.jpeg?") })) +// image_to_model status=Completed progress=Some(100) output=Some(ImageToModel(TripoImageToModelResult { model_url: TripoUrl("https://openapi.cdn.tripo3d.com/.../tripo_pbr_model.glb?"), rendered_image_url: TripoUrl("https://openapi.cdn.tripo3d.com/.../legacy_mesh.webp?") })) +// multiview_to_model status=Completed progress=Some(100) output=Some(MultiviewToModel(TripoMultiviewToModelResult { model_url: TripoUrl("https://openapi.cdn.tripo3d.com/.../tripo_pbr_model.glb?"), rendered_image_url: TripoUrl("https://openapi.cdn.tripo3d.com/.../legacy_mesh.webp?") })) +// text_to_model artifact=text_to_model.glb bytes=41443076 url=https://openapi.cdn.tripo3d.com/.../tripo_pbr_model.glb? +// image_to_model artifact=image_to_model.glb bytes=42363084 url=https://openapi.cdn.tripo3d.com/.../tripo_pbr_model.glb? +// multiview_to_model artifact=multiview_to_model.glb bytes=42724784 url=https://openapi.cdn.tripo3d.com/.../tripo_pbr_model.glb?