feat: 添加智能自动模式的默认生图模型配置

This commit is contained in:
Your Name 2026-02-01 22:51:33 +08:00
parent 51196ea0dd
commit 3855cb05cd
4 changed files with 61 additions and 1 deletions

View File

@ -168,6 +168,7 @@ type SiteSettings = {
rankingEnabled: boolean;
canvasEnabled: boolean;
canvasDefaultModelId: string | null;
canvasAutoModeDefaultModelId: string | null;
};
type NavLink = {
@ -382,6 +383,7 @@ export function AdminSettingsClient() {
rankingEnabled: true,
canvasEnabled: true,
canvasDefaultModelId: null,
canvasAutoModeDefaultModelId: null,
});
useEffect(() => {
@ -409,6 +411,7 @@ export function AdminSettingsClient() {
rankingEnabled: siteSettingsData.rankingEnabled ?? true,
canvasEnabled: siteSettingsData.canvasEnabled ?? true,
canvasDefaultModelId: siteSettingsData.canvasDefaultModelId || null,
canvasAutoModeDefaultModelId: siteSettingsData.canvasAutoModeDefaultModelId || null,
});
}
}, [siteSettingsData]);
@ -2615,6 +2618,33 @@ export function AdminSettingsClient() {
设置无限画布中用户的默认生图模型。"智能自动"会根据用户需求自动选择最佳模型。
</div>
</div>
{/* 智能自动模式下的默认生图模型 */}
<div className="space-y-2 mt-4 pt-4 border-t">
<Label htmlFor="canvasAutoModeDefaultModelId">智能自动模式 - 默认生图模型</Label>
<Select
value={siteSettings.canvasAutoModeDefaultModelId || "system"}
onValueChange={(value) => setSiteSettings({
...siteSettings,
canvasAutoModeDefaultModelId: value === "system" ? null : value
})}
>
<SelectTrigger id="canvasAutoModeDefaultModelId">
<SelectValue placeholder="选择默认模型" />
</SelectTrigger>
<SelectContent>
<SelectItem value="system">系统智能选择(根据意图路由)</SelectItem>
{modelsData?.models?.filter((m: any) => m.supportsImageGen).map((model: any) => (
<SelectItem key={model.id} value={model.id}>
{model.displayName}
</SelectItem>
))}
</SelectContent>
</Select>
<div className="text-xs text-muted-foreground">
当用户选择"智能自动"模式时,系统实际使用的生图模型。"系统智能选择"会根据用户意图(如抠图、换背景等)自动路由到最佳模型。
</div>
</div>
)}
</div>
</div>

View File

@ -43,6 +43,7 @@ export async function GET() {
rankingEnabled: true,
canvasEnabled: true,
canvasDefaultModelId: null,
canvasAutoModeDefaultModelId: null,
};
const response = NextResponse.json({
@ -88,6 +89,7 @@ const updateSchema = z.object({
rankingEnabled: z.boolean().optional(),
canvasEnabled: z.boolean().optional(),
canvasDefaultModelId: z.string().nullable().optional(),
canvasAutoModeDefaultModelId: z.string().nullable().optional(),
});
// PUT /api/site-settings - 更新网站设置(仅管理员)
@ -149,6 +151,7 @@ export async function PUT(request: NextRequest) {
rankingEnabled: data.rankingEnabled ?? true,
canvasEnabled: data.canvasEnabled ?? true,
canvasDefaultModelId: data.canvasDefaultModelId,
canvasAutoModeDefaultModelId: data.canvasAutoModeDefaultModelId,
updatedBy: session.user.id,
})
.returning();

View File

@ -110,10 +110,36 @@ export async function routeToModel(params: {
// 使用动态导入避免循环依赖
const { getEnabledAiModelsWithProvider } = await import("@/lib/db/queries");
const { db } = await import("@/lib/db");
const { siteSettings } = await import("@/lib/db/schema");
// 获取所有可用模型
const allModels = await getEnabledAiModelsWithProvider();
console.log("[Model Router] Available models:", allModels.length);
// 🆕 检查是否有配置的默认生图模型
const [settings] = await db.select().from(siteSettings).limit(1);
const configuredDefaultModelId = settings?.canvasAutoModeDefaultModelId;
if (configuredDefaultModelId) {
// 如果配置了默认模型,直接使用该模型
const configuredModel = allModels.find(
(m) => m.model.id === configuredDefaultModelId && m.model.isEnabled && !m.model.isSubModel
);
if (configuredModel) {
console.log("[Model Router] ✅ Using configured default model:", configuredModel.model.displayName);
return {
id: configuredModel.model.id,
displayName: configuredModel.model.displayName,
providerType: configuredModel.provider.type,
modelId: configuredModel.model.modelId,
reason: `管理员配置的默认模型 → ${configuredModel.model.displayName}`,
};
} else {
console.log("[Model Router] ⚠️ Configured default model not found or disabled, falling back to intent routing");
}
}
// 获取意图对应的配置
let config = INTENT_MODEL_MAP[intent] || INTENT_MODEL_MAP["chat"];

View File

@ -308,7 +308,8 @@ export const siteSettings = pgTable("SiteSettings", {
rankingEnabled: boolean("rankingEnabled").notNull().default(true), // 是否显示精选榜按钮
// 无限画布设置
canvasEnabled: boolean("canvasEnabled").notNull().default(true), // 是否启用无限画布功能
canvasDefaultModelId: varchar("canvasDefaultModelId", { length: 128 }), // 画布默认生图模型ID(null表示智能自动)
canvasDefaultModelId: varchar("canvasDefaultModelId", { length: 128 }), // 画布默认选择的模型ID(null表示智能自动)
canvasAutoModeDefaultModelId: varchar("canvasAutoModeDefaultModelId", { length: 128 }), // 智能自动模式下实际使用的默认生图模型ID
updatedAt: timestamp("updatedAt").notNull().defaultNow(),
updatedBy: uuid("updatedBy").references(() => user.id),
});