feat: add model selection for scene fusion - allow choosing between Alibaba and Gemini models
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-01-18 17:04:47 +08:00
parent 150b146f91
commit 0547ab2cc2
2 changed files with 68 additions and 9 deletions

View File

@ -404,6 +404,7 @@ export function AdminSettingsClient() {
enabled: true,
defaultPrompt: "将图1的产品替换到图2的场景中,保持图1产品的外观、颜色和细节不变,自然融合到图2的环境中。",
maxScenes: 10,
modelId: "", // 使用的生图模型ID
});
// 加载抠图API配置
@ -497,11 +498,13 @@ export function AdminSettingsClient() {
enabled?: boolean;
defaultPrompt?: string;
maxScenes?: number;
modelId?: string;
};
setSceneFusionConfig({
enabled: config.enabled ?? true,
defaultPrompt: config.defaultPrompt || "将图1的产品替换到图2的场景中,保持图1产品的外观、颜色和细节不变,自然融合到图2的环境中。",
maxScenes: config.maxScenes ?? 10,
modelId: config.modelId ?? "",
});
}
}, [sceneFusionConfigData]);
@ -966,6 +969,7 @@ export function AdminSettingsClient() {
enabled: sceneFusionConfig.enabled,
defaultPrompt: sceneFusionConfig.defaultPrompt.trim(),
maxScenes: sceneFusionConfig.maxScenes,
modelId: sceneFusionConfig.modelId,
},
}),
});
@ -3898,12 +3902,47 @@ export function AdminSettingsClient() {
</div>
</div>
{/* 生图模型选择 */}
<div className="space-y-2">
<Label htmlFor="sceneFusionModel">生图模型</Label>
<Select
value={sceneFusionConfig.modelId}
onValueChange={(value) => setSceneFusionConfig({ ...sceneFusionConfig, modelId: value })}
disabled={!sceneFusionConfig.enabled}
>
<SelectTrigger>
<SelectValue placeholder="选择生图模型(留空使用默认阿里模型)" />
</SelectTrigger>
<SelectContent>
<SelectItem value="">自动选择(默认阿里生图)</SelectItem>
{(modelsData?.models || [])
.filter((m: AiModel) => {
// 过滤出支持图片编辑的模型(阿里生图、Gemini 图片模型等)
const provider = (providersData?.providers || []).find((p: AiProvider) => p.id === m.providerId);
return provider && ["alibaba-image", "gemini-image"].includes(provider.type);
})
.map((m: AiModel) => {
const provider = (providersData?.providers || []).find((p: AiProvider) => p.id === m.providerId);
return (
<SelectItem key={m.id} value={m.id}>
{m.displayName} ({provider?.name})
</SelectItem>
);
})
}
</SelectContent>
</Select>
<div className="text-xs text-muted-foreground">
选择用于场景裂变的生图模型,支持阿里生图和Gemini图片编辑模型
</div>
</div>
<div className="rounded-lg border border-blue-200 bg-blue-50 p-4 space-y-2">
<div className="text-sm font-medium text-blue-900">功能说明</div>
<div className="text-xs text-blue-800 space-y-1">
<p>• 用户上传1张产品图和多张场景参考图</p>
<p>• 系统自动将产品图融合到每个场景中</p>
<p>• 使用已配置的阿里生图模型进行处理</p>
<p>• 支持选择阿里生图或Gemini图片模型</p>
<p>• 生成的图片会自动保存到用户相册</p>
</div>
</div>

View File

@ -42,11 +42,13 @@ async function getSceneFusionConfig() {
enabled?: boolean;
defaultPrompt?: string;
maxScenes?: number;
modelId?: string;
};
return {
enabled: config.enabled ?? true,
defaultPrompt: config.defaultPrompt || FALLBACK_PROMPT,
maxScenes: config.maxScenes ?? 10,
modelId: config.modelId || "",
};
}
} catch (error) {
@ -57,6 +59,7 @@ async function getSceneFusionConfig() {
enabled: true,
defaultPrompt: FALLBACK_PROMPT,
maxScenes: 10,
modelId: "",
};
}
@ -418,22 +421,39 @@ export async function POST(request: Request) {
console.log(`[SceneFusion] Processing ${scenes.length} scenes for user ${session.user.id}`);
console.log(`[SceneFusion] Product name: ${productName || '(not specified)'}`);
console.log(`[SceneFusion] Using default prompt: ${config.defaultPrompt.substring(0, 50)}...`);
console.log(`[SceneFusion] Configured model ID: ${config.modelId || '(auto - default alibaba)'}`);
// 4. 获取阿里生图模型配置
// 4. 获取生图模型配置
const allModels = await getEnabledAiModelsWithProvider();
const alibabaModel = allModels.find(
(m) => m.provider.type === "alibaba-image" && m.model.isEnabled
);
if (!alibabaModel) {
let selectedModel: typeof allModels[0] | undefined;
// 如果配置了指定的模型ID,优先使用
if (config.modelId) {
selectedModel = allModels.find(
(m) => m.model.id === config.modelId && m.model.isEnabled
);
if (!selectedModel) {
console.warn(`[SceneFusion] Configured model ${config.modelId} not found or disabled, falling back to default`);
}
}
// 如果没有配置或配置的模型不可用,使用默认的阿里生图模型
if (!selectedModel) {
selectedModel = allModels.find(
(m) => m.provider.type === "alibaba-image" && m.model.isEnabled
);
}
if (!selectedModel) {
return NextResponse.json(
{ error: "未配置阿里生图模型,请联系管理员" },
{ error: "未配置可用的生图模型,请联系管理员" },
{ status: 500 }
);
}
const { provider, model } = alibabaModel;
console.log(`[SceneFusion] Using model: ${model.displayName} (${model.modelId})`);
const { provider, model } = selectedModel;
console.log(`[SceneFusion] Using model: ${model.displayName} (${model.modelId}) - Provider: ${provider.type}`);
// 4. 预处理:将 Base64 图片上传到 S3
let productImageUrl = productImage;