LorekeeperConfig

data class LorekeeperConfig(var openaiEnabled: Boolean = false, var openaiProvider: String = "openai", var openaiApiKey: String = "", var openaiBaseUrl: String = "https://api.openai.com/v1", var openaiModelLow: String = "gpt-5-nano-2025-08-07", var openaiModelHigh: String = "gpt-5.2-2025-12-11", var openaiTimeoutSeconds: Int = 30, var openaiConnectTimeoutSeconds: Int = 15, var openaiNewsTimeoutSeconds: Int = 240, var openaiHistoryTimeoutSeconds: Int = 240, var openaiReputationTimeoutSeconds: Int = 180, var openaiStartupJokeTestEnabled: Boolean = false, var openaiFallbackEnabled: Boolean = false, var openaiFallbackProvider: String = "", var openaiFallbackBaseUrl: String = "", var openaiFallbackApiKey: String = "", var openaiFallbackModel: String = "", var jeevesEnabled: Boolean = true, var jeevesIntentionThreshold: Double = 0.5, var jeevesContextLength: Int = 20, var jeevesIntentionPromptFile: String = "evermod-jeeves-intention.md", var jeevesPromptFile: String = "evermod-jeeves-system.md", var notionEnabled: Boolean = false, var notionApiKey: String = "", var notionDatabaseId: String = "", var notionPollIntervalSeconds: Int = 300, var notionTitleProperty: String = "Name", var notionAuthorProperty: String = "Author", var notionTimestampProperty: String = "Timestamp", var notionApiBaseUrl: String = "https://api.notion.com/v1", var qualityMinChars: Int = 120, var lorekeeperChatEnabled: Boolean = true, var lorekeeperEncountersEnabled: Boolean = true, var lorekeeperNewsEnabled: Boolean = true, var bookMarketEnabled: Boolean = true, var memoryIndexEnabled: Boolean = true, var memoryIndexUseForTalk: Boolean = false, var memoryIndexOpenAiArchiveEnabled: Boolean = false, var memoryIndexOpenAiArchiveUseForTalkFallback: Boolean = false, var memoryIndexOpenAiArchiveSyncIntervalSeconds: Int = 900, var memoryIndexOpenAiArchiveMaxRecordsPerSnapshot: Int = 1600, var memoryIndexOpenAiArchiveRetainedFiles: Int = 4, var memoryIndexOpenAiArchivePurpose: String = "user_data", var marioEnabled: Boolean = true, var minigamesEnabled: Boolean = true, var presenceEnabled: Boolean = true, var mcpServerEnabled: Boolean = false, var mcpServerPort: Int = 8526, var mcpApiKey: String = "", var blueMapRefreshIntervalSeconds: Int = 3600)(source)

Configuration for the Lorekeeper mod.

Loaded from config/evermod.json on startup. If the file doesn't exist, a default configuration is created.

See also

for the service that uses this configuration

Constructors

Link copied to clipboard
constructor(openaiEnabled: Boolean = false, openaiProvider: String = "openai", openaiApiKey: String = "", openaiBaseUrl: String = "https://api.openai.com/v1", openaiModelLow: String = "gpt-5-nano-2025-08-07", openaiModelHigh: String = "gpt-5.2-2025-12-11", openaiTimeoutSeconds: Int = 30, openaiConnectTimeoutSeconds: Int = 15, openaiNewsTimeoutSeconds: Int = 240, openaiHistoryTimeoutSeconds: Int = 240, openaiReputationTimeoutSeconds: Int = 180, openaiStartupJokeTestEnabled: Boolean = false, openaiFallbackEnabled: Boolean = false, openaiFallbackProvider: String = "", openaiFallbackBaseUrl: String = "", openaiFallbackApiKey: String = "", openaiFallbackModel: String = "", jeevesEnabled: Boolean = true, jeevesIntentionThreshold: Double = 0.5, jeevesContextLength: Int = 20, jeevesIntentionPromptFile: String = "evermod-jeeves-intention.md", jeevesPromptFile: String = "evermod-jeeves-system.md", notionEnabled: Boolean = false, notionApiKey: String = "", notionDatabaseId: String = "", notionPollIntervalSeconds: Int = 300, notionTitleProperty: String = "Name", notionAuthorProperty: String = "Author", notionTimestampProperty: String = "Timestamp", notionApiBaseUrl: String = "https://api.notion.com/v1", qualityMinChars: Int = 120, lorekeeperChatEnabled: Boolean = true, lorekeeperEncountersEnabled: Boolean = true, lorekeeperNewsEnabled: Boolean = true, bookMarketEnabled: Boolean = true, memoryIndexEnabled: Boolean = true, memoryIndexUseForTalk: Boolean = false, memoryIndexOpenAiArchiveEnabled: Boolean = false, memoryIndexOpenAiArchiveUseForTalkFallback: Boolean = false, memoryIndexOpenAiArchiveSyncIntervalSeconds: Int = 900, memoryIndexOpenAiArchiveMaxRecordsPerSnapshot: Int = 1600, memoryIndexOpenAiArchiveRetainedFiles: Int = 4, memoryIndexOpenAiArchivePurpose: String = "user_data", marioEnabled: Boolean = true, minigamesEnabled: Boolean = true, presenceEnabled: Boolean = true, mcpServerEnabled: Boolean = false, mcpServerPort: Int = 8526, mcpApiKey: String = "", blueMapRefreshIntervalSeconds: Int = 3600)

Types

Link copied to clipboard
object Companion

Companion object containing file I/O utilities.

Properties

Link copied to clipboard

How often (in seconds) to re-read BlueMap markers. Default: 3600 (1 hour).

Link copied to clipboard

Whether the book market (polish/resale/royalties) is active

Link copied to clipboard

Number of recent messages to include in Jeeves chat context

Link copied to clipboard

Whether Jeeves chat participation is enabled

Link copied to clipboard

Markdown filename/path for the Jeeves intention checker prompt

Link copied to clipboard

Probability threshold (0-1) for Jeeves intention checks

Link copied to clipboard

Markdown filename/path for the Jeeves response system prompt

Link copied to clipboard

Whether the Lorekeeper chat listener (interviews/talks) is active

Link copied to clipboard

Whether Lorekeeper encounter event triggers are active

Link copied to clipboard

Whether the automatic weekly news scheduler is active

Link copied to clipboard

Whether Mario mode features are active on the server

Link copied to clipboard

API key required to authenticate MCP requests

Link copied to clipboard

Whether the server-side MCP HTTP endpoint is active

Link copied to clipboard

TCP port for the server-side MCP HTTP endpoint

Link copied to clipboard

Whether canonical Lorekeeper memory indexing is enabled

Link copied to clipboard

Whether memory index snapshots should sync to OpenAI Files storage

Maximum canonical memory records to include per uploaded archive snapshot

Link copied to clipboard

OpenAI Files purpose used for uploaded archive snapshots

Link copied to clipboard

Number of latest OpenAI archive snapshots to keep before pruning older files

Interval between periodic OpenAI Files archive sync attempts

Whether talk retrieval may use OpenAI archived memory as a cache fallback when local packets are empty

Link copied to clipboard

Whether talk retrieval should prefer memory-index packets

Link copied to clipboard

Whether the minigame framework (Plasmid game types) is active

Link copied to clipboard

Base URL for Notion API requests

Link copied to clipboard

Notion integration token

Link copied to clipboard

Notion property name for the lore author

Link copied to clipboard

Notion database ID to sync with

Link copied to clipboard

Whether Notion sync is enabled

Link copied to clipboard

Polling interval for Notion sync

Link copied to clipboard

Notion property name for the lore timestamp

Link copied to clipboard

Notion property name for the lore text (title property)

Link copied to clipboard

The API key for AI services

Link copied to clipboard

The API base URL (defaults to OpenAI's endpoint)

Link copied to clipboard

HTTP connect timeout in seconds

Link copied to clipboard

Whether AI features are enabled

Link copied to clipboard

Fallback API key

Link copied to clipboard

Fallback API base URL

Link copied to clipboard

Whether to use a fallback AI provider on failure

Link copied to clipboard

Fallback AI model to use

Link copied to clipboard

Fallback AI provider identifier

Link copied to clipboard

Per-request timeout for long history generation

Link copied to clipboard

High-quality AI model for complex tasks

Link copied to clipboard

Low-cost AI model for fast tasks

Link copied to clipboard

Per-request timeout for weekly gazette generation

Link copied to clipboard

The AI provider identifier (e.g., "openai")

Link copied to clipboard

Per-request timeout for reputation profile generation

Link copied to clipboard

Whether to run async startup AI knock-knock test

Link copied to clipboard

HTTP request timeout in seconds

Link copied to clipboard

Whether WATUT-style presence networking/visuals are active

Link copied to clipboard

Minimum characters for book submissions to score

Functions

Link copied to clipboard

Returns true if the API key is set.

Link copied to clipboard
fun save(): Boolean

Writes the configuration to disk.