WOW Legends bots don't just run combat — they talk. Whisper one and it answers in character, remembers you across days, and has a temper if you push it. That conversation is powered by a real, high-tier language model, not a tiny model bundled in the repack — so the hosted version runs on credits (1 credit = 1 reply). You can also point it at your own model and pay nothing to us. This guide covers exactly how it works and every dial.
The single most common question — so let's nail it first.
The random general / world chatter bots type as they roam is not the AI — those are fixed canned
lines from the database (mod-playerbots' ai_playerbot_texts). They keep the world feeling alive and
cost nothing: no credits, no API calls, ever.
Only when a bot answers you does the language model run: a whisper, party/raid or guild reply, or a proximity chime-in. On the hosted AI that's 1 credit per reply; on your own Ollama it's free.
If no AI backend is reachable, bots simply stay silent — no error, no crash. And the HTTP call runs off the main thread, so AI replies never lag your server; the answer just arrives on the next tick.
Four things make a bot actually think and reply. Everything else is free canned chatter.
| Trigger | What happens | Settings |
|---|---|---|
| Whisper a bot | It replies in character — directed, so it always answers. | on when Enabled=1 |
| Party / raid chat | A named bot replies directly; otherwise one random group-bot may chime in. | PartyChat · PartyAmbientChance |
| Guild chat | A bot replies only when named (guilds are big — no free-for-all). | GuildChat |
Proximity (/say, /yell) | A nearby bot may answer out loud for city/world ambiance; a named one always answers. Uses the cheaper ModelFast tier if you set one. | ProximityChat · ProximityRange · ProximityChance |
Plain whisper = AI chat. A $-prefixed message is a bot order. So
/w Grom hello there talks to the AI (1 credit), while /w Grom $follow or $summon is a
command handled by the bot engine — the AI ignores it and no credit is spent. ($ is the
AiPlayerbot.CommandPrefix.) Want a chattier open world like the demo realm? Raise
ProximityChance / PartyAmbientChance — more ambient AI replies, more credits.
You own the brain. Pick one:
Works out of the box. Grab an API key from your account dashboard, paste it into
AiChat.ApiKey — no model setup. Supporters get 2,500 credits included; top up anytime. Metered
per reply by the hosted endpoint.
OpenAI (GPT-4o, o-series), Anthropic's Claude, or any OpenAI-compatible API. You pay your provider
directly, no WL credits. Set Provider / ApiUrl / ApiKey / Model.
Runs on your own machine, no key, no cost. Set Provider = "ollama", your
OllamaHost/OllamaPort, and a Model you've pulled (e.g. llama3.1).
Provider=openai and the default ApiUrl, paste your
wlk_ key into ApiKey, leave Model empty. Done.Provider=openai, set ApiUrl to your provider, ApiKey
to your key, Model to their model name.Provider=ollama, set OllamaHost/OllamaPort and
Model to a pulled model. No key needed.# Hosted WoW Legends AI — the whole setup: WowLegends.AiChat.Provider = "openai" WowLegends.AiChat.ApiUrl = "https://wow-legends.eu/api/v1/ai/chat/completions" WowLegends.AiChat.ApiKey = "wlk_your_key_from_the_dashboard" WowLegends.AiChat.Model = "" # empty = the hosted endpoint chooses
⚠️ Using a reasoning model (e.g. OpenAI's o-series)? Set MaxTokens higher (~2000)
or replies can come back empty — the reasoning eats the budget. And keep VerifyTLS = 0 — 1 is known
to silence AI chat unless the host has a proper CA bundle.
Each bot keeps your recent exchanges per player, stored in playerbot_ai_chat_memory — so it remembers you across restarts and days. Depth = MemoryTurns (default 12, ceiling 200; higher = more context, more tokens).
Every bot gets its own race + faction persona injected automatically (one cheap line each) on top of the base System prompt. Fully editable per race and side. Replies in the language of your latest message.
Insult a bot and its anger climbs (+2 each). With RudeActions=1, a grouped bot can storm out of your party (LeavePartyAnger) and an ungrouped one can roar in fury (RoarAnger).
Replies are plain text only — the 3.3.5a client can't render emoji (they'd show as ?), so the model is told to skip them.
Every reply is shaped in three layers: the base System rules + that bot's race line + its faction line.
Only those two flavour lines are injected per call, so it stays token-cheap. All are editable in mod_wowlegends.conf —
rewrite a line to re-flavour a race or side, or set a race to "" to suppress it. These are the shipped defaults:
The base System prompt is editable too — the shared rulebook every bot follows: reply in
1–2 in-character sentences, match the player's language, plain text only (no emoji), and never break character or invent facts.
Rewrite any of these to give your whole realm its own voice.
All keys live in mod_wowlegends.conf under "BOT AI CHAT" and are prefixed
WowLegends.AiChat. Changes apply on a worldserver restart or .reload config.
| Key | Default | What it does |
|---|---|---|
| Enabled | 1 | Master on/off for all AI chat. |
| Provider | "openai" | Backend: openai (hosted or your own cloud key), ollama (local, free), anthropic. |
| ApiUrl | …/api/v1/ai/chat/completions | Endpoint. Default = hosted WL AI. BYO: OpenAI api.openai.com/v1/chat/completions, Anthropic / Claude api.anthropic.com/v1/messages. Ignored for Ollama. |
| ApiKey | "" | Your key — the wlk_ dashboard key (hosted) or your provider key (BYO). Empty for Ollama. Keep private. |
| Model | "" | Empty = the hosted endpoint picks. Required for Ollama / your own cloud (the model name). |
| ModelFast | unset | Optional cheaper model for high-volume ambient chatter (proximity/party chime-ins). Empty = one model for all. |
| OllamaHost | "127.0.0.1" | Where Ollama listens (Provider=ollama only). |
| OllamaPort | "11434" | Ollama port. |
| MaxTokens | 512 | Reply-length cap for cloud calls. With a reasoning model (e.g. OpenAI o-series) set it higher (~2000) or replies can come back empty. |
| Temperature | 0.7 | Sampling temperature (openai/ollama; anthropic ignores it). |
| TimeoutMs | 20000 | Per-request network timeout (ms). |
| VerifyTLS | 0 | TLS cert verification. Keep 0 — 1 breaks AI chat unless the host has a CA bundle. |
| CooldownSeconds | 5 | Per-bot reply cooldown (spam / token guard). |
| MemoryTurns | 12 | Remembered exchanges per (bot, player), persisted. Ceiling 200. |
| PartyChat | 1 | Bots may answer party/raid chat. |
| GuildChat | 1 | Bots may answer guild chat — only when named. |
| PartyAmbientChance | 25 | % chance one group-bot answers an un-addressed party line. |
| ProximityChat | 1 | A nearby bot may answer a real player's say/yell aloud. |
| ProximityRange | 20 | Yards to scan for nearby bots (WoW say range ≈ 20). |
| ProximityChance | 12 | % chance one nearby bot answers an un-addressed say (named always answer). |
| RudeActions | 1 | An angered bot can physically act (rage-quit party / roar). |
| LeavePartyAnger | 4 | Anger level at which a grouped bot storms out (insults +2 each). |
| RoarAnger | 6 | Anger at which an ungrouped bot roars at you. |
| System | long prompt | Base system prompt / shared rules (1–2 in-character sentences, no emoji, reply in the player's language, never break character). |
| Race.<Name> | baked-in | Per-race persona, injected only for that bot's race: Human, Orc, Dwarf, NightElf, Undead, Tauren, Gnome, Troll, BloodElf, Draenei. "" suppresses one. |
| Faction.Alliance / .Horde | baked-in | Per-faction persona, injected for that bot's side. |
That's the whole brain. Start with the hosted AI for zero setup, or point it at your own Ollama and chat for free — either way, whisper a bot something and watch it answer. 🐉 Pair it with your permanent Companion, or see the Owner Guide for the rest.