Configuration

Everything optional starts off. Keep the mock until the client works end to end, then add one provider at a time from the dashboard or the private config/config.php. Changes apply on the next request; no restart is needed.

Shipped Defaults

SettingDefault
llm.modemock: predictable replies, no network
tts.enabled, stt.enabledfalse (PocketTTS and Parakeet preselected)
decision.enabledfalse: always the baseline NPC
allowed_actions["follow_player"] on the server and in the client
history_limit10 lines per session and NPC
Client voice_enabledfalse

The dashboard settings pages rewrite config/config.php safely but do not keep comments in the file. If a page refuses to save, run sudo bash scripts/install.sh again to repair ownership, then check Control Panel > Diagnostics ("Dashboard can save settings").

Connect An LLM

  1. Open Configuration > LLM and choose a Reply mode.
  2. For local, set Base URL to the server's /v1 address, for example http://127.0.0.1:1234/v1. For openai it is optional; openrouter and dwemerllm use fixed URLs.
  3. Set Model to the exact model name your provider lists. Every mode except mock needs one.
  4. Press Save LLM settings (saving never contacts the provider), then Send test.
Reply modeEndpointKey
mocknonenone
openaiOpenAI, or any OpenAI-compatible base_urlusually
openrouterOpenRouterrequired
localyour own OpenAI-compatible serveroptional
dwemerllmDwemerDistro LLM Studio at 127.0.0.1:1234; load a model there firstnever sent

The test shows the reply and its time, or a short reason such as HTTP 401 (key refused) or HTTP 404 (URL or model not found). A test may cost money; it saves no history and runs no actions. A failing provider gives the game 502 llm_unavailable, with the reason in the Apache error log.

To edit the file instead, in WSL, replace the llm block, for example:

'llm' => ['mode' => 'dwemerllm', 'model' => 'id-of-the-model-loaded-in-llm-studio',
          'timeout_seconds' => 60, 'max_tokens' => 200],

API Keys

  1. Open Configuration > API keys.
  2. Paste the key into its slot, for example llm.api_key, and press Save keys.

The page only ever shows Saved or Not set. A blank field keeps the saved key; the clear box removes it. Keys live only in config/config.php: never in the database, the browser, logs or Git. dwemerllm never receives a key.

Voice: PocketTTS And Parakeet

Voice is opt-in and never needed for text. The templates do not install or start voice services.

  1. Start PocketTTS (audio.cpp, port 8086) and/or Parakeet (port 8022) from the DwemerDistro launcher.
  2. Open Configuration > Voice, enable speech and/or transcription and save. The default URLs are http://127.0.0.1:8086/v1/audio/speech and http://127.0.0.1:8022/v1/audio/transcriptions. For PocketTTS, a blank model or voice saves pocket-tts and alba.
  3. Press Speak to hear a sample. For Parakeet, choose a short WAV (at most 10 MB) under Test transcription and press Transcribe.
  4. In the client's config.json, set "voice_enabled": true.

The console client saves reply WAVs in %TEMP%\dwemer-ai-example\ and does not play them. Use --listen <file.wav> for speech input. Text always comes first: a voice failure prints Voice unavailable, text only: .... faster-whisper (port 9876) is also supported; see CONNECTORS.md, Voice.

Report voice as working only after you test it with your own services and recordings.

Optional NPC Selection

decision.php answers one question: which of up to 8 offered NPCs should answer a line. It returns no reply or actions and falls back to the baseline NPC on any problem. Call it only when the player has no explicit or crosshair target.

Enable it on Configuration > NPC selection, or in the config:

'decision' => ['enabled' => true, 'provider' => 'mock'],

Then test from the client folder:

.\example_mod.exe --decide "Scout, is the trail safe?"

With the mock enabled it prints npc_scout (provider, matched, ...); the command only prints the choice. The jev provider uses OpenRouter and needs a key; see CONNECTORS.md, NPC selection.

Full reference: CONNECTORS.md and SETUP.md sections 4 and 5.

Next step: Give NPCs bios, facts and memory.