fix chat pending drop when title model fails and filter auto-title vision model
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-19 04:54:58 +08:00
parent cbad5ee2e2
commit 8aba32d35d
2 changed files with 34 additions and 13 deletions

View File

@ -23,19 +23,28 @@ export async function generateTitleFromUserMessage({
}: { }: {
message: UIMessage; message: UIMessage;
}) { }) {
// 优先使用数据库配置的模型,回退到预定义模型 const prompt = (getTextFromMessage(message) || "").trim();
let model = await getSystemModel("title"); const fallbackTitle = prompt.slice(0, 20) || "新对话";
if (!model) {
model = myProvider.languageModel("title-model"); try {
// 优先使用数据库配置的模型,回退到预定义模型
let model = await getSystemModel("title");
if (!model) {
model = myProvider.languageModel("title-model");
}
const { text: title } = await generateText({
model,
system: titlePrompt,
prompt,
});
const normalized = (title || "").trim();
return normalized || fallbackTitle;
} catch (error) {
console.warn("[generateTitleFromUserMessage] fallback title:", error);
return fallbackTitle;
} }
const { text: title } = await generateText({
model,
system: titlePrompt,
prompt: getTextFromMessage(message),
});
return title;
} }
export async function deleteTrailingMessages({ id }: { id: string }) { export async function deleteTrailingMessages({ id }: { id: string }) {

View File

@ -21,15 +21,27 @@ export async function POST(request: NextRequest) {
return NextResponse.json({ error: "Image URL is required" }, { status: 400 }); return NextResponse.json({ error: "Image URL is required" }, { status: 400 });
} }
const blockedProviderTypes = new Set([
"fal-video",
"qianwen-video",
"volcano-video",
"doubao-video",
]);
// 从数据库获取支持视觉的模型(优先使用 supportsVision) // 从数据库获取支持视觉的模型(优先使用 supportsVision)
const modelsData = await getEnabledAiModelsWithProvider(); const modelsData = await getEnabledAiModelsWithProvider();
console.log("[Auto-title] Available models count:", modelsData.length); console.log("[Auto-title] Available models count:", modelsData.length);
console.log("[Auto-title] All model IDs:", modelsData.map(m => m.model.modelId)); console.log("[Auto-title] All model IDs:", modelsData.map(m => m.model.modelId));
let visionModelData = modelsData.find(m => m.model.supportsVision); let visionModelData = modelsData.find(
(m) => m.model.supportsVision && !blockedProviderTypes.has(String(m.provider?.type || "")),
);
if (!visionModelData) { if (!visionModelData) {
// 兼容旧配置:根据模型名称兜底匹配 // 兼容旧配置:根据模型名称兜底匹配
visionModelData = modelsData.find(m => { visionModelData = modelsData.find(m => {
if (blockedProviderTypes.has(String(m.provider?.type || ""))) {
return false;
}
const id = m.model.modelId?.toLowerCase() || ''; const id = m.model.modelId?.toLowerCase() || '';
const name = m.model.displayName?.toLowerCase() || ''; const name = m.model.displayName?.toLowerCase() || '';
return id.includes('qwen-vl') || return id.includes('qwen-vl') ||