feat: add dedicated default model for canvas detail generation
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-02-21 23:42:41 +08:00
parent c5abfaf974
commit 9f66a5ea28
6 changed files with 51 additions and 2 deletions

View File

@ -199,6 +199,7 @@ type SiteSettings = {
aiDetailGenerationEnabled: boolean;
canvasDefaultModelId: string | null;
canvasAutoModeDefaultModelId: string | null;
canvasDetailDefaultModelId: string | null;
lovartComposerPrefix: string;
lovartComposerPreviewTexts: string[];
lovartPromptTagVisibility: LovartPromptTagVisibility;
@ -520,6 +521,7 @@ export function AdminSettingsClient() {
aiDetailGenerationEnabled: false,
canvasDefaultModelId: null,
canvasAutoModeDefaultModelId: null,
canvasDetailDefaultModelId: null,
lovartComposerPrefix: "让Buyi-ai",
lovartComposerPreviewTexts: [
"打造引人注目的社交媒体视觉",
@ -587,6 +589,7 @@ export function AdminSettingsClient() {
aiDetailGenerationEnabled: siteSettingsData.aiDetailGenerationEnabled ?? false,
canvasDefaultModelId: siteSettingsData.canvasDefaultModelId || null,
canvasAutoModeDefaultModelId: siteSettingsData.canvasAutoModeDefaultModelId || null,
canvasDetailDefaultModelId: siteSettingsData.canvasDetailDefaultModelId || null,
lovartComposerPrefix:
String((siteSettingsData as any).lovartComposerPrefix || "").trim() ||
"让Buyi-ai",
@ -4556,6 +4559,34 @@ export function AdminSettingsClient() {
/>
</div>
<div className="space-y-2 mt-4">
<Label htmlFor="canvasDetailDefaultModelId">AI详情生成 - 默认生图模型</Label>
<Select
value={siteSettings.canvasDetailDefaultModelId || "agent-default"}
onValueChange={(value) =>
setSiteSettings({
...siteSettings,
canvasDetailDefaultModelId: value === "agent-default" ? null : value,
})
}
>
<SelectTrigger id="canvasDetailDefaultModelId">
<SelectValue placeholder="选择默认模型" />
</SelectTrigger>
<SelectContent>
<SelectItem value="agent-default">沿用Agent模式默认生图模型</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">
仅用于AI详情生成(含详情图与评价晒图)的默认出图模型;不影响普通生图模式。
</div>
</div>
<div className="space-y-2">
<Label htmlFor="canvasDefaultModelId">画布默认生图模型</Label>
<Select

View File

@ -285,6 +285,7 @@ export async function GET() {
canvasEnabled: true,
canvasDefaultModelId: null,
canvasAutoModeDefaultModelId: null,
canvasDetailDefaultModelId: null,
lovartPromoText: "现在升级,立享 Kling 3.0 与 Nano Banana Pro,最高 5 折优惠",
lovartPromoActionText: "立即升级",
lovartHeroTitle: "由壹点AI 让设计更简单",
@ -366,6 +367,7 @@ const updateSchema = z.object({
aiDetailGenerationEnabled: z.boolean().optional(),
canvasDefaultModelId: z.string().nullable().optional(),
canvasAutoModeDefaultModelId: z.string().nullable().optional(),
canvasDetailDefaultModelId: z.string().nullable().optional(),
lovartPromoText: z.string().max(300).optional(),
lovartPromoActionText: z.string().max(32).optional(),
lovartHeroTitle: z.string().max(300).optional(),
@ -754,6 +756,7 @@ export async function PUT(request: NextRequest) {
canvasEnabled: siteSettingsPayload.canvasEnabled ?? true,
canvasDefaultModelId: siteSettingsPayload.canvasDefaultModelId,
canvasAutoModeDefaultModelId: siteSettingsPayload.canvasAutoModeDefaultModelId,
canvasDetailDefaultModelId: siteSettingsPayload.canvasDetailDefaultModelId,
lovartPromoText:
siteSettingsPayload.lovartPromoText ??
"现在升级,立享 Kling 3.0 与 Nano Banana Pro,最高 5 折优惠",

View File

@ -1865,6 +1865,7 @@ export function CanvasChatPanel({ chatId, initialMessages = [], onClose, onOpenF
aiDetailGenerationEnabled?: boolean;
canvasDefaultModelId?: string | null;
canvasAutoModeDefaultModelId?: string | null;
canvasDetailDefaultModelId?: string | null;
}>("/api/site-settings", fetcher);
const { data: membershipSummary } = useSWR<{
pointsSystemConfig?: {
@ -3553,7 +3554,8 @@ export function CanvasChatPanel({ chatId, initialMessages = [], onClose, onOpenF
const modelForGeneration =
selectedModelId !== "auto"
? selectedModelId
: siteSettings?.canvasAutoModeDefaultModelId ||
: siteSettings?.canvasDetailDefaultModelId ||
siteSettings?.canvasAutoModeDefaultModelId ||
siteSettings?.canvasDefaultModelId ||
undefined;
for (let index = 0; index < prompts.length; index += 1) {
@ -3973,6 +3975,7 @@ export function CanvasChatPanel({ chatId, initialMessages = [], onClose, onOpenF
saveDetailArchiveSnapshot,
setMessages,
siteSettings?.canvasAutoModeDefaultModelId,
siteSettings?.canvasDetailDefaultModelId,
siteSettings?.canvasDefaultModelId,
updateLocalDetailArchive,
]);
@ -4030,7 +4033,8 @@ export function CanvasChatPanel({ chatId, initialMessages = [], onClose, onOpenF
const modelForGeneration =
selectedModelId !== "auto"
? selectedModelId
: siteSettings?.canvasAutoModeDefaultModelId ||
: siteSettings?.canvasDetailDefaultModelId ||
siteSettings?.canvasAutoModeDefaultModelId ||
siteSettings?.canvasDefaultModelId ||
undefined;
const existingImageBottom = nodes
@ -4251,6 +4255,7 @@ export function CanvasChatPanel({ chatId, initialMessages = [], onClose, onOpenF
selectedModelId,
setMessages,
siteSettings?.canvasAutoModeDefaultModelId,
siteSettings?.canvasDetailDefaultModelId,
siteSettings?.canvasDefaultModelId,
]);

View File

@ -0,0 +1,2 @@
ALTER TABLE "SiteSettings"
ADD COLUMN IF NOT EXISTS "canvasDetailDefaultModelId" varchar(128);

View File

@ -183,6 +183,13 @@
"when": 1771588800000,
"tag": "0039_add_ai_model_hidden",
"breakpoints": true
},
{
"idx": 26,
"version": "7",
"when": 1771718400000,
"tag": "0040_add_canvas_detail_default_model",
"breakpoints": true
}
]
}

View File

@ -355,6 +355,7 @@ export const siteSettings = pgTable("SiteSettings", {
canvasEnabled: boolean("canvasEnabled").notNull().default(true), // 是否启用无限画布功能
canvasDefaultModelId: varchar("canvasDefaultModelId", { length: 128 }), // 画布默认选择的模型ID(null表示智能自动)
canvasAutoModeDefaultModelId: varchar("canvasAutoModeDefaultModelId", { length: 128 }), // 智能自动模式下实际使用的默认生图模型ID
canvasDetailDefaultModelId: varchar("canvasDetailDefaultModelId", { length: 128 }), // AI详情生成专用默认生图模型ID
lovartPromoText: text("lovartPromoText").default(
"现在升级,立享 Kling 3.0 与 Nano Banana Pro,最高 5 折优惠"
),