ContextWindow API for structured memory storage, lorebook management, and conversation history operations.
ContextWindow Class API
Table of Contents
Overview
The ContextWindow class manages context data including lorebook entries, context elements, and conversation history with intelligent selection and truncation capabilities.
@Serializable
data class ContextWindow(@Transient val cinit: Boolean = false)
Public Properties
loreBookKeys
var loreBookKeys: MutableMap<String, LoreBook> = mutableMapOf()
Lorebook keys and values for weighted context injection. Each entry contains key-value pairs with metadata like weight, aliases, and dependencies.
contextElements
var contextElements: MutableList<String> = mutableListOf()
List of raw context strings for direct context injection without lorebook processing.
converseHistory
var converseHistory: ConverseHistory = ConverseHistory()
Structured conversation history between user and LLM agent for maintaining conversation context.
contextSize
var contextSize: Int = 8000
Maximum token size for the context window. Overridden by Pipe class settings during execution.
Public Functions
LoreBook Management
addLoreBookEntry(key: String, value: String, weight: Int = 0, linkedKeys: List<String> = listOf(), aliasKeys: List<String> = listOf(), requiredKeys: List<String> = listOf())
Adds a new lorebook entry with comprehensive metadata.
Behavior: Creates LoreBook object with specified parameters. Automatically adds uppercase and lowercase versions of the key as aliases for case-insensitive matching.
addLoreBookEntryWithObject(lorebook: LoreBook)
Adds lorebook entry using existing LoreBook object.
Behavior: Wrapper around addLoreBookEntry() that extracts parameters from LoreBook object. Useful for copying and re-adding entries.
findLoreBookEntry(key: String): LoreBook?
Finds lorebook entry by key or alias with case-insensitive matching.
Behavior: Searches in order: uppercase key, lowercase key, exact key, then all alias keys (uppercase, lowercase, exact). Returns first match or null.
cleanLorebook(bannedChars: String = "", replaceBannedCharWith: String = "")
Cleans lorebook keys by removing or replacing banned characters.
Behavior:
- Parses
bannedCharsas comma-space delimited list - Creates copy of all lorebook entries
- Replaces banned characters with replacement string
- Re-adds entries with cleaned keys and regenerated aliases
Context Selection
findMatchingLoreBookKeys(text: String): List<String>
Finds lorebook keys that match substrings in input text.
Behavior: Case-insensitive substring matching against both main keys and alias keys. Returns list of matching main keys (not aliases).
countAndSortKeyHits(hitKeys: List<String>): List<Pair<String, Int>>
Counts key occurrences and sorts by frequency.
Behavior: Groups identical keys, counts occurrences, returns key-count pairs sorted by count descending.
selectLoreBookContext(text: String, maxTokens: Int, countSubWordsInFirstWord: Boolean = true, favorWholeWords: Boolean = true, countOnlyFirstWordFound: Boolean = false, splitForNonWordChar: Boolean = true, alwaysSplitIfWholeWordExists: Boolean = false, countSubWordsIfSplit: Boolean = false, nonWordSplitCount: Int = 4): List<String>
Intelligently selects lorebook entries based on text relevance and token budget.
Behavior: Complex selection algorithm:
- Finds matching keys in input text
- Expands selection to include linked keys
- Validates dependency requirements
- Sorts by hit count and weight
- Selects entries within token budget using tokenizer configuration parameters
- Prioritizes higher-weighted and more frequently matched entries
selectAndFillLoreBookContext(text: String, maxTokens: Int, countSubWordsInFirstWord: Boolean = true, favorWholeWords: Boolean = true, countOnlyFirstWordFound: Boolean = false, splitForNonWordChar: Boolean = true, alwaysSplitIfWholeWordExists: Boolean = false, countSubWordsIfSplit: Boolean = false, nonWordSplitCount: Int = 4): List<String>
Selects lorebook entries with an additional fill phase to maximize token usage.
Behavior:
- Reuses the priority selection from
selectLoreBookContextto gather matching lorebook entries. - Computes remaining budget after the priority phase.
- Iterates through non-matching entries (sorted by weight) and adds them as long as the total token usage stays within
maxTokensand dependencies are satisfied. - Returns an ordered list that can be used to filter
loreBookKeysbefore truncating the rest of the context.
selectLoreBookContextWithSettings(settings: TruncationSettings, text: String, maxTokens: Int): List<String>
Alternative selection method using TruncationSettings for token counting.
selectAndFillLoreBookContextWithSettings(settings: TruncationSettings, text: String, maxTokens: Int): List<String>
Selects LoreBook entries using the select-and-fill strategy while reusing a settings object.
Behavior: Same as selectAndFillLoreBookContext() but uses the passed TruncationSettings for tokenizer configuration, preserving token counting behavior across helper methods.
Parameters:
settings: TruncationSettings containing tokenization parameterstext: Input text to scan for matching LoreBook keysmaxTokens: Maximum tokens to allocate for lorebook selection
Returns: Ordered list of LoreBook keys selected via the priority + fill strategy
Context Merging
merge(other: ContextWindow, emplaceLoreBookKeys: Boolean = true, appendKeys: Boolean = false)
Merges another ContextWindow into this one with configurable strategies.
Behavior: Complex merge with multiple strategies:
- New entries: Always added if key doesn’t exist
- Existing entries with
appendKeys = true: Appends new value to existing value - Existing entries with
emplaceLoreBookKeys = true: Replaces entire entry - Existing entries with both false: Keeps original entry unchanged
- Alias/Linked keys: Always merged using combine utility
- Context elements: Appended to existing list
- Conversation history: Merged using ConverseHistory merge logic
Truncation
truncateContextElements(maxTokens: Int, multiplyWindowSizeBy: Int, truncateSettings: ContextWindowSettings, countSubWordsInFirstWord: Boolean = true, favorWholeWords: Boolean = true, countOnlyFirstWordFound: Boolean = false, splitForNonWordChar: Boolean = true, alwaysSplitIfWholeWordExists: Boolean = false, countSubWordsIfSplit: Boolean = false, nonWordSplitCount: Int = 4, inputText: String = "", preserveTextMatches: Boolean = false)
Truncates context elements to fit token budget.
Behavior: Uses Dictionary truncation with specified method (TruncateTop, TruncateBottom, TruncateMiddle) and tokenizer configuration parameters.
- When
preserveTextMatches = true, context elements matching words frominputTextare kept before the default truncation ordering is applied.
selectAndTruncateContext(text: String, totalTokenBudget: Int, multiplyWindowSizeBy: Int, truncateSettings: ContextWindowSettings, countSubWordsInFirstWord: Boolean = true, favorWholeWords: Boolean = true, countOnlyFirstWordFound: Boolean = false, splitForNonWordChar: Boolean = true, alwaysSplitIfWholeWordExists: Boolean = false, countSubWordsIfSplit: Boolean = false, nonWordSplitCount: Int = 4, fillMode: Boolean = false, fillAndSplitMode: Boolean = false, preserveTextMatches: Boolean = false)
Selects and truncates context with automatic budget allocation.
Behavior: Intelligent budget allocation based on available content types:
- Lorebook only: Full budget to lorebook selection
- Context + Lorebook: 50/50 split
- Conversation + Lorebook: Conversation first, remainder to lorebook
- All three types: 1/3 each, with lorebook getting remainder
- Returns: Unit (modifies context in place)
Additional Parameters:
fillMode: Boolean = false— when true,selectAndTruncateContextfirst runs the select-and-fill LoreBook flow (selectAndFillLoreBookContext) using the full budget, then splits the remaining tokens between context elements and conversation history.fillAndSplitMode: Boolean = false— when true,selectAndTruncateContextreserves half of the available top-level budget for lorebook selection and half for the remaining context/history split. If the lorebook side underfills its half, the unused budget is reclaimed and passed to the remaining context/history split. If both context elements and conversation history exist, the remainder is still split 50/50 between them.preserveTextMatches: Boolean = false— when true, context elements and conversation history that include words fromtextare preserved before applying the usual truncation ordering.
combineAndTruncateAsString(text: String, totalTokenBudget: Int, multiplyWindowSizeBy: Int, truncateSettings: ContextWindowSettings, countSubWordsInFirstWord: Boolean = true, favorWholeWords: Boolean = true, countOnlyFirstWordFound: Boolean = false, splitForNonWordChar: Boolean = true, alwaysSplitIfWholeWordExists: Boolean = false, countSubWordsIfSplit: Boolean = false, nonWordSplitCount: Int = 4): String
Combines lorebook values with context elements into single string with truncation.
Behavior: Selects lorebook context, combines with context elements, truncates result to fit token budget using tokenizer parameters.
combineAndTruncateAsStringWithSettings(text: String, tokenBudget: Int, settings: TruncationSettings, truncateMethod: ContextWindowSettings, multiplyBy: Int, fillMode: Boolean = false): String
Enhanced version with TruncationSettings object, configurable truncation method, and optional lorebook fill mode.
Behavior: When fillMode = true, applies selectAndFillLoreBookContextWithSettings() before combining lorebook and context strings. After filtering keys based on the fill-mode selection, it concatenates the remaining sections and truncates them down to tokenBudget, using the supplied tokenizer parameters.
ℹ️ Note: Fill mode only affects which LoreBook entries remain—it does not change how the final string is truncated. This helper therefore preserves the standard string-based truncation semantics while still respecting advanced lorebook selection.
Conversation Management
selectConverseHistoryLoreBookContext(maxTokens: Int, countSubWordsInFirstWord: Boolean = true, favorWholeWords: Boolean = true, countOnlyFirstWordFound: Boolean = false, splitForNonWordChar: Boolean = true, alwaysSplitIfWholeWordExists: Boolean = false, countSubWordsIfSplit: Boolean = false, nonWordSplitCount: Int = 4): List<String>
Selects lorebook context relevant to conversation history.
Behavior: Extracts text from conversation history, finds matching lorebook entries using tokenizer parameters, returns list of selected lorebook keys.
truncateConverseHistory(maxTokens: Int, multiplyWindowSizeBy: Int, truncateSettings: ContextWindowSettings, countSubWordsInFirstWord: Boolean = true, favorWholeWords: Boolean = true, countOnlyFirstWordFound: Boolean = false, splitForNonWordChar: Boolean = true, alwaysSplitIfWholeWordExists: Boolean = false, countSubWordsIfSplit: Boolean = false, nonWordSplitCount: Int = 4, inputText: String = "", preserveTextMatches: Boolean = false)
Truncates conversation history to fit token budget.
Behavior: Extracts conversation text, truncates using Dictionary methods with tokenizer parameters, reconstructs conversation with truncated content.
- When
preserveTextMatches = true, history items containing words frominputTextare kept before the default truncation ordering runs.
truncateConverseHistoryWithObject(tokenBudget: Int, multiplyBy: Int, truncateMethod: ContextWindowSettings, truncationSettings: TruncationSettings)
Truncates conversation using settings object for token counting parameters.
Context Access Control
isContextLocked(): Boolean
Checks if this ContextWindow is currently locked by the ContextLock system.
Behavior: Returns true if the ContextWindow has been marked as locked via ContextLock metadata (metaData["isLocked"]).
Returns: Boolean indicating lock status
Example:
if (contextWindow.isContextLocked()) {
println("Context window has active locks")
}
canSelectLoreBookKey(key: String): Boolean
Checks if a specific lorebook key can be selected based on ContextLock state.
Behavior:
- Returns true immediately if context is not locked
- Checks for passthrough functions that can bypass locks
- Handles passthrough function exceptions gracefully
- Falls back to checking key lock state via ContextLock
Parameters:
key: The lorebook key to check for selection eligibility
Returns: Boolean indicating if key can be selected
Example:
if (contextWindow.canSelectLoreBookKey("sensitive_data")) {
// Key is available for selection
val value = contextWindow.loreBookKeys["sensitive_data"]?.value
} else {
// Key is locked or conditionally restricted
println("Access denied to sensitive_data")
}
getLockedKeys(): Set<String>
Gets list of locked lorebook keys that affect this ContextWindow.
Behavior:
- Returns empty set if context is not locked
- Queries ContextLock for keys that would be filtered from selection
- Only returns lorebook keys (excludes page keys)
Returns: Set of locked lorebook key names
Example:
val lockedKeys = contextWindow.getLockedKeys()
if (lockedKeys.isNotEmpty()) {
println("Locked keys: ${lockedKeys.joinToString(", ")}")
}
Utilities
isEmpty(): Boolean
Checks if context window contains any data.
Behavior: Returns true if all collections (contextElements, loreBookKeys, converseHistory) are empty.
clear()
Clears all context data.
Behavior: Empties all three main collections: contextElements, loreBookKeys, and converseHistory.
Next Steps
- ContextBank API - Continue into global context management.