56 lines
1.5 KiB
TypeScript
56 lines
1.5 KiB
TypeScript
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),
|
|
}));
|
|
} |