Configuration

Everything you can configure

Six JSON files in the mod's server folder, one per concern, plus a handful of YAML content files. All of them use the same convention: the packaged default is written once on first start, then never touched again — your edits always survive an update.

LLM.json

Turns the AI layer on and points it at your model. Every reaction has a hand-written fallback line, so the plugin runs without this file being touched at all — fill it in when you're ready for live-generated dialogue.

SettingDescriptionDefault
EnableLLMToggle LLM features.true
UsePlayer2APIUse the Player2 API instead of a generic OpenAI-compatible endpoint (requires EnableLLM).false
UrlYour LLM API endpoint (e.g. a local LM Studio instance, or a hosted provider's chat-completions URL).
ModelThe model identifier your endpoint expects.
ApiKeyAPI key for your LLM service, if it requires one.
MaxTokensLimit the length of AI responses.100
TemperatureControls randomness of responses (0.0–1.0).0.9
StructuredResponseMaxTokensSeparate, smaller token budget for background structured calls (memory summaries, legendary-memory replacement) that only return compact JSON — keeps those calls fast without shrinking your conversational MaxTokens.80

Every field here has a placeholder value out of the box (pointing at nothing reachable) — set your own Url/Model/ApiKey before enabling. Options: a local client like LM Studio, a hosted provider (DeepSeek, Qwen, etc. — set Url, Model and ApiKey), or the Player2 API via UsePlayer2API.

Reaction.json

One on/off switch per reaction category, plus cooldowns for the ones that fire on a timer rather than an event.

SettingDescriptionDefault
EnableCombatReactionsReact to your recent fights.true
EnableBlockReactionsReact to your recent block placements/breaks.true
EnableItemReactionsReact to your recent item pickups.true
EnableDiscoverReactionsReact when you enter a new zone for the first time.true
EnableCraftingReactionsReact when you craft an item.true
EnableWorldReactionsPeriodic world-info messages (zone, biome, time, weather).true
WorldReactionPeriodInterval (seconds) for world reaction messages.60
EnableWeatherReactionsReact when the weather changes.true
WeatherReactionPeriodCheck interval (seconds) for weather changes.5
EnableMoodReactionsLet Bud moods shift over time and color dialogue.true
MoodReactionPeriodInterval (seconds) between mood re-rolls.180
EnablePlayerChatReactionsLet Buds respond to your chat messages.true
EnablePlayerStateReactionsReact to your status effects (poisoned, regenerating, etc.).true
PlayerStateReactionPeriodCheck interval (seconds) for status-effect changes.2
EnableWorkReactionsWorking-state reactions (started/finished working, interacted-with-while-working, output storage full, out of fuel).true
OutputFullReactionPeriodMinimum interval (seconds) between "output storage full" reminders for the same Workstation, so it doesn't repeat every tick while stuck.300

Orchestrator.json

Governs the queue that stops Buds from spamming chat — only change these for performance tuning.

SettingDescriptionDefault
OrchestratorGlobalCooldownMsGlobal cooldown between any two Bud reactions.3000
OrchestratorChannelCooldownMsCooldown per reaction channel (combat, ambient, activity, social...).5000
OrchestratorMaxQueueDepthMaximum queued reactions per channel before low-priority ones get dropped.3
OrchestratorTickIntervalMsHow often the orchestrator evaluates its queues.1000
OrchestratorEntryTtlMsHow long a queued reaction stays eligible before it's discarded as stale.60000

Debug.json

SettingDescriptionDefault
EnablePlayerInfoLog player information for debugging.false
EnableBudDebugInfoLog Bud information for debugging.false
EnableMoodChangeDebugInfoChat-message mood-change debugging.false
LogLevelServer log verbosity.INFO
AutoUpdateContentOnVersionMismatchLocal-dev convenience — automatically reset prompts/Bud content to the packaged version on a versions.yml mismatch at startup, instead of just logging a warning. Overwrites your customizations. Leave false on a live server.true

Conversation.json

SettingDescriptionDefault
EnableConversationMemoryEnable the memory system.true
ConversationMemoryDepthHow many memories a Bud keeps per player before evicting.8
ConversationMemoryDecayFactorHow quickly a memory's importance decays over time.0.9
ConversationMemoryMinImportanceMinimum importance a memory needs to be kept at all.4
ConversationMemoryMinMessageLengthSkip the memory-summary LLM call entirely for one-line responses shorter than this — saves a call for trivial exchanges.75
EnableLegendaryMemoryEnable permanently-retained "legendary" memories.true
LegendaryMemorySlotsPerBudNumber of legendary memory slots per Bud.3
EnableDialogModeEnable turn-based back-and-forth chat sessions.true
DialogModeIdleSecondsIdle timeout (seconds) before dialog mode ends.180
DialogModeActiveSecondsHow long an active dialog session stays open.30
DialogModeTurnIntervalSecondsMinimum gap between turns in an active dialog.8
BudReactionChainMaxRepliesMaximum back-and-forth replies in a Bud-to-Bud reaction chain before it goes quiet again.3

Work.json

Field sizes, work pacing, tree root tuning and mining growth timing — this one is documented in full on the Work Stations page, right next to the mechanics it controls.

Jump to the Work Configuration reference →

Bud Registry (buds/*.yml)

Buds are fully data-driven. Each companion is defined by a YAML file at buds/<id>.yml (id, displayName, color, npcTypeId, weaponId, armorId, pronoun, favoriteDay, promptKey, sounds, plus a workRole and restPosition for Workstation binding). Adding a new Bud only needs a new YAML file plus matching game assets — no plugin rebuild.

buds/roster.yml lists defaultBuds (at most 3) — the set /bud create spawns without an id, and what the Roster card summons. Buds outside the roster are still summonable individually.

Prompt management

LLM system prompts and each Bud's personality/fallback text live as external YAML under the mod's prompts/ folder — edit them to change what a Bud says without touching any code. They're copied from the packaged defaults on first server start.

⚠️ /bud prompt --reset overwrites your custom prompts with the packaged defaults. Back up any customizations first.

Content versioning (versions.yml)

versions.yml in the mod's data directory is the single place that tracks whether your server's prompt/Bud content is up to date with the packaged version:

budVersion: 2
promptVersion: 2
excludedPrompts:
  - "buds/gronkh.yml"
excludedBuds:
  - "gronkh.yml"

excludedPrompts/excludedBuds (paths relative to prompts//buds/) mark files to keep untouched during an automatic update — for content you've customized yourself, at your own risk. The plugin only ever updates the version numbers here when syncing content, never the exclusion lists, so your exclusions survive every automatic update. An explicit --reset command still ignores exclusions and overwrites everything.

⚠️ Using reasoning models

If you're pointing LLM.json at a reasoning model (e.g. DeepSeek-R1, Qwen-Reasoning):

  • Disable "thinking" — these models generate many <think> tokens that can cause delays or cut-off messages. Prefer a non-thinking model, or disable the thinking phase in your provider's settings.
  • Raise the token limit — if messages get cut off, increase MaxTokens to at least 200.
  • The plugin does try to filter <think> tags automatically, but a native no-thinking model gives the best experience.