Your Name 21497ae57c
Some checks failed
Lint / build (20) (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled
feat: align scene fusion output params with model capabilities
2026-03-07 11:09:51 +08:00

97 lines
3.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 场景裂变配置 API(公开端点)
*
* 允许普通用户获取场景裂变的配置信息
*/
import { NextResponse } from "next/server";
import { auth } from "@/app/(auth)/auth";
import { getEnabledAiModelsWithProvider, getSystemSetting } from "@/lib/db/queries";
import {
buildSceneFusionCapabilitySummary,
canProcessSceneFusionProviderType,
normalizeSceneFusionProviderType,
type SceneFusionCapabilityCandidate,
type SceneFusionImageGenConfig,
} from "@/lib/scene-fusion/output-capabilities";
// 默认提示词
const FALLBACK_PROMPT = "将图1的产品替换到图2的场景中,保持图1产品的外观、颜色和细节不变,自然融合到图2的环境中。";
const SCENE_FUSION_MAX_ITEMS = 10;
export async function GET() {
try {
// 需要登录但不需要 admin 权限
const session = await auth();
if (!session?.user?.id) {
return NextResponse.json(
{ error: "未登录" },
{ status: 401 }
);
}
// 获取配置
const setting = await getSystemSetting({ key: "scene_fusion_config" });
const config = setting?.value as
| {
enabled?: boolean;
defaultPrompt?: string;
maxScenes?: number;
preRmbgEnabled?: boolean;
modelId?: string;
}
| undefined;
const allModels = await getEnabledAiModelsWithProvider();
const capabilityCandidates: SceneFusionCapabilityCandidate[] = allModels
.filter((entry) => {
if (!entry?.model?.isEnabled) return false;
if (!entry?.model?.supportsImageGen) return false;
if (entry?.model?.isSubModel) return false;
return canProcessSceneFusionProviderType(String(entry.provider?.type || ""));
})
.map((entry) => ({
model: {
id: String(entry.model.id),
displayName: String(entry.model.displayName || entry.model.modelId || entry.model.id),
imageGenConfig: (entry.model.imageGenConfig || null) as SceneFusionImageGenConfig | null,
},
provider: {
type: normalizeSceneFusionProviderType(String(entry.provider.type || "")),
},
}));
const outputCapabilities = buildSceneFusionCapabilitySummary(
capabilityCandidates,
config?.modelId || null
);
if (setting?.value && config) {
return NextResponse.json({
enabled: config.enabled ?? true,
preRmbgEnabled: config.preRmbgEnabled ?? true,
defaultPrompt: config.defaultPrompt || FALLBACK_PROMPT,
maxScenes: Math.min(config.maxScenes ?? SCENE_FUSION_MAX_ITEMS, SCENE_FUSION_MAX_ITEMS),
mode: "diversity",
preferredModelId: config.modelId || null,
outputCapabilities,
});
}
// 返回默认配置
return NextResponse.json({
enabled: true,
preRmbgEnabled: true,
defaultPrompt: FALLBACK_PROMPT,
maxScenes: SCENE_FUSION_MAX_ITEMS,
mode: "diversity",
preferredModelId: null,
outputCapabilities,
});
} catch (error) {
console.error("[SceneFusion Config] Error:", error);
return NextResponse.json(
{ error: "获取配置失败" },
{ status: 500 }
);
}
}