wow-llm-personas
A tiny (~230-line, stdlib-only) Python shim that gives CMaNGOS +
playerbots AI playerbots real personalities by
routing their in-game "ai chat" through your local Ollama.
Party bots roast you in character, remember the last few things you said, and banter with each
other, all on one consumer GPU, nothing leaving your LAN.
This is the shim behind [that r/homelab post] about ~1,800 vanilla-WoW bots with AI personalities.
The bots and the server are stock projects; this repo is the glue that gives them a voice:
the persona injection, the per-bot memory, and the bot-to-bot banter tuning.
Prerequisites
This shim only handles the personality layer. You need a working CMaNGOS 1.12 + playerbots
server first (the one with the native LLM-chat hook). The fastest path, and the one I used, is the
prebuilt Eluna-CMaNGOS-Classic Windows builds, which bundle the bots, Eluna, and the extractors:
- Core (prebuilt, easiest): Eluna-Ports/Eluna-CMaNGOS-Classic: grab a
with-all build
- Playerbots module: cmangos/playerbots
- World database: cmangos/classic-db
- LLM runtime: Ollama, with a model pulled
You supply your own 1.12 game client. This repo distributes no game data and links to none. Once your
bots chat at all server-side, point AiPlayerbot.LLMApiEndpoint at this shim and you're set (see
Quick start).
How it works
The playerbots module already has a native "LLM chat" hook: when a bot talks, it POSTs a
KoboldCpp-shaped request to whatever endpoint you configure:
POST /api/v1/generate {"max_length": 100, "prompt": ""}
-> {"results": [{"text": ""}]}
So instead of running KoboldCpp, you point it at this shim, which speaks that shape on the front
and talks to Ollama on the back. In between, it does the three things that turn "an LLM answered"
into "a character answered":
1. Per-bot persona injection
The server's prompt always contains Your name is .. The shim pulls that name out and, if
personas/.txt exists, loads it as the **system me