Compare commits

..

7 Commits

Author SHA1 Message Date
k88936 da9ee65119 记录Tripo真实冒烟结果结构
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Successful in 7m41s
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Successful in 7m48s
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Successful in 7m50s
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Successful in 8m0s
Project CI / Backend tests (pull_request) Failing after 11s
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 2m17s
Project CI / Repository checks (pull_request) Failing after 10s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 2m29s
Project CI / Frontend tests (pull_request) Successful in 14m49s
Project CI / AI game creator shell web tests (pull_request) Failing after 18m48s
Project CI / Native shell tests (pull_request) Failing after 27m31s
保留三个生成入口的脱敏真实结果形状与下载产物信息

使用实际可访问的 Rustacean 图片完成 image 与 multiview 示例

同步严格 endpoint 结果契约和真实 Provider 验收文档
2026-09-18 21:42:17 +08:00
k88936 527706b84e 按接口收紧Tripo任务结果类型
为 text、image、multiview 三类生成定义独立必填结果结构

以枚举关联任务类型与具体结果并对缺失字段失败关闭

将通用 URL 类型由 TripoModelUrl 更名为 TripoUrl
2026-09-18 21:37:38 +08:00
k88936 a4beb53dc6 完善Tripo冒烟CLI产物流程
等待三类生成任务完成并打印映射后的输出

完成后下载模型产物到当前目录并输出文件信息

仅在示例内部使用SDK轮询器,不扩展平台公共接口
2026-09-18 18:51:49 +08:00
k88936 25314d9a4a 新增Tripo三类生成冒烟CLI
增加仅通过环境变量配置的 Tripo generation example

顺序提交 text、image、multiview 三类任务并执行单次状态查询

保持无命令行参数且不调用 SDK 轮询接口
2026-09-18 18:42:58 +08:00
k88936 5be4a51ac1 完善Tripo枚举与参数组合校验
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Successful in 7m19s
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Successful in 7m22s
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Successful in 7m26s
Project CI / Backend tests (pull_request) Failing after 11s
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Successful in 7m38s
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 2m1s
Project CI / Repository checks (pull_request) Failing after 15s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 2m54s
Project CI / Native shell tests (pull_request) Failing after 3m5s
Project CI / AI game creator shell web tests (pull_request) Failing after 2m13s
Project CI / Frontend tests (pull_request) Successful in 5m44s
按提供的 Tripo 文档补齐 compression、texture quality 与 texture version 枚举

移除未在三个生成接口出现的 style 占位字段并同步 Rust/TypeScript contracts

增加模型版本、纹理版本、生成部件、quad、smart-low-poly 与 face limit 的副作用前校验

同步 Provider 技术方案和 ADR
2026-09-18 17:23:55 +08:00
k88936 37b355a814 接入Tripo三类3D生成Provider
加入固定 revision 的 tripo-rust-sdk 与 platform-tripo workspace crate

实现 text-to-model、image-to-model、multiview-to-model 提交、通用任务查询和显式模型下载

抽取通用任务类型、状态映射、输出 URL 校验与 SDK 错误归一,保持 wait_for_task 不对外暴露

同步 Provider 边界文档并暂不接入 api-server
2026-09-18 16:02:13 +08:00
k88936 1c4009ea3b 建立3D生成目录化契约
新增 model3d common、text-to-model、image-to-model、multiview-to-model Rust contracts

通过 ts-rs 按目录生成 TypeScript bindings,移除依赖 barrel 的组织方式

增加 model3d contracts 定向生成脚本
2026-09-18 15:59:19 +08:00
72 changed files with 2371 additions and 87 deletions
+18
View File
@@ -50,6 +50,24 @@ _Avoid_: 为每个玩法单独发明素材流水线、把系列素材建模成
## Language
### 3D Model Generation
**3D 模型生成操作**:
由文本提示驱动、可异步查询并最终产生模型文件的 provider-neutral 操作;操作状态和产品资源结果分开建模。
_Avoid_: 直接把第三方 provider task 当作产品资源、把模型 URL 当作永久资源地址
**Provider task**:
第三方 3D 生成平台返回的任务引用与任务快照,只存在于 provider adapter 的 Rust 边界内;它不是 Genarrative 的内部操作 ID。
_Avoid_: 把 Tripo task ID 当作稳定产品 operationId、让 SDK 类型穿透 api-server
**临时 provider URL**:
第三方任务完成后返回的短时模型下载地址,必须通过显式下载流程转换为本地或持久化资源,不能直接当作长期资产地址。
_Avoid_: 永久 OSS URL、资源 ID
**模型 artifact**:
由 text-to-model、image-to-model 或 multiview-to-model 任务产生、待应用层登记和持久化的模型文件结果;provider adapter 只提供可下载结果,不负责生成 resourceId 或 assetId。
_Avoid_: 仅 UI 中展示的模型链接、没有来源任务的静态文件
### Puzzle Clear
**拼消消**:
+1
View File
@@ -5016,6 +5016,7 @@ dependencies = [
"serde",
"serde_json",
"sha2",
"ts-rs",
]
[[package]]
@@ -411,7 +411,9 @@ export function registerClientHomeTests() {
await openResourceBookCategory('UI 交互');
expect(await findResourceSelectButton('live-hero.png')).not.toBeNull();
await openResourceBookCategory('项目版本');
expect(await findResourceSelectButton('版本 1')).not.toBeNull();
expect(
await findResourceSelectButton('版本 1'),
).not.toBeNull();
expect(runButton.getAttribute('data-unavailable')).toBeNull();
await waitFor(() => {
expect(invoke).toHaveBeenCalledWith(
@@ -580,7 +582,9 @@ export function registerClientHomeTests() {
}),
).not.toBeNull();
await openResourceBookCategory('项目版本');
expect(await findResourceSelectButton('版本 1')).not.toBeNull();
expect(
await findResourceSelectButton('版本 1'),
).not.toBeNull();
expect(runButton.getAttribute('data-unavailable')).toBeNull();
await waitFor(() => {
expect(
@@ -3836,9 +3836,7 @@ export function registerProjectWorkbenchFoundationTests() {
];
await openResourceBookCategory('角色与对象');
const infoButton = await screen.findByRole('button', {
name: '查看hero.png资源信息',
});
const infoButton = await screen.findByRole('button', { name: '查看hero.png资源信息' });
expect(infoButton.getAttribute('aria-pressed')).toBe('false');
// 未选中的卡片直接打开信息,不被选中变化 effect 立即关闭。
@@ -4098,7 +4096,13 @@ export function registerProjectWorkbenchFoundationTests() {
within(audioToolbar)
.getAllByRole('button')
.map((button) => button.getAttribute('aria-label')),
).toEqual(['引用资源 bgm.mp3', '编辑标签', '重命名', '导出', '删除素材']);
).toEqual([
'引用资源 bgm.mp3',
'编辑标签',
'重命名',
'导出',
'删除素材',
]);
// 工具条的「导出」必须真的走通落盘链路:原生保存对话框 + Rust 分块复制,
// 而不是只渲染一个按钮。原生对话框由入口文件 mock 成"用户选了
@@ -2072,9 +2072,7 @@ describe('project resource live canvas integration', () => {
await openResourceBookCategory('角色与对象');
fireEvent.click(await findResourceSelectButton('hero.png'));
const toolbar = await screen.findByRole('toolbar', { name: '图片工具栏' });
fireEvent.click(
screen.getByRole('button', { name: '查看hero.png资源信息' }),
);
fireEvent.click(screen.getByRole('button', { name: '查看hero.png资源信息' }));
const infoPanel = await screen.findByRole('dialog', { name: '资源信息' });
// 分类值本身仍是只读文本(`dd` 里只有值,入口按钮在它外面)。
@@ -379,10 +379,7 @@ function toolbarAction(toolbar: HTMLElement, name: string) {
const visible = within(toolbar).queryByRole('button', { name });
if (visible) return visible;
fireEvent.mouseEnter(within(toolbar).getByRole('button', { name: '更多' }));
return within(screen.getByRole('group', { name: '更多操作' })).getByRole(
'button',
{ name },
);
return within(screen.getByRole('group', { name: '更多操作' })).getByRole('button', { name });
}
async function selectCardAndOpenToolbar(label: string) {
@@ -553,20 +550,12 @@ describe('版本级资源替换', () => {
const toolbar = await selectCardAndOpenToolbar('legacy.png');
fireEvent.mouseEnter(within(toolbar).getByRole('button', { name: '更多' }));
const menu = screen.getByRole('group', { name: '更多操作' });
const viewport = () =>
document
.querySelector('[data-resource-viewport]')
?.getAttribute('data-resource-viewport');
const viewport = () => document.querySelector('[data-resource-viewport]')
?.getAttribute('data-resource-viewport');
const before = viewport();
expect(before).toBeTruthy();
const wheel = new WheelEvent('wheel', {
bubbles: true,
cancelable: true,
deltaY: 120,
});
act(() => {
menu.dispatchEvent(wheel);
});
const wheel = new WheelEvent('wheel', { bubbles: true, cancelable: true, deltaY: 120 });
act(() => { menu.dispatchEvent(wheel); });
expect(wheel.defaultPrevented).toBe(false);
expect(viewport()).toBe(before);
@@ -579,15 +568,9 @@ describe('版本级资源替换', () => {
const scene = document.querySelector('.game-resource-book-scene')!;
act(() => {
scene.dispatchEvent(
new WheelEvent('wheel', {
bubbles: true,
cancelable: true,
deltaY: 120,
clientX: 90,
clientY: 70,
}),
);
scene.dispatchEvent(new WheelEvent('wheel', {
bubbles: true, cancelable: true, deltaY: 120, clientX: 90, clientY: 70,
}));
});
expect(viewport()).not.toBe(before);
});
@@ -595,17 +578,13 @@ describe('版本级资源替换', () => {
it('信息从未选中卡打开并跟随资源身份,普通换选会关闭', async () => {
renderReplacementWorkbench();
await selectCardAndOpenToolbar('legacy.png');
const lateInfo = screen.getByRole('button', {
name: '查看late.png资源信息',
});
const lateInfo = screen.getByRole('button', { name: '查看late.png资源信息' });
fireEvent.pointerDown(lateInfo, { button: 0 });
fireEvent.click(lateInfo);
const panel = screen.getByRole('dialog', { name: '资源信息' });
expect(within(panel).getByText('late.png')).toBeTruthy();
expect(lateInfo.getAttribute('aria-pressed')).toBe('true');
fireEvent.click(
screen.getByRole('button', { name: '查看legacy.png资源信息' }),
);
fireEvent.click(screen.getByRole('button', { name: '查看legacy.png资源信息' }));
const switched = screen.getByRole('dialog', { name: '资源信息' });
expect(within(switched).getByText('legacy.png')).toBeTruthy();
expect(within(switched).queryByText('late.png')).toBeNull();
@@ -618,10 +597,10 @@ describe('版本级资源替换', () => {
// 未被初始版本绑定的素材(版本创建之后才登记):工具条照常出现,但没有「替换素材」。
const lateToolbar = await selectCardAndOpenToolbar('late.png');
fireEvent.mouseEnter(
within(lateToolbar).getByRole('button', { name: '更多' }),
);
expect(screen.queryByRole('button', { name: '替换素材' })).toBeNull();
fireEvent.mouseEnter(within(lateToolbar).getByRole('button', { name: '更多' }));
expect(
screen.queryByRole('button', { name: '替换素材' }),
).toBeNull();
expect(
within(lateToolbar).getByRole('button', { name: '快速编辑' }),
).not.toBeNull();
@@ -635,7 +614,9 @@ describe('版本级资源替换', () => {
// 被当前版本绑定的素材:入口出现。
const sourceToolbar = await selectCardAndOpenToolbar('legacy.png');
expect(toolbarAction(sourceToolbar, '替换素材')).not.toBeNull();
expect(
toolbarAction(sourceToolbar, '替换素材'),
).not.toBeNull();
});
it('从入口一路走到写入:候选弹窗禁用硬门禁项、给出格式提示、直接替换且不产生新版本', async () => {
@@ -914,10 +895,9 @@ describe('版本级资源替换', () => {
const deleteButton = toolbarAction(toolbar, '删除素材');
const toolbarLabels = [
...within(toolbar).getAllByRole('button'),
...within(screen.getByRole('group', { name: '更多操作' })).getAllByRole(
'button',
),
].map((button) => button.getAttribute('aria-label') ?? '');
...within(screen.getByRole('group', { name: '更多操作' })).getAllByRole('button'),
]
.map((button) => button.getAttribute('aria-label') ?? '');
// 末位:在最后一个非破坏性动作(替换素材)之后、共享导出按钮之前。
expect(toolbarLabels.indexOf('删除素材')).toBeGreaterThan(
toolbarLabels.indexOf('替换素材'),
@@ -1431,7 +1411,9 @@ describe('版本级资源替换', () => {
// 第一次:legacy → final。
const legacyToolbar = await selectCardAndOpenToolbar('legacy.png');
fireEvent.click(toolbarAction(legacyToolbar, '替换素材'));
fireEvent.click(
toolbarAction(legacyToolbar, '替换素材'),
);
let dialog = await screen.findByRole('dialog', {
name: '选择替换素材',
});
@@ -1449,7 +1431,9 @@ describe('版本级资源替换', () => {
// 第二次:final → final.webp(同一个工作台会话内)。
const finalToolbar = await selectCardAndOpenToolbar('final.png');
fireEvent.click(toolbarAction(finalToolbar, '替换素材'));
fireEvent.click(
toolbarAction(finalToolbar, '替换素材'),
);
dialog = await screen.findByRole('dialog', { name: '选择替换素材' });
fireEvent.click(
within(dialog).getByRole('option', { name: '选择替换素材final.webp' }),
+4
View File
@@ -25,6 +25,8 @@
## AI 游戏创作与 Agent Runtime
- [Tripo 3D 模型 Provider 集成](./technical/【技术方案】Tripo文本到3D模型Provider集成-2026-09-18.md):实现 text-to-model、image-to-model、multiview-to-model 的 Rust provider adapter,暂不接入 api-server。
- [策划 Agent 生产迁移与工作区浏览](./technical/【技术方案】策划Agent生产迁移与工作区浏览-2026-09-10.md):实施中;以自由协作原型为行为基线,复用生产基建,采用阶段审批与用户工作区文件浏览。无旧 V2 会话的策划入口切换到新设计 Agent。
- [LLM 累计额度结算](./technical/【技术方案】LLM累计额度结算-2026-09-05.md):Router 累计额度、首次基线与原子钱包结算。
@@ -74,6 +76,8 @@
## 后端、运维与测试
- [Tripo SDK 隔离与 Provider DTO 边界 ADR](./adr/【ADR】0001-Tripo%20SDK隔离与Provider%20DTO边界-2026-09-18.md):固定 SDK 只存在于 `platform-tripo` 内部,provider task 与产品资源结果分层。
- [BgFilter 受限资源调度方案](./technical/【后端架构】BgFilter受限资源调度方案-2026-07-21.md)
- [Issue225 登录成功 AGC 用户归属修复](./technical/【后端架构】Issue225登录成功AGC用户归属修复方案-2026-09-03.md):登录 route tracking 的真实用户归属、`daily_login` 幂等边界和实施验收。
- [SpacetimeDB 连接池取消安全](./【后端架构】SpacetimeDB连接池租约Drop兜底与取消安全-2026-06-11.md)
@@ -0,0 +1,9 @@
# 【ADR】0001-Tripo SDK隔离与Provider DTO边界-2026-09-18
状态:已接受
`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 要求模型、渲染图和生成参考图 URLimage-to-model 与 multiview-to-model 要求模型和渲染图 URL;共同 task DTO 只用 enum 标识具体结果,不再提供由 `Vec` 和可选字段组成的宽松通用 output。URL 使用语义中性的 `TripoUrl`,真实响应缺少对应必填字段时以 output schema error 失败关闭。
@@ -0,0 +1,35 @@
# 【技术方案】Tripo文本到3D模型 Provider 集成-2026-09-18
## 目标
本阶段在 `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-server`、worker、SpacetimeDB、OSS、计费或 UI。
- 不暴露 SDK 的 `wait_for_task`,不在 adapter 内启动后台轮询。
- 不实现后处理、rig、animation、图片生成或其它 SDK endpoint。
## 边界与状态
`platform-tripo` 是唯一接触 `tripo3d-sdk` 的边界。它返回自己的 provider DTO,不让 SDK 类型穿透到未来的 `api-server`。Tripo 的 `success` 映射为 `completed``failed`/`banned` 映射为 `failed``cancelled``expired` 保留为独立终态;未知状态返回结构化错误。
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。
提交前由 provider 统一执行组合校验:模型必填;`fast` 必须配 `v3.5-20260815`;几何质量 / 压缩 / 自动尺寸 / P 系列与 H 系列能力按模型版本限制;`quad``generate_parts``smart_low_poly``texture/pbr` 组合按文档的互斥关系拒绝;`face_limit` 按模型、quad 和 smart-low-poly 模式检查范围。SDK 返回的参数错误仍统一归一为 `TripoError`
## 验收
- `platform-tripo` 不公开 re-export SDK 类型或 `wait_for_task`
- 三个 3D 生成入口的 submit、通用 get task、按 endpoint 严格映射的完成结果和显式 download API 可编译。
- provider 错误统一为 adapter 错误类型。
- shared contracts 的 ts-rs binding 无 feature 开关且始终可生成。
- 真实 Provider smoke 已覆盖三个入口;example 保留脱敏后的结果结构和下载产物信息。
+1
View File
@@ -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",
@@ -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 = 'geometry';
@@ -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';
@@ -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';
@@ -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';
@@ -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';
@@ -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';
@@ -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';
@@ -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';
@@ -0,0 +1,7 @@
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
export type Model3dTextureQuality =
| 'fast'
| 'standard'
| 'detailed'
| 'extreme';
@@ -0,0 +1,6 @@
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
export type Model3dTextureVersion =
| 'v3.5-20260815'
| 'v3.0-20250812'
| 'v2.5-20250123';
@@ -0,0 +1,33 @@
// 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 { Model3dTextureVersion } from '../common/Model3dTextureVersion';
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;
textureVersion: Model3dTextureVersion | null;
delight: boolean | 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;
};
@@ -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 };
@@ -0,0 +1,33 @@
// 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 { Model3dTextureVersion } from '../common/Model3dTextureVersion';
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;
textureVersion: Model3dTextureVersion | null;
delight: boolean | 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;
};
@@ -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;
};
@@ -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;
};

Some files were not shown because too many files have changed in this diff Show More