u/Kritblade

Image 1 — MVU Game Maker preview - Auto Image gen/Multi LLM call/Deterministic D20
Image 2 — MVU Game Maker preview - Auto Image gen/Multi LLM call/Deterministic D20
Image 3 — MVU Game Maker preview - Auto Image gen/Multi LLM call/Deterministic D20
Image 4 — MVU Game Maker preview - Auto Image gen/Multi LLM call/Deterministic D20
Image 5 — MVU Game Maker preview - Auto Image gen/Multi LLM call/Deterministic D20
Image 6 — MVU Game Maker preview - Auto Image gen/Multi LLM call/Deterministic D20

MVU Game Maker preview - Auto Image gen/Multi LLM call/Deterministic D20

The following post was not written by AI, so it will have grammatical and spelling errors, and the post will be long, you have been warned.

# 💡 Current Status

It's been a while since I give an update on the MVU Game Maker. At the beginning, I was making the MVU Game Maker v1.5, which feature the Japanese School genre. The game should mimic the well known NSFW game from Illgames - Koikatsu. Of course I can't make it fully interactive like the real game, but it should have the same feeling in a visual novel style. It turns out, the game is way bigger than I anticipated. The game alone with all the logic in place cost 85k token/reply excluding events and image generation. I guess it will pass 100k token per reply, which is way too expensive.

That was almost 3 months ago, and I was back to drawing board after the MVU Game Maker v1.5 School Genre was ALREADY implemented. I need a way to selectively send what is needed to AI model, not the complete engine. Long story short, I implemented School Genre v1, v2, v3 and then finally v4...actually got that right.

The screenshot you saw in the post, it's the in game GUI which feature a galgame style interface. The image is auto generated based on story, and backend is comfyui with Anima or Krea 2 image model. I believe you will need at the minimum of 8GB ram of video card to get the image generation to work. That also means for all local model users with low end video card, you will have to choose if you want image generation , or running a model to write your story. The game works in plain sillytavern mode without image generation.

I ran through so many different iteration of School genre implementation because I found a fatal issue during development that plague the whole user base of English speaking Sillytavern users. For whatever reason, we have many Sillytavern like engine, and we have many more presets, but there are no content creator to create character cards. It's almost zero if you look at this reddit channel. Unlike other language Sillytavern community, they made thoudsands of character cards. And they are NOT just a few lorebook entries with a few alt greetings. All of those have game mechanics in the game.

# 💡 What is Game Mechanics?

AI model is trained to execute instruction. You throw a lorebook with some characters and background to AI model would not buy you any game mechanics, because there is no instruction to tell the AI model what , when and how to do. For example, You have a lorebook entry that is a warrior called Hero with 50 Str, 30 CON, 15 INT. The AI Model do NOT know how to translate these stats into damage. When you add weapon and armor on top of these stats, AI just randomly make up numbers when you hit a mob. So, reply 5 and reply 40 can have completely different damage with the same stats. Slice of life/dating game will also have the same problem. Bonding 30, Affection 40, Jealousy 35 have no meaning to AI model. It will randomly generate the behavior of the girl and her behavior and personality could be completely different from turn to turn. Does affection 45 allow you to kiss? AI doesn't know. Final fantasy have game mechanics, Dragon Quest have game mechanics. You know exactly how much you will damage with the weapon you are using to the same level mob EVERY single time. You know fire based magic works way better on human mob in Final fantasy. This is game mechanics.

That also point to another issue with tracking extension. There are many tracking extension out there, including preset also is doing that now. It will embed the state of every single character in the main text every single turn. It takes a lot of token when your party is big, and you can't really track too many stuff without messing up your chat. Moreover, tracking extension without game mechanics are next to useless for AI model. How much damage should I hit with 45 str? How does 58 Trust, 43 Comfort, and 60 Affection translate to her behavior? AI model just make it up, and it could be different every single time and they are wildly different.

Local model will have significant challenge as well because most users use local model that is good at prose, they usually suck at reasoning. I saw numerous report people have difficulty just tracking simple stuff in a preset with a local model. I guess we are getting to a point that you NEED API model to do anything other than prosing. A 27B model can stuff only so much information it can carry, there is a limit on what a local model can do on a regular video card. The worst reply on a GLM 5.2 is the best reply you can get on a Gemma 4.

And this is only a problem for English speaking Sillytavern community. As you can see this, this , this , this and this, which is created by Korean/Chinese Sillytavern community. Every single one of them have a proper GUI, stats tracking capability with game mechanics built into the game card, and they all play differently. Even as simple as character creation, it is way better than anything you can see in any English based card. You are REQUIRED to find out the game mechanics so that you can survive in the game card, just like how you do on a console game. That's why 99%+ of Chinese Sillytavern users use Gemini/Claude/GLM as their main AI model, because all these requirements need a model smart enough to follow instruction, not writing prose. Local model will just fail to run.

Another problem is that you can't make game content with a plain lorebook. Zero, none.

# 💡 What is Game Contents?

If you want to make a Konosuba game and want to play as the main cast to experience the same event and fight those boss in the same order, you can't do that with a plain lorebook. There is no way to track the state nor a way to trigger event. So, smaller AI model will become dry after 100 turns with 800 words reply or so because you will see it write the same thing over and over again. Even with big model, there is still NO content, AI just write in a way that the pattern "most likely" what will happen, which you have already seen that in another character card. It will not trigger event the way you want, let alone you want to fight the same boss in Konosuba. You can't rely on AI model to create game content, because AI model required you to give instruction. What, when, and how to create content. Otherwise, it will just do "Given everything before this point, what text is most likely/appropriate to come next?". This is how AI model works.

That's why so many people care about prose, only because there is nothing else you can tweak on. Characters card from other community have image, music, game contents, Character design, trigger events, very different game mechanics so that you do NOT need to focus on the prose only. You can focus on the content, like you will focus what content a game will offer in a console game. Game mechanics would not restrict how AI prose, it just provides a structure for AI to prose so that it will be consistent across the whole story.

If you manage to read this far, this is the message I want to deliver. We need game character card creator, to build events and game mechanics so that people could explore what the content creator offer. I am trying to build something to fill the gap.

# 🤖 MVU Game Engine v2.0

- **Logic engine** > non-emotional related calculation, anything that can be handle by calculation locally would be coded in javascript which save a LOT of token by not sending the instruction to AI model.

- **Multi LLM call** > you can have multiple LLM call before (PRE) the main call and multiple LLM call after (POST) the main call. You can create different lorebook entry + logic in pure javascript before or after main call to guide how main call to shape. That means, for example, you can create a "town NPC simulation" in a PRE call and main call will know NPC out of your main story is doing something.

- **Extension** > The Logic engine is installed in an extension that is still in development at about 90% done, which it can add game mechanics to a game character card. User can build RPG logic engine, love dating logic engine..etc. Activate it on a character card and it will make a card with game mechanics + stats tracking done in backend. Only required stats will be sent to AI model to process, not the complete roster of every single NPC you track. For regular user, you will just download whatever Logic Engine that match the genre of the character card you are playing and activate it.

- **Plugin engine** > which allow content creator to create addon functionality to the main Logic engine that is missing. (eg. a weather plugin for RPG logic engine)

- **Event engine** > which allow content creator to create events using a GUI in mvu status menu builder. No coding required. Based on condition to trigger event to hint main llm call to prose an event happen. (eg. When mainchar.level > 30 and quest.step2 = completed) > "A dragon roaming in a dungeon far east". Based on this design, you can pretty much code a complete story of Naruto. Basically you create a checkpoint with condition. When you hit a checkpoint and complete it, it will give you the next checkpoint. Between checkpoint A to B, you can still do whatever you want as you can now, but you have a objective to push the story forward. And this is open for anyone to make new events for a story using a provided GUI in status menu builder. Event engine is about SHARING.

- **Status Menu engine** > Content creator can create different status menu (GUI) for different logic engine. User can switch to different status menu in the extension.

- **DNA Harvest** > Auto harvest on character's DNA in a story so that auto image generation will draw the same guy with the same outlook everytime.

As you can see, all these can be as simple as creating events for a game card by non-coder, to a dev with Claude to create a complete game with their own coded logic engine. Since it's all modular design, engine can be plugged into a regular character card. **It's about SHARING and something in common that people can talk about the game, talk about tricks to beat the game mechanics, not a complete random generated story.**

The reason I didn't create yet another SillyTavern-like system because.... Sillytavern can just do the same thing. What is missing is the game mechanics and game contents and events, which no system can fill the gap. It's a human content creation thing. We need game character creator to make game card, this is the missing part. During design phase, I also looked into the possibility of using preset. And eventually using extension as the media and not a preset because I found that preset have a big limitation on what you can do with scripting. Even as simple as a true crypto D20 dice roll, it can't do it. No array, no collection and no looping can be a real challenge to pull off the Japanese school genre with event driven trigger and a lot of calculation behind the scene. And preset will take a lot of token to keep track of state because there is just no easy and stable way to do delta changes on stat manipulation, you have to submit the complete snapshot of state for every single character you track every single turn ,which is expensive. On top of that, multi language support is mandatory like all other extension i released.

I end up draw the line like this for the design of MVU Game Engine v2.0. Console = Sillytavern , Controller = preset, Console Game = character card, memory card = memory extension. I will just use preset to do prosing and turn off anything regarding logic inside the preset, and keep all the logic inside the game card, just like game play and logic is inside a console game cartridge. Sillytavern is the main console machine to compute the coding behind the scene. This is the final design of MVU Game Engine v2.0, and the first consumer is the Japanese School Genre...Logic Engine backport of previous RPG and Dating genre follows after. The token usage is around 35k token per reply with events and auto image generation. I would believe RPG genre Logic engine would be even less than this because all the logic are formula based and everything can be moved to javascript. Events doesn't take much token anyway, because logic engine only feed event to AI model when requirement is met. It won't feed 100+ events to the AI model every single turn.

No, I don't have the time line yet when I am going to release. The design become extremely complex when I have to take into account that the extension shouldn't need to upgrade to adapt to another genre Logic Engine. The reason I am posting this is to give an update...and call to arms. We need game content creator. The new extension **"MVU-Helper"** just provide a framework, make it accessible to community user to SHARE contents and talk about the game contents...not some random generated garbage. AI will be used to prose what the content creator want to do, not the *only* member to design how the content should flow.

u/Kritblade — 4 days ago

VectFox v3.5 - the vector engine now comes with Summarizer!

For a better format version > Head to VectFox repo to see the detail

💡 What's new in version 3.5?

  • Now comes with Summarizer - The last 30 events will be injected into the prompt so you will have the exact same benefit of using other summarizer.
  • Language Neutral - I removed all English dependent code so that it now works with story virtually in any languages. I have tested English, Spanish, German, Japanese, Korean, Chinese, Indian, Thai...etc. It will correctly doing the keyword matching and embedding.
  • Vectorize and Summarize 2000+ replies in 22 minutes- I beleive this is the fastest on the market.
  • Vectorization recovery - Even if your kid yank the network cable in the middle of vectorization, it will pick up where it left off. Vectorize 5000+ replies and got disconnected in the middle? No problem.

My SillyTavern stories run 2,000+ replies at 1,000+ words each with MVU Game Maker. Every memory extension I tried buckled under that load. So I built one that doesn't and return results under 3 seconds.

🧠 Why VectFox instead of traditional memory extensions

Most existing memory extensions use one of two approaches. Both lose detail as the chat grows. Here's why — and how EventBase avoids it:

Aspect 📝 Rolling Summary (most "memory" extensions) ✂️ Raw Chunking (older vector RAG) 🧬 EventBase (VectFox)
What gets stored One ever-growing summary text Every message cut into raw chunks Structured event records with metadata
At msg 100 Mostly intact Intact Intact
At msg 200 Heavily compressed — names, numbers, and one-off details drift or vanish Token budget overflow — older chunks score-pruned or dropped Intact — old events still in DB, surfaced by relevance
At msg 1,000+ Effectively a blur DB bloat; retrieval gets noisy because raw chunks are low signal Intact — only the few events relevant to the current scene are pulled
Retrieval signal None — whole summary always injected Vector similarity over raw text (catches paraphrases but also noise) Vector + BM25 hybrid over rich fields (characters, items, locations, concepts, keywords)
Where detail goes Lost forever once compressed Lost when chunk drops below score threshold Doesn't go anywhere — events live in the vector DB and surface when relevant
What gets injected The whole running summary (every turn, every time) A few semantically-close raw messages The events that matter for the current message — plus the last N events pinned every turn via Summarizer Injection
Guaranteed recent memory (what just happened) ✅ Always there — but it's the whole lossy, recursively re-compressed blob ❌ Not guaranteed — recent turns show up only if they happen to score Summarizer Injection pins the last N events into every prompt, in order — always present, fully structured, no detail loss

🧠 I actually benchmark it with 1500+ events

>💡 I not only test if it technically works, I tested if the result that is recall actually meaningful.
>
>The way you phrase your message has a big impact on what gets retrieved. Because retrieval is driven by the text of your reply, the words you use matter. For example, "Mayla, Do you remember why I paid the ransom?" and "Mayla, Do you remember why I paid 2,000 bucks?" will return very different events — "ransom" pulls in every event tied to that storyline (the kidnapping, the negotiation, the drop-off), while "2,000 bucks" mostly matches events that literally mention the number 2,000. If you want the AI to recall a specific scene, anchor your message with the story-meaningful words from that scene rather than incidental details like exact numbers.
>
>In side-by-side testing on a 1,500-event chat, A3 (Qdrant) ranked the ransom events at #1 / #2 for the well-anchored query and still surfaced them at the top for the numeric-detail query. A1 / A2 (standard backend) did find the same ransom events but ranked them lower . The difference is structural — A3 searches the full corpus via a sparse keyword index. Most importantly, A3 returns **NOT ONLY **why the ransom happened, it also return who was involved in the back story and how the story become what it is now. A3 path is actually able to pin point all the important back story and events out of 1500+ events.

📌 Summarizer Injection — guaranteed memory of the last few turns (optional)

Semantic retrieval answers "which old event is relevant to this message?" But every reply also needs a second question answered: "what just happened over the last few turns?" — the running thread, who's in the room, the deal struck two replies ago. That continuity shouldn't have to win a relevance contest to be remembered. It should always be there.

Summarizer Injection pins the most recent N extracted events (default 20) into every prompt, in chronological order, each tagged with how far back it is:

<VectFoxSummarizer>
(3 turns ago) Critblade agreed to escort Mayla to the harbor before dawn. 
(2 turns ago) They were ambushed in the alley; Mayla took a knife wound to the arm. 
(latest turn) Critblade carried her into the apothecary and demanded a healer. </VectFoxSummarizer>

It's independent of semantic retrieval and stacks on top of it — its own prompt slot, so the two never clobber each other. Retrieval still pulls the relevant old events by meaning; the summarizer guarantees the recent ones are always present regardless of score.

🧬 VectFox's answer: EventBase

Instead of summarizing per reply, VectFox sends a sliding window of messages to an LLM and asks: what actually happened here? The LLM extracts 0, 1, or several structured events depending on what occurred — not one blob per reply regardless. It is highly structural format that is native to vector engine.

Each event is a real structured record stored natively in Qdrant:

event_type:   item_acquired
importance:   6 
text:         Tav and Astarion shopped for armor in Baldur's Gate. Tav bought a leather chestpiece for 80gp. 
characters:   [Tav, Astarion] 
locations:    [Baldur's Gate, Sorcerous Sundries district] 
items:        [leather chestpiece, 80gp] 
concepts:     [armor shopping, party economy] 
keywords:     [armor, leather, chestpiece, gold, shopping] 
open_threads: [Gauntlet of Shar preparation]

2,000 replies → ~1,000–3,000 structured events. Old events never get compressed away. They stay in the database and surface again when your query is relevant. Irrelevance is filtered, not detail.

🤖 Agent Mode — let an LLM plan your search (A3 only, optional)

Plain vector search has one weakness: it only finds what you literally typed. Ask "why did I pay the ransom?" and the search matches "ransom." But the full answer might involve the kidnapping, the negotiation, and your character's relationship arc — and your question doesn't mention any of that.

**Agent Mode** adds a small planner LLM that reads your recent chat plus the top pre-search candidates, then asks: *what other angles should I search to actually answer this?* It emits 1–4 follow-up queries that fan out in parallel against Qdrant.

🚫 What it doesn't do

VectFox is a memory system, not a state tracker. It doesn't track quest progress, character stats, or live world state. For that, pair it with MVU Game Maker. It is built for stat tracking and it's permenent always available right inside your hard drive. Running both covers roughly 90% of the memory and state problems in long-form SillyTavern roleplay.

💾 Installation

Head to VectFox to see the detail
Qdrant (optional, only for A3 path) installation can be found here

🔗 Links

Let's make memory hardcore. 🦊

u/Kritblade — 2 months ago

[WebUI] I made a Helper app for Windows and MacOS to register .torrent and magnet for headless

**QBWebUIHelper - Easy WebView Wrapper for Headless qBittorrent (Docker)**

For those running a headless qBittorrent via Docker, you can now use **QBWebUIHelper**.

It’s a very simple app that acts as a webview wrapper for the qBittorrent Web UI.

### The Problem

The Web UI has one annoying limitation on Windows/MacOS — it doesn’t register magnet links or `.torrent` files properly. Double-clicking a torrent file won’t open it in the Web UI.

### The Solution

**QBWebUIHelper** is a native Windows/macOS app that displays the qBittorrent Web UI. Because it’s a proper desktop application, you can set it as the default app for torrents and magnets in Windows **Default Apps** (and the same on macOS).

I originally made this tool for my own use after qBittorrent v5.2 finally added magnet content viewing support. No installation needed, it's a portable app.

✅ **Open source**

✅ **Completely free**

**Link:** (https://github.com/KritBlade/QBWebUIHelper)

u/Kritblade — 3 months ago

VectFox - vector database backend driven memory extension for SillyTavern

For a better format version > Head to VectFox repo to see the detail

BTW, I updated MVU Game Maker v1.0 and ArtificRealm v1.0 to work with VectFox.

My SillyTavern stories run 2,000+ replies at 1,000+ words each with MVU Game Maker. Every memory extension I tried buckled under that load. So I built one that doesn't and return results under 3 seconds. It supports both Sillytavern default vector engine or a dedicated vector database Qdrant as backend. The fastest and most accurate option would use Qdrant vector database on a docker as the backend. Qdrant is free and open source.

Built on the excellent VectHare foundation, VectFox is a high-performance long-term memory system for SillyTavern. It goes well beyond a language-extended fork — all intelligent retrieval logic runs server-side inside a real vector database (Qdrant), a structured event-based approach replaces raw chunk summarization for dramatically more accurate recall, and queries return in under 3 seconds even at 2,000+ messages. Natively multilingual: English, Japanese, Korean, Traditional Chinese, and Simplified Chinese.

The core problem nobody talks about

Most memory extensions use one of three approaches, and all of them fall apart at scale:

Rolling Summary — one ever-growing text blob. Works at 100 messages. By message 500 it's compressed mush. Names, numbers, and one-off details drift or vanish. You can't un-compress information that was thrown away.

Raw Chunking — cut messages into chunks, vectorize them. Also works fine at 100 messages. At 1,000+, retrieval gets noisy because raw chat text is low-signal — every chunk "kind of" matches everything.

Lorebook-backed storage — some extensions write memories back into the lorebook. This runs into a hard wall: SillyTavern's lorebook is injected into the context window on every turn. At 2,000+ replies you accumulate hundreds of entries, and depends on simple keyword matching for tiggering. Even summarizing story of every 2000 replies would still hit the limit of what a lorebook can do. Agressively compact 2000+ replies that would fit in lorebook would result in lose of details which defeats the purpose of having memory at all.

The real problem: all three approaches treat every reply the same. A 100-sentence reply might contain 5 meaningful events buried in 95 sentences of banter and scene-setting. Summary-per-reply averages all of that into one blob. A shopping trip where Tav buys armor gets mixed with the idle chatter that surrounded it and loses its shape entirely.

I need something that solve my own problem, it will strip away all noise, functional tags used by MVU Game Maker, and precisely return results within 3 seconds across 2000+ messages. I NEED something that I don't need to maintain even at 2000+ replies, set it and forget it. My NAS has a better spec that runs the Qdrant docker which return results in under 1 second.

🧠 Difference between traditional memory extensions

Most existing memory extensions use one of two approaches. Both lose detail as the chat grows. Here's why — and how EventBase avoids it:

Aspect 📝 Rolling Summary (most "memory" extensions) ✂️ Raw Chunking (older vector RAG) 🧬 EventBase (VectFox)
What gets stored One ever-growing summary text Every message cut into raw chunks Structured event records with metadata
At msg 100 Mostly intact Intact Intact
At msg 200 Heavily compressed — names, numbers, and one-off details drift or vanish Token budget overflow — older chunks score-pruned or dropped Intact — old events still in DB, surfaced by relevance
At msg 1,000+ Effectively a blur DB bloat; retrieval gets noisy because raw chunks are low signal Intact — only the few events relevant to the current scene are pulled
What "compression" does Re-summarizes recursively — every pass loses information None, but no synthesis either; raw text is hit-or-miss One-time, semantic — extracts the meaningful event and drops filler
Retrieval signal None — whole summary always injected Vector similarity over raw text (catches paraphrases but also noise) Vector + BM25 hybrid over rich fields (characters, items, locations, concepts, keywords)
Where detail goes Lost forever once compressed Lost when chunk drops below score threshold Doesn't go anywhere — events live in the vector DB and surface when relevant
What gets injected The whole running summary (every turn, every time) A few semantically-close raw messages Only the events that matter for the current message

The core insight: rolling summaries lose detail because they throw away old content to make room. Raw chunking loses detail because retrieval breaks at scale. EventBase keeps every meaningful event around forever — and lets vector + keyword search decide which 5–10 of them are worth showing the AI right now. Detail isn't compressed; irrelevance is filtered.

🧠 I actually benchmark it with 1500+ events

>💡 The way you phrase your message has a big impact on what gets retrieved. Because retrieval is driven by the text of your reply, the words you use matter. For example, "Mayla, Do you remember why I paid the ransom?" and "Mayla, Do you remember why I paid 2,000 bucks?" will return very different events — "ransom" pulls in every event tied to that storyline (the kidnapping, the negotiation, the drop-off), while "2,000 bucks" mostly matches events that literally mention the number 2,000. If you want the AI to recall a specific scene, anchor your message with the story-meaningful words from that scene rather than incidental details like exact numbers.
>
>In side-by-side testing on a 1,500-event chat, A3 (Qdrant) ranked the ransom events at #1 / #2 for the well-anchored query and still surfaced them at the top for the numeric-detail query. A1 / A2 (standard backend) did find the same ransom events but ranked them lower (around #3 / #5 for the well-anchored query, often outside the top events that actually get injected into the prompt). The difference is structural — A3 searches the full corpus via a sparse keyword index, while A1 / A2 score only the candidates the dense vector layer happened to surface (see the Path comparison below). Anchor wording matters on every backend; A3 is just more forgiving when you guess wrong.

VectFox's answer: EventBase

Instead of summarizing per reply, VectFox sends a sliding window of messages to an LLM and asks: what actually happened here? The LLM extracts 0, 1, or several structured events depending on what occurred — not one blob per reply regardless. It is highly structural format that is native to vector engine.

Each event is a real structured record stored natively in Qdrant:

event_type:   item_acquired
importance:   6
text:         Tav and Astarion shopped for armor in Baldur's Gate. Tav bought a leather chestpiece for 80gp.
characters:   [Tav, Astarion]
locations:    [Baldur's Gate, Sorcerous Sundries district]
items:        [leather chestpiece, 80gp]
concepts:     [armor shopping, party economy]
keywords:     [armor, leather, chestpiece, gold, shopping]
open_threads: [Gauntlet of Shar preparation]

2,000 replies → ~1,000–3,000 structured events. Old events never get compressed away. They stay in the database and surface again when your query is relevant. Irrelevance is filtered, not detail.

The three retrieval paths: A1, A2, A3

For users who aren't ready to run an extra service, a "light" version using the A1 and A2 paths runs on SillyTavern's built-in vector store with no additional software — it shares many features of the full vector DB at smaller scale. When you're ready for a real long-term memory system, upgrade to the A3 path with Qdrant.

VectFox combines two signals — vector similarity (meaning: "hungry" matches "let's grab lunch") and BM25 keyword score (exact word: "Astarion" matches "Astarion"). How they're combined depends on your backend:

A1 — Standard backend + BM25

Vector search returns the top ~100 candidates. BM25 keyword scores are computed on those 100 only. Simple weighted blend. Fast and lightweight — good for getting started with no extra software.

Ceiling: if the perfect keyword match wasn't in the top 100 vector results, it's invisible.

A2 — Standard backend + Hybrid (recommended for most users not on A3)

Same as A1 but adds RRF (Reciprocal Rank Fusion) — results are merged by rank position, not raw score. Events that appear in both the vector list and the keyword list get a boost. Better fusion, no extra software required.

Ceiling: still bounded by the dense vector's top-K candidate pool (~300).

A3 — Qdrant native sparse + server-side RRF + formula rerank (best accuracy)

This is where the architecture genuinely changes. A3 runs everything inside Qdrant in a single API call:

  1. Full-corpus keyword search — Qdrant stores a sparse keyword vector on every event at upsert time. At query time the sparse index and dense index run in parallel against every event in the collection. A rare keyword from message 1,500 is found directly — not dependent on the dense vector happening to surface it. A1/A2 can't do this.
  2. Server-side RRF — fusion happens inside Qdrant, not in your browser.
  3. Server-side formula rerank — importance, persistence, and recency decay applied before results leave the server. No extra round-trip.
  4. Server-side payload filtering — minimum importance, context dedup, and AgentMode entity filters enforced at the DB level.
What runs where A1 — Standard + BM25 A2 — Standard + Hybrid A3 — Qdrant Native
Requires Qdrant ❌ No ❌ No ✅ Yes (free, open-source)
Keyword search scope Scores top ~100 dense candidates only Scores top ~300 dense candidates only Searches every event by keywords (sparse index)
BM25 IDF weights Corpus-wide (default on) Corpus-wide (default on) Corpus-wide (server-side, always)
Recall ceiling Bounded by dense vector top-K Bounded by dense vector top-K Union of dense + sparse — keyword-only matches still surface
Dense + sparse fusion Weighted blend, browser RRF + dual-signal bonus, browser Server-side RRF, 1 call
Importance / recency re-ranking Browser JS Browser JS Server-side formula (Qdrant ≥ 1.13)
Minimum importance filter Browser JS Browser JS Server-side
Context dedup filter Browser JS Browser JS Server-side
AgentMode pre-filtering ❌ Not supported ❌ Not supported Server-side (characters, locations, factions, concepts, event type)
Network calls per query 1 1 1 (hybrid + rerank + filter, all in one)
Scale ceiling ~500 events ~500 events 10,000+ events

A3 requires Qdrant (free, open-source, runs in Docker) and the Similharity plugin (included in the repo). Round-trip for 2,000+ events: under 3 seconds.

Agent Mode — let an LLM plan your search (A3 only, optional)

Plain vector search has one weakness: it only finds what you literally typed. Ask "why did I pay the ransom?" and the search matches "ransom." But the full answer might involve the kidnapping, the negotiation, and your character's relationship arc — and your question doesn't mention any of that.

Agent Mode adds a small planner LLM that reads your recent chat plus the top pre-search candidates, then asks: what other angles should I search to actually answer this? It emits 1–4 follow-up queries that fan out in parallel against Qdrant.

For "What deal did we make with Shadowheart?" the planner might emit:

queries: [
  "what agreement or promise involving Shadowheart",
  "what did Shadowheart ask for in return",
  "what event led to the deal with Shadowheart"
]
filters: { characters_any: ["Shadowheart"], concepts_any: ["deal", "promise"] }

Four parallel Qdrant searches return four different angles. All merge through the same re-ranker. The main LLM gets the full causal chain instead of just the surface match.

Cost: ~$0.0002/turn with GPT-4o-mini or Grok 4.1 fast. ~2–5 seconds added latency. Disabled by default — opt in when long-form recall matters.

CJK language support

Full native support for Japanese, Korean, Traditional Chinese, and Simplified Chinese:

  • Jieba WASM for Chinese, TinySegmenter for Japanese, Intl.Segmenter for Korean
  • Dedicated stop-word lists per language — strips grammar particles (「の・は・を」, 「的・地・得」, 「의・은・는」) that kill BM25 signal if left in
  • CJK tokenizer mode is locked per Qdrant collection so sparse vectors stay consistent

What it doesn't do

VectFox is a memory system, not a state tracker. It doesn't track quest progress, character stats, or live world state. For that, pair it with MVU Game Maker. Running both covers roughly 90% of the memory and state problems in long-form SillyTavern roleplay.

Installation

Head to VectFox to see the detail on A3 path
Qdrant (optional, only for A3 path) installation can be found here

If you want something simple and get started without using dedicated vector database, just install >

Step 1: Install the Extension

  1. Open SillyTavern in your browser
  2. Go to Extensions panel (puzzle piece icon)
  3. Click "Install Extension"
  4. Paste this URL:https://github.com/KritBlade/VectFox
  5. Click Install

Step 2: Configure VectFox

  1. Open VectFox Settings (Core tab in the extensions panel).
  2. Choose your vector storage (Standard).
  3. Select your embedding provider (Transformers, vLLM, Ollama, OpenRouter, etc.).
    • 💡 Recommended: use qwen/qwen3-embedding-8b through OpenRouter. It's extremely cheap ($0.00000015/run), multilingual (excellent CJK + Latin), and produces high-quality dense vectors for the corpus size VectFox targets.
  4. Select your Summarization LLM (OpenRouter or vLLM) — used by EventBase extraction during vectorization.
    • 💡 Recommended cheap & fast models: openai/gpt-4o-mini or x-ai/grok-4.1-fast ($0.0004/run) through OpenRouter. Both are very cheap and fast enough to keep ingestion latency low. Same recommendation applies to the Agent Mode LLM (configured separately in the AgentMode tab) — if you leave the AgentMode model field blank it inherits this summarizer setting.
  5. Configure API keys if using cloud providers (OpenRouter / vLLM ).
  6. Under Keyword Extraction, choose the language of your story.
  7. Most settings work fine on default — feel free to tweak.
  8. Open your chat in SillyTavern, then click the VectFox extension icon again. You HAVE to click "Vectorize Content" and choose Chat History to vectorize your first DB.
  9. Enable Auto-Sync if needed in the AutoSync tab. Frequency is controlled by the EventBase tab under Extraction > Window Size.
  10. Vectorize your lorebook / World Info if needed in the WorldInfo tab.
  11. (Optional) Turn on Agent Mode in the AgentMode tab once everything else works. Leave provider/model/API-key blank to inherit from your summarizer config — that way the same cheap/fast model used in step 4 also drives the planner. See "How It Works → Agent Mode" above for what it does.

# Debug mode

For those who want to dig into the weight and scoring under BM25 and RRF numbers, turn on all the debug checkbox in Action tab and using the Debug Query icon. You can see side by side for all tech stats of the weight and score on chrome console. You know exactly what was being calculated and this is how I do the benchmarking on A1, A2 , A3 , and A3 + agent mode.

[EventBase] Retrieval start — topK overfetch=20, minImportance=1, method=bm25, nativePrefer=true, liveCollections=0, nativeRerank=true
eventbase-retrieval.js:380 [EventBase] Live query skipped (no locked collection or paused)
eventbase-retrieval.js:433 [EventBase] Merged 10 archive event(s) into 0 live candidates
eventbase-retrieval.js:447 [EventBase] After importance filter (>=1): 10 candidates
eventbase-retrieval.js:644 [EventBase] Final events after dedup + trim: 10
eventbase-retrieval.js:646   [0] type=dialogue_significant imp=5 score=1.081 persist=true
eventbase-retrieval.js:646   [1] type=revelation imp=7 score=0.649 persist=true
eventbase-retrieval.js:646   [2] type=relationship_change imp=6 score=0.553 persist=true
eventbase-retrieval.js:646   [3] type=promise_or_oath imp=9 score=0.521 persist=true
eventbase-retrieval.js:646   [4] type=relationship_change imp=6 score=0.498 persist=true
eventbase-retrieval.js:646   [5] type=revelation imp=8 score=0.473 persist=true
eventbase-retrieval.js:646   [6] type=promise_or_oath imp=8 score=0.457 persist=true
eventbase-retrieval.js:646   [7] type=revelation imp=7 score=0.420 persist=true
eventbase-retrieval.js:646   [8] type=relationship_change imp=7 score=0.416 persist=true
eventbase-retrieval.js:646   [9] type=dialogue_significant imp=6 score=0.403 persist=true

- If you are using local model , tune down the concurrency in Vectorize Content to 1 or 2 just to be safe... If your embedding model and summarizer model are both on openrouter and it is NOT a free model, you can crank it up to 8 for faster operation. See the image below.

https://i.vgy.me/9qSwox.png

Links

Let's make memory hardcore. 🦊

u/Kritblade — 3 months ago

In case you don't know what MVU Game Maker is, check here. It converts Slice of Life/RPG character card into full on simulation card on SillyTavern with GUI and multi char stats tracking.

I have been messing with Deepseek pro v4 and using numerous preset including the new Frankenstein 4 MAX still doesn't quite help. It just won't update variable correctly because Deepseek 4 pro do NOT listen to instruction. Frankenstein 4 MAX is already trying to close the gap but MVU Game Maker require 100% instruction following, we feed a game engine to AI, any deviation from the prompt will result in stats not updating correctly.

Since Deepseek is a China based AI model, I end up get on to Chinese SillyTavern channel on Discord and see if the folks in China have any solution. I finally found one preset that seems to work, but that preset is purely in Chinese. I end up translate most of the name of preset entries in English and force it to output English story.

Give a shot on MVU_Deepseek_v0.5 preset. It is based on Xia Jin, Pisces v0.4 preset which works for me on MVU game maker. Please note that I only do the translation of the name of preset entries, I didn't change any content of the preset, so the content is still in Chinese. I tried to translate that into English and Deepseek end up not listening to my instruction again. So, I just leave that in Chinese as is.

Note: I am not a preset creator, I am just trying to solve the problem of Deepseek v4 pro doesn't work with MVU Game Maker. So I can't help you on preset configuration.

You can Download here. It is not a A-tier preset, but it works with MVU Game Maker + deepseek v4 pro. I translate that just because too many people want to test it on Deepseek v4 Pro. Moreover, it works for my story might not work for you. New game certainly helps. Your mileage may vary.

PS: I will release MVU Game Maker v1.0 in a week or two. Mostly on optimisation and better COT. And also try to make it works on a fork of VectorHare, which is a vector based memory system. Most of the existing memory extension doesn't quite work for me , especially those that store summary into lorebook. My MVU game chat have 2000+ replies and each reply have 1000 words. Any summary extension that try to use lorebook as a storage for quick lookup will be destroyed by my long chat history. And any extension that use file based vector lookup will takes 1 minute+ just to look up my 2000+ replies vectors.

So, I found VectorHare , which use a dedicate vector database Qdrant for storing vector. So...additional docker running on the PC is required. I am modding that to support AI summary and make it MVU compatible so that it will support long story with LOTS of replies. Still in development... Let see how that goes...

u/Kritblade — 4 months ago