diff --git a/src/components/image-editor/model3d-generation/Model3dGenerationSubmission.test.ts b/src/components/image-editor/model3d-generation/Model3dGenerationSubmission.test.ts index 08c12bb1c..94e1e5b7f 100644 --- a/src/components/image-editor/model3d-generation/Model3dGenerationSubmission.test.ts +++ b/src/components/image-editor/model3d-generation/Model3dGenerationSubmission.test.ts @@ -138,11 +138,8 @@ describe('buildModel3dSubmissionPlan', () => { smartLowPoly: false, generateParts: false, }, - target: { - kind: 'projectResource', - projectId: 'project-1', - canvasCompletion: CANVAS_COMPLETION, - }, + projectId: 'project-1', + canvasCompletion: CANVAS_COMPLETION, }); }); @@ -172,7 +169,7 @@ describe('buildModel3dSubmissionPlan', () => { smartLowPoly: false, generateParts: true, }, - target: { kind: 'projectResource', projectId: 'project-1' }, + projectId: 'project-1', }); expect(result.plan.body).not.toHaveProperty('prompt'); // 后端显式拒绝 texture=false + textureQuality 的组合,缺位是契约要求。 @@ -322,7 +319,7 @@ describe('Idempotency-Key', () => { endpoint: 'text-to-model', body: { generation: { model: 'v3.1-20260211', prompt: '木椅' }, - target: { kind: 'projectResource', projectId: 'project-1' }, + projectId: 'project-1', }, }), ).toMatch(/^[\x21-\x7e]{1,128}$/); @@ -334,7 +331,7 @@ describe('Idempotency-Key', () => { endpoint: 'text-to-model', body: { generation: { texture: true, model: 'v3.1-20260211', prompt: '木椅' }, - target: { kind: 'projectResource', projectId: 'project-1' }, + projectId: 'project-1', }, }); const right = resolveModel3dRequestKey({ @@ -342,7 +339,7 @@ describe('Idempotency-Key', () => { endpoint: 'text-to-model', body: { generation: { model: 'v3.1-20260211', texture: true, prompt: '木椅' }, - target: { kind: 'projectResource', projectId: 'project-1' }, + projectId: 'project-1', }, }); expect(right).toBe(left); diff --git a/src/components/image-editor/model3d-generation/Model3dGenerationSubmission.ts b/src/components/image-editor/model3d-generation/Model3dGenerationSubmission.ts index f5d894301..e218c83e5 100644 --- a/src/components/image-editor/model3d-generation/Model3dGenerationSubmission.ts +++ b/src/components/image-editor/model3d-generation/Model3dGenerationSubmission.ts @@ -1,7 +1,6 @@ import type { ExternalGenerationJobStatusRecord } from '../../../../packages/shared/src/contracts/externalGeneration'; import type { Model3dGenerationSource, - Model3dGenerationTarget, Model3dImageToModelRequest, Model3dTextToModelRequest, } from '../../../../packages/shared/src/contracts/model3d'; @@ -126,8 +125,9 @@ export function buildModel3dSubmissionPlan({ smartLowPoly: params.smartLowPoly, generateParts: params.generateParts, }; - const target: Model3dGenerationTarget = { - kind: 'projectResource', + // 落点与其它生成接口同形:平坦的可选字段,不再包一层 tagged enum。 + // 服务端按「二选一」校验:这里只给 projectId(画布链路没有落素材库的入口)。 + const placement = { projectId: trimmedProjectId, ...(canvasCompletion ? { canvasCompletion } : {}), }; @@ -153,14 +153,14 @@ export function buildModel3dSubmissionPlan({ if (!source) { return { ok: false, message: MODEL3D_IMAGE_SOURCE_REQUIRED_MESSAGE }; } - return finish({ source, generation, target }); + return finish({ source, generation, ...placement }); } const prompt = dialog.prompt.trim(); if (!prompt) { return { ok: false, message: MODEL3D_TEXT_PROMPT_REQUIRED_MESSAGE }; } - return finish({ generation: { ...generation, prompt }, target }); + return finish({ generation: { ...generation, prompt }, ...placement }); } /** diff --git a/src/components/image-editor/model3d-generation/useModel3dGenerationTask.test.tsx b/src/components/image-editor/model3d-generation/useModel3dGenerationTask.test.tsx index b10b6b038..4e28579f0 100644 --- a/src/components/image-editor/model3d-generation/useModel3dGenerationTask.test.tsx +++ b/src/components/image-editor/model3d-generation/useModel3dGenerationTask.test.tsx @@ -166,7 +166,7 @@ describe('useModel3dGenerationTask', () => { smartLowPoly: false, generateParts: false, }, - target: { kind: 'projectResource', projectId: 'project-1' }, + projectId: 'project-1', }); expect(applyQueuedGeneration).toHaveBeenCalledTimes(1); diff --git a/src/services/image-editor/editorProjectClient.ts b/src/services/image-editor/editorProjectClient.ts index 2e04bd5f6..040880d5f 100644 --- a/src/services/image-editor/editorProjectClient.ts +++ b/src/services/image-editor/editorProjectClient.ts @@ -1746,7 +1746,7 @@ export async function submitModel3dGenerationRequest({ idempotencyKey, }: { endpoint: Model3dPricingEndpoint; - // 提交体直接用端点契约:形状不符(缺 target、generation 结构错)在编译期就会暴露。 + // 提交体直接用端点契约:形状不符(落点缺失、generation 结构错)在编译期就会暴露。 body: Model3dTextToModelRequest | Model3dImageToModelRequest; idempotencyKey: string; }) {