Skip to content

SkyrimNet Beta27

Choose a tag to compare

@MinLL MinLL released this 14 Oct 15:20
· 43 commits to main since this release
c53cb30

Memory embedding model, including multilingual ones @Dekana.

Memory → Embedding Model picks the model that matches memories to the conversation. New installs default to Bekko Embedding v1, which recalls better than the old all-MiniLM-L6-v2 in English and other languages, with recall no slower. Two multilingual models let NPCs recall memories written in Russian, Japanese and other languages by meaning, not only by shared words.

  • Bekko Embedding v1 (the new default): the best recall; 234 MB download.
  • Granite Embedding 107M Multilingual: about all-MiniLM-L6-v2's speed; 442 MB download.
  • Right memory in the top five on real saves (all-MiniLM-L6-v2, Granite, Bekko): English 65%, 71%, 76%; Russian 46%, 88%, 93%.
  • Existing installs are not switched. Settings › Updated Defaults offers Bekko; Keep Old stays on the model you have.
  • Save Changes switches the running game: the model downloads, then memories re-embed in the background, with progress on the Memories page. Saved at the main menu, it loads with the next save.
  • If the model cannot be downloaded or loaded, the setting goes back to the previous model and the settings page says why.
  • Custom models: an ONNX model and its tokenizer.json in models/embedding/custom/<name>/. The README.txt there explains the rest.

Speaker Selector Strictness @MinLL

Tweaks to target selector behavior with Jev to improve response decision coherency and consistency, and make the interject summary more applicable. Settings → Conversations → Speaker Selector has a new Strictness select that sets how readily NPCs speak up unprompted when the decision model picks who answers.

  • Chatty: the Beta26 behaviour. Companions react to whatever happens around you, and a loose fit with an NPC's "interjects when" bio text is enough.
  • Balanced (the default): companions need a fit with their bio text or something that happens to you (a fight, a close call, a find, a choice you just made); other NPCs speak on a topical fit with their bio. Something dramatic or unexpected still gets a reaction from someone.
  • Strict: anyone not addressed needs a specific match with their interjection text, and silence is the default.
  • In continuous mode a bystander joins only when named, spoken to, or their bio's interjection triggers match.

Experimental Better Facial Animations Integration @MinLL

With Better Facial Animations 4.1 installed, NPC replies and the player's own voiced lines get its Audio2Face faces: lips, jaw, brows and eyes driven by the actual audio, with the speaker's current mood as the expression. SkyrimNet's own lipsync still moves the mouth until BFA takes a sentence over and whenever BFA declines one.

  • Settings → Voice → Animation Tuning → Use Better Facial Animations (on by default); nothing changes when BFA is not installed.
  • BFA's own rules still apply: its Enabled and Player switches, race filters, scenes and Potato mode decide which lines it animates.
  • Needs BFA 4.1 or newer - Does not work with older builds.

Speech-to-text prompting @MinLL

When you speak, speech-to-text now receives a list of the names you are likely to say, so "Farengar" and "Dragonsreach" come back spelled right instead of as sound-alike words. It is on by default for Local Whisper and External Whisper.

  • The names: characters near you (followers first), your pinned characters, your own name, where you are (location, hold, interior), and nearby map markers and doors.
  • Turn it off with Name Hints on the Speech-to-Text page.
  • The stt_hints prompt in the Content Library decides the text that is sent; edit it to drop places or change the wording. We'll probably want to add some common Skyrim terms to this later - open to feedback on this, though we can't send a ton here. Context window is tight.
  • For prompt authors: the new get_place_names() decorator lists the places around the player by name ("current" or "nearby").

Import bard songs from audio files @Dekana.

Give bards songs without a music API: import an .mp3, .wav, .ogg or .flac file, and bards sing it like a composed song. Voice > Bard Singing > Songs > Import song.

  • Pick a voice (male or female), or mark it Instrumental so any bard plays it. Ask for an instrumental by its style tags ("something classical"), not only its title.
  • "This is my song" keeps it for your own /playsong; NPC bards won't pick it.
  • A .yaml song file with the same name as the audio fills in the form. Download saves the pair, so songs can be shared by hand. In a browser, select both files together.
  • "Compose New Songs With AI" (on by default): turn it off and bards only sing songs you have, and decline requests none match.
  • Imported songs are never evicted. They are stored per save.

Share one ElevenLabs account between several players @MinLL

Several people can now use one ElevenLabs account without deleting and re-cloning each other's voices.

  • Toggle: Voice → Text-to-Speech → ElevenLabs → Advanced → Shared Account (off by default). Everyone on the account should turn it on.
  • With it on, a voice type someone else already cloned is reused as is, so the first person to clone a voice type picks its sample for everyone.
  • Player and custom-NPC voices are still cloned separately for each player.

Whisper GPU setup without a specific CUDA toolkit @langfod

Local Whisper speech-to-text no longer needs exactly the CUDA 12.9 toolkit: any CUDA 12.x runtime from 12.9 up works. An older or missing runtime falls back to Vulkan or CPU. (Build size has gone up a little due to supporting more CUDA runtimes.)

  • The GPU Device list on the Speech-to-Text page names the real devices (for example "GPU 0 - CUDA0", "GPU 1 - Vulkan0") once speech-to-text has started.
  • The device setting is now a ggml device index: CUDA devices first, then Vulkan, then CPU. Single-GPU setups keep device 0; multi-GPU users should re-pick their card.
  • A saved device that is not listed yet stays selected and is labelled as such.
  • The OpenCL backend is gone; Intel and AMD GPUs use Vulkan.
  • Why CUDA was skipped is one line in SkyrimNet.log ("CUDA backend skipped").

Reasoning effort per model @MinLL

The "Allow Reasoning" toggle is now a level: off, model default, minimal, low, medium or high. Set it per model in the rotation editor's gear panel (or per variant / globally in OpenRouter.yaml as reasoning_effort). Thinking models such as Gemini 3.x Flash can be kept at minimal instead of their default medium, which is where most of their latency and output tokens went.

  • A model that cannot turn reasoning off (OpenRouter's "reasoning is mandatory" 400) no longer fails when the level is off: the request is retried once at minimal and the model is remembered for the session, so later requests pay no extra round trip.
  • Existing configs keep working: reasoning: true reads as model default and reasoning: false as off. A save writes the new key.
  • Presets (catalog and your own) can set reasoning_effort globally, per variant or per model, and a recommended model in the picker can carry one.

Dialogue @Dekana.

  • Fewer unrelated memories in recall — NPCs are handed fewer memories unrelated to the conversation, and the closest match comes first more often. Memory → Min Relevance Score defaults to 0.6 (was 0.5); existing configs are offered it under Updated Defaults. Similarity is now scaled differently, so a hand-tuned Similarity Threshold may need a fresh look.
  • Lore found by name, and less unrelated lore — NPCs find a world knowledge entry when asked about it by name, and get unrelated lore far less often. Knowledge re-embeds once in the background. New Knowledge Similarity Threshold (0.40); Knowledge Min Score 0.575, offered under Updated Defaults.

LLM & Routing @MinLL

  • Latency Improvements — Reduced the latency on all outbound HTTP requests to remote servers. In benchmarks, this ranged from a 60-210ms reduction in latency for every call (paid 3-4x over the course of a given dialogue request). Will be more significant than benchmarked results for non-North-American players who have longer round-trip times to remote providers.
  • Prompt caching — Improved engine support for prompt caching. Each provider's cache lifetime, 5 minutes or 1 hour, is under Advanced on AI › Providers. A new experimental plugin restructures the prompts to use this: https://discord.com/channels/1287232260617015336/1559073450365165629. Should reduce costs and increase speeds.
  • LLM replies finish, stop and fail over as they should — A reply whose first model stalls ends when its backup finishes, a long backup reply is no longer cut at 30 s, and a cancelled reply stops streaming, Bard Singing's music too. Profiles under non-English folder names load their settings.
  • Presets set an fp8 quantization floor — Applying a built-in preset, or a fresh install, sets the quantization floor to fp8, so OpenRouter skips providers declared below it. Change it with Quantization floor on the Providers page.
  • External Whisper defaults to OpenRouter — New installs point External Whisper speech input at OpenRouter (openai/whisper-1), so the OpenRouter key you already use for the LLM works for STT; existing STT configs keep their saved endpoint and model. External STT remains fairly slow though; I'd recommend using local if you have the specs for it.

For Mod Authors @MinLL

  • Papyrus can flip the SkyrimNet master switch — SkyrimNetApi.TriggerToggleGlobalAI() turns all of SkyrimNet on or off, exactly like pressing the master toggle hotkey. The DLL has offered it for a while, but the script never declared it, so the game refused to bind it and logged an error on every load.

Bug Fixes

  • NPCs recalled nothing when playing in Russian, Japanese or Chinese — NPCs now recall memories and world knowledge in Japanese and Chinese, and bards and /playsong find stored songs with non-English titles. @Dekana.
  • NPCs would sometimes recall no memories after walking into a new area — The last conversation's memory search is kept through area changes until it expires, and a failed one no longer leaves a placeholder for five minutes. @Dekana.
  • NPCs recalled no memories when no memory search was ready — When the LLM memory search has not run yet or fails, recall searches with the recent conversation's text instead of only the location. @Dekana.
  • Diary and thought prompts reused stale results from the last dialogue turn — Diaries, thoughts, book reactions and parsed strings no longer read a finished turn's cached decorator values, and simultaneous turns no longer have a risk of leaking them. @MinLL
  • Line of Sight Improvements — Fixed several issue that were causing line-of-sight to be ignored in various situations, letting NPC's hear you through walls. Fixed. @MinLL
  • Stutter fix when an NPC fired a vanilla dialogue line — Fixed a condition that could cause a micro-freeze when an NPC chose a quest line action. @MinLL
  • NPCs call you the Dragonborn before you are one — About 50 character bios no longer refer to the player as the Dragonborn when it was only a stand-in for "the player", such as Leyathil's rescuer, Melana's companion, the Skaal freed from Miraak, or Cicero's Listener. Greybeards, dragons, Miraak and other characters whose story centers on the Dragonborn still speak of the Dragonborn. @Dekana.
  • Stray gendered pronoun in player thoughts prompt — Changed one instance of "her" in the player thoughts prompt to "their." @Dekana.
  • ElevenLabs Silent Voice — Fixed a regression in Beta26 that could cause ElevenLabs to go silent after re-cloning. @MinLL
  • External Whisper needed an API key for a local server — External Whisper pointed at your own server (e.g. whisper.cpp) works with the API key left blank; OpenAI and OpenRouter still need one. @Dekana.
  • A local decision model needed a placeholder API key — A decision provider you add yourself, or the built-in OpenRouter (Decisions) pointed at your own server, no longer needs a placeholder API key. @Dekana.
  • Requests to nano-gpt failed after a minute or two idle — The request is redone on a new connection instead of failing with "Error in the HTTP2 framing layer"; nano-gpt connections are kept alive. @MinLL
  • API Style could not be set on a new provider — Pick a new provider's API Style before saving, even right after renaming it. The dropdown is now readable on dark themes. @Dekana.
  • Update Bio showed "The string did not match the expected pattern." — When Update Bio cannot run, the toast now says why, such as an NPC you have not met yet in this save. @Dekana.
  • Deciding one updated default dropped the rest — Accepting or keeping one change under Settings › Updated Defaults leaves the others listed, this launch and the next. @Dekana.
  • The MCM fills Papyrus.0.log with CurrentPage_var errors — Loading a save no longer writes dozens of "Failed to find variable ::CurrentPage_var" errors from skynet_McmScript to the Papyrus log. @MinLL
  • Developer kit C++ headers — SKSE plugins that included PublicAPI.h from the Beta26 developer kit failed to compile because PublicAPIDiaryQuery.h was missing from the kit. The kit now includes it under CppAPI/. @MinLL
  • New game after a cancelled load no longer breaks the database — Declining a save's "continue loading?" prompt and then starting a new game showed "Database is not initialized"; the new game now starts normally. @Dekana.