feat: add model selection for scene fusion - allow choosing between Alibaba and Gemini models
This commit is contained in:
parent
150b146f91
commit
0547ab2cc2
@ -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>
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user