feat: preserve pages and compress context

This commit is contained in:
mesalogo
2026-08-15 20:44:47 +08:00
parent 1031ea618b
commit c2b9ce4ff0
23 changed files with 1972 additions and 507 deletions
+63
View File
@@ -0,0 +1,63 @@
export const minimumModelContextWindowTokens = 32_000
export const maximumModelContextWindowTokens = 10_000_000
export const contextOutputAndSafetyTokens = 12_000
export const estimatedContextRequestOverheadTokens = 4_000
export type ContextWindowMessage = {
role: 'user' | 'assistant'
content: string
}
export function estimateTextTokens(value: string): number {
let asciiCharacters = 0
let nonAsciiCharacters = 0
for (const character of value) {
if (character.codePointAt(0)! <= 0x7f) {
asciiCharacters += 1
} else {
nonAsciiCharacters += 1
}
}
return Math.max(
1,
Math.ceil(asciiCharacters / 4 + nonAsciiCharacters)
)
}
export function estimateMessagesTokens(
messages: readonly ContextWindowMessage[]
): number {
return messages.reduce(
(total, message) => total + estimateTextTokens(message.content) + 4,
0
)
}
export function estimateContextInputTokens(input: {
history: readonly ContextWindowMessage[]
prompt: string
summaryTokens?: number
}): number {
return (
estimateMessagesTokens(input.history) +
estimateTextTokens(input.prompt) +
(input.summaryTokens ?? 0) +
estimatedContextRequestOverheadTokens
)
}
export function getEffectiveContextTriggerTokens(input: {
triggerTokens: number
contextWindowTokens?: number
}): number {
if (input.contextWindowTokens === undefined) {
return input.triggerTokens
}
return Math.min(
input.triggerTokens,
Math.max(
input.contextWindowTokens,
minimumModelContextWindowTokens
) - contextOutputAndSafetyTokens
)
}