fast-tavern 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +202 -0
- package/dist/index.cjs +647 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +462 -0
- package/dist/index.d.ts +462 -0
- package/dist/index.js +627 -0
- package/dist/index.js.map +1 -0
- package/package.json +31 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/channels/gemini.ts","../src/core/channels/openai.ts","../src/core/channels/simple.ts","../src/core/channels/tagged.ts","../src/core/channels/text.ts","../src/core/channels/detect.ts","../src/core/convert.ts","../src/core/modules/history/factories.ts","../src/core/modules/history/guards.ts","../src/core/modules/worldbook/testCondition.ts","../src/core/modules/inputs/normalizeRegexes.ts","../src/core/modules/inputs/normalizeWorldbooks.ts","../src/core/modules/worldbook/getActiveEntries.ts","../src/core/modules/regex/applyRegex.ts","../src/core/modules/regex/mergeRegexRules.ts","../src/core/modules/macro/replaceMacros.ts","../src/core/modules/assemble/assembleTaggedPromptList.ts","../src/core/modules/pipeline/processContentStages.ts","../src/core/modules/pipeline/compileTaggedStages.ts","../src/core/modules/build/buildPrompt.ts","../src/core/channels/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { GeminiContent } from '../types';\r\n\r\nexport function isGeminiContents(v: unknown): v is GeminiContent[] {\r\n return (\r\n Array.isArray(v) &&\r\n v.every(\r\n (x) =>\r\n typeof x === 'object' &&\r\n x !== null &&\r\n 'role' in x &&\r\n 'parts' in x &&\r\n Array.isArray((x as any).parts)\r\n )\r\n );\r\n}\r\n\r\nexport function toInternalFromGemini(input: GeminiContent[]): GeminiContent[] {\r\n return (input || []).map((m) => ({\r\n role: m.role,\r\n parts: (m.parts || []).map((p) => ({ text: p.text ?? '' }))\r\n }));\r\n}\r\n\r\nexport function fromInternalToGemini(internal: GeminiContent[]): GeminiContent[] {\r\n return internal;\r\n}\r\n","import type { GeminiContent, OpenAIMessage } from '../types';\r\n\r\nexport function isOpenAIMessages(v: unknown): v is OpenAIMessage[] {\r\n return (\r\n Array.isArray(v) &&\r\n v.every(\r\n (x) =>\r\n typeof x === 'object' &&\r\n x !== null &&\r\n 'role' in x &&\r\n 'content' in x &&\r\n typeof (x as any).content === 'string'\r\n )\r\n );\r\n}\r\n\r\n/**\r\n * openai: system/user/assistant 都保留。\r\n * - assistant -> model(内部)\r\n */\r\nexport function toInternalFromOpenAI(input: OpenAIMessage[]): GeminiContent[] {\r\n return (input || []).map((m) => ({\r\n role: m.role === 'assistant' ? 'model' : m.role,\r\n parts: [{ text: m.content ?? '' }]\r\n }));\r\n}\r\n\r\nexport function fromInternalToOpenAI(internal: GeminiContent[]): OpenAIMessage[] {\r\n return (internal || []).map((m) => ({\r\n role: m.role === 'model' ? 'assistant' : m.role,\r\n content: (m.parts || []).map((p) => p.text ?? '').join('')\r\n }));\r\n}\r\n","import type { GeminiContent, SimpleMessage } from '../types';\r\n\r\nexport function isSimpleMessages(v: unknown): v is SimpleMessage[] {\r\n return (\r\n Array.isArray(v) &&\r\n v.every(\r\n (x) =>\r\n typeof x === 'object' &&\r\n x !== null &&\r\n 'role' in x &&\r\n 'text' in x &&\r\n typeof (x as any).text === 'string'\r\n )\r\n );\r\n}\r\n\r\n/**\r\n * simple: 保留 system/user;assistant/model -> model(内部)。\r\n */\r\nexport function toInternalFromSimple(input: SimpleMessage[]): GeminiContent[] {\r\n return (input || []).map((m) => ({\r\n role: m.role === 'assistant' || m.role === 'model' ? 'model' : m.role,\r\n parts: [{ text: m.text ?? '' }]\r\n }));\r\n}\r\n\r\nexport function fromInternalToSimple(internal: GeminiContent[]): SimpleMessage[] {\r\n return (internal || []).map((m) => ({\r\n role: m.role,\r\n text: (m.parts || []).map((p) => p.text ?? '').join('')\r\n }));\r\n}\r\n","import type { GeminiContent, TaggedContent } from '../types';\r\n\r\nexport function isTaggedContents(v: unknown): v is TaggedContent[] {\r\n return (\r\n Array.isArray(v) &&\r\n v.every(\r\n (x) =>\r\n typeof x === 'object' &&\r\n x !== null &&\r\n 'tag' in x &&\r\n 'target' in x &&\r\n 'text' in x\r\n )\r\n );\r\n}\r\n\r\nexport function toInternalFromTagged(input: TaggedContent[]): GeminiContent[] {\r\n return (input || []).map((m) => ({\r\n role: m.role,\r\n parts: [{ text: m.text ?? '' }]\r\n }));\r\n}\r\n\r\n/**\r\n * 注意:tagged 的“反向转换”没有足够信息恢复 tag/target。\r\n * 所以 fromInternal 只能退化成 simple 或文本。\r\n * buildPrompt() 会在 outputFormat='tagged' 时直接返回 taggedStages,而不是走 convertMessagesOut。\r\n */\r\nexport function fromInternalToTagged(_internal: GeminiContent[]): TaggedContent[] {\r\n throw new Error(\r\n \"fromInternalToTagged is not supported: tagged output should be produced by prompt assembly stage.\"\r\n );\r\n}\r\n","import type { GeminiContent } from '../types';\r\n\r\nexport function isTextInput(v: unknown): v is string | string[] {\r\n return typeof v === 'string' || (Array.isArray(v) && v.every((x) => typeof x === 'string'));\r\n}\r\n\r\nexport function toInternalFromText(input: string | string[]): GeminiContent[] {\r\n const text = Array.isArray(input) ? input.join('\\n') : (input ?? '');\r\n return [{ role: 'user', parts: [{ text }] }];\r\n}\r\n\r\nexport function fromInternalToText(internal: GeminiContent[]): string {\r\n return (internal || [])\r\n .map((m) => (m.parts || []).map((p) => p.text ?? '').join(''))\r\n .join('\\n');\r\n}\r\n","import type { MessageFormat, MessageInput } from '../types';\r\nimport { isGeminiContents } from './gemini';\r\nimport { isOpenAIMessages } from './openai';\r\nimport { isSimpleMessages } from './simple';\r\nimport { isTaggedContents } from './tagged';\r\nimport { isTextInput } from './text';\r\n\r\nexport function detectMessageFormat(input: MessageInput): Exclude<MessageFormat, 'auto'> {\r\n if (isTextInput(input)) return 'text';\r\n if (isGeminiContents(input)) return 'gemini';\r\n if (isOpenAIMessages(input)) return 'openai';\r\n if (isTaggedContents(input)) return 'tagged';\r\n if (isSimpleMessages(input)) return 'simple';\r\n return 'simple';\r\n}\r\n","import type { GeminiContent, MessageFormat, MessageInput, OpenAIMessage, SimpleMessage } from './types';\r\n\r\nimport { detectMessageFormat } from './channels/detect';\r\nimport { toInternalFromGemini, fromInternalToGemini } from './channels/gemini';\r\nimport { toInternalFromOpenAI, fromInternalToOpenAI } from './channels/openai';\r\nimport { toInternalFromSimple, fromInternalToSimple } from './channels/simple';\r\nimport { toInternalFromTagged } from './channels/tagged';\r\nimport { toInternalFromText, fromInternalToText, isTextInput } from './channels/text';\r\n\r\nexport { detectMessageFormat };\r\n\r\n/**\r\n * 将任意输入历史统一转换为 GeminiContent[](role 只保留 user/model)。\r\n * - openai: system/user -> user, assistant -> model\r\n * - simple: system/user -> user, assistant/model -> model\r\n */\r\nexport function convertMessagesIn(\r\n input: MessageInput,\r\n format: MessageFormat = 'auto'\r\n): { detected: Exclude<MessageFormat, 'auto'>; internal: GeminiContent[] } {\r\n const detected = (format === 'auto'\r\n ? detectMessageFormat(input)\r\n : (format as Exclude<MessageFormat, 'auto'>));\r\n\r\n if (detected === 'text') {\r\n // 兼容:string | string[]\r\n return { detected, internal: toInternalFromText(input as any) };\r\n }\r\n\r\n if (detected === 'gemini') {\r\n return { detected, internal: toInternalFromGemini(input as any) };\r\n }\r\n\r\n if (detected === 'openai') {\r\n return { detected, internal: toInternalFromOpenAI(input as any) };\r\n }\r\n\r\n if (detected === 'tagged') {\r\n return { detected, internal: toInternalFromTagged(input as any) };\r\n }\r\n\r\n // simple\r\n return { detected, internal: toInternalFromSimple(input as any) };\r\n}\r\n\r\nexport function convertMessagesOut(\r\n internal: GeminiContent[],\r\n format: Exclude<MessageFormat, 'auto'>\r\n): GeminiContent[] | OpenAIMessage[] | SimpleMessage[] | string {\r\n if (format === 'gemini') return fromInternalToGemini(internal);\r\n if (format === 'openai') return fromInternalToOpenAI(internal);\r\n if (format === 'simple') return fromInternalToSimple(internal);\r\n if (format === 'text') return fromInternalToText(internal);\r\n\r\n // tagged 无法从 internal 逆向恢复 tag/target(见 channels/tagged.ts 说明)\r\n return internal;\r\n}\r\n\r\n/** 小工具:兼容外部直接判断 text 输入 */\r\nexport { isTextInput };\r\n","import type { HistoryInput, MessageInput } from '../../types';\r\n\r\n/**\r\n * 帮助你创建“明确格式”的 history 入参,避免依赖 auto 推断。\r\n */\r\nexport const History = {\r\n gemini: (messages: Extract<HistoryInput, { format: 'gemini' }>['messages']): HistoryInput => ({\r\n format: 'gemini',\r\n messages\r\n }),\r\n\r\n openai: (messages: Extract<HistoryInput, { format: 'openai' }>['messages']): HistoryInput => ({\r\n format: 'openai',\r\n messages\r\n }),\r\n\r\n simple: (messages: Extract<HistoryInput, { format: 'simple' }>['messages']): HistoryInput => ({\r\n format: 'simple',\r\n messages\r\n }),\r\n\r\n tagged: (messages: Extract<HistoryInput, { format: 'tagged' }>['messages']): HistoryInput => ({\r\n format: 'tagged',\r\n messages\r\n }),\r\n\r\n text: (text: Extract<HistoryInput, { format: 'text' }>['text']): HistoryInput => ({\r\n format: 'text',\r\n text\r\n }),\r\n\r\n auto: (input: MessageInput): HistoryInput => ({\r\n format: 'auto',\r\n input\r\n })\r\n} as const;\r\n","import type { HistoryInput, MessageFormat } from '../../types';\r\n\r\nexport function isHistoryInput(v: unknown): v is HistoryInput {\r\n return typeof v === 'object' && v !== null && 'format' in v && typeof (v as any).format === 'string';\r\n}\r\n\r\n/**\r\n * 用于兼容:当调用方没有使用 HistoryInput,而是直接传了 MessageInput 时,\r\n * 可通过该函数统一推断/声明其格式。\r\n */\r\nexport function normalizeHistoryFormat(format?: MessageFormat): MessageFormat {\r\n return format ?? 'auto';\r\n}\r\n","export function testCondition(condition: string | undefined, text: string): boolean {\r\n if (!condition || condition.trim() === '') return true;\r\n\r\n const kwMatch = condition.match(/<<keywords:(.+)>>/i);\r\n if (kwMatch?.[1]) {\r\n const keywords = kwMatch[1].split(',').map((k) => k.trim());\r\n return keywords.some((k) => k && text.includes(k));\r\n }\r\n\r\n try {\r\n const regex = new RegExp(condition, 'i');\r\n return regex.test(text);\r\n } catch {\r\n return text.includes(condition);\r\n }\r\n}\r\n","import type { RegexRule, RegexesInput } from '../../types';\r\n\r\nfunction isRegexRuleArray(v: unknown): v is RegexRule[] {\r\n return Array.isArray(v) && v.every((x) => typeof x === 'object' && x !== null && 'find_regex' in (x as any));\r\n}\r\n\r\n/**\r\n * 兼容用户一次性传入多个“正则 JSON 文件”的情况。\r\n * 支持格式:\r\n * - RegexRule[]\r\n * - { regex_rules: RegexRule[] }\r\n * - { rules: RegexRule[] }\r\n * - RegexRule\r\n * - 以上任意形式的数组(多文件)\r\n */\r\nexport function normalizeRegexes(input?: RegexesInput): RegexRule[] {\r\n if (!input) return [];\r\n\r\n // 同 normalizeWorldbooks:\r\n // input 既可能是“单个文件的 RegexRule[]”,也可能是“多个文件的数组”。\r\n const files: any[] = [];\r\n\r\n if (Array.isArray(input)) {\r\n // 若 input 本身就是 RegexRule[](而不是多文件),则视作单文件\r\n if (isRegexRuleArray(input)) {\r\n files.push(input);\r\n } else {\r\n files.push(...input);\r\n }\r\n } else {\r\n files.push(input);\r\n }\r\n\r\n const out: RegexRule[] = [];\r\n\r\n for (const item of files) {\r\n if (!item) continue;\r\n\r\n // RegexRule[]\r\n if (isRegexRuleArray(item)) {\r\n out.push(...item);\r\n continue;\r\n }\r\n\r\n // RegexRule\r\n if (typeof item === 'object' && item !== null && 'find_regex' in (item as any)) {\r\n out.push(item as RegexRule);\r\n continue;\r\n }\r\n\r\n // { regex_rules: [...] }\r\n if (typeof item === 'object' && item !== null && Array.isArray((item as any).regex_rules)) {\r\n out.push(...((item as any).regex_rules as RegexRule[]));\r\n continue;\r\n }\r\n\r\n // { rules: [...] }\r\n if (typeof item === 'object' && item !== null && Array.isArray((item as any).rules)) {\r\n out.push(...((item as any).rules as RegexRule[]));\r\n continue;\r\n }\r\n }\r\n\r\n return out;\r\n}\r\n","import type {\r\n Role,\r\n WorldbookEntry,\r\n WorldbookEntryInput,\r\n WorldbooksInput,\r\n WorldbookInput\r\n} from '../../types';\r\n\r\nfunction isWorldbookEntryArray(v: unknown): v is WorldbookEntryInput[] {\r\n return Array.isArray(v) && v.every((x) => typeof x === 'object' && x !== null && 'content' in (x as any));\r\n}\r\n\r\nfunction normalizeOne(item: WorldbookInput): WorldbookEntry[] {\r\n const normalizeEntry = (e: any): WorldbookEntry | null => {\r\n if (!e || typeof e !== 'object') return null;\r\n\r\n const position = (e as any).position as WorldbookEntryInput['position'] | undefined;\r\n if (position !== 'before_char' && position !== 'after_char' && position !== 'fixed') return null;\r\n\r\n const role: Role = (e as any).role ?? 'user';\r\n\r\n // order 约束:fixed/slot 都必须显式提供 order\r\n const orderRaw = (e as any).order;\r\n const order = Number.isFinite(orderRaw) ? Number(orderRaw) : NaN;\r\n if (!Number.isFinite(order)) return null;\r\n\r\n if (position === 'fixed') {\r\n const depthRaw = (e as any).depth;\r\n const depth = Number.isFinite(depthRaw) ? Number(depthRaw) : NaN;\r\n if (!Number.isFinite(depth)) return null;\r\n\r\n return {\r\n ...(e as any),\r\n role,\r\n position,\r\n order,\r\n depth\r\n } as WorldbookEntry;\r\n }\r\n\r\n // slot 条目:忽略 depth\r\n return {\r\n ...(e as any),\r\n role,\r\n position,\r\n order\r\n } as WorldbookEntry;\r\n };\r\n\r\n const normalizeEntries = (entries: any[]): WorldbookEntry[] => {\r\n return (entries || [])\r\n .map(normalizeEntry)\r\n .filter((x): x is WorldbookEntry => Boolean(x));\r\n };\r\n\r\n // 直接是 entries 数组\r\n if (isWorldbookEntryArray(item)) return normalizeEntries(item as any);\r\n\r\n // 形如 { name, entries } 的 worldbook.json\r\n if (typeof item === 'object' && item !== null && Array.isArray((item as any).entries)) {\r\n // 允许 { enabled: false } 作为文件级开关\r\n if ((item as any).enabled === false) return [];\r\n return normalizeEntries((item as any).entries);\r\n }\r\n\r\n return [];\r\n}\r\n\r\n/**\r\n * 兼容用户一次性传入多个“世界书 JSON 文件”的情况。\r\n * 支持格式:\r\n * - Worldbook({ name, entries })\r\n * - WorldbookEntryInput[]\r\n * - 以上任意形式的数组(多文件)\r\n */\r\nexport function normalizeWorldbooks(input?: WorldbooksInput): WorldbookEntry[] {\r\n if (!input) return [];\r\n\r\n // 关键点:\r\n // - input 既可能是“单个文件的 entries 数组(WorldbookEntryInput[])”\r\n // - 也可能是“多个文件的数组(WorldbookInput[])”\r\n // 两者在运行时都是 Array,需要用内容结构区分。\r\n\r\n const files: WorldbookInput[] = [];\r\n\r\n if (Array.isArray(input)) {\r\n // 如果本身就是 entries 数组,把它当作“单个文件”处理\r\n if (isWorldbookEntryArray(input)) {\r\n files.push(input);\r\n } else {\r\n files.push(...(input as WorldbookInput[]));\r\n }\r\n } else {\r\n files.push(input);\r\n }\r\n\r\n const out: WorldbookEntry[] = [];\r\n for (const file of files) {\r\n if (!file) continue;\r\n out.push(...normalizeOne(file));\r\n }\r\n\r\n return out;\r\n}\r\n","import type { Worldbook, WorldbookEntry } from '../../types';\r\nimport { normalizeWorldbooks } from '../inputs';\r\nimport { testCondition } from './testCondition';\r\n\r\nexport function getActiveEntries(params: {\r\n contextText?: string;\r\n /** 已归一化后的全局世界书 entries */\r\n globalEntries?: WorldbookEntry[];\r\n presetWorldbook?: Worldbook;\r\n characterWorldbook?: Worldbook;\r\n}): WorldbookEntry[] {\r\n const { contextText = '', globalEntries = [], presetWorldbook, characterWorldbook } = params;\r\n\r\n const filterEntry = (e: WorldbookEntry) => {\r\n if (e.enabled === false) return false;\r\n if (e.mode === 'always') return true;\r\n if (e.mode === 'conditional') return testCondition(e.condition, contextText);\r\n return true;\r\n };\r\n\r\n const entries: Array<WorldbookEntry & { _source: string }> = [];\r\n\r\n // 1) global(已归一化为严格 WorldbookEntry)\r\n (globalEntries || []).filter(filterEntry).forEach((e, idx) => {\r\n entries.push({ ...e, _source: `global-${idx}` });\r\n });\r\n\r\n // 2) preset(输入 worldbook 需要归一化)\r\n const presetEntries = normalizeWorldbooks(presetWorldbook);\r\n presetEntries.filter(filterEntry).forEach((e) => {\r\n entries.push({ ...e, _source: 'preset' });\r\n });\r\n\r\n // 3) character(输入 worldbook 需要归一化)\r\n const characterEntries = normalizeWorldbooks(characterWorldbook);\r\n characterEntries.filter(filterEntry).forEach((e) => {\r\n entries.push({ ...e, _source: 'character' });\r\n });\r\n\r\n // 保持你当前项目中的排序策略:先按 order,再按 source priority\r\n return entries.sort((a, b) => {\r\n if (a.order !== b.order) return a.order - b.order;\r\n\r\n const getPrio = (src: string) => {\r\n if (src === 'character') return 3;\r\n if (src === 'preset') return 2;\r\n return 1;\r\n };\r\n\r\n return getPrio(a._source) - getPrio(b._source);\r\n });\r\n}\r\n","import type { RegexRule, Target, View } from '../../types';\r\n\r\n/**\r\n * 复刻你当前 store 里的 applyRegex 行为(含 target 映射逻辑)。\r\n */\r\nexport function applyRegex(\r\n text: string,\r\n params: {\r\n rules: RegexRule[];\r\n target: Target;\r\n view: View;\r\n placement?: 'before_macro' | 'after_macro';\r\n }\r\n): string {\r\n let result = text ?? '';\r\n const { rules, target, view, placement } = params;\r\n\r\n for (const rule of rules) {\r\n if (!rule?.enabled) continue;\r\n if (!(rule.views || []).includes(view)) continue;\r\n if (placement && rule.placement !== placement) continue;\r\n\r\n const mappedTarget: string[] =\r\n target === 'model' || target === 'chat_history'\r\n ? ['model', 'chat_history', 'assistant_response']\r\n : [target];\r\n\r\n const isMatch =\r\n (rule.targets || []).some((t) => mappedTarget.includes(t)) ||\r\n (target === 'model' && (rule.targets || []).includes('chat_history')) ||\r\n (target === 'user' && (rule.targets || []).includes('chat_history'));\r\n\r\n if (!isMatch) continue;\r\n\r\n try {\r\n const re = new RegExp(rule.find_regex, 'g');\r\n result = result.replace(re, rule.replace_regex);\r\n } catch {\r\n // 库内不打印 console,避免污染调用方;直接跳过该条规则\r\n continue;\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n","import type { RegexRule, View } from '../../types';\r\n\r\nfunction normalizeView(v: RegexRule['views'][number]): View {\r\n return v === 'assistant_view' ? 'model_view' : v;\r\n}\r\n\r\nexport function mergeRegexRules(params: {\r\n /** 全局正则规则(可选) */\r\n globalRules?: RegexRule[];\r\n\r\n /** 预设内嵌正则 */\r\n presetRules?: RegexRule[];\r\n\r\n /** 角色卡内嵌正则 */\r\n characterRules?: RegexRule[];\r\n}): RegexRule[] {\r\n const all: RegexRule[] = [];\r\n\r\n // 1) 全局直传 rules(推荐)\r\n all.push(...(params.globalRules || []));\r\n\r\n // 2) 预设与角色\r\n all.push(...(params.presetRules || []));\r\n all.push(...(params.characterRules || []));\r\n\r\n return all.map((r) => ({\r\n ...r,\r\n views: (r.views || []).map(normalizeView)\r\n }));\r\n}\r\n","/**\r\n * 简单宏替换。\r\n * 兼容:{{char}} {{user}} <<user>>\r\n * 同时支持传入任意 key:{{key}}\r\n */\r\nexport function replaceMacros(text: string, macros: Record<string, string>): string {\r\n if (!text) return '';\r\n\r\n let out = text;\r\n\r\n // 兼容:<<user>>\r\n if (macros.user !== undefined) {\r\n out = out.replace(/<<user>>/g, String(macros.user));\r\n }\r\n\r\n // 兼容:{{char}} / {{user}} 以及其它 {{key}}\r\n out = out.replace(/\\{\\{\\s*([a-zA-Z0-9_]+)\\s*\\}\\}/g, (_m, key: string) => {\r\n if (Object.prototype.hasOwnProperty.call(macros, key)) return String(macros[key]);\r\n return _m; // 未知宏保持原样\r\n });\r\n\r\n return out;\r\n}\r\n","import type { PromptBlock, Role, TaggedContent, WorldbookEntry } from '../../types';\r\n\r\nfunction mapRole(role: Role): Role {\r\n // 内部保留 system;仅在最终输出转换时按格式需要做降级\r\n return role;\r\n}\r\n\r\nfunction isFixedPromptBlock(b: PromptBlock): b is Extract<PromptBlock, { position: 'fixed' }> {\r\n return b.position === 'fixed';\r\n}\r\n\r\nfunction isFixedWorldbookEntry(\r\n e: WorldbookEntry\r\n): e is Extract<WorldbookEntry, { position: 'fixed' }> {\r\n return e.position === 'fixed';\r\n}\r\n\r\nexport function assembleTaggedPromptList(params: {\r\n presetBlocks: PromptBlock[];\r\n activeEntries: WorldbookEntry[];\r\n /** 线性聊天历史(允许包含 system) */\r\n chatHistory: Array<{ role: Role; text: string }>;\r\n positionMap?: Partial<Record<'before_char' | 'after_char', string>>;\r\n}): TaggedContent[] {\r\n const {\r\n presetBlocks,\r\n activeEntries,\r\n chatHistory,\r\n positionMap = { before_char: 'charBefore', after_char: 'charAfter' }\r\n } = params;\r\n\r\n const result: TaggedContent[] = [];\r\n\r\n const enabledBlocks = (presetBlocks || []).filter((b) => b.enabled !== false);\r\n\r\n // 1) relative blocks:作为“骨架块”输出(包含 chatHistory、charBefore、charAfter 等占位块)\r\n const relativeBlocks = enabledBlocks.filter((b) => b.position === 'relative');\r\n\r\n for (const block of relativeBlocks) {\r\n // 1) 世界书:插槽条目(before_char/after_char)\r\n // 规则:\r\n // - 仅 position=before_char/after_char 才会落入占位块\r\n // - 不使用 depth(slot 条目靠 order 相对排序)\r\n // - 仅排除 position=fixed(它们属于 chatHistory 注入)\r\n const slotEntries = (activeEntries || [])\r\n .filter((e) => {\r\n if (isFixedWorldbookEntry(e)) return false;\r\n const mappedPos = positionMap[e.position] || e.position;\r\n return mappedPos === block.identifier;\r\n })\r\n .sort((a, b) => a.order - b.order);\r\n\r\n for (const entry of slotEntries) {\r\n result.push({\r\n tag: `Worldbook: ${entry.name}`,\r\n target: 'world_book',\r\n role: mapRole(entry.role),\r\n text: entry.content\r\n });\r\n }\r\n\r\n // 2) 主内容\r\n if (block.identifier === 'chatHistory') {\r\n let dialogueList: TaggedContent[] = (chatHistory || []).map((node) => ({\r\n tag: `History: ${node.role}`,\r\n // system 属于聊天历史的一部分:这里用 chat_history 目标以便 regex 可覆盖\r\n target: node.role === 'user' ? 'user' : node.role === 'model' ? 'model' : 'chat_history',\r\n role: node.role,\r\n text: node.text\r\n }));\r\n\r\n // 仅 fixed 才会注入到 chatHistory,此时才使用 depth\r\n // 约束:fixed 必须具备 depth + order(两者都必填);否则视为无效配置并忽略。\r\n const presetInjections = enabledBlocks.filter(\r\n (b): b is Extract<PromptBlock, { position: 'fixed' }> =>\r\n isFixedPromptBlock(b) &&\r\n typeof b.depth === 'number' &&\r\n Number.isFinite(b.depth) &&\r\n typeof b.order === 'number' &&\r\n Number.isFinite(b.order)\r\n );\r\n const worldbookInjections = (activeEntries || []).filter(\r\n (e): e is Extract<WorldbookEntry, { position: 'fixed' }> =>\r\n isFixedWorldbookEntry(e) &&\r\n typeof e.depth === 'number' &&\r\n Number.isFinite(e.depth) &&\r\n typeof e.order === 'number' &&\r\n Number.isFinite(e.order)\r\n );\r\n\r\n const allInjections = [\r\n ...presetInjections.map((b) => ({\r\n tag: `Preset: ${b.name}`,\r\n target: 'preset' as const,\r\n role: mapRole(b.role),\r\n text: b.content || '',\r\n depth: b.depth,\r\n order: b.order\r\n })),\r\n ...worldbookInjections.map((e) => ({\r\n tag: `Worldbook: ${e.name}`,\r\n target: 'world_book' as const,\r\n role: mapRole(e.role),\r\n text: e.content,\r\n depth: e.depth,\r\n order: e.order\r\n }))\r\n ].sort((a, b) => {\r\n if (a.depth !== b.depth) return a.depth - b.depth;\r\n return a.order - b.order;\r\n });\r\n\r\n for (const item of allInjections) {\r\n const targetIndex = Math.max(0, dialogueList.length - item.depth);\r\n dialogueList.splice(targetIndex, 0, {\r\n tag: item.tag,\r\n target: item.target,\r\n role: item.role,\r\n text: item.text\r\n });\r\n }\r\n\r\n result.push(...dialogueList);\r\n } else if (block.content) {\r\n result.push({\r\n tag: `Preset: ${block.name}`,\r\n target: 'preset',\r\n role: mapRole(block.role),\r\n text: block.content\r\n });\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n","import type { PerItemStages, RegexRule, Target, View } from '../../types';\r\nimport { applyRegex } from '../regex';\r\nimport { replaceMacros } from '../macro';\r\n\r\nexport function processContentStages(\r\n text: string,\r\n params: {\r\n target: Target;\r\n view: View;\r\n rules: RegexRule[];\r\n macros: Record<string, string>;\r\n }\r\n): Pick<PerItemStages, 'raw' | 'afterPreRegex' | 'afterMacro' | 'afterPostRegex'> {\r\n const raw = text ?? '';\r\n\r\n const afterPreRegex = applyRegex(raw, {\r\n rules: params.rules,\r\n target: params.target,\r\n view: params.view,\r\n placement: 'before_macro'\r\n });\r\n\r\n const afterMacro = replaceMacros(afterPreRegex, params.macros);\r\n\r\n const afterPostRegex = applyRegex(afterMacro, {\r\n rules: params.rules,\r\n target: params.target,\r\n view: params.view,\r\n placement: 'after_macro'\r\n });\r\n\r\n return { raw, afterPreRegex, afterMacro, afterPostRegex };\r\n}\r\n\r\n","import type { PerItemStages, PromptStages, RegexRule, TaggedContent, View } from '../../types';\r\nimport { processContentStages } from './processContentStages';\r\n\r\nexport function compileTaggedStages(\r\n tagged: TaggedContent[],\r\n params: { view: View; rules: RegexRule[]; macros: Record<string, string> }\r\n): { stages: PromptStages<TaggedContent[]>; perItem: PerItemStages[] } {\r\n const perItem: PerItemStages[] = [];\r\n\r\n const raw = (tagged || []).map((i) => ({ ...i }));\r\n const afterPreRegex: TaggedContent[] = [];\r\n const afterMacro: TaggedContent[] = [];\r\n const afterPostRegex: TaggedContent[] = [];\r\n\r\n for (const item of raw) {\r\n const s = processContentStages(item.text, {\r\n target: item.target,\r\n view: params.view,\r\n rules: params.rules,\r\n macros: params.macros\r\n });\r\n\r\n perItem.push({\r\n tag: item.tag,\r\n role: item.role,\r\n target: item.target,\r\n ...s\r\n });\r\n\r\n afterPreRegex.push({ ...item, text: s.afterPreRegex });\r\n afterMacro.push({ ...item, text: s.afterMacro });\r\n afterPostRegex.push({ ...item, text: s.afterPostRegex });\r\n }\r\n\r\n return {\r\n stages: { raw, afterPreRegex, afterMacro, afterPostRegex },\r\n perItem\r\n };\r\n}\r\n\r\n","import type { BuildPromptParams, BuildPromptResult, GeminiContent, TaggedContent } from '../../types';\r\nimport { convertMessagesIn, convertMessagesOut } from '../../convert';\r\nimport { isHistoryInput, normalizeHistoryFormat } from '../history';\r\nimport { normalizeRegexes, normalizeWorldbooks } from '../inputs';\r\nimport { getActiveEntries } from '../worldbook';\r\nimport { assembleTaggedPromptList } from '../assemble';\r\nimport { mergeRegexRules } from '../regex';\r\nimport { compileTaggedStages } from '../pipeline';\r\n\r\nfunction geminiContentsToChatHistory(\r\n contents: GeminiContent[]\r\n): Array<{ role: GeminiContent['role']; text: string }> {\r\n return (contents || []).map((m) => ({\r\n role: m.role,\r\n text: (m.parts || []).map((p) => p.text ?? '').join('')\r\n }));\r\n}\r\n\r\nfunction taggedToGemini(tagged: TaggedContent[]): GeminiContent[] {\r\n return (tagged || []).map((item) => ({\r\n role: item.role,\r\n parts: [{ text: item.text ?? '' }]\r\n }));\r\n}\r\n\r\nfunction applySystemRolePolicy(\r\n internal: GeminiContent[],\r\n policy: 'keep' | 'to_user'\r\n): GeminiContent[] {\r\n if (policy === 'keep') return internal;\r\n return (internal || []).map((m) => ({\r\n ...m,\r\n role: m.role === 'system' ? 'user' : m.role\r\n }));\r\n}\r\n\r\nexport function buildPrompt(params: BuildPromptParams): BuildPromptResult {\r\n const { preset, character, globals, history, historyFormat, macros, view, options } = params;\r\n\r\n // 1) 统一 history 输入为“类 Gemini”\r\n const historyConv = (() => {\r\n if (isHistoryInput(history)) {\r\n if (history.format === 'text') {\r\n return convertMessagesIn(history.text, 'text');\r\n }\r\n if (history.format === 'auto') {\r\n return convertMessagesIn(history.input, 'auto');\r\n }\r\n return convertMessagesIn(history.messages as any, history.format);\r\n }\r\n\r\n // 兼容:直接传 MessageInput\r\n return convertMessagesIn(history as any, normalizeHistoryFormat(historyFormat));\r\n })();\r\n\r\n const detectedHistoryFormat = historyConv.detected;\r\n const internalHistory = historyConv.internal;\r\n\r\n const chatHistory = geminiContentsToChatHistory(internalHistory);\r\n\r\n const recentN = options?.recentHistoryForWorldbook ?? 5;\r\n const recentHistoryText = chatHistory\r\n .slice(-recentN)\r\n .map((n) => n.text)\r\n .join('\\n');\r\n\r\n const globalWorldbookEntries = normalizeWorldbooks(globals?.worldbooks);\r\n\r\n const activeEntries = getActiveEntries({\r\n contextText: recentHistoryText,\r\n globalEntries: globalWorldbookEntries,\r\n presetWorldbook: preset.world_book,\r\n characterWorldbook: character?.world_book\r\n });\r\n\r\n const tagged = assembleTaggedPromptList({\r\n presetBlocks: preset.prompts,\r\n activeEntries,\r\n chatHistory,\r\n positionMap: options?.positionMap\r\n });\r\n\r\n const globalRegexRules = normalizeRegexes(globals?.regexes);\r\n\r\n const rules = mergeRegexRules({\r\n globalRules: globalRegexRules,\r\n presetRules: preset.regex_rules,\r\n characterRules: character?.regex_rules\r\n });\r\n\r\n // 2) 编译各阶段(raw -> beforeRegex -> macro -> afterRegex)\r\n const compiled = compileTaggedStages(tagged, { view, rules, macros });\r\n\r\n const taggedStages = compiled.stages;\r\n const perItem = compiled.perItem;\r\n\r\n const internalStages = {\r\n raw: taggedToGemini(taggedStages.raw),\r\n afterPreRegex: taggedToGemini(taggedStages.afterPreRegex),\r\n afterMacro: taggedToGemini(taggedStages.afterMacro),\r\n afterPostRegex: taggedToGemini(taggedStages.afterPostRegex)\r\n };\r\n\r\n // 3) 计算 outputFormat(默认跟随输入格式;也可手动指定)\r\n const defaultOutputFormat = isHistoryInput(history)\r\n ? history.format === 'auto'\r\n ? detectedHistoryFormat\r\n : history.format\r\n : detectedHistoryFormat;\r\n\r\n const outputFormat = (params.outputFormat ?? defaultOutputFormat) as BuildPromptResult['outputFormat'];\r\n const systemRolePolicy = params.systemRolePolicy ?? 'keep';\r\n\r\n const outputStages =\r\n outputFormat === 'tagged'\r\n ? taggedStages\r\n : {\r\n raw: convertMessagesOut(\r\n applySystemRolePolicy(internalStages.raw, systemRolePolicy),\r\n outputFormat as Exclude<any, 'tagged'>\r\n ),\r\n afterPreRegex: convertMessagesOut(\r\n applySystemRolePolicy(internalStages.afterPreRegex, systemRolePolicy),\r\n outputFormat as Exclude<any, 'tagged'>\r\n ),\r\n afterMacro: convertMessagesOut(\r\n applySystemRolePolicy(internalStages.afterMacro, systemRolePolicy),\r\n outputFormat as Exclude<any, 'tagged'>\r\n ),\r\n afterPostRegex: convertMessagesOut(\r\n applySystemRolePolicy(internalStages.afterPostRegex, systemRolePolicy),\r\n outputFormat as Exclude<any, 'tagged'>\r\n )\r\n };\r\n\r\n return {\r\n detectedHistoryFormat,\r\n outputFormat,\r\n systemRolePolicy,\r\n activeWorldbookEntries: activeEntries,\r\n mergedRegexRules: rules,\r\n stages: {\r\n tagged: taggedStages,\r\n internal: internalStages,\r\n output: outputStages,\r\n perItem\r\n }\r\n };\r\n}\r\n","export * from './detect';\r\nexport * from './gemini';\r\nexport * from './openai';\r\nexport * from './simple';\r\nexport * from './tagged';\r\nexport * from './text';\r\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "fast-tavern",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "A framework-agnostic prompt engine: preset + worldbook + character + regex + macros -> compiled messages.",
|
|
5
|
+
"keywords": ["prompt", "worldbook", "regex", "macro", "sillytavern"],
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"author": "",
|
|
8
|
+
"type": "module",
|
|
9
|
+
"main": "./dist/index.cjs",
|
|
10
|
+
"module": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"import": "./dist/index.js",
|
|
16
|
+
"require": "./dist/index.cjs"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"files": ["dist"],
|
|
20
|
+
"sideEffects": false,
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsup",
|
|
23
|
+
"dev": "tsup --watch",
|
|
24
|
+
"clean": "node -e \"require('fs').rmSync('dist', { recursive: true, force: true })\"",
|
|
25
|
+
"test": "npm run build && node test/test.mjs"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"tsup": "^8.5.0",
|
|
29
|
+
"typescript": "^5.9.3"
|
|
30
|
+
}
|
|
31
|
+
}
|