38 lines
1.9 KiB
TypeScript
38 lines
1.9 KiB
TypeScript
import { executeRemoveBackgroundPOST } from "@/lib/canvas/operations/rmbg";
|
|
import { createLogger } from "@/lib/observability/logger";
|
|
|
|
const logger = createLogger("scene-fusion");
|
|
|
|
export async function preprocessProductImageWithRmbg(params: {
|
|
request: Request;
|
|
requestId: string;
|
|
userId: string;
|
|
productImageUrl: string;
|
|
preRmbgEnabled: boolean;
|
|
}): Promise<{ productImageUrl: string; usedPreRmbg: boolean; provider?: string; reason?: string }> {
|
|
const { request, requestId, userId, productImageUrl, preRmbgEnabled } = params;
|
|
if (!preRmbgEnabled) return { productImageUrl, usedPreRmbg: false, reason: "disabled_by_config" };
|
|
|
|
logger.info("pre_rmbg_started", { requestId });
|
|
try {
|
|
const response = await executeRemoveBackgroundPOST(new Request(new URL("/api/rmbg", request.url), {
|
|
method: "POST",
|
|
headers: { "Content-Type": "application/json", "X-Request-ID": `${requestId}:pre-rmbg` },
|
|
body: JSON.stringify({ imageUrl: productImageUrl, prompt: "场景裂变预处理-抠图", skipGallerySave: true }),
|
|
}), userId);
|
|
const payload = await response.json();
|
|
if (!response.ok) {
|
|
logger.warn("pre_rmbg_failed", { requestId, status: response.status, code: payload?.failure?.code });
|
|
return { productImageUrl, usedPreRmbg: false, reason: String(payload?.error || `request_failed_${response.status}`) };
|
|
}
|
|
const cleanedUrl = String(payload?.original_url || payload?.thumbnail_url || "").trim();
|
|
if (!cleanedUrl || cleanedUrl === productImageUrl) {
|
|
return { productImageUrl, usedPreRmbg: false, reason: cleanedUrl ? "same_as_source" : "empty_result" };
|
|
}
|
|
return { productImageUrl: cleanedUrl, usedPreRmbg: true, provider: String(payload?.provider || "unknown") };
|
|
} catch (error) {
|
|
logger.warn("pre_rmbg_failed", error, { requestId });
|
|
return { productImageUrl, usedPreRmbg: false, reason: error instanceof Error ? error.message : "exception" };
|
|
}
|
|
}
|