3D 产物 content type 只认字节或槽位白名单,去掉兜底

- 删除 fallback_extension 与「未知声明原样放行 + 扩展名兜底」的归一逻辑
- 槽位白名单收敛为唯一映射表(content type ↔ 对象键扩展名),跨槽位类型返回 None
- resolve_artifact_content_type 改为返回 Result:字节认不出且声明不在白名单时按 502 失败,
  不再把 text/plain 之类的声明连同拼出来的 .glb 扩展名落进 OSS 与 asset_object
- 错误体只回显截断到 64 字符的声明值,避免把任意长度的 provider 文本带进响应
- 重写 storage 测试:新增白名单外声明、跨槽位类型与字节认不出三类用例
- 同步技术方案:说明白名单范围与「不做任何兜底」的口径
This commit is contained in:
2026-09-23 16:39:15 +08:00
parent 6a7cf294a0
commit a4132616d8
9 changed files with 227 additions and 130 deletions
@@ -7,13 +7,13 @@ import type { Model3dImageToModelParams } from './Model3dImageToModelParams';
* image-to-model API 请求:站内图片引用 + provider 生成参数 + 平台字段。
*
* 结果落点与 text-to-model 同形:平坦的可选 `projectId` / `canvasCompletion` /
* `assetFolderId` / `assetLabel`,二选一,不用 tagged enum。
* `assetFolderId` / `assetLabel`,至少给一个,不用 tagged enum。
*/
export type Model3dImageToModelRequest = {
source: Model3dGenerationSource;
generation: Model3dImageToModelParams;
/**
* 项目资源落点;与 `assetFolderId` 二选一。
* 项目资源落点;与 `assetFolderId` 至少给一个,两个都给合法。
*/
projectId?: string | null;
/**
@@ -21,7 +21,7 @@ export type Model3dImageToModelRequest = {
*/
canvasCompletion?: EditorCanvasGenerationCompletionPayload | null;
/**
* 素材库落点;与 `projectId` 二选一。
* 素材库落点;与 `projectId` 至少给一个,两个都给合法。
*/
assetFolderId?: string | null;
/**
@@ -10,12 +10,13 @@ import type { Model3dTextToModelParams } from './Model3dTextToModelParams';
*
* 结果落点与其它生成接口同形:平坦的可选 `projectId` / `canvasCompletion` /
* `assetFolderId` / `assetLabel`,不用 tagged enum —— 客户端不必为「落项目还是落素材库」
* 多拼一层判别结构。服务端按「二选一」校验:两个都给或都不给都拒绝。
* 多拼一层判别结构。服务端按「至少一个落点」校验:两个都不给拒绝,两个都给合法(两条落点都落);
* 没有 `projectId` 时结果只落素材库,与其它画布生成工具一致。
*/
export type Model3dTextToModelRequest = {
generation: Model3dTextToModelParams;
/**
* 项目资源落点;与 `assetFolderId` 二选一。
* 项目资源落点;与 `assetFolderId` 至少给一个,两个都给合法。
*/
projectId?: string | null;
/**
@@ -23,7 +24,7 @@ export type Model3dTextToModelRequest = {
*/
canvasCompletion?: EditorCanvasGenerationCompletionPayload | null;
/**
* 素材库落点;与 `projectId` 二选一。
* 素材库落点;与 `projectId` 至少给一个,两个都给合法。
*/
assetFolderId?: string | null;
/**