# ╔══════════════════════════════════════════════════════════════════════════════╗ # ║ MULTI-MCP AGENT CONFIGURATION ║ # ╚══════════════════════════════════════════════════════════════════════════════╝ # # Copia questo file in .env e compila i valori. # Provider e API key sono configurati UNA SOLA VOLTA nella sezione MAIN AGENT. # I sotto-agenti ereditano provider e credenziali dall'orchestratore quando # vengono chiamati tramite main_agent.py. # # Per usare un sotto-agente in modalità standalone (senza main_agent.py), # decommenta e compila le variabili provider nella sua sezione. # # Provider supportati: openrouter | groq | gemini | cloudflare | cerebras | mistral | nvidia | puter | ollama # # Placeholder da sostituire SEMPRE prima del deploy: qualsiasi valore che # assomiglia a "your_..._here", "sk-...", "192.168.0.x" o simili non è un # default funzionante — è un segnaposto. Le righe commentate (`#`) sono # invece opzionali: il default hardcoded nel codice si applica finché restano # commentate. # ══════════════════════════════════════════════════════════════════════════════ # MAIN AGENT — orchestratore multi-dominio (main_agent.py) # Configura qui il provider: vale per l'orchestratore E per tutti i sotto-agenti. # ══════════════════════════════════════════════════════════════════════════════ MAIN_AGENT_PROVIDER=rotate # vuoto o "rotate" = rotazione automatica tra provider con API key # MAIN_AGENT_MODEL= # forza un modello specifico (ignorato in modalità rotazione) MAIN_AGENT_VERBOSE=true # true = mostra provider/modello usato ad ogni chiamata LLM # MAIN_AGENT_ROTATE_KEYS= # slot key da usare (es: "1" = solo primary, "1,3" = slot 1 e 3) # vuoto = usa tutte le key configurate # MAIN_AGENT_AGENTS_DIR= # cartella dei sub-agent (un JSON per agente); # vuoto = agents.d/ accanto al codice # MAIN_AGENT_TURN_LOCK_TIMEOUT=60 # secondi di attesa massimi per una richiesta HTTP # concorrente prima di rispondere 503 invece di # accodarsi indefinitamente (agent_server.py) # ─── Timezone (tutti i container Docker) ─────────────────────────────────────── # TZ=Europe/Rome # usata da orchestrator, lab_health_agent e # linux_update_agent per lo scheduling (HH:MM # locali) e i timestamp nei report # ─── HTTP sidecar (agent_server.py) ──────────────────────────────────────────── # Bearer token richiesto su /v1/models e /v1/chat/completions. Senza questa chiave # l'API resta SENZA autenticazione (vedi DEPLOY.md) — impostala sempre prima di # esporre la porta 8910 oltre 127.0.0.1. AGENT_SERVER_API_KEY= # AGENT_SERVER_BIND=127.0.0.1 # interfaccia su cui pubblicare la porta 8910 # (docker-compose.yml); usare 0.0.0.0 solo con # AGENT_SERVER_API_KEY impostata # ─── OpenRouter ─────────────────────────────────────────────────────────────── # Più key: MAIN_AGENT_OPENROUTER_API_KEY_2=sk-or-... _3=sk-or-... ecc. MAIN_AGENT_OPENROUTER_API_KEY=sk-or-v1-... # MAIN_AGENT_OPENROUTER_API_KEY_2=sk-or-v1-... # MAIN_AGENT_OPENROUTER_MODEL=openrouter/auto # ─── Groq ───────────────────────────────────────────────────────────────────── # Più key: MAIN_AGENT_GROQ_API_KEY_2=gsk_... _3=gsk_... ecc. MAIN_AGENT_GROQ_API_KEY=gsk_... # MAIN_AGENT_GROQ_API_KEY_2=gsk_... # MAIN_AGENT_GROQ_MODEL=llama-3.3-70b-versatile # ─── Google Gemini ──────────────────────────────────────────────────────────── # Più key: MAIN_AGENT_GEMINI_API_KEY_2=AIza... _3=AIza... ecc. MAIN_AGENT_GEMINI_API_KEY=AIza... # MAIN_AGENT_GEMINI_MODEL=gemini-2.0-flash # ─── Cloudflare Workers AI ──────────────────────────────────────────────────── # Account aggiuntivi: ogni coppia KEY+ACCOUNT_ID deve avere lo stesso suffisso _N MAIN_AGENT_CLOUDFLARE_API_KEY=cfut_... MAIN_AGENT_CLOUDFLARE_ACCOUNT_ID=your_account_id # MAIN_AGENT_CLOUDFLARE_API_KEY_2=cfut_... # MAIN_AGENT_CLOUDFLARE_ACCOUNT_ID_2=your_account_id_2 # MAIN_AGENT_CLOUDFLARE_MODEL=@cf/meta/llama-3.3-70b-instruct-fp8-fast # ─── Cerebras ───────────────────────────────────────────────────────────────── # Più key: MAIN_AGENT_CEREBRAS_API_KEY_2=csk-... ecc. MAIN_AGENT_CEREBRAS_API_KEY=csk-... # MAIN_AGENT_CEREBRAS_API_KEY_2=csk-... # MAIN_AGENT_CEREBRAS_MODEL=llama-3.3-70b # ─── Mistral ────────────────────────────────────────────────────────────────── # Più key: MAIN_AGENT_MISTRAL_API_KEY_2=... ecc. MAIN_AGENT_MISTRAL_API_KEY=... # MAIN_AGENT_MISTRAL_API_KEY_2=... # MAIN_AGENT_MISTRAL_MODEL=mistral-small-latest # ─── NVIDIA NIM ─────────────────────────────────────────────────────────────── # API OpenAI-compatible su https://integrate.api.nvidia.com/v1 — key formato nvapi-... # Più key: MAIN_AGENT_NVIDIA_API_KEY_2=nvapi-... _3=nvapi-... ecc. MAIN_AGENT_NVIDIA_API_KEY=nvapi-... # MAIN_AGENT_NVIDIA_API_KEY_2=nvapi-... # MAIN_AGENT_NVIDIA_MODEL=meta/llama-3.3-70b-instruct # ─── Puter ──────────────────────────────────────────────────────────────────── # Puter.com offre inferenza gratuita senza API key obbligatoria. # Decommenta e imposta un valore qualsiasi (es. "nokey") per includerlo nella # rotazione. Lasciato commentato per default: una chiave finta attiva qui # finirebbe nel pool di rotazione e fallirebbe un turno su N con 401. # MAIN_AGENT_PUTER_API_KEY=nokey # Più key: MAIN_AGENT_PUTER_API_KEY_2=... ecc. # MAIN_AGENT_PUTER_API_KEY_2=nokey # MAIN_AGENT_PUTER_MODEL=gpt-4o-mini # ─── Ollama ─────────────────────────────────────────────────────────────────── MAIN_AGENT_OLLAMA_HOST=http://localhost:11434 # MAIN_AGENT_OLLAMA_MODEL=llama3.2:1b # ══════════════════════════════════════════════════════════════════════════════ # LINUX SSH SERVERS (credenziali SSH — usate da linux_mcp_agent.py) # Il loader si ferma al primo N mancante: la numerazione deve essere continua. # ══════════════════════════════════════════════════════════════════════════════ UXMCP_SERVER_1_LABEL=server1 UXMCP_SERVER_1_HOST=192.168.0.x UXMCP_SERVER_1_PORT=22 UXMCP_SERVER_1_USER=admin UXMCP_SERVER_1_PASSWORD=your_password # UXMCP_SERVER_1_SUDO_PASSWORD=your_sudo_password # UXMCP_SERVER_1_KEY_PATH=~/.ssh/id_rsa # Template per server aggiuntivi: # UXMCP_SERVER_2_LABEL=server2 # UXMCP_SERVER_2_HOST=192.168.0.y # UXMCP_SERVER_2_PORT=22 # UXMCP_SERVER_2_USER=root # UXMCP_SERVER_2_PASSWORD=your_password # ══════════════════════════════════════════════════════════════════════════════ # LINUX SSH AGENT (linux_mcp_agent.py) # ══════════════════════════════════════════════════════════════════════════════ UXMCP_MCP_DOCKER_IMAGE=lordraw/linux-mcp:latest # UXMCP_MCP_SSH_KEY_DIR=~/.ssh # Standalone mode — decommenta per usare linux_mcp_agent.py senza main_agent.py: # UXMCP_PROVIDER=openrouter # UXMCP_MODEL= # (UXMCP_AGENT_PROVIDER / UXMCP_AGENT_MODEL / *_DEFAULT_MODEL / OLLAMA_BASE_URL # sono i nomi storici, ancora accettati come fallback) # ══════════════════════════════════════════════════════════════════════════════ # SYNOLOGY NAS AGENT (synology_mcp_agent.py) # ══════════════════════════════════════════════════════════════════════════════ # ─── Connessione NAS ────────────────────────────────────────────────────────── SYNOLOGY_MCP_NAS_CONFIG=nas_config.json # Fallback single-NAS (solo se SYNOLOGY_MCP_NAS_CONFIG non è impostato): # SYNOLOGY_MCP_HOST=192.168.0.x # SYNOLOGY_MCP_PORT=5000 # SYNOLOGY_MCP_HTTPS=false # SYNOLOGY_MCP_VERIFY_SSL=false # SYNOLOGY_MCP_USER=admin # SYNOLOGY_MCP_PASSWORD=your_password SYNOLOGY_MCP_DOCKER_IMAGE=lordraw/synology-mcp:latest # Standalone mode — decommenta per usare synology_mcp_agent.py senza main_agent.py: # SYNOLOGY_MCP_PROVIDER=openrouter # SYNOLOGY_MCP_MODEL= # (SYNOLOGY_MCP_AI_PROVIDER / SYNOLOGY_MCP_AI_MODEL / OLLAMA_BASE_URL sono i # nomi storici, ancora accettati come fallback) # ══════════════════════════════════════════════════════════════════════════════ # PROXMOX AGENT (proxmox_mcp_agent.py) # ══════════════════════════════════════════════════════════════════════════════ # ─── Connessione Proxmox ────────────────────────────────────────────────────── PROXMOX_MCP_HOST=192.168.0.x PROXMOX_MCP_PORT=8006 PROXMOX_MCP_USER=root@pam PROXMOX_MCP_PASSWORD=your_password PROXMOX_MCP_VERIFY_SSL=false # PROXMOX_MCP_TOKEN_ID=mytoken # PROXMOX_MCP_TOKEN_SECRET=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx PROXMOX_MCP_DOCKER_IMAGE=lordraw/proxmox-mcp:latest # Standalone mode — decommenta per usare proxmox_mcp_agent.py senza main_agent.py: # PROXMOX_MCP_PROVIDER=openrouter # PROXMOX_MCP_MODEL= # ══════════════════════════════════════════════════════════════════════════════ # HOME ASSISTANT AGENT (homeassistant_mcp_agent.py) # ══════════════════════════════════════════════════════════════════════════════ # ─── Connessione Home Assistant ─────────────────────────────────────────────── HAOS_MCP_URL=http://192.168.0.x:8123 HAOS_MCP_TOKEN=your_long_lived_access_token # Provider e API key ereditati automaticamente da MAIN_AGENT_* — non serve duplicarli. # Standalone mode — decommenta per usare homeassistant_mcp_agent.py senza main_agent.py: # HAOS_MCP_PROVIDER=openrouter # ══════════════════════════════════════════════════════════════════════════════ # WATCHYOURLAN AGENT (watchyourlan_mcp_agent.py) # ══════════════════════════════════════════════════════════════════════════════ # ─── Connessione WatchYourLAN ───────────────────────────────────────────────── # WYL_BASE_URL è il nome della variabile usata dal container lordraw/watchyourlan-mcp WYLA_MCP_URL=http://192.168.0.x:8840 # WYLA_MCP_TIMEOUT=10 # timeout HTTP in secondi (default: 10) WYLA_MCP_DOCKER_IMAGE=lordraw/watchyourlan-mcp:latest # Provider e API key ereditati automaticamente da MAIN_AGENT_* — non serve duplicarli. # Standalone mode — decommenta per usare watchyourlan_mcp_agent.py senza main_agent.py: # WYLA_MCP_PROVIDER=openrouter # ══════════════════════════════════════════════════════════════════════════════ # PLEX AGENT (plex_mcp_agent.py) # ══════════════════════════════════════════════════════════════════════════════ # ─── Connessione Plex Media Server ──────────────────────────────────────────── # PLEX_SERVER_URL e PLEX_TOKEN sono i nomi usati dal container lordraw/plex-mcp PLEX_MCP_URL=http://192.168.0.x:32400 PLEX_MCP_TOKEN=your_plex_token_here # Come ottenere il token: accedi a plex.tv → apri un contenuto → menu → "Get Info" # → "View XML" → cerca X-Plex-Token nell'URL PLEX_MCP_DOCKER_IMAGE=lordraw/plex-mcp:latest # Provider e API key ereditati automaticamente da MAIN_AGENT_* — non serve duplicarli. # Standalone mode — decommenta per usare plex_mcp_agent.py senza main_agent.py: # PLEX_MCP_PROVIDER=openrouter # ══════════════════════════════════════════════════════════════════════════════ # ZABBIX AGENT (zabbix_mcp_agent.py) # ══════════════════════════════════════════════════════════════════════════════ # ─── Connessione Zabbix ─────────────────────────────────────────────────────── # ZABBIX_URL, ZABBIX_TOKEN, ZABBIX_USER, ZABBIX_PASSWORD, ZABBIX_VERIFY_SSL # sono i nomi usati dal container lordraw/zabbix-mcp ZABBIX_MCP_URL=http://192.168.0.x/zabbix # Auth via API token (Zabbix 5.4+, consigliato — ha la priorità su user/password): ZABBIX_MCP_TOKEN=your_zabbix_api_token # Auth alternativa via utente e password (usata solo se TOKEN non è impostato): # ZABBIX_MCP_USER=Admin # ZABBIX_MCP_PASSWORD=your_password # ZABBIX_MCP_VERIFY_SSL=false # disabilita la verifica TLS (default: true) ZABBIX_MCP_DOCKER_IMAGE=lordraw/zabbix-mcp:latest # Provider e API key ereditati automaticamente da MAIN_AGENT_* — non serve duplicarli. # Standalone mode — decommenta per usare zabbix_mcp_agent.py senza main_agent.py: # ZABBIX_MCP_PROVIDER=openrouter # ══════════════════════════════════════════════════════════════════════════════ # AGENTI AUTONOMI (lab_health_agent.py, linux_update_agent.py, # linux_inventory_agent.py — girano su schedule, non su richiesta) # ══════════════════════════════════════════════════════════════════════════════ # ─── Telegram (usato da lab_health_agent.py e linux_update_agent.py) ────────── # linux_inventory_agent.py non manda nulla su Telegram: scrive file Markdown. # TELEGRAM_BOT_TOKEN=123456:ABC-your-bot-token # TELEGRAM_ALLOWED_USERS=123456789,987654321 # chat id numerici, separati da virgola # ─── Lab Health Agent — health check periodico, sola lettura ────────────────── # LAB_HEALTH_INTERVAL_HOURS=12 # ogni N ore (gira anche all'avvio) # LAB_HEALTH_SCHEDULE_TIMES=06:00,19:00 # orari fissi HH:MM (ha priorità sull'intervallo) # LAB_HEALTH_PROVIDER= # vuoto/rotate = pool; oppure un provider; oppure "ollama" # LAB_HEALTH_MODEL= # LAB_HEALTH_MAX_TOKENS= # LAB_HEALTH_MAX_TOOL_RESULT_CHARS= # ─── Linux Update Agent — check/upgrade della flotta Linux ──────────────────── # LINUX_UPDATE_INTERVAL_HOURS=24 # LINUX_UPDATE_SCHEDULE_TIMES=12:00 # LINUX_UPDATE_DRY_RUN=true # true = solo report, non installa nulla # LINUX_UPDATE_EXCLUDE_SERVERS= # label separate da virgola, da NON aggiornare # LINUX_UPDATE_PROVIDER= # LINUX_UPDATE_MODEL= # LINUX_UPDATE_MAX_TOKENS= # LINUX_UPDATE_MAX_TOOL_RESULT_CHARS= # ─── Linux Inventory Agent — censimento read-only della flotta Linux ────────── # Nessun Telegram: scrive un .md per server (+ indice) in LINUX_INVENTORY_OUTPUT_DIR. # LINUX_INVENTORY_OUTPUT_DIR=docs/inventory # relativo alla root del repo # LINUX_INVENTORY_INTERVAL_HOURS=0 # 0 e nessuno schedule = esecuzione singola # LINUX_INVENTORY_SCHEDULE_TIMES= # LINUX_INVENTORY_ONLY_SERVERS= # label separate da virgola, se vuoto = tutti # LINUX_INVENTORY_EXCLUDE_SERVERS= # LINUX_INVENTORY_PROVIDER= # LINUX_INVENTORY_MODEL= # LINUX_INVENTORY_MAX_TOKENS= # LINUX_INVENTORY_MAX_TOOL_RESULT_CHARS=