Agent-Q3 / docker-compose.yml
madDegen's picture
feat: 6+1 model stack, kimi_distilled, moonshot backend, crash fixes, HF CLI
d9aa575 verified
Raw
History Blame Contribute Delete
8.15 kB
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