From a9a9f8e138e4e0c831960445f5e8944a39679cfb Mon Sep 17 00:00:00 2001 From: 134 Date: Wed, 19 Aug 2026 12:34:13 +0800 Subject: [PATCH] fix(world): guard unsupported modes for external world task provider --- app/api/canvas/world/tasks/route.ts | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/app/api/canvas/world/tasks/route.ts b/app/api/canvas/world/tasks/route.ts index ae3961682..314b1c3a6 100644 --- a/app/api/canvas/world/tasks/route.ts +++ b/app/api/canvas/world/tasks/route.ts @@ -145,6 +145,26 @@ function shouldUseExternalTaskCreateApi( return isWorldLabsExternalTaskApi(config.baseUrl) && mode === "text"; } +function isWorldLabsModeUnsupportedByExternalProvider( + config: Awaited>, + mode: WorldTaskMode +) { + return isWorldLabsExternalTaskApi(config.baseUrl) && mode !== "text"; +} + +function assertWorldModeSupportedByCandidate( + config: Awaited>, + mode: WorldTaskMode, +) { + if (isWorldLabsModeUnsupportedByExternalProvider(config, mode)) { + const normalizedBaseUrl = String(config.baseUrl || "").trim() || "未知服务地址"; + const normalizedMode = String(mode || "").trim() || "未知模式"; + throw new Error( + `${normalizedBaseUrl} 的 world-generation 当前仅支持文生世界(text)。当前提交的是 ${normalizedMode},请先切换供应商或使用文生世界。` + ); + } +} + function resolveOfficialMarbleModel(model?: string | null) { const normalized = readOptionalTrimmedText(model); if (!normalized || normalized === WORLDLABS_EXTERNAL_TASK_MODEL) { @@ -356,6 +376,7 @@ export async function POST(request: Request) { for (const candidate of candidates) { try { const useExternalTaskApi = shouldUseExternalTaskCreateApi(candidate, mode); + assertWorldModeSupportedByCandidate(candidate, mode); if (useExternalTaskApi) { const prompt = readOptionalTrimmedText(body.prompt); if (!prompt) {