NexusAI 1.1.2
What's new
Bugfix release: masking of keys already stored in dialogue-memory.yml, protection of an unreadable dialogue-memory.yml, /nai reload with dialogue.persist-memory and clearer busy lines in the console. Everyone on 1.1.1 should update; there are no new config keys and config.yml stays at config-version: 2.
Upgrading
- Replace
NexusAI-1.1.1.jarwithNexusAI-1.1.2.jarand restart. - No config changes: 1.1.2 adds no keys, so there is nothing to append or edit, and
config-versionstays2. - On the first start, a
dialogue-memory.ymlthat still holds an API key is masked and written back once, owner-only (0600) on a POSIX file system, and the log showsMasked API keys in dialogue-memory.yml. A file without a key is not rewritten. You no longer need to delete the file to remove a key written by 1.1.1 or earlier. - To roll back: stop the server, put
NexusAI-1.1.1.jarback and start it.config.ymlcan stay as it is; text masked indialogue-memory.ymlstays masked.
Keys in dialogue memory and logs
- Fix: on startup, summaries and transcript lines already stored in
dialogue-memory.ymlare masked and written back when they contain a configured API key or a key shaped like an OpenAI, Groq or Google key. The summary and the lines stay. This also happens whendialogue.persist-memoryis false. - A player line that contains one of these keys is masked when it is stored.
- A token shaped like an OpenAI (
sk-…), Groq (gsk_…) or Google (AIza…) key is masked even when it is not in the config: in NPC replies, placeholder answers,/nai test,actions.logand the server log. It must have that vendor's length, a digit and both letter cases, and not be a run of ordinary words, so a lowercase slug such assk-learn-pipeline-v2-2024-finalis left as written. A key that is all lowercase or all uppercase, such as a hex key, is masked only when it is configured.
Unreadable dialogue-memory.yml
- Fix: a
dialogue-memory.ymlthat cannot be read is not loaded and is no longer overwritten by the 30-second save, with summaries on or off, and also whendialogue.persist-memoryis false. - The broken text is copied to
dialogue-memory.yml.corrupt(ordialogue-memory.yml.corrupt.<time>when that name is taken) with keys masked and owner-only permissions. The copy is renamed into place only after it is fully written, so an interrupted copy does not leave a partial file. A file that is not valid UTF-8 is copied as its original bytes, with ASCII keys masked. No.bakof the broken file is written. - With
dialogue.persist-memory: true, new lines go into a newdialogue-memory.ymlonce the broken file has been moved aside. If the copy cannot be written, the original stays, is restricted to owner-only permissions and is not overwritten. The log names the copy, or says why it could not be written, and asks you to repair or replacedialogue-memory.ymland restart. - Temp files named
dialogue-memory.yml.<id>.tmp, left behind when a save was interrupted, are removed on startup.
Reload and persist-memory
- Fix:
/nai reloadkeeps the running dialogue. The first timedialogue.persist-memorychanges from false to true,dialogue-memory.ymlis loaded before any save, so the file is not replaced by the in-memory dialogue. No save writes the file until that load has finished. - For a character that is in the file, the lines on disk replace the lines held in memory. A character that is only in memory stays. Later reloads do not read the file again.
- A hand edit of
dialogue-memory.ymlwhile the server is running is overwritten by the next save, as in 1.1.1. Edit the file while the server is stopped.
Console busy lines
- When
/nai talkcannot use the fallback model because its daily request limit, or its remaining request or token budget, is exhausted, the console line names that reason for that provider. An HTTP status from another provider is still named for the provider that returned it. - When every queue row is at its daily cap, the console line says the queue is exhausted, at most once every 30 seconds. The player still sees
talk.busy, and the request body is unchanged. - The daily-cap warning now says at least 80% of the daily limit.
Known issues
- The player-input boundary and the reply filter reduce prompt-injection risk. They do not eliminate it.
- An HTTP 429 on one model pauses its whole provider. Put
fallback-modelon a different provider so/nai talkcan still answer. - If the server stops while the first load of
dialogue-memory.ymlafter/nai reloadturneddialogue.persist-memoryon is still running (more than about 5 seconds, for example with a very large file), lines that exist only in memory are not saved. The file on disk stays as it was. - If that first load fails and the broken file cannot be copied to
.corrupt, saves are skipped until the next restart. The only warning is the one logged at the reload; the file on disk stays as it was. - The other known issues listed for 1.1.0 are unchanged.
Compatibility
- Paper and Purpur 1.20.6–26.2; Folia is not supported; Java 21 or newer
- PlaceholderAPI 2.11.6+ (soft-depend)
- Tested with PlaceholderAPI 2.12.3 on Paper 1.20.6-151, 1.21.1-133, 1.21.4-232, 1.21.8-60 and 26.2-129, and on Purpur 26.2-2633 (Java 21 on 1.20.6–1.21.8, Java 25 on 26.2).
- Paper and Purpur 26.3, Spigot and CraftBukkit are not supported.
Download
NexusAI-1.1.2.jar, SHA-256 dc1bffa17eebea56da10872c0a489e455f9f252c04faafa491432516d6743463
Full history: CHANGELOG.md
All Relations
- All Relations
- Embedded Library
- Optional Dependency
- Required Dependency
- Tool
- Incompatible
- Include
This mod has no related projects

