From b7de92ec4e850573e7676ba11023f1320cd347b7 Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 19 Feb 2026 00:06:11 +0800 Subject: [PATCH] fix(provider): auto backfill default base urls on migration --- lib/ai/dynamic-provider.ts | 69 ++++++++++++++++++++----------------- lib/ai/provider-defaults.ts | 21 +++++++++++ lib/db/migrate.ts | 31 +++++++++++++++++ 3 files changed, 89 insertions(+), 32 deletions(-) create mode 100644 lib/ai/provider-defaults.ts diff --git a/lib/ai/dynamic-provider.ts b/lib/ai/dynamic-provider.ts index dc6c74bef..ce1781885 100644 --- a/lib/ai/dynamic-provider.ts +++ b/lib/ai/dynamic-provider.ts @@ -22,6 +22,7 @@ import { createRuxaImage } from "./providers/ruxa-image"; import { createFalImage } from "./providers/fal-image"; import { createFalVideo } from "./providers/fal-video"; import { createVolcanoMultimodal } from "./providers/volcano-multimodal"; +import { getProviderDefaultBaseUrl } from "./provider-defaults"; // 缓存已创建的 provider 实例 const providerCache = new Map>(); @@ -41,7 +42,9 @@ function isVolcanoMultimodalBaseUrl(baseUrl?: string | null) { * - custom: OpenAI兼容的第三方API (GPT-5 Nano、其他兼容服务等) */ function getOrCreateProvider(provider: Pick) { - const cacheKey = `${provider.id}-${provider.baseUrl}`; + const resolvedBaseUrl = + provider.baseUrl?.trim() || getProviderDefaultBaseUrl(provider.type) || ""; + const cacheKey = `${provider.id}-${resolvedBaseUrl}`; if (providerCache.has(cacheKey)) { return providerCache.get(cacheKey); @@ -57,9 +60,9 @@ function getOrCreateProvider(provider: Pick> = { + alibaba: "https://dashscope.aliyuncs.com/compatible-mode/v1", + openai: "https://api.openai.com/v1", + "huanke-gemini": "https://api.huandutech.com/v1", + "qianwen-video": "https://dashscope.aliyuncs.com/api/v1/services/aigc/video-generation", + "doubao-video": "https://ark.cn-beijing.volces.com/api/v3", + "volcano-vision": "https://ark.cn-beijing.volces.com", + "volcano-video": "https://ark.cn-beijing.volces.com/api/v3", + "alibaba-image": + "https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation", + "ruxa-image": "https://api.ruxa.ai", + "fal-image": "https://fal.run", + "fal-video": "https://fal.run", +}; + +export function getProviderDefaultBaseUrl(type: AiProvider["type"]): string | undefined { + return PROVIDER_DEFAULT_BASE_URL[type]; +} + diff --git a/lib/db/migrate.ts b/lib/db/migrate.ts index 484557d99..6712ef625 100644 --- a/lib/db/migrate.ts +++ b/lib/db/migrate.ts @@ -10,6 +10,26 @@ config({ path: ".env.local", }); +const providerBaseUrlDefaults = [ + { type: "alibaba", baseUrl: "https://dashscope.aliyuncs.com/compatible-mode/v1" }, + { type: "openai", baseUrl: "https://api.openai.com/v1" }, + { type: "huanke-gemini", baseUrl: "https://api.huandutech.com/v1" }, + { + type: "qianwen-video", + baseUrl: "https://dashscope.aliyuncs.com/api/v1/services/aigc/video-generation", + }, + { type: "doubao-video", baseUrl: "https://ark.cn-beijing.volces.com/api/v3" }, + { type: "volcano-vision", baseUrl: "https://ark.cn-beijing.volces.com" }, + { type: "volcano-video", baseUrl: "https://ark.cn-beijing.volces.com/api/v3" }, + { + type: "alibaba-image", + baseUrl: "https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation", + }, + { type: "ruxa-image", baseUrl: "https://api.ruxa.ai" }, + { type: "fal-image", baseUrl: "https://fal.run" }, + { type: "fal-video", baseUrl: "https://fal.run" }, +] as const; + function assertMigrationJournalIsConsistent() { const migrationsDir = join(process.cwd(), "lib/db/migrations"); const journalPath = join(migrationsDir, "meta", "_journal.json"); @@ -70,6 +90,17 @@ const runMigrate = async () => { 'huanke-gemini', 'qianwen-video', 'doubao-video', 'volcano-vision', 'volcano-video', 'alibaba-image', 'ruxa-image', 'fal-image', 'fal-video', 'zhipu' )); `); + for (const item of providerBaseUrlDefaults) { + await db.execute(sql` + UPDATE "AiProvider" + SET + "baseUrl" = ${item.baseUrl}, + "updatedAt" = NOW() + WHERE + "type" = ${item.type} + AND ("baseUrl" IS NULL OR BTRIM("baseUrl") = ''); + `); + } const end = Date.now(); console.log("✅ Migrations completed in", end - start, "ms");