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.
| Setting | Description | Default |
|---|---|---|
EnableLLM | Toggle LLM features. | true |
UsePlayer2API | Use the Player2 API instead of a generic OpenAI-compatible endpoint (requires EnableLLM). | false |
Url | Your LLM API endpoint (e.g. a local LM Studio instance, or a hosted provider's chat-completions URL). | — |
Model | The model identifier your endpoint expects. | — |
ApiKey | API key for your LLM service, if it requires one. | — |
MaxTokens | Limit the length of AI responses. | 100 |
Temperature | Controls randomness of responses (0.0–1.0). | 0.9 |
StructuredResponseMaxTokens | Separate, 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.
| Setting | Description | Default |
|---|---|---|
EnableCombatReactions | React to your recent fights. | true |
EnableBlockReactions | React to your recent block placements/breaks. | true |
EnableItemReactions | React to your recent item pickups. | true |
EnableDiscoverReactions | React when you enter a new zone for the first time. | true |
EnableCraftingReactions | React when you craft an item. | true |
EnableWorldReactions | Periodic world-info messages (zone, biome, time, weather). | true |
WorldReactionPeriod | Interval (seconds) for world reaction messages. | 60 |
EnableWeatherReactions | React when the weather changes. | true |
WeatherReactionPeriod | Check interval (seconds) for weather changes. | 5 |
EnableMoodReactions | Let Bud moods shift over time and color dialogue. | true |
MoodReactionPeriod | Interval (seconds) between mood re-rolls. | 180 |
EnablePlayerChatReactions | Let Buds respond to your chat messages. | true |
EnablePlayerStateReactions | React to your status effects (poisoned, regenerating, etc.). | true |
PlayerStateReactionPeriod | Check interval (seconds) for status-effect changes. | 2 |
EnableWorkReactions | Working-state reactions (started/finished working, interacted-with-while-working, output storage full, out of fuel). | true |
OutputFullReactionPeriod | Minimum 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.
| Setting | Description | Default |
|---|---|---|
OrchestratorGlobalCooldownMs | Global cooldown between any two Bud reactions. | 3000 |
OrchestratorChannelCooldownMs | Cooldown per reaction channel (combat, ambient, activity, social...). | 5000 |
OrchestratorMaxQueueDepth | Maximum queued reactions per channel before low-priority ones get dropped. | 3 |
OrchestratorTickIntervalMs | How often the orchestrator evaluates its queues. | 1000 |
OrchestratorEntryTtlMs | How long a queued reaction stays eligible before it's discarded as stale. | 60000 |
Debug.json
| Setting | Description | Default |
|---|---|---|
EnablePlayerInfo | Log player information for debugging. | false |
EnableBudDebugInfo | Log Bud information for debugging. | false |
EnableMoodChangeDebugInfo | Chat-message mood-change debugging. | false |
LogLevel | Server log verbosity. | INFO |
AutoUpdateContentOnVersionMismatch | Local-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
| Setting | Description | Default |
|---|---|---|
EnableConversationMemory | Enable the memory system. | true |
ConversationMemoryDepth | How many memories a Bud keeps per player before evicting. | 8 |
ConversationMemoryDecayFactor | How quickly a memory's importance decays over time. | 0.9 |
ConversationMemoryMinImportance | Minimum importance a memory needs to be kept at all. | 4 |
ConversationMemoryMinMessageLength | Skip the memory-summary LLM call entirely for one-line responses shorter than this — saves a call for trivial exchanges. | 75 |
EnableLegendaryMemory | Enable permanently-retained "legendary" memories. | true |
LegendaryMemorySlotsPerBud | Number of legendary memory slots per Bud. | 3 |
EnableDialogMode | Enable turn-based back-and-forth chat sessions. | true |
DialogModeIdleSeconds | Idle timeout (seconds) before dialog mode ends. | 180 |
DialogModeActiveSeconds | How long an active dialog session stays open. | 30 |
DialogModeTurnIntervalSeconds | Minimum gap between turns in an active dialog. | 8 |
BudReactionChainMaxReplies | Maximum 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
MaxTokensto at least 200. - The plugin does try to filter
<think>tags automatically, but a native no-thinking model gives the best experience.