import { NextRequest, NextResponse } from "next/server"; import { auth } from "@/app/(auth)/auth"; import { generateText } from "ai"; import { getEnabledAiModelsWithProvider } from "@/lib/db/queries"; import { getLanguageModelById } from "@/lib/ai/dynamic-provider"; export async function POST(request: NextRequest) { console.log("[Auto-title] API called"); try { const session = await auth(); if (!session?.user?.id) { console.log("[Auto-title] Unauthorized"); return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); } const { imageUrl } = await request.json(); console.log("[Auto-title] Image URL:", imageUrl); if (!imageUrl) { return NextResponse.json({ error: "Image URL is required" }, { status: 400 }); } // 从数据库获取支持视觉的模型(优先使用 supportsVision) const modelsData = await getEnabledAiModelsWithProvider(); console.log("[Auto-title] Available models count:", modelsData.length); console.log("[Auto-title] All model IDs:", modelsData.map(m => m.model.modelId)); let visionModelData = modelsData.find(m => m.model.supportsVision); if (!visionModelData) { // 兼容旧配置:根据模型名称兜底匹配 visionModelData = modelsData.find(m => { const id = m.model.modelId?.toLowerCase() || ''; const name = m.model.displayName?.toLowerCase() || ''; return id.includes('qwen-vl') || id.includes('qwen3-vl') || id.includes('qwen2.5-vl') || id.includes('vision') || name.includes('vl') || name.includes('视觉'); }); } console.log("[Auto-title] Found vision model:", visionModelData?.model.modelId, visionModelData?.model.displayName); if (!visionModelData) { console.log("[Auto-title] No vision model found, using default title"); return NextResponse.json({ title: "未命名画布" }); } const visionModel = visionModelData.model; const model = await getLanguageModelById(visionModel.id); if (!model) { console.log("[Auto-title] Failed to load vision model"); return NextResponse.json({ title: "未命名画布" }); } // 构造 Prompt const prompt = "请用2-4个字概括这张图片的主体内容,作为文件标题。直接返回标题,不要包含任何标点符号或其他文字。"; const { text } = await generateText({ model, messages: [ { role: 'user', content: [ { type: 'text', text: prompt }, { type: 'image', image: imageUrl }, ], }, ], temperature: 0.2, maxTokens: 50, }); let title = (text || "").trim(); title = title.replace(/[\s\p{P}\p{S}]+/gu, ""); if (title.length > 4) title = title.slice(0, 4); if (title.length < 2) title = "新画布"; console.log("[Auto-title] Generated title:", title); return NextResponse.json({ title }); } catch (error) { console.error("[Auto-title] Error:", error); // 失败时返回默认标题,不报错中断流程 return NextResponse.json({ title: "新画布" }); } }