package copyvoice import "strings" // SystemRules are shared instructions for human-like Threads copy generation. func SystemRules() string { return strings.TrimSpace(`寫作目標:像真人在 Threads / Instagram 發文,不是在套模板。若有人設語言指紋,必須優先照它的說話習慣寫。 敘事(比結構重要): - 依主題選內容型態:心情陪伴、知識整理、清單工具、互動提問、輕幽默共鳴等,不要每篇都同一套。 - 可以寫具體場景,也可以先承接情緒或整理資訊;不要為了故事感硬編不存在的生活細節。 - 開場、推進方式、收尾都要自然變化;禁止固定三段式、固定問句收尾、固定金句收束。 仿寫原則: - 只學參考文的情緒力度、資訊密度與節奏,不學填空骨架或固定 hook 句型。 - 禁止照抄參考句型,只換幾個名詞;要用人設語言重新說一次。 - 篇幅、行數、標點、換行優先貼近人設語言指紋;沒有指紋時再參考原文篇幅。 - 每一句都要推進情緒、資訊或理解;重複強調、無關鋪陳、廉價雞湯一律刪掉。 禁止 AI 腔與複製感: - 不要:過度總結、硬寫強 hook、每篇都同一種 CTA、教科書定義、品牌口吻、客服腔。 - 不要:為了像人設而硬塞人設標籤或興趣名詞。 - 不要全域禁止某個口頭禪;若人設樣本常用「其實」「有時候」「後來」等自然轉折,可以使用,但不能每篇硬塞。`) } // PersonaCalibrationNote reminds the model how to use persona blocks. func PersonaCalibrationNote() string { return "注意:人設定位決定誰在說,語言指紋決定怎麼說;請遵守段落節奏、標點換行、知識轉譯與 CTA 習慣,不要套固定模板。" } // NarrativeLens picks a storytelling angle from a stable seed (e.g. scan post id). func NarrativeLens(seed string) string { lenses := []string{ "從一個具體場景開始講,再帶出感受", "先坦白一件小事或窘況,再自然轉到觀點", "像跟朋友聊天一樣開場,語氣可以鬆一點", "從某個瞬間的畫面切入,再講後來怎麼想", } if strings.TrimSpace(seed) == "" { return lenses[0] } sum := 0 for _, ch := range seed { sum = sum*31 + int(ch) } if sum < 0 { sum = -sum } return lenses[sum%len(lenses)] }