69 lines
2.0 KiB
TypeScript
69 lines
2.0 KiB
TypeScript
import { prisma, resolvePersona } from "@/lib/db";
|
|
import { getOrCreateSettings } from "@/lib/user-settings";
|
|
import { getActiveAccountProfile } from "@/lib/account-context";
|
|
import { generatePostDrafts } from "@/lib/ai/generate-posts";
|
|
import { parseProviderApiKeys } from "@/lib/ai/keys";
|
|
|
|
export async function generateDraftsForScan(scanId: string) {
|
|
const scan = await prisma.scan.findUnique({
|
|
where: { id: scanId },
|
|
include: {
|
|
topic: true,
|
|
items: {
|
|
where: { OR: [{ qualityTier: null }, { qualityTier: { not: "EXCLUDE" } }] },
|
|
orderBy: [{ combinedScore: "desc" }, { score: "desc" }],
|
|
take: 8,
|
|
include: {
|
|
replies: { orderBy: { likeCount: "desc" }, take: 5 },
|
|
},
|
|
},
|
|
},
|
|
});
|
|
|
|
if (!scan) throw new Error("找不到海巡紀錄");
|
|
if (scan.items.length === 0) throw new Error("此海巡沒有素材,請重新海巡");
|
|
|
|
const settings = await getOrCreateSettings();
|
|
const account = await getActiveAccountProfile();
|
|
const apiKeys = parseProviderApiKeys(settings.providerApiKeys);
|
|
|
|
const drafts = await generatePostDrafts({
|
|
topicLabel: scan.topic.label,
|
|
persona: resolvePersona(settings, account),
|
|
aiProvider: settings.aiProvider,
|
|
aiModel: settings.aiModel,
|
|
apiKeys,
|
|
count: settings.draftsPerScan,
|
|
posts: scan.items.map((item) => ({
|
|
text: item.text,
|
|
authorName: item.authorName,
|
|
permalink: item.permalink,
|
|
likeCount: item.likeCount,
|
|
replyCount: item.replyCount,
|
|
replies: item.replies.map((r) => ({
|
|
text: r.text,
|
|
authorName: r.authorName,
|
|
likeCount: r.likeCount,
|
|
})),
|
|
})),
|
|
});
|
|
|
|
const created = [];
|
|
for (const draft of drafts) {
|
|
const record = await prisma.draft.create({
|
|
data: {
|
|
accountId: scan.topic.accountId,
|
|
topicId: scan.topicId,
|
|
text: draft.text,
|
|
angle: draft.angle,
|
|
rationale: draft.rationale,
|
|
sources: JSON.stringify(draft.sourcePermalinks),
|
|
status: "PENDING",
|
|
},
|
|
});
|
|
created.push(record);
|
|
}
|
|
|
|
return created;
|
|
}
|