97 lines
3.1 KiB
TypeScript
97 lines
3.1 KiB
TypeScript
/**
|
||
* 场景裂变配置 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 }
|
||
);
|
||
}
|
||
}
|