fix(volcano): rewrite upload urls to direct s3 endpoint
Some checks failed
Lint / build (20) (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled

This commit is contained in:
Your Name 2026-02-19 00:55:02 +08:00
parent e010c9b643
commit c5fce7359b

View File

@ -1,12 +1,73 @@
import "server-only";
import { uploadFile } from "@/lib/storage/service";
import { getDefaultStorageConfig } from "@/lib/db/queries";
interface VolcanoVisionConfig {
apiKey: string;
baseURL: string;
}
type VolcanoUrlRewriteConfig = {
publicOrigin: string;
endpointBase: string;
bucket: string;
};
let cachedRewriteConfig: VolcanoUrlRewriteConfig | null | undefined;
async function getVolcanoUrlRewriteConfig(): Promise<VolcanoUrlRewriteConfig | null> {
if (cachedRewriteConfig !== undefined) {
return cachedRewriteConfig;
}
try {
const storageConfig = await getDefaultStorageConfig();
if (
!storageConfig ||
storageConfig.type !== "s3" ||
!storageConfig.endpoint ||
!storageConfig.bucket ||
!storageConfig.publicUrl
) {
cachedRewriteConfig = null;
return null;
}
const publicOrigin = new URL(storageConfig.publicUrl).origin;
const endpointBase = storageConfig.endpoint.replace(/\/+$/, "");
cachedRewriteConfig = {
publicOrigin,
endpointBase,
bucket: storageConfig.bucket,
};
return cachedRewriteConfig;
} catch {
cachedRewriteConfig = null;
return null;
}
}
async function rewriteUploadPublicUrlForVolcano(url: string): Promise<string> {
if (!/^https?:\/\//i.test(url)) return url;
const config = await getVolcanoUrlRewriteConfig();
if (!config) return url;
try {
const parsed = new URL(url);
if (parsed.origin !== config.publicOrigin) return url;
if (!parsed.pathname.startsWith("/uploads/")) return url;
const rewritten = `${config.endpointBase}/${config.bucket}${parsed.pathname}${parsed.search}`;
console.log("[Volcano Vision] Rewrote upload URL for provider fetch:", rewritten);
return rewritten;
} catch {
return url;
}
}
/**
* 压缩图片生成缩略图(使用 sharp)
*/
@ -251,11 +312,13 @@ async function convertMessagesToVolcanoFormat(messages: any[]): Promise<{ prompt
// Base64格式:需要先上传到S3获取URL
console.log("[Volcano Vision] Found Base64 image, uploading to S3...");
const uploaded = await uploadImageToS3(imageUrl);
processedImages.push(uploaded.original);
const rewritten = await rewriteUploadPublicUrlForVolcano(uploaded.original);
processedImages.push(rewritten);
} else {
// URL格式:直接使用
processedImages.push(imageUrl);
console.log("[Volcano Vision] Using image URL directly:", imageUrl.substring(0, 80) + "...");
const rewritten = await rewriteUploadPublicUrlForVolcano(imageUrl);
processedImages.push(rewritten);
console.log("[Volcano Vision] Using image URL directly:", rewritten.substring(0, 80) + "...");
}
}