62 lines
1.9 KiB
TypeScript
62 lines
1.9 KiB
TypeScript
import { NextResponse } from "next/server";
|
|
import { prisma } from "@/lib/db";
|
|
import { getOrCreateSettings } from "@/lib/user-settings";
|
|
import { factCheckDraft } from "@/lib/ai/fact-check";
|
|
import { parseProviderApiKeys } from "@/lib/ai/keys";
|
|
import { trackAiTask } from "@/lib/jobs/track";
|
|
|
|
export const maxDuration = 120;
|
|
|
|
export async function POST(request: Request) {
|
|
try {
|
|
const body = (await request.json()) as { draftId?: string; text?: string };
|
|
const settings = await getOrCreateSettings();
|
|
const apiKeys = parseProviderApiKeys(settings.providerApiKeys);
|
|
|
|
let text = body.text;
|
|
let angle: string | null | undefined;
|
|
let searchTag: string | null | undefined;
|
|
let topicLabel: string | null | undefined;
|
|
|
|
if (body.draftId) {
|
|
const draft = await prisma.draft.findUnique({ where: { id: body.draftId } });
|
|
if (!draft) {
|
|
return NextResponse.json({ error: "找不到草稿" }, { status: 404 });
|
|
}
|
|
text = draft.text;
|
|
angle = draft.angle;
|
|
searchTag = draft.searchTag;
|
|
if (draft.topicId) {
|
|
const topic = await prisma.topic.findUnique({ where: { id: draft.topicId } });
|
|
topicLabel = topic?.label;
|
|
}
|
|
}
|
|
|
|
if (!text?.trim()) {
|
|
return NextResponse.json({ error: "缺少貼文內容" }, { status: 400 });
|
|
}
|
|
|
|
const result = await trackAiTask("貼文事實查核", () => factCheckDraft({
|
|
text: text.trim(),
|
|
angle,
|
|
searchTag,
|
|
topicLabel,
|
|
aiProvider: settings.aiProvider,
|
|
aiModel: settings.aiModel,
|
|
apiKeys,
|
|
}));
|
|
|
|
if (body.draftId) {
|
|
await prisma.draft.update({
|
|
where: { id: body.draftId },
|
|
data: { factCheckResult: JSON.stringify(result) },
|
|
});
|
|
}
|
|
|
|
return NextResponse.json({ factCheck: result });
|
|
} catch (error) {
|
|
const message = error instanceof Error ? error.message : "查證失敗";
|
|
return NextResponse.json({ error: message }, { status: 500 });
|
|
}
|
|
}
|