haixunMaster/lib/ai/generate-posts.ts

56 lines
1.5 KiB
TypeScript
Raw Permalink Normal View History

2026-06-21 12:50:31 +00:00
import { z } from "zod";
import type { ProviderApiKeys } from "./keys";
import { generateStructuredObject } from "./generate-structured";
import { getModel } from "./provider";
import { buildSystemPrompt, buildUserPrompt } from "./prompts";
import { THREADS_MAX_CHARS } from "@/lib/utils";
const draftSchema = z.object({
drafts: z.array(
z.object({
text: z.string().max(THREADS_MAX_CHARS),
angle: z.string(),
rationale: z.string(),
sourcePermalinks: z.array(z.string()),
})
),
});
export interface GenerateInput {
topicLabel: string;
persona?: string | null;
aiProvider: string;
aiModel: string;
apiKeys?: ProviderApiKeys;
count: number;
posts: Array<{
text: string;
authorName?: string | null;
permalink?: string | null;
likeCount?: number | null;
replyCount?: number | null;
replies?: Array<{ text: string; authorName?: string | null; likeCount?: number | null }>;
}>;
}
export async function generatePostDrafts(input: GenerateInput) {
const model = getModel(input.aiProvider, input.aiModel, input.apiKeys ?? {});
const object = await generateStructuredObject({
model,
provider: input.aiProvider,
modelId: input.aiModel,
schema: draftSchema,
system: buildSystemPrompt(input.persona),
prompt: buildUserPrompt({
topicLabel: input.topicLabel,
posts: input.posts,
count: input.count,
}),
});
return object.drafts.map((draft) => ({
...draft,
text: draft.text.slice(0, THREADS_MAX_CHARS),
}));
}