services: brain: build: . container_name: glpi-neural-brain restart: unless-stopped ports: - "8090:8090" environment: BRAIN_LISTEN_ADDR: ":8090" BRAIN_DATA_DIR: /app/data BRAIN_KNOWLEDGE_DIRS: /sources/knowledge BRAIN_STAGING_DIRS: /sources/staging BRAIN_AGENT_RUNS_FILES: /sources/agent-data/runs.jsonl OLLAMA_URL: ${OLLAMA_URL:-http://host.docker.internal:11434} OLLAMA_URLS: ${OLLAMA_URLS:-http://host.docker.internal:11434} OLLAMA_NODE_NAMES: ${OLLAMA_NODE_NAMES:-local-gpu} OLLAMA_NODE_WEIGHTS: ${OLLAMA_NODE_WEIGHTS:-1} OLLAMA_ROUTING_MODE: ${OLLAMA_ROUTING_MODE:-least_inflight} OLLAMA_NODE_MAX_INFLIGHT: ${OLLAMA_NODE_MAX_INFLIGHT:-1} OLLAMA_NODE_HEALTH_INTERVAL: ${OLLAMA_NODE_HEALTH_INTERVAL:-15s} OLLAMA_NODE_FAILURE_COOLDOWN: ${OLLAMA_NODE_FAILURE_COOLDOWN:-30s} OLLAMA_NODE_REQUEST_TIMEOUT: ${OLLAMA_NODE_REQUEST_TIMEOUT:-8m} OLLAMA_FAILOVER_ENABLED: ${OLLAMA_FAILOVER_ENABLED:-true} OLLAMA_FAILOVER_ATTEMPTS: ${OLLAMA_FAILOVER_ATTEMPTS:-0} OLLAMA_REQUIRE_SAME_MODEL_DIGEST: ${OLLAMA_REQUIRE_SAME_MODEL_DIGEST:-true} OLLAMA_REQUIRE_EMBEDDING_MODEL: ${OLLAMA_REQUIRE_EMBEDDING_MODEL:-true} OLLAMA_CHAT_MODEL: ${OLLAMA_CHAT_MODEL:-qwen3:8b} OLLAMA_EMBEDDING_MODEL: ${OLLAMA_EMBEDDING_MODEL:-embeddinggemma} BRAIN_AUTO_ENRICH: ${BRAIN_AUTO_ENRICH:-true} BRAIN_SCAN_INTERVAL: ${BRAIN_SCAN_INTERVAL:-20s} BRAIN_PERSIST_INTERVAL: ${BRAIN_PERSIST_INTERVAL:-5m} BRAIN_LEARNING_ENABLED: ${BRAIN_LEARNING_ENABLED:-true} BRAIN_THINKING_ENABLED: ${BRAIN_THINKING_ENABLED:-true} BRAIN_LEARNING_SOURCES: ${BRAIN_LEARNING_SOURCES:-} BRAIN_DISPLAY_SOURCES: ${BRAIN_DISPLAY_SOURCES:-} BRAIN_THINKING_SOURCES: ${BRAIN_THINKING_SOURCES:-} BRAIN_DEFAULT_VIEW: ${BRAIN_DEFAULT_VIEW:-neural} BRAIN_MAX_DISPLAY_NODES: ${BRAIN_MAX_DISPLAY_NODES:-0} BRAIN_LOW_POWER_MODE: ${BRAIN_LOW_POWER_MODE:-false} BRAIN_ENRICH_INTERVAL: ${BRAIN_ENRICH_INTERVAL:-90s} BRAIN_ENRICH_BATCH_SIZE: ${BRAIN_ENRICH_BATCH_SIZE:-3} BRAIN_ENRICH_STEP_DELAY: ${BRAIN_ENRICH_STEP_DELAY:-3s} BRAIN_ENRICH_ANCHORS: ${BRAIN_ENRICH_ANCHORS:-48} BRAIN_PROCESSING_MODE: ${BRAIN_PROCESSING_MODE:-precise} BRAIN_CLUSTER_HASH_BITS: ${BRAIN_CLUSTER_HASH_BITS:-24} BRAIN_CLUSTER_HASH_TABLES: ${BRAIN_CLUSTER_HASH_TABLES:-2} BRAIN_CLUSTER_CANDIDATES_PER_ANCHOR: ${BRAIN_CLUSTER_CANDIDATES_PER_ANCHOR:-96} BRAIN_CLUSTER_ARTICLE_CANDIDATES: ${BRAIN_CLUSTER_ARTICLE_CANDIDATES:-192} BRAIN_CLUSTER_REVIEW_EVIDENCE: ${BRAIN_CLUSTER_REVIEW_EVIDENCE:-8} BRAIN_CLUSTER_REVIEW_CONTEXT_CHARS: ${BRAIN_CLUSTER_REVIEW_CONTEXT_CHARS:-8000} BRAIN_SIMILARITY_THRESHOLD: ${BRAIN_SIMILARITY_THRESHOLD:-0.68} BRAIN_RELATION_THRESHOLD: ${BRAIN_RELATION_THRESHOLD:-0.72} BRAIN_ARTICLE_SYNTHESIS_ENABLED: ${BRAIN_ARTICLE_SYNTHESIS_ENABLED:-true} BRAIN_ARTICLE_LANGUAGE: ${BRAIN_ARTICLE_LANGUAGE:-de-DE} BRAIN_ARTICLE_SYNTHESIS_MODEL: ${BRAIN_ARTICLE_SYNTHESIS_MODEL:-qwen3:8b} BRAIN_ARTICLE_REVIEW_MODEL: ${BRAIN_ARTICLE_REVIEW_MODEL:-qwen3:8b} BRAIN_ARTICLE_REVIEW_REPAIR_ROUNDS: ${BRAIN_ARTICLE_REVIEW_REPAIR_ROUNDS:-1} BRAIN_ARTICLE_MIN_SOURCES: ${BRAIN_ARTICLE_MIN_SOURCES:-3} BRAIN_ARTICLE_MAX_SOURCES: ${BRAIN_ARTICLE_MAX_SOURCES:-8} BRAIN_ARTICLE_MIN_PRODUCTION_RATIO: ${BRAIN_ARTICLE_MIN_PRODUCTION_RATIO:-0.70} BRAIN_ARTICLE_MAX_GENERATION_DEPTH: ${BRAIN_ARTICLE_MAX_GENERATION_DEPTH:-2} BRAIN_ARTICLE_MIN_CONFIDENCE: ${BRAIN_ARTICLE_MIN_CONFIDENCE:-0.74} BRAIN_ARTICLE_MIN_TEXT_CHARS: ${BRAIN_ARTICLE_MIN_TEXT_CHARS:-180} BRAIN_ARTICLE_MIN_ANSWER_CHARS: ${BRAIN_ARTICLE_MIN_ANSWER_CHARS:-420} BRAIN_ARTICLE_MAX_RESEARCH_QUERIES: ${BRAIN_ARTICLE_MAX_RESEARCH_QUERIES:-6} BRAIN_ARTICLE_RESEARCH_RESULTS: ${BRAIN_ARTICLE_RESEARCH_RESULTS:-12} BRAIN_ARTICLE_RESEARCH_ROUNDS: ${BRAIN_ARTICLE_RESEARCH_ROUNDS:-3} BRAIN_ARTICLE_RESEARCH_FETCH_RESULTS: ${BRAIN_ARTICLE_RESEARCH_FETCH_RESULTS:-6} BRAIN_ARTICLE_RESEARCH_EXPLORATION_RESULTS: ${BRAIN_ARTICLE_RESEARCH_EXPLORATION_RESULTS:-3} BRAIN_ARTICLE_RESEARCH_PREFETCH_MIN_RELEVANCE: ${BRAIN_ARTICLE_RESEARCH_PREFETCH_MIN_RELEVANCE:-0.25} BRAIN_ARTICLE_RESEARCH_MIN_RELEVANCE: ${BRAIN_ARTICLE_RESEARCH_MIN_RELEVANCE:-0.55} BRAIN_ARTICLE_RESEARCH_MIN_QUALITY: ${BRAIN_ARTICLE_RESEARCH_MIN_QUALITY:-0.35} BRAIN_ARTICLE_RESEARCH_PAGE_MAX_BYTES: ${BRAIN_ARTICLE_RESEARCH_PAGE_MAX_BYTES:-2097152} BRAIN_ARTICLE_RESEARCH_PAGE_MAX_CHARS: ${BRAIN_ARTICLE_RESEARCH_PAGE_MAX_CHARS:-14000} BRAIN_ARTICLE_RESEARCH_FETCH_TIMEOUT: ${BRAIN_ARTICLE_RESEARCH_FETCH_TIMEOUT:-20s} BRAIN_ARTICLE_RESEARCH_ALLOW_PRIVATE: ${BRAIN_ARTICLE_RESEARCH_ALLOW_PRIVATE:-false} BRAIN_RESEARCH_OLLAMA_MAX_INFLIGHT: ${BRAIN_RESEARCH_OLLAMA_MAX_INFLIGHT:-2} BRAIN_RESEARCH_OLLAMA_QUEUE_SIZE: ${BRAIN_RESEARCH_OLLAMA_QUEUE_SIZE:-64} BRAIN_RESEARCH_DEDUPE_THRESHOLD: ${BRAIN_RESEARCH_DEDUPE_THRESHOLD:-0.92} BRAIN_RESEARCH_DEDUPE_TTL: ${BRAIN_RESEARCH_DEDUPE_TTL:-45m} BRAIN_TOP_K: ${BRAIN_TOP_K:-8} BRAIN_MAX_CONTEXT_CHARS: ${BRAIN_MAX_CONTEXT_CHARS:-16000} BRAIN_RESEARCH_ENABLED: ${BRAIN_RESEARCH_ENABLED:-false} BRAIN_AUTONOMOUS_RESEARCH_ENABLED: ${BRAIN_AUTONOMOUS_RESEARCH_ENABLED:-false} BRAIN_AUTONOMOUS_RESEARCH_IDLE_ONLY: ${BRAIN_AUTONOMOUS_RESEARCH_IDLE_ONLY:-true} BRAIN_AUTONOMOUS_RESEARCH_INTERVAL: ${BRAIN_AUTONOMOUS_RESEARCH_INTERVAL:-30m} BRAIN_AUTONOMOUS_RESEARCH_TASKS_PER_CYCLE: ${BRAIN_AUTONOMOUS_RESEARCH_TASKS_PER_CYCLE:-1} BRAIN_AUTONOMOUS_RESEARCH_MAX_TASKS_PER_DAY: ${BRAIN_AUTONOMOUS_RESEARCH_MAX_TASKS_PER_DAY:-12} BRAIN_AUTONOMOUS_RESEARCH_MAX_QUERIES_PER_TASK: ${BRAIN_AUTONOMOUS_RESEARCH_MAX_QUERIES_PER_TASK:-6} BRAIN_AUTONOMOUS_RESEARCH_MAX_PAGES_PER_TASK: ${BRAIN_AUTONOMOUS_RESEARCH_MAX_PAGES_PER_TASK:-8} BRAIN_AUTONOMOUS_RESEARCH_MAX_ROUNDS: ${BRAIN_AUTONOMOUS_RESEARCH_MAX_ROUNDS:-3} BRAIN_AUTONOMOUS_RESEARCH_MIN_PRIORITY: ${BRAIN_AUTONOMOUS_RESEARCH_MIN_PRIORITY:-0.65} BRAIN_AUTONOMOUS_RESEARCH_COOLDOWN: ${BRAIN_AUTONOMOUS_RESEARCH_COOLDOWN:-168h} BRAIN_AUTONOMOUS_RESEARCH_LEASE: ${BRAIN_AUTONOMOUS_RESEARCH_LEASE:-45m} BRAIN_AUTONOMOUS_RESEARCH_MAX_ATTEMPTS: ${BRAIN_AUTONOMOUS_RESEARCH_MAX_ATTEMPTS:-3} BRAIN_AUTONOMOUS_RESEARCH_QUERY_TRIGGERS: ${BRAIN_AUTONOMOUS_RESEARCH_QUERY_TRIGGERS:-true} BRAIN_AUTONOMOUS_RESEARCH_OPPORTUNITY_LIMIT: ${BRAIN_AUTONOMOUS_RESEARCH_OPPORTUNITY_LIMIT:-8} # In Docker, localhost points to this Brain container. Use the SearXNG # service name (for example http://searxng:8080) or host.docker.internal. SEARXNG_URL: ${SEARXNG_URL:-} BRAIN_API_KEY: ${BRAIN_API_KEY:-} GLPI_KB_ENABLED: ${GLPI_KB_ENABLED:-false} GLPI_URL: ${GLPI_URL:-} GLPI_API_VERSION: ${GLPI_API_VERSION:-v2.3} GLPI_CLIENT_ID: ${GLPI_CLIENT_ID:-} GLPI_CLIENT_SECRET: ${GLPI_CLIENT_SECRET:-} GLPI_USERNAME: ${GLPI_USERNAME:-} GLPI_PASSWORD: ${GLPI_PASSWORD:-} GLPI_ALLOW_INSECURE_HTTP: ${GLPI_ALLOW_INSECURE_HTTP:-false} GLPI_TIMEOUT: ${GLPI_TIMEOUT:-20s} GLPI_KB_PATH: ${GLPI_KB_PATH:-auto} GLPI_KB_FILTER: ${GLPI_KB_FILTER:-} GLPI_KB_LIMIT: ${GLPI_KB_LIMIT:-500} GLPI_KB_SYNC_INTERVAL: ${GLPI_KB_SYNC_INTERVAL:-10m} GLPI_KB_SOURCE: ${GLPI_KB_SOURCE:-GLPI Knowledge Base} volumes: - brain-data:/app/data # Adjust the three host paths to your actual project directories. - ../glpi-ai-agent/knowledge:/sources/knowledge:ro - ../glpi-ai-knowledgebase/staging:/sources/staging:rw - ../glpi-ai-agent/data:/sources/agent-data:ro extra_hosts: - "host.docker.internal:host-gateway" volumes: brain-data: