Files
zalbot/.env.example
Kaysser Kayyali 10e0f22598
Some checks failed
tests / Unit tests (Node 22) (push) Failing after 30s
feat: integration testing
2026-06-20 00:32:18 +00:00

108 lines
5.7 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
DISCORD_TOKEN=your_discord_bot_token
DISCORD_CLIENT_ID=your_discord_application_id
# DISCORD_GUILD_ID=your_server_id # Set for instant command registration (vs 1hr global propagation)
# ── Redis ──────────────────────────────────────────────────────────────────────
# Shared with GraphMCP-Example stack via knowledge-graph-ai_internal network
REDIS_URL=redis://redis:6379
# How long a session stays alive in Redis without activity (hours)
# SESSION_TTL_HOURS=12
# ── Ollama / LLM ───────────────────────────────────────────────────────────────
OLLAMA_BASE_URL=http://192.168.1.x:11434
OLLAMA_MODEL=gemma4-it:e2b
# Sampling temperature — higher = more creative, lower = more consistent (02)
# OLLAMA_TEMPERATURE=0.75
# Context window in tokens — must match your model's actual max
# OLLAMA_NUM_CTX=131072
# LLM call timeout in milliseconds
# OLLAMA_TIMEOUT_MS=120000
# ── GraphMCP ───────────────────────────────────────────────────────────────────
GRAPHMCP_URL=http://mcp-server:9000
# Minimum semantic similarity score (01) to count a chunk as relevant context.
# Raise to be stricter (fewer but more accurate results).
# Lower to be more permissive (more context, more noise).
# GRAPHMCP_SCORE_THRESHOLD=0.68
# How many memory chunks to fetch per NPC at encounter start
# GRAPHMCP_NPC_MEMORY_LIMIT=5
# How many chunks to fetch when @Zalram is mentioned
# GRAPHMCP_MENTION_LIMIT=5
# ── Encounter behaviour ────────────────────────────────────────────────────────
SPECS_DIR=./specs
# Delay before archiving a resolved thread — gives players time to read the ending (ms)
# ENCOUNTER_ARCHIVE_DELAY_MS=5000
# How long the player-gate embed stays visible before auto-delete (ms)
# ENCOUNTER_GATE_TIMEOUT_MS=30000
# ── Persona ────────────────────────────────────────────────────────────────────
# Path to the YAML file defining the bot's @mention persona
# PERSONA_PATH=./persona.yaml
# ── Access control ─────────────────────────────────────────────────────────────
# Comma-separated channel IDs where encounters are allowed.
# The bot checks the parent channel of threads before responding.
# Leave empty and the bot responds nowhere (secure by default).
# DISCORD_ALLOWED_CHANNELS=123456789012345678,987654321098765432
DISCORD_ALLOWED_CHANNELS=
# Comma-separated user IDs who can use /encounter commands. Empty = everyone.
# DISCORD_ALLOWED_USERS=123456789012345678,987654321098765432
DISCORD_ALLOWED_USERS=
# ── Logging ────────────────────────────────────────────────────────────────────
LOG_LEVEL=debug
LITELLM_BASE_URL=
LITELLM_API_KEY=
LITELLM_MODEL=ollama-cloud
# ── Live integration tests (tests/integration/graphmcp/) ──────────────────────
# Opt-in gates for the live E2E suite. With neither set, `npm run test:int`
# skips all 16 graphmcp tests (and the 2 phase1 tests) and exits 0 — CI-safe.
#
# RUN_GRAPHMCP_LIVE=1 activates ONLY the AC1 contract suite, which needs a
# reachable GraphMCP and nothing else (no Discord/LLM/Redis).
# RUN_FULL_E2E=1 activates AC2AC4 (and AC1). Needs the full live stack:
# real Discord gateway, real LLM, real Redis, real GraphMCP.
# RUN_GRAPHMCP_LIVE=1
# RUN_FULL_E2E=1
# ── Required for RUN_FULL_E2E=1 (AC2AC4) ──────────────────────────────────────
# A dedicated Discord test guild + channel (NOT a production server).
# E2E_TEST_GUILD_ID=123456789012345678
# E2E_TEST_CHANNEL_ID=1517576125172289787
# Token for a SECOND bot that posts chat messages / @mentions into the thread
# (the bot under test cannot be driven by another bot's slash commands).
# E2E_DRIVER_TOKEN=your_second_bot_token
# Discord user ID of whoever the driver bot acts as. Used as interaction.user.id
# in the hybrid slash-command fakes. If DISCORD_ALLOWED_USERS (above) is non-empty,
# this ID MUST be listed there or /encounter start|end will be rejected.
# E2E_DRIVER_USER_ID=123456789012345678
# ── Optional test knobs ───────────────────────────────────────────────────────
# Real NPC name present in the graph — enables AC1 S1.1 (query_as_npc). When
# unset, S1.1 is skipped; the rest of AC1 still runs.
# E2E_TEST_NPC=miriam-merchant-mardonar
# Spec to start for AC2/AC3 encounters (defaults to market-thief).
# E2E_SPEC=market-thief
#
# NOTE: when RUN_FULL_E2E=1, the test bootstrap (tests/integration/graphmcp/support/env.ts)
# auto-seeds DISCORD_ALLOWED_CHANNELS from E2E_TEST_CHANNEL_ID if you haven't set
# it — so you don't have to edit DISCORD_ALLOWED_CHANNELS just to run the suite.
# It also injects harmless DISCORD_TOKEN/DISCORD_CLIENT_ID stubs when absent, so
# the AC1 contract suite can run without any Discord creds at all.