#!/usr/bin/env bash set -Eeuo pipefail HERE=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd) REPO_ROOT=$(cd -- "$HERE/.." && pwd) MODEL=${MODEL:-"$REPO_ROOT/Qwen3.8-27B-IQ1_M.gguf"} LLAMA_SERVER=${LLAMA_SERVER:-llama-server} LLAMA_HOST=${LLAMA_HOST:-127.0.0.1} LLAMA_PORT=${LLAMA_PORT:-18539} ADAPTER_HOST=${ADAPTER_HOST:-127.0.0.1} ADAPTER_PORT=${ADAPTER_PORT:-18540} THREADS=${THREADS:-16} CTX_SIZE=${CTX_SIZE:-1024} LOG_DIR=${LOG_DIR:-"$HERE/runtime-logs"} mkdir -p "$LOG_DIR" [[ -f "$MODEL" ]] || { echo "Model not found: $MODEL" >&2; exit 2; } command -v "$LLAMA_SERVER" >/dev/null 2>&1 || { echo "llama-server not found: $LLAMA_SERVER" >&2; exit 3; } command -v python3 >/dev/null 2>&1 || { echo "python3 is required" >&2; exit 4; } cleanup() { local rc=$? [[ -n "${ADAPTER_PID:-}" ]] && kill -TERM "$ADAPTER_PID" 2>/dev/null || true [[ -n "${LLAMA_PID:-}" ]] && kill -TERM "$LLAMA_PID" 2>/dev/null || true wait "${ADAPTER_PID:-}" 2>/dev/null || true wait "${LLAMA_PID:-}" 2>/dev/null || true exit "$rc" } trap cleanup EXIT INT TERM "$LLAMA_SERVER" \ --model "$MODEL" \ --alias Qwen3.8-27B-IQ1_M-agentic \ --host "$LLAMA_HOST" \ --port "$LLAMA_PORT" \ --threads "$THREADS" \ --threads-batch "$THREADS" \ --ctx-size "$CTX_SIZE" \ --batch-size 512 \ --ubatch-size 128 \ --parallel 1 \ --cache-type-k q4_0 \ --cache-type-v q4_0 \ --jinja \ --reasoning off \ --reasoning-budget 0 \ --no-mmproj \ --cache-ram 0 \ --ctx-checkpoints 0 \ --no-warmup \ >"$LOG_DIR/llama-server.log" 2>&1 & LLAMA_PID=$! for _ in $(seq 1 600); do if curl -fsS --max-time 2 "http://$LLAMA_HOST:$LLAMA_PORT/health" >/dev/null 2>&1; then break fi kill -0 "$LLAMA_PID" 2>/dev/null || { tail -100 "$LOG_DIR/llama-server.log" >&2; exit 5; } sleep 1 done curl -fsS --max-time 2 "http://$LLAMA_HOST:$LLAMA_PORT/health" >/dev/null python3 -u "$HERE/ADAPTER.py" \ --host "$ADAPTER_HOST" \ --port "$ADAPTER_PORT" \ --upstream "http://$LLAMA_HOST:$LLAMA_PORT" \ >"$LOG_DIR/adapter.log" 2>&1 & ADAPTER_PID=$! for _ in $(seq 1 60); do if curl -fsS --max-time 2 "http://$ADAPTER_HOST:$ADAPTER_PORT/health" >/dev/null 2>&1; then break fi kill -0 "$ADAPTER_PID" 2>/dev/null || { tail -100 "$LOG_DIR/adapter.log" >&2; exit 6; } sleep 1 done curl -fsS --max-time 2 "http://$ADAPTER_HOST:$ADAPTER_PORT/health" >/dev/null echo "Agentic OpenAI-compatible endpoint: http://$ADAPTER_HOST:$ADAPTER_PORT/v1/chat/completions" echo "Logs: $LOG_DIR" wait "$ADAPTER_PID"