#!/usr/bin/env bash set -euo pipefail MODEL_NAME="${MODEL_NAME:-qwen2.5-coder:3b}" TRIAGE_MODEL="${TRIAGE_MODEL:-$MODEL_NAME}" ACTIONS_MODEL="${ACTIONS_MODEL:-$MODEL_NAME}" WRITER_MODEL="${WRITER_MODEL:-$MODEL_NAME}" OLLAMA_URL="${OLLAMA_URL:-http://127.0.0.1:11434}" export OLLAMA_URL MODEL_NAME TRIAGE_MODEL ACTIONS_MODEL WRITER_MODEL echo "[start.sh] Starting Ollama..." ollama serve > /tmp/ollama.log 2>&1 & OLLAMA_PID=$! # Wait until Ollama is ready python3 - << 'PY' import os, time, urllib.request base = os.environ.get("OLLAMA_URL","http://127.0.0.1:11434").rstrip("/") url = base + "/api/tags" for _ in range(180): try: urllib.request.urlopen(url, timeout=1).read() print("Ollama is up") raise SystemExit(0) except Exception: time.sleep(1) raise SystemExit("Ollama did not start") PY # Unique model list MODELS=("$MODEL_NAME" "$TRIAGE_MODEL" "$ACTIONS_MODEL" "$WRITER_MODEL") UNIQ=() for m in "${MODELS[@]}"; do seen=false for u in "${UNIQ[@]}"; do if [ "$u" = "$m" ]; then seen=true; fi done if [ "$seen" = false ]; then UNIQ+=("$m"); fi done echo "[start.sh] Ensuring models exist..." for m in "${UNIQ[@]}"; do echo "[start.sh] model: $m" if ! ollama show "$m" >/dev/null 2>&1; then echo "[start.sh] pulling $m..." ollama pull "$m" else echo "[start.sh] already present" fi done echo "[start.sh] Warming up models..." python3 - << 'PY' import os, json, urllib.request base = os.environ.get("OLLAMA_URL","http://127.0.0.1:11434").rstrip("/") ctx = int(os.environ.get("OLLAMA_CONTEXT_LENGTH","4096")) models = [] for k in ("MODEL_NAME","TRIAGE_MODEL","ACTIONS_MODEL","WRITER_MODEL"): v = os.environ.get(k) if v and v not in models: models.append(v) for m in models: payload = { "model": m, "prompt": "ping", "stream": False, "options": {"num_ctx": ctx, "num_predict": 16} } req = urllib.request.Request( base + "/api/generate", data=json.dumps(payload).encode(), headers={"Content-Type":"application/json"}, ) urllib.request.urlopen(req, timeout=1800).read() print("Warmup OK:", m) PY echo "[start.sh] Launching app..." exec python3 /app/app.py