haixunMaster/lib/ai/replicate-viral.ts

73 lines
2.7 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { z } from "zod";
import type { ProviderApiKeys } from "./keys";
import { withAgentSystem } from "./agent";
import { generateStructuredObject } from "./generate-structured";
import { HASHTAG_USER_REMINDER, HASHTAG_WRITING_RULES } from "./hashtag-rules";
import { buildPersonaPromptBlock } from "./persona";
import { getModel } from "./provider";
import { THREADS_MAX_CHARS } from "@/lib/utils";
import type { ViralAnalysis } from "@/lib/types/viral";
const replicaSchema = z.object({
angle: z.string(),
hook: z.string(),
text: z.string().max(THREADS_MAX_CHARS),
imageBrief: z.string(),
rationale: z.string(),
structureNotes: z.string(),
});
export interface ReplicateViralInput {
originalText: string;
authorName?: string | null;
viralAnalysis: ViralAnalysis;
topicLabel: string;
topicBrief?: string | null;
persona?: string | null;
aiProvider: string;
aiModel: string;
apiKeys?: ProviderApiKeys;
}
export async function replicateViralPost(input: ReplicateViralInput) {
const model = getModel(input.aiProvider, input.aiModel, input.apiKeys ?? {});
const object = await generateStructuredObject({
model,
provider: input.aiProvider,
modelId: input.aiModel,
schema: replicaSchema,
system: withAgentSystem(`你是 Threads 爆款複製策略師。根據爆款分析報告,為使用者撰寫「同結構、同節奏、但完全原創」的貼文。
${buildPersonaPromptBlock(input.persona)}
規則:
- 複製的是「爆款公式」hook 手法、情緒節奏、圖文配合),不是抄襲原文
- 文筆必須像創作者本人,不是只複製爆款語氣
- text ≤ 500 字(含 #話題標籤)
${HASHTAG_WRITING_RULES}
- imageBrief 描述要產出的配圖:版面、配色、圖上文字、風格(繁體中文台灣用語,具體可執行)`),
prompt: `主題:${input.topicLabel}
${input.topicBrief ? `Brief${input.topicBrief}` : ""}
原文參考(@${input.authorName ?? "匿名"},只學結構不抄內容):
${input.originalText}
爆款分析:
- 爆紅原因:${input.viralAnalysis.whyViral.join("")}
- Hook 手法:${input.viralAnalysis.hookPattern}
- 結構:${input.viralAnalysis.structurePattern}
- 情緒觸發:${input.viralAnalysis.emotionalTrigger}
- 留言共鳴:${input.viralAnalysis.commentInsights.whyPeopleEngage}
- 複製策略:${input.viralAnalysis.replicationStrategy}
- 圖文策略:${input.viralAnalysis.visualAnalysis.replicationTips.join("")}
- 繪圖 prompt 參考:${input.viralAnalysis.visualAnalysis.imageGenPrompt}
請產出一篇可發布的複製版貼文 + 配圖製作說明。${HASHTAG_USER_REMINDER}`,
});
return {
...object,
text: object.text.slice(0, THREADS_MAX_CHARS),
};
}