version: "3.9" # ============================================================================= # Agent-Q3 — 8-container stack # Ollama Cloud model stack (nicholasjmcleod namespace) # ============================================================================= # # Model → role mapping: # nicholasjmcleod/kimi-linear:q6_k reasoner /v1/instruct /v1/chat (multimodal) # nicholasjmcleod/harmonic-hermes:q6_k tandem /v1/tandem stage-2 + /v1/monitor analysis # nicholasjmcleod/ultracoder:q4_k_m coder /v1/code /v1/tandem stage-3 + monitor remediation # nicholasjmcleod/qwopus:q8_0 fallback /v1/fallback # nicholasjmcleod/qwen3-coder-53b:q6_k coder_ded /v1/coder # nicholasjmcleod/genstruct:q6_k genstruct /v1/generate (structure middleware) # nicholasjmcleod/infinity-parser:latest parser /v1/parse (parse middleware) # # Containers: # ollama — Ollama Cloud proxy (nicholasjmcleod signed-in) # redis — shared memory (cache, sessions, events) # mcp-bridge — :8004 unified MCP gateway (.mcp.json) # multimodal — :8000 reasoner + tandem + coder + fallback + genstruct + parser # coder — :8001 coder_dedicated (Qwen3-Coder-53B) # research — :8002 Perplexity/Exa/Tavily/Free/Polymarket + synthesis # monitor — :8003 Harmonic-Hermes (analysis) + Ultra-Coder (remediation) # open-webui — :3000 GUI # ============================================================================= x-app-base: &app-base build: context: . dockerfile: Dockerfile env_file: - .env environment: OLLAMA_BASE_URL: "http://ollama:11434" REDIS_URL: "redis://redis:6379/0" COMPUTE_STRATEGY: "cloud_priority" REQUEST_TIMEOUT_SECS: "300" OLLAMA_CLOUD_ENABLED: "true" REASONER_MODEL: "nicholasjmcleod/kimi-linear:q6_k" TANDEM_MODEL: "nicholasjmcleod/harmonic-hermes:q6_k" CODER_MODEL: "nicholasjmcleod/ultracoder:q4_k_m" FALLBACK_MODEL: "nicholasjmcleod/qwopus:q8_0" CODER_DEDICATED_MODEL: "nicholasjmcleod/qwen3-coder-53b:q6_k" GENSTRUCT_MODEL: "nicholasjmcleod/genstruct:q6_k" INFINITY_PARSER_MODEL: "nicholasjmcleod/infinity-parser:latest" MONITOR_MODEL: "nicholasjmcleod/harmonic-hermes:q6_k" MONITOR_CODER_MODEL: "nicholasjmcleod/ultracoder:q4_k_m" depends_on: redis: condition: service_healthy ollama: condition: service_healthy volumes: - ./skills:/app/skills:ro - ./plugins:/app/plugins:ro - ./.mcp.json:/app/.mcp.json:ro restart: unless-stopped services: # ── Shared memory ───────────────────────────────────────────────────────── redis: image: redis:7-alpine container_name: agent-q3-redis ports: - "6379:6379" volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 3s retries: 10 restart: unless-stopped # ── Ollama Cloud proxy ───────────────────────────────────────────────────── # Device key at /root/.ollama/id_ed25519 enables cloud model pull. # Models pulled from nicholasjmcleod namespace on Ollama Cloud. ollama: build: context: . dockerfile: Dockerfile.ollama container_name: agent-q3-ollama ports: - "11434:11434" volumes: - ~/.ollama:/root/.ollama environment: OLLAMA_HOST: "0.0.0.0" OLLAMA_ORIGINS: "*" OLLAMA_KEEP_ALIVE: "24h" OLLAMA_MAX_LOADED_MODELS: "7" restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:11434/"] interval: 15s timeout: 5s retries: 20 start_period: 60s # ── MCP Bridge ──────────────────────────────────────────────────────────── mcp-bridge: <<: *app-base container_name: agent-q3-mcp-bridge ports: - "8004:8004" command: ["python", "-m", "uvicorn", "orchestrator.services.mcp_bridge:app", "--host", "0.0.0.0", "--port", "8004", "--log-level", "info"] healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8004/health"] interval: 30s timeout: 10s retries: 5 # ── Multimodal — Kimi-Linear + Harmonic-Hermes + Ultra-Coder + Qwopus ──── multimodal: <<: *app-base container_name: agent-q3-multimodal ports: - "8000:8000" command: ["python", "-m", "uvicorn", "orchestrator.main:app", "--host", "0.0.0.0", "--port", "8000", "--log-level", "info"] healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/health"] interval: 30s timeout: 10s retries: 5 # ── Dedicated Coder — Qwen3-Coder-53B TOTAL-RECALL ─────────────────────── coder: <<: *app-base container_name: agent-q3-coder ports: - "8001:8001" command: ["python", "-m", "uvicorn", "orchestrator.services.coder:app", "--host", "0.0.0.0", "--port", "8001", "--log-level", "info"] healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8001/health"] interval: 30s timeout: 10s retries: 5 # ── Deep Research ───────────────────────────────────────────────────────── research: <<: *app-base container_name: agent-q3-research ports: - "8002:8002" command: ["python", "-m", "uvicorn", "orchestrator.services.research:app", "--host", "0.0.0.0", "--port", "8002", "--log-level", "info"] healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8002/health"] interval: 30s timeout: 10s retries: 5 # ── Monitor — Harmonic-Hermes (analysis) + Ultra-Coder (remediation) ───── monitor: <<: *app-base container_name: agent-q3-monitor ports: - "8003:8003" environment: OLLAMA_BASE_URL: "http://ollama:11434" REDIS_URL: "redis://redis:6379/0" MONITOR_MODEL: "nicholasjmcleod/harmonic-hermes:q6_k" MONITOR_CODER_MODEL: "nicholasjmcleod/ultracoder:q4_k_m" MONITOR_POLL_INTERVAL_SECS: "30" MONITOR_TARGETS: "http://multimodal:8000,http://coder:8001,http://research:8002,http://mcp-bridge:8004,http://ollama:11434" command: ["python", "-m", "uvicorn", "orchestrator.services.monitor:app", "--host", "0.0.0.0", "--port", "8003", "--log-level", "info"] healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8003/health"] interval: 30s timeout: 10s retries: 5 # ── Open WebUI ──────────────────────────────────────────────────────────── open-webui: image: ghcr.io/open-webui/open-webui:main container_name: agent-q3-webui ports: - "3000:8080" volumes: - open_webui_data:/app/backend/data environment: OLLAMA_BASE_URL: "http://ollama:11434" WEBUI_SECRET_KEY: ${WEBUI_SECRET_KEY:-change-me-in-env} ENABLE_SIGNUP: "true" DEFAULT_MODELS: "nicholasjmcleod/kimi-linear:q6_k" depends_on: ollama: condition: service_healthy restart: unless-stopped volumes: redis_data: driver: local open_webui_data: driver: local