From 1c4009ea3b34a30082d0d26f1f4958b1d6b92ee4 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 15:59:19 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BB=BA=E7=AB=8B3D=E7=94=9F=E6=88=90=E7=9B=AE?= =?UTF-8?q?=E5=BD=95=E5=8C=96=E5=A5=91=E7=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增 model3d common、text-to-model、image-to-model、multiview-to-model Rust contracts 通过 ts-rs 按目录生成 TypeScript bindings,移除依赖 barrel 的组织方式 增加 model3d contracts 定向生成脚本 --- package.json | 1 + .../model3d/common/Model3dCompression.ts | 3 + .../common/Model3dExportOrientation.ts | 3 + .../model3d/common/Model3dGeometryQuality.ts | 3 + .../model3d/common/Model3dInputOrientation.ts | 3 + .../model3d/common/Model3dModelVersion.ts | 8 ++ .../model3d/common/Model3dOutputFormat.ts | 10 +++ .../contracts/model3d/common/Model3dStyle.ts | 3 + .../model3d/common/Model3dTaskStatus.ts | 9 +++ .../model3d/common/Model3dTextureAlignment.ts | 3 + .../model3d/common/Model3dTextureQuality.ts | 3 + .../Model3dImageToModelRequest.ts | 32 ++++++++ .../Model3dMultiviewInputs.ts | 11 +++ .../Model3dMultiviewToModelRequest.ts | 30 ++++++++ .../model3d/text-to-model/Model3dArtifact.ts | 11 +++ .../text-to-model/Model3dGenerationJob.ts | 13 ++++ .../text-to-model/Model3dGenerationResult.ts | 8 ++ .../Model3dGenerationSubmission.ts | 9 +++ .../Model3dTextToModelRequest.ts | 29 ++++++++ server-rs/crates/shared-contracts/Cargo.toml | 1 + server-rs/crates/shared-contracts/src/lib.rs | 1 + .../src/model3d/common/compression.rs | 20 +++++ .../src/model3d/common/export_orientation.rs | 27 +++++++ .../src/model3d/common/geometry_quality.rs | 21 ++++++ .../src/model3d/common/input_orientation.rs | 21 ++++++ .../src/model3d/common/mod.rs | 26 +++++++ .../src/model3d/common/model_version.rs | 30 ++++++++ .../src/model3d/common/output_format.rs | 22 ++++++ .../src/model3d/common/style.rs | 20 +++++ .../src/model3d/common/task_status.rs | 16 ++++ .../src/model3d/common/texture_alignment.rs | 21 ++++++ .../src/model3d/common/texture_quality.rs | 23 ++++++ .../src/model3d/image_to_model/mod.rs | 8 ++ .../src/model3d/image_to_model/request.rs | 57 +++++++++++++++ .../shared-contracts/src/model3d/mod.rs | 8 ++ .../src/model3d/multiview_to_model/mod.rs | 8 ++ .../src/model3d/multiview_to_model/request.rs | 73 +++++++++++++++++++ .../src/model3d/text_to_model/mod.rs | 11 +++ .../src/model3d/text_to_model/request.rs | 55 ++++++++++++++ .../src/model3d/text_to_model/response.rs | 59 +++++++++++++++ 40 files changed, 720 insertions(+) create mode 100644 packages/shared/src/contracts/model3d/common/Model3dCompression.ts create mode 100644 packages/shared/src/contracts/model3d/common/Model3dExportOrientation.ts create mode 100644 packages/shared/src/contracts/model3d/common/Model3dGeometryQuality.ts create mode 100644 packages/shared/src/contracts/model3d/common/Model3dInputOrientation.ts create mode 100644 packages/shared/src/contracts/model3d/common/Model3dModelVersion.ts create mode 100644 packages/shared/src/contracts/model3d/common/Model3dOutputFormat.ts create mode 100644 packages/shared/src/contracts/model3d/common/Model3dStyle.ts create mode 100644 packages/shared/src/contracts/model3d/common/Model3dTaskStatus.ts create mode 100644 packages/shared/src/contracts/model3d/common/Model3dTextureAlignment.ts create mode 100644 packages/shared/src/contracts/model3d/common/Model3dTextureQuality.ts create mode 100644 packages/shared/src/contracts/model3d/image-to-model/Model3dImageToModelRequest.ts create mode 100644 packages/shared/src/contracts/model3d/multiview-to-model/Model3dMultiviewInputs.ts create mode 100644 packages/shared/src/contracts/model3d/multiview-to-model/Model3dMultiviewToModelRequest.ts create mode 100644 packages/shared/src/contracts/model3d/text-to-model/Model3dArtifact.ts create mode 100644 packages/shared/src/contracts/model3d/text-to-model/Model3dGenerationJob.ts create mode 100644 packages/shared/src/contracts/model3d/text-to-model/Model3dGenerationResult.ts create mode 100644 packages/shared/src/contracts/model3d/text-to-model/Model3dGenerationSubmission.ts create mode 100644 packages/shared/src/contracts/model3d/text-to-model/Model3dTextToModelRequest.ts create mode 100644 server-rs/crates/shared-contracts/src/model3d/common/compression.rs create mode 100644 server-rs/crates/shared-contracts/src/model3d/common/export_orientation.rs create mode 100644 server-rs/crates/shared-contracts/src/model3d/common/geometry_quality.rs create mode 100644 server-rs/crates/shared-contracts/src/model3d/common/input_orientation.rs create mode 100644 server-rs/crates/shared-contracts/src/model3d/common/mod.rs create mode 100644 server-rs/crates/shared-contracts/src/model3d/common/model_version.rs create mode 100644 server-rs/crates/shared-contracts/src/model3d/common/output_format.rs create mode 100644 server-rs/crates/shared-contracts/src/model3d/common/style.rs create mode 100644 server-rs/crates/shared-contracts/src/model3d/common/task_status.rs create mode 100644 server-rs/crates/shared-contracts/src/model3d/common/texture_alignment.rs create mode 100644 server-rs/crates/shared-contracts/src/model3d/common/texture_quality.rs create mode 100644 server-rs/crates/shared-contracts/src/model3d/image_to_model/mod.rs create mode 100644 server-rs/crates/shared-contracts/src/model3d/image_to_model/request.rs create mode 100644 server-rs/crates/shared-contracts/src/model3d/mod.rs create mode 100644 server-rs/crates/shared-contracts/src/model3d/multiview_to_model/mod.rs create mode 100644 server-rs/crates/shared-contracts/src/model3d/multiview_to_model/request.rs create mode 100644 server-rs/crates/shared-contracts/src/model3d/text_to_model/mod.rs create mode 100644 server-rs/crates/shared-contracts/src/model3d/text_to_model/request.rs create mode 100644 server-rs/crates/shared-contracts/src/model3d/text_to_model/response.rs diff --git a/package.json b/package.json index 6bc5033fc..20a64195f 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ "admin-web:typecheck": "node scripts/admin-web-build.mjs typecheck", "admin-web:preview": "npm --prefix apps/admin-web run preview --", "spacetime:generate": "node scripts/generate-spacetime-bindings.mjs", + "contracts:model3d:generate": "cargo test --locked -p shared-contracts model3d --manifest-path server-rs/Cargo.toml", "spacetime:external-generation:maintain": "node scripts/spacetime-maintain-external-generation-jobs.mjs", "spacetime:editor-image-asset-kind:clean": "node scripts/spacetime-clean-editor-image-asset-kind.mjs", "spacetime:editor-canvas-layout:migrate": "node scripts/spacetime-migrate-editor-canvas-layout.mjs", diff --git a/packages/shared/src/contracts/model3d/common/Model3dCompression.ts b/packages/shared/src/contracts/model3d/common/Model3dCompression.ts new file mode 100644 index 000000000..bfde74226 --- /dev/null +++ b/packages/shared/src/contracts/model3d/common/Model3dCompression.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type Model3dCompression = 'example'; diff --git a/packages/shared/src/contracts/model3d/common/Model3dExportOrientation.ts b/packages/shared/src/contracts/model3d/common/Model3dExportOrientation.ts new file mode 100644 index 000000000..b41e45107 --- /dev/null +++ b/packages/shared/src/contracts/model3d/common/Model3dExportOrientation.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type Model3dExportOrientation = '+x' | '-x' | '+y' | '-y'; diff --git a/packages/shared/src/contracts/model3d/common/Model3dGeometryQuality.ts b/packages/shared/src/contracts/model3d/common/Model3dGeometryQuality.ts new file mode 100644 index 000000000..ce0d3e4a9 --- /dev/null +++ b/packages/shared/src/contracts/model3d/common/Model3dGeometryQuality.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type Model3dGeometryQuality = 'standard' | 'detailed'; diff --git a/packages/shared/src/contracts/model3d/common/Model3dInputOrientation.ts b/packages/shared/src/contracts/model3d/common/Model3dInputOrientation.ts new file mode 100644 index 000000000..c656ed95a --- /dev/null +++ b/packages/shared/src/contracts/model3d/common/Model3dInputOrientation.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type Model3dInputOrientation = 'default' | 'align_image'; diff --git a/packages/shared/src/contracts/model3d/common/Model3dModelVersion.ts b/packages/shared/src/contracts/model3d/common/Model3dModelVersion.ts new file mode 100644 index 000000000..187eac996 --- /dev/null +++ b/packages/shared/src/contracts/model3d/common/Model3dModelVersion.ts @@ -0,0 +1,8 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type Model3dModelVersion = + | 'v3.1-20260211' + | 'v3.0-20250812' + | 'v2.5-20250123' + | 'P1-20260311' + | 'P2-20260801'; diff --git a/packages/shared/src/contracts/model3d/common/Model3dOutputFormat.ts b/packages/shared/src/contracts/model3d/common/Model3dOutputFormat.ts new file mode 100644 index 000000000..d12790c00 --- /dev/null +++ b/packages/shared/src/contracts/model3d/common/Model3dOutputFormat.ts @@ -0,0 +1,10 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type Model3dOutputFormat = + | 'glb' + | 'gltf' + | 'fbx' + | 'obj' + | 'stl' + | 'usdz' + | '3mf'; diff --git a/packages/shared/src/contracts/model3d/common/Model3dStyle.ts b/packages/shared/src/contracts/model3d/common/Model3dStyle.ts new file mode 100644 index 000000000..49de6c090 --- /dev/null +++ b/packages/shared/src/contracts/model3d/common/Model3dStyle.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type Model3dStyle = 'example'; diff --git a/packages/shared/src/contracts/model3d/common/Model3dTaskStatus.ts b/packages/shared/src/contracts/model3d/common/Model3dTaskStatus.ts new file mode 100644 index 000000000..7e36e7212 --- /dev/null +++ b/packages/shared/src/contracts/model3d/common/Model3dTaskStatus.ts @@ -0,0 +1,9 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type Model3dTaskStatus = + | 'queued' + | 'running' + | 'completed' + | 'failed' + | 'cancelled' + | 'expired'; diff --git a/packages/shared/src/contracts/model3d/common/Model3dTextureAlignment.ts b/packages/shared/src/contracts/model3d/common/Model3dTextureAlignment.ts new file mode 100644 index 000000000..9a5635b09 --- /dev/null +++ b/packages/shared/src/contracts/model3d/common/Model3dTextureAlignment.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type Model3dTextureAlignment = 'original_image' | 'geometry'; diff --git a/packages/shared/src/contracts/model3d/common/Model3dTextureQuality.ts b/packages/shared/src/contracts/model3d/common/Model3dTextureQuality.ts new file mode 100644 index 000000000..160606df8 --- /dev/null +++ b/packages/shared/src/contracts/model3d/common/Model3dTextureQuality.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type Model3dTextureQuality = 'standard' | 'detailed' | 'extreme'; diff --git a/packages/shared/src/contracts/model3d/image-to-model/Model3dImageToModelRequest.ts b/packages/shared/src/contracts/model3d/image-to-model/Model3dImageToModelRequest.ts new file mode 100644 index 000000000..d1a1b17a1 --- /dev/null +++ b/packages/shared/src/contracts/model3d/image-to-model/Model3dImageToModelRequest.ts @@ -0,0 +1,32 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Model3dCompression } from '../common/Model3dCompression'; +import type { Model3dExportOrientation } from '../common/Model3dExportOrientation'; +import type { Model3dGeometryQuality } from '../common/Model3dGeometryQuality'; +import type { Model3dInputOrientation } from '../common/Model3dInputOrientation'; +import type { Model3dModelVersion } from '../common/Model3dModelVersion'; +import type { Model3dStyle } from '../common/Model3dStyle'; +import type { Model3dTextureAlignment } from '../common/Model3dTextureAlignment'; +import type { Model3dTextureQuality } from '../common/Model3dTextureQuality'; + +export type Model3dImageToModelRequest = { + input: string; + model: Model3dModelVersion | null; + enableImageAutofix: boolean | null; + modelSeed: number | null; + textureSeed: number | null; + texture: boolean | null; + pbr: boolean | null; + textureQuality: Model3dTextureQuality | null; + textureAlignment: Model3dTextureAlignment | null; + geometryQuality: Model3dGeometryQuality | null; + faceLimit: number | null; + autoSize: boolean | null; + orientation: Model3dInputOrientation | null; + quad: boolean | null; + smartLowPoly: boolean | null; + generateParts: boolean | null; + compress: Model3dCompression | null; + exportUv: boolean | null; + exportOrientation: Model3dExportOrientation | null; + style: Model3dStyle | null; +}; diff --git a/packages/shared/src/contracts/model3d/multiview-to-model/Model3dMultiviewInputs.ts b/packages/shared/src/contracts/model3d/multiview-to-model/Model3dMultiviewInputs.ts new file mode 100644 index 000000000..d5d145b9a --- /dev/null +++ b/packages/shared/src/contracts/model3d/multiview-to-model/Model3dMultiviewInputs.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type Model3dMultiviewInputs = + | { + kind: 'views'; + front: string; + left: string | null; + back: string | null; + right: string | null; + } + | { kind: 'taskId'; taskId: string }; diff --git a/packages/shared/src/contracts/model3d/multiview-to-model/Model3dMultiviewToModelRequest.ts b/packages/shared/src/contracts/model3d/multiview-to-model/Model3dMultiviewToModelRequest.ts new file mode 100644 index 000000000..9caca8182 --- /dev/null +++ b/packages/shared/src/contracts/model3d/multiview-to-model/Model3dMultiviewToModelRequest.ts @@ -0,0 +1,30 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Model3dCompression } from '../common/Model3dCompression'; +import type { Model3dExportOrientation } from '../common/Model3dExportOrientation'; +import type { Model3dGeometryQuality } from '../common/Model3dGeometryQuality'; +import type { Model3dInputOrientation } from '../common/Model3dInputOrientation'; +import type { Model3dModelVersion } from '../common/Model3dModelVersion'; +import type { Model3dTextureAlignment } from '../common/Model3dTextureAlignment'; +import type { Model3dTextureQuality } from '../common/Model3dTextureQuality'; +import type { Model3dMultiviewInputs } from './Model3dMultiviewInputs'; + +export type Model3dMultiviewToModelRequest = { + inputs: Model3dMultiviewInputs; + model: Model3dModelVersion | null; + modelSeed: number | null; + textureSeed: number | null; + texture: boolean | null; + pbr: boolean | null; + textureQuality: Model3dTextureQuality | null; + geometryQuality: Model3dGeometryQuality | null; + textureAlignment: Model3dTextureAlignment | null; + faceLimit: number | null; + autoSize: boolean | null; + orientation: Model3dInputOrientation | null; + quad: boolean | null; + smartLowPoly: boolean | null; + generateParts: boolean | null; + compress: Model3dCompression | null; + exportUv: boolean | null; + exportOrientation: Model3dExportOrientation | null; +}; diff --git a/packages/shared/src/contracts/model3d/text-to-model/Model3dArtifact.ts b/packages/shared/src/contracts/model3d/text-to-model/Model3dArtifact.ts new file mode 100644 index 000000000..d3fed8219 --- /dev/null +++ b/packages/shared/src/contracts/model3d/text-to-model/Model3dArtifact.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Model3dOutputFormat } from '../common/Model3dOutputFormat'; + +export type Model3dArtifact = { + resourceId: string; + format: Model3dOutputFormat; + contentType: string; + sizeBytes: number; + sha256: string; + previewResourceId?: string | null; +}; diff --git a/packages/shared/src/contracts/model3d/text-to-model/Model3dGenerationJob.ts b/packages/shared/src/contracts/model3d/text-to-model/Model3dGenerationJob.ts new file mode 100644 index 000000000..510b02868 --- /dev/null +++ b/packages/shared/src/contracts/model3d/text-to-model/Model3dGenerationJob.ts @@ -0,0 +1,13 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Model3dTaskStatus } from '../common/Model3dTaskStatus'; +import type { Model3dGenerationResult } from './Model3dGenerationResult'; + +export type Model3dGenerationJob = { + operationId: string; + status: Model3dTaskStatus; + phase: string; + progress: number; + error?: string | null; + result?: Model3dGenerationResult | null; + updatedAtMicros: number; +}; diff --git a/packages/shared/src/contracts/model3d/text-to-model/Model3dGenerationResult.ts b/packages/shared/src/contracts/model3d/text-to-model/Model3dGenerationResult.ts new file mode 100644 index 000000000..0a48fbb24 --- /dev/null +++ b/packages/shared/src/contracts/model3d/text-to-model/Model3dGenerationResult.ts @@ -0,0 +1,8 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Model3dArtifact } from './Model3dArtifact'; + +export type Model3dGenerationResult = { + resourceId: string; + assetId: string; + artifacts: Array; +}; diff --git a/packages/shared/src/contracts/model3d/text-to-model/Model3dGenerationSubmission.ts b/packages/shared/src/contracts/model3d/text-to-model/Model3dGenerationSubmission.ts new file mode 100644 index 000000000..dcd97a66a --- /dev/null +++ b/packages/shared/src/contracts/model3d/text-to-model/Model3dGenerationSubmission.ts @@ -0,0 +1,9 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Model3dTaskStatus } from '../common/Model3dTaskStatus'; + +export type Model3dGenerationSubmission = { + operationId: string; + status: Model3dTaskStatus; + statusUrl: string; + pollAfterMs: number; +}; diff --git a/packages/shared/src/contracts/model3d/text-to-model/Model3dTextToModelRequest.ts b/packages/shared/src/contracts/model3d/text-to-model/Model3dTextToModelRequest.ts new file mode 100644 index 000000000..7064e70b7 --- /dev/null +++ b/packages/shared/src/contracts/model3d/text-to-model/Model3dTextToModelRequest.ts @@ -0,0 +1,29 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Model3dCompression } from '../common/Model3dCompression'; +import type { Model3dExportOrientation } from '../common/Model3dExportOrientation'; +import type { Model3dGeometryQuality } from '../common/Model3dGeometryQuality'; +import type { Model3dModelVersion } from '../common/Model3dModelVersion'; +import type { Model3dStyle } from '../common/Model3dStyle'; +import type { Model3dTextureQuality } from '../common/Model3dTextureQuality'; + +export type Model3dTextToModelRequest = { + prompt: string; + model: Model3dModelVersion | null; + negativePrompt: string | null; + imageSeed: number | null; + modelSeed: number | null; + textureSeed: number | null; + texture: boolean | null; + pbr: boolean | null; + textureQuality: Model3dTextureQuality | null; + geometryQuality: Model3dGeometryQuality | null; + faceLimit: number | null; + autoSize: boolean | null; + quad: boolean | null; + smartLowPoly: boolean | null; + generateParts: boolean | null; + compress: Model3dCompression | null; + exportUv: boolean | null; + exportOrientation: Model3dExportOrientation | null; + style: Model3dStyle | null; +}; diff --git a/server-rs/crates/shared-contracts/Cargo.toml b/server-rs/crates/shared-contracts/Cargo.toml index 7d23e1bd9..c08ce8e61 100644 --- a/server-rs/crates/shared-contracts/Cargo.toml +++ b/server-rs/crates/shared-contracts/Cargo.toml @@ -13,3 +13,4 @@ oss-contracts = [] serde = { workspace = true } serde_json = { workspace = true } sha2 = { workspace = true } +ts-rs = { workspace = true } diff --git a/server-rs/crates/shared-contracts/src/lib.rs b/server-rs/crates/shared-contracts/src/lib.rs index c3cc5ecaa..19ad8557d 100644 --- a/server-rs/crates/shared-contracts/src/lib.rs +++ b/server-rs/crates/shared-contracts/src/lib.rs @@ -32,6 +32,7 @@ pub mod external_generation; pub mod game_creation_app; pub mod hyper3d; pub mod llm; +pub mod model3d; #[cfg(any())] pub mod public_work; #[cfg(any())] diff --git a/server-rs/crates/shared-contracts/src/model3d/common/compression.rs b/server-rs/crates/shared-contracts/src/model3d/common/compression.rs new file mode 100644 index 000000000..aeb219989 --- /dev/null +++ b/server-rs/crates/shared-contracts/src/model3d/common/compression.rs @@ -0,0 +1,20 @@ +use serde::{Deserialize, Serialize}; + +use super::MODEL3D_TS_EXPORT_DIR; + +#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize, ts_rs::TS)] +#[ts(export, export_to = MODEL3D_TS_EXPORT_DIR)] +pub enum Model3dCompression { + /// TODO(tripo-docs): replace this compile-time placeholder with the + /// official text-to-model compression enum values. + #[serde(rename = "example")] + Example, +} + +impl Model3dCompression { + pub const fn as_str(self) -> &'static str { + match self { + Self::Example => "example", + } + } +} diff --git a/server-rs/crates/shared-contracts/src/model3d/common/export_orientation.rs b/server-rs/crates/shared-contracts/src/model3d/common/export_orientation.rs new file mode 100644 index 000000000..1657ef898 --- /dev/null +++ b/server-rs/crates/shared-contracts/src/model3d/common/export_orientation.rs @@ -0,0 +1,27 @@ +use serde::{Deserialize, Serialize}; + +use super::MODEL3D_TS_EXPORT_DIR; + +#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize, ts_rs::TS)] +#[ts(export, export_to = MODEL3D_TS_EXPORT_DIR)] +pub enum Model3dExportOrientation { + #[serde(rename = "+x")] + PlusX, + #[serde(rename = "-x")] + MinusX, + #[serde(rename = "+y")] + PlusY, + #[serde(rename = "-y")] + MinusY, +} + +impl Model3dExportOrientation { + pub const fn as_str(self) -> &'static str { + match self { + Self::PlusX => "+x", + Self::MinusX => "-x", + Self::PlusY => "+y", + Self::MinusY => "-y", + } + } +} diff --git a/server-rs/crates/shared-contracts/src/model3d/common/geometry_quality.rs b/server-rs/crates/shared-contracts/src/model3d/common/geometry_quality.rs new file mode 100644 index 000000000..bf2cfda39 --- /dev/null +++ b/server-rs/crates/shared-contracts/src/model3d/common/geometry_quality.rs @@ -0,0 +1,21 @@ +use serde::{Deserialize, Serialize}; + +use super::MODEL3D_TS_EXPORT_DIR; + +#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)] +#[serde(rename_all = "lowercase")] +#[derive(ts_rs::TS)] +#[ts(export, export_to = MODEL3D_TS_EXPORT_DIR)] +pub enum Model3dGeometryQuality { + Standard, + Detailed, +} + +impl Model3dGeometryQuality { + pub const fn as_str(self) -> &'static str { + match self { + Self::Standard => "standard", + Self::Detailed => "detailed", + } + } +} diff --git a/server-rs/crates/shared-contracts/src/model3d/common/input_orientation.rs b/server-rs/crates/shared-contracts/src/model3d/common/input_orientation.rs new file mode 100644 index 000000000..96517ea8d --- /dev/null +++ b/server-rs/crates/shared-contracts/src/model3d/common/input_orientation.rs @@ -0,0 +1,21 @@ +use serde::{Deserialize, Serialize}; + +use super::MODEL3D_TS_EXPORT_DIR; + +#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)] +#[serde(rename_all = "snake_case")] +#[derive(ts_rs::TS)] +#[ts(export, export_to = MODEL3D_TS_EXPORT_DIR)] +pub enum Model3dInputOrientation { + Default, + AlignImage, +} + +impl Model3dInputOrientation { + pub const fn as_str(self) -> &'static str { + match self { + Self::Default => "default", + Self::AlignImage => "align_image", + } + } +} diff --git a/server-rs/crates/shared-contracts/src/model3d/common/mod.rs b/server-rs/crates/shared-contracts/src/model3d/common/mod.rs new file mode 100644 index 000000000..c54bf2620 --- /dev/null +++ b/server-rs/crates/shared-contracts/src/model3d/common/mod.rs @@ -0,0 +1,26 @@ +pub(crate) const MODEL3D_TS_EXPORT_DIR: &str = concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../../packages/shared/src/contracts/model3d/common/" +); + +mod compression; +mod export_orientation; +mod geometry_quality; +mod input_orientation; +mod model_version; +mod output_format; +mod style; +mod task_status; +mod texture_alignment; +mod texture_quality; + +pub use compression::Model3dCompression; +pub use export_orientation::Model3dExportOrientation; +pub use geometry_quality::Model3dGeometryQuality; +pub use input_orientation::Model3dInputOrientation; +pub use model_version::Model3dModelVersion; +pub use output_format::Model3dOutputFormat; +pub use style::Model3dStyle; +pub use task_status::Model3dTaskStatus; +pub use texture_alignment::Model3dTextureAlignment; +pub use texture_quality::Model3dTextureQuality; diff --git a/server-rs/crates/shared-contracts/src/model3d/common/model_version.rs b/server-rs/crates/shared-contracts/src/model3d/common/model_version.rs new file mode 100644 index 000000000..172a1bcf1 --- /dev/null +++ b/server-rs/crates/shared-contracts/src/model3d/common/model_version.rs @@ -0,0 +1,30 @@ +use serde::{Deserialize, Serialize}; + +use super::MODEL3D_TS_EXPORT_DIR; + +#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize, ts_rs::TS)] +#[ts(export, export_to = MODEL3D_TS_EXPORT_DIR)] +pub enum Model3dModelVersion { + #[serde(rename = "v3.1-20260211")] + H31, + #[serde(rename = "v3.0-20250812")] + H30, + #[serde(rename = "v2.5-20250123")] + H25, + #[serde(rename = "P1-20260311")] + P1, + #[serde(rename = "P2-20260801")] + P2, +} + +impl Model3dModelVersion { + pub const fn as_str(self) -> &'static str { + match self { + Self::H31 => "v3.1-20260211", + Self::H30 => "v3.0-20250812", + Self::H25 => "v2.5-20250123", + Self::P1 => "P1-20260311", + Self::P2 => "P2-20260801", + } + } +} diff --git a/server-rs/crates/shared-contracts/src/model3d/common/output_format.rs b/server-rs/crates/shared-contracts/src/model3d/common/output_format.rs new file mode 100644 index 000000000..bd7717002 --- /dev/null +++ b/server-rs/crates/shared-contracts/src/model3d/common/output_format.rs @@ -0,0 +1,22 @@ +use serde::{Deserialize, Serialize}; + +use super::MODEL3D_TS_EXPORT_DIR; + +#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize, ts_rs::TS)] +#[ts(export, export_to = MODEL3D_TS_EXPORT_DIR)] +pub enum Model3dOutputFormat { + #[serde(rename = "glb")] + Glb, + #[serde(rename = "gltf")] + Gltf, + #[serde(rename = "fbx")] + Fbx, + #[serde(rename = "obj")] + Obj, + #[serde(rename = "stl")] + Stl, + #[serde(rename = "usdz")] + Usdz, + #[serde(rename = "3mf")] + ThreeMf, +} diff --git a/server-rs/crates/shared-contracts/src/model3d/common/style.rs b/server-rs/crates/shared-contracts/src/model3d/common/style.rs new file mode 100644 index 000000000..096cec931 --- /dev/null +++ b/server-rs/crates/shared-contracts/src/model3d/common/style.rs @@ -0,0 +1,20 @@ +use serde::{Deserialize, Serialize}; + +use super::MODEL3D_TS_EXPORT_DIR; + +#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize, ts_rs::TS)] +#[ts(export, export_to = MODEL3D_TS_EXPORT_DIR)] +pub enum Model3dStyle { + /// TODO(tripo-docs): replace this compile-time placeholder with the + /// official text-to-model style enum values. + #[serde(rename = "example")] + Example, +} + +impl Model3dStyle { + pub const fn as_str(self) -> &'static str { + match self { + Self::Example => "example", + } + } +} diff --git a/server-rs/crates/shared-contracts/src/model3d/common/task_status.rs b/server-rs/crates/shared-contracts/src/model3d/common/task_status.rs new file mode 100644 index 000000000..f9a65d575 --- /dev/null +++ b/server-rs/crates/shared-contracts/src/model3d/common/task_status.rs @@ -0,0 +1,16 @@ +use serde::{Deserialize, Serialize}; + +use super::MODEL3D_TS_EXPORT_DIR; + +#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)] +#[serde(rename_all = "kebab-case")] +#[derive(ts_rs::TS)] +#[ts(export, export_to = MODEL3D_TS_EXPORT_DIR)] +pub enum Model3dTaskStatus { + Queued, + Running, + Completed, + Failed, + Cancelled, + Expired, +} diff --git a/server-rs/crates/shared-contracts/src/model3d/common/texture_alignment.rs b/server-rs/crates/shared-contracts/src/model3d/common/texture_alignment.rs new file mode 100644 index 000000000..1c87c36b8 --- /dev/null +++ b/server-rs/crates/shared-contracts/src/model3d/common/texture_alignment.rs @@ -0,0 +1,21 @@ +use serde::{Deserialize, Serialize}; + +use super::MODEL3D_TS_EXPORT_DIR; + +#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)] +#[serde(rename_all = "snake_case")] +#[derive(ts_rs::TS)] +#[ts(export, export_to = MODEL3D_TS_EXPORT_DIR)] +pub enum Model3dTextureAlignment { + OriginalImage, + Geometry, +} + +impl Model3dTextureAlignment { + pub const fn as_str(self) -> &'static str { + match self { + Self::OriginalImage => "original_image", + Self::Geometry => "geometry", + } + } +} diff --git a/server-rs/crates/shared-contracts/src/model3d/common/texture_quality.rs b/server-rs/crates/shared-contracts/src/model3d/common/texture_quality.rs new file mode 100644 index 000000000..661bd1b27 --- /dev/null +++ b/server-rs/crates/shared-contracts/src/model3d/common/texture_quality.rs @@ -0,0 +1,23 @@ +use serde::{Deserialize, Serialize}; + +use super::MODEL3D_TS_EXPORT_DIR; + +#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)] +#[serde(rename_all = "lowercase")] +#[derive(ts_rs::TS)] +#[ts(export, export_to = MODEL3D_TS_EXPORT_DIR)] +pub enum Model3dTextureQuality { + Standard, + Detailed, + Extreme, +} + +impl Model3dTextureQuality { + pub const fn as_str(self) -> &'static str { + match self { + Self::Standard => "standard", + Self::Detailed => "detailed", + Self::Extreme => "extreme", + } + } +} diff --git a/server-rs/crates/shared-contracts/src/model3d/image_to_model/mod.rs b/server-rs/crates/shared-contracts/src/model3d/image_to_model/mod.rs new file mode 100644 index 000000000..70006ce90 --- /dev/null +++ b/server-rs/crates/shared-contracts/src/model3d/image_to_model/mod.rs @@ -0,0 +1,8 @@ +pub(crate) const MODEL3D_TS_EXPORT_DIR: &str = concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../../packages/shared/src/contracts/model3d/image-to-model/" +); + +mod request; + +pub use request::Model3dImageToModelRequest; diff --git a/server-rs/crates/shared-contracts/src/model3d/image_to_model/request.rs b/server-rs/crates/shared-contracts/src/model3d/image_to_model/request.rs new file mode 100644 index 000000000..fd2233640 --- /dev/null +++ b/server-rs/crates/shared-contracts/src/model3d/image_to_model/request.rs @@ -0,0 +1,57 @@ +use serde::{Deserialize, Serialize}; + +use crate::model3d::common::{ + Model3dCompression, Model3dExportOrientation, Model3dGeometryQuality, Model3dInputOrientation, + Model3dModelVersion, Model3dStyle, Model3dTextureAlignment, Model3dTextureQuality, +}; + +use super::MODEL3D_TS_EXPORT_DIR; + +#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +#[derive(ts_rs::TS)] +#[ts(export, export_to = MODEL3D_TS_EXPORT_DIR)] +pub struct Model3dImageToModelRequest { + pub input: String, + #[serde(default)] + pub model: Option, + #[serde(default)] + pub enable_image_autofix: Option, + #[serde(default)] + #[ts(type = "number | null")] + pub model_seed: Option, + #[serde(default)] + #[ts(type = "number | null")] + pub texture_seed: Option, + #[serde(default)] + pub texture: Option, + #[serde(default)] + pub pbr: Option, + #[serde(default)] + pub texture_quality: Option, + #[serde(default)] + pub texture_alignment: Option, + #[serde(default)] + pub geometry_quality: Option, + #[serde(default)] + #[ts(type = "number | null")] + pub face_limit: Option, + #[serde(default)] + pub auto_size: Option, + #[serde(default)] + pub orientation: Option, + #[serde(default)] + pub quad: Option, + #[serde(default)] + pub smart_low_poly: Option, + #[serde(default)] + pub generate_parts: Option, + #[serde(default)] + pub compress: Option, + #[serde(default)] + pub export_uv: Option, + #[serde(default)] + pub export_orientation: Option, + #[serde(default)] + pub style: Option, +} diff --git a/server-rs/crates/shared-contracts/src/model3d/mod.rs b/server-rs/crates/shared-contracts/src/model3d/mod.rs new file mode 100644 index 000000000..3293af64e --- /dev/null +++ b/server-rs/crates/shared-contracts/src/model3d/mod.rs @@ -0,0 +1,8 @@ +//! Provider-neutral 3D model generation contracts. + +pub mod common; +pub mod image_to_model; +pub mod multiview_to_model; +pub mod text_to_model; + +pub const MODEL3D_CONTRACT_VERSION: &str = "model3d.v1"; diff --git a/server-rs/crates/shared-contracts/src/model3d/multiview_to_model/mod.rs b/server-rs/crates/shared-contracts/src/model3d/multiview_to_model/mod.rs new file mode 100644 index 000000000..48aeae756 --- /dev/null +++ b/server-rs/crates/shared-contracts/src/model3d/multiview_to_model/mod.rs @@ -0,0 +1,8 @@ +pub(crate) const MODEL3D_TS_EXPORT_DIR: &str = concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../../packages/shared/src/contracts/model3d/multiview-to-model/" +); + +mod request; + +pub use request::{Model3dMultiviewInputs, Model3dMultiviewToModelRequest}; diff --git a/server-rs/crates/shared-contracts/src/model3d/multiview_to_model/request.rs b/server-rs/crates/shared-contracts/src/model3d/multiview_to_model/request.rs new file mode 100644 index 000000000..c98ded2d0 --- /dev/null +++ b/server-rs/crates/shared-contracts/src/model3d/multiview_to_model/request.rs @@ -0,0 +1,73 @@ +use serde::{Deserialize, Serialize}; + +use crate::model3d::common::{ + Model3dCompression, Model3dExportOrientation, Model3dGeometryQuality, Model3dInputOrientation, + Model3dModelVersion, Model3dTextureAlignment, Model3dTextureQuality, +}; + +use super::MODEL3D_TS_EXPORT_DIR; + +#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] +#[serde(tag = "kind", rename_all = "camelCase")] +#[derive(ts_rs::TS)] +#[ts(export, export_to = MODEL3D_TS_EXPORT_DIR)] +pub enum Model3dMultiviewInputs { + Views { + front: String, + #[serde(default)] + left: Option, + #[serde(default)] + back: Option, + #[serde(default)] + right: Option, + }, + TaskId { + #[serde(rename = "taskId")] + task_id: String, + }, +} + +#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +#[derive(ts_rs::TS)] +#[ts(export, export_to = MODEL3D_TS_EXPORT_DIR)] +pub struct Model3dMultiviewToModelRequest { + pub inputs: Model3dMultiviewInputs, + #[serde(default)] + pub model: Option, + #[serde(default)] + #[ts(type = "number | null")] + pub model_seed: Option, + #[serde(default)] + #[ts(type = "number | null")] + pub texture_seed: Option, + #[serde(default)] + pub texture: Option, + #[serde(default)] + pub pbr: Option, + #[serde(default)] + pub texture_quality: Option, + #[serde(default)] + pub geometry_quality: Option, + #[serde(default)] + pub texture_alignment: Option, + #[serde(default)] + #[ts(type = "number | null")] + pub face_limit: Option, + #[serde(default)] + pub auto_size: Option, + #[serde(default)] + pub orientation: Option, + #[serde(default)] + pub quad: Option, + #[serde(default)] + pub smart_low_poly: Option, + #[serde(default)] + pub generate_parts: Option, + #[serde(default)] + pub compress: Option, + #[serde(default)] + pub export_uv: Option, + #[serde(default)] + pub export_orientation: Option, +} diff --git a/server-rs/crates/shared-contracts/src/model3d/text_to_model/mod.rs b/server-rs/crates/shared-contracts/src/model3d/text_to_model/mod.rs new file mode 100644 index 000000000..569acfc33 --- /dev/null +++ b/server-rs/crates/shared-contracts/src/model3d/text_to_model/mod.rs @@ -0,0 +1,11 @@ +pub(crate) const MODEL3D_TS_EXPORT_DIR: &str = concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../../packages/shared/src/contracts/model3d/text-to-model/" +); + +mod request; +mod response; +pub use request::Model3dTextToModelRequest; +pub use response::{ + Model3dArtifact, Model3dGenerationJob, Model3dGenerationResult, Model3dGenerationSubmission, +}; diff --git a/server-rs/crates/shared-contracts/src/model3d/text_to_model/request.rs b/server-rs/crates/shared-contracts/src/model3d/text_to_model/request.rs new file mode 100644 index 000000000..993b82cc3 --- /dev/null +++ b/server-rs/crates/shared-contracts/src/model3d/text_to_model/request.rs @@ -0,0 +1,55 @@ +use serde::{Deserialize, Serialize}; + +use super::MODEL3D_TS_EXPORT_DIR; +use crate::model3d::common::{ + Model3dCompression, Model3dExportOrientation, Model3dGeometryQuality, Model3dModelVersion, + Model3dStyle, Model3dTextureQuality, +}; + +#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +#[derive(ts_rs::TS)] +#[ts(export, export_to = MODEL3D_TS_EXPORT_DIR)] +pub struct Model3dTextToModelRequest { + pub prompt: String, + #[serde(default)] + pub model: Option, + #[serde(default)] + pub negative_prompt: Option, + #[serde(default)] + #[ts(type = "number | null")] + pub image_seed: Option, + #[serde(default)] + #[ts(type = "number | null")] + pub model_seed: Option, + #[serde(default)] + #[ts(type = "number | null")] + pub texture_seed: Option, + #[serde(default)] + pub texture: Option, + #[serde(default)] + pub pbr: Option, + #[serde(default)] + pub texture_quality: Option, + #[serde(default)] + pub geometry_quality: Option, + #[serde(default)] + #[ts(type = "number | null")] + pub face_limit: Option, + #[serde(default)] + pub auto_size: Option, + #[serde(default)] + pub quad: Option, + #[serde(default)] + pub smart_low_poly: Option, + #[serde(default)] + pub generate_parts: Option, + #[serde(default)] + pub compress: Option, + #[serde(default)] + pub export_uv: Option, + #[serde(default)] + pub export_orientation: Option, + #[serde(default)] + pub style: Option, +} diff --git a/server-rs/crates/shared-contracts/src/model3d/text_to_model/response.rs b/server-rs/crates/shared-contracts/src/model3d/text_to_model/response.rs new file mode 100644 index 000000000..0427d946b --- /dev/null +++ b/server-rs/crates/shared-contracts/src/model3d/text_to_model/response.rs @@ -0,0 +1,59 @@ +use serde::{Deserialize, Serialize}; + +use crate::model3d::common::{Model3dOutputFormat, Model3dTaskStatus}; + +use super::MODEL3D_TS_EXPORT_DIR; + +#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)] +#[serde(rename_all = "camelCase")] +#[derive(ts_rs::TS)] +#[ts(export, export_to = MODEL3D_TS_EXPORT_DIR)] +pub struct Model3dGenerationSubmission { + pub operation_id: String, + pub status: Model3dTaskStatus, + pub status_url: String, + #[ts(type = "number")] + pub poll_after_ms: u64, +} + +#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)] +#[serde(rename_all = "camelCase")] +#[derive(ts_rs::TS)] +#[ts(export, export_to = MODEL3D_TS_EXPORT_DIR)] +pub struct Model3dGenerationJob { + pub operation_id: String, + pub status: Model3dTaskStatus, + pub phase: String, + pub progress: u8, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub error: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub result: Option, + #[ts(type = "number")] + pub updated_at_micros: i64, +} + +#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)] +#[serde(rename_all = "camelCase")] +#[derive(ts_rs::TS)] +#[ts(export, export_to = MODEL3D_TS_EXPORT_DIR)] +pub struct Model3dGenerationResult { + pub resource_id: String, + pub asset_id: String, + pub artifacts: Vec, +} + +#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)] +#[serde(rename_all = "camelCase")] +#[derive(ts_rs::TS)] +#[ts(export, export_to = MODEL3D_TS_EXPORT_DIR)] +pub struct Model3dArtifact { + pub resource_id: String, + pub format: Model3dOutputFormat, + pub content_type: String, + #[ts(type = "number")] + pub size_bytes: u64, + pub sha256: String, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub preview_resource_id: Option, +}