feat: 階段 2 路由、改寫與好感度
- Haiku 一次分類(難度、模型、思考程度、語氣),角色立刻回應 - turn.step 覆寫模型與思考程度,額度低於門檻自動降一級,支援手動鎖定 - 主模型回覆改寫為角色口吻,程式碼/路徑/指令/數字/URL 原樣保留,失敗回原文並另存原文 log - 好感度規則、五階段、不跨階段掉落、個性倍率、狀態列愛心、/jsc-anima:anima-affinity - 年齡與關係規則(未成年友情、成年移轉、戀愛式依賴需明確開啟) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
// 改寫前把必須原樣保留的片段換成佔位符,改寫後確認全數還在才還原。
|
||||
const PROTECT = [
|
||||
/```[\s\S]*?```/g, // 程式碼區塊
|
||||
/`[^`\n]+`/g, // 行內程式碼(含指令)
|
||||
/https?:\/\/[^\s))」]+/g, // URL
|
||||
/(?:~|\.{1,2})?\/[\w.@-]+(?:\/[\w.@-]+)+\/?/g, // 路徑
|
||||
/\d+(?:[.,:/]\d+)*%?/g, // 數字
|
||||
]
|
||||
|
||||
export type Protected = { text: string; tokens: string[] }
|
||||
|
||||
const open = (i: number): string => `⟦${i}⟧`
|
||||
|
||||
export const protect = (src: string): Protected => {
|
||||
const tokens: string[] = []
|
||||
let text = src
|
||||
for (const re of PROTECT) {
|
||||
// 已是佔位符的部分不再處理,避免把佔位符裡的數字再包一次。
|
||||
text = text
|
||||
.split(/(⟦\d+⟧)/)
|
||||
.map((part, i) =>
|
||||
i % 2 === 1
|
||||
? part
|
||||
: part.replace(re, m => {
|
||||
tokens.push(m)
|
||||
return open(tokens.length - 1)
|
||||
}),
|
||||
)
|
||||
.join('')
|
||||
}
|
||||
return { text, tokens }
|
||||
}
|
||||
|
||||
// 佔位符被遺失或多出來都視為失敗。
|
||||
export const restore = (rewritten: string, tokens: readonly string[]): string | undefined => {
|
||||
for (let i = 0; i < tokens.length; i++) {
|
||||
if (rewritten.split(open(i)).length !== 2) return undefined
|
||||
}
|
||||
if ((rewritten.match(/⟦\d+⟧/g) ?? []).length !== tokens.length) return undefined
|
||||
return rewritten.replace(/⟦(\d+)⟧/g, (_, n: string) => tokens[Number(n)]!)
|
||||
}
|
||||
|
||||
export const withPrefix = (name: string, body: string): string => `${name} > ${body}`
|
||||
|
||||
export const REWRITE_SYSTEM =
|
||||
'你是文字改寫器。把使用者給的回覆改寫成指定角色的口吻,保留所有事實與結構(標題、清單、段落)。' +
|
||||
'⟦數字⟧ 形式的佔位符必須原樣出現且各一次,不可改動、不可刪除。只輸出改寫後的內文,不要加前綴或說明。'
|
||||
|
||||
export const needsSonnet = (text: string, threshold: number): boolean => text.length > threshold
|
||||
Reference in New Issue
Block a user