diff --git a/lib/canvas/generate-image.ts b/lib/canvas/generate-image.ts index c3277d9c7..9ac6b7132 100644 --- a/lib/canvas/generate-image.ts +++ b/lib/canvas/generate-image.ts @@ -11,6 +11,7 @@ import { createStepfunImage } from "@/lib/ai/providers/stepfun-image"; import { createMidjourney } from "@/lib/ai/providers/midjourney"; import { createRunway } from "@/lib/ai/providers/runway"; import { createKrea } from "@/lib/ai/providers/krea"; +import { createVolcanoVision } from "@/lib/ai/providers/volcano-vision"; import { filterReachableRemoteUrls } from "@/lib/net/url-access"; import { acquireCanvasImageModelSlot, @@ -73,6 +74,7 @@ const SUPPORTED_CANVAS_PROVIDER_TYPES = new Set([ "midjourney", "runway", "krea", + "volcano-vision", ]); function summarizeReferenceImageHosts(urls: string[]) { @@ -256,6 +258,12 @@ export async function generateCanvasImage( let provider = selectedModel.provider; if (!SUPPORTED_CANVAS_PROVIDER_TYPES.has(provider.type)) { + if (request.allowFailover === false) { + throw new Error( + "当前图片模型类型暂不支持画布生成,请在后台选择 Gemini/Grsai GPT Image/火山 Seedream/阿里/BFL/RUXA/FAL/OpenAI/StepFun/Runway/Krea 图片模型。" + ); + } + let fallbackModel = selectedModel; let fallbackProvider = provider; for (const candidate of imageModels) { @@ -267,7 +275,7 @@ export async function generateCanvasImage( } if (!SUPPORTED_CANVAS_PROVIDER_TYPES.has(fallbackProvider.type)) { throw new Error( - "当前图片模型类型暂不支持画布生成,请在后台选择 Gemini/Grsai GPT Image/阿里/BFL/RUXA/FAL/OpenAI/StepFun/Runway/Krea 图片模型。" + "当前图片模型类型暂不支持画布生成,请在后台选择 Gemini/Grsai GPT Image/火山 Seedream/阿里/BFL/RUXA/FAL/OpenAI/StepFun/Runway/Krea 图片模型。" ); } if (fallbackModel.model.id !== selectedModel.model.id) { @@ -508,9 +516,25 @@ export async function generateCanvasImage( }); return result.text || ""; }; + } else if (provider.type === "volcano-vision") { + const volcanoVisionProvider = createVolcanoVision({ + apiKey: provider.apiKey, + baseURL: provider.baseUrl, + }); + const modelInstance = volcanoVisionProvider.chat(selectedModel.model.modelId); + executeGenerateBatch = async (batchImageCount) => { + const result = await modelInstance.doGenerate({ + messages, + imageParams: { + ...imageParams, + imageCount: batchImageCount, + }, + }); + return result.text || ""; + }; } else { throw new Error( - `不支持的图片生成模型类型: ${provider.type || "unknown"},请改用 Gemini/Grsai GPT Image/阿里/BFL/RUXA/FAL/OpenAI/StepFun/Midjourney/Runway/Krea 图片模型` + `不支持的图片生成模型类型: ${provider.type || "unknown"},请改用 Gemini/Grsai GPT Image/火山 Seedream/阿里/BFL/RUXA/FAL/OpenAI/StepFun/Midjourney/Runway/Krea 图片模型` ); }