# heretic2-charrp-reasoning — modelopt NVFP4 + native MTP fast char-rp-reasoning seat on
# ana-ml2 GPU0, replacing the GGUF NEO-CODE reasoning seat (llama-charrp-reasoning, now retired).
# Same Heretic2/NEO-CODE model; ~77 tok/s (~1.3x over GGUF) via qwen3_5_mtp spec-decode.
#
# ⚠️ REQUIRES the MTP workaround: vLLM 0.24.0 doesn't propagate modelopt exclude_modules to the
# spec-decode DRAFT model, so the BF16 mtp head gets quantized -> shape crash. The mounted
# sitecustomize.py (conf/mtp-workaround/) force-skips mtp.* in is_layer_skipped. Without it the
# engine dies at load. Full recipe: eshpfi docs/runbooks/heretic2-nvfp4-mtp-seat.md.
#
# Co-located on GPU0 with vllm-aeon-gen (gen) + llama-charrp (char-rp). VRAM: NVFP4 27B weights
# ~26GB + KV. util 0.30 fits the ~33GB free alongside gen+char-rp -> max-model-len capped at
# 32768 (the GGUF seat did 256K on lighter Q5 weights; NVFP4 is heavier, so context is reduced
# until VRAM is rebalanced). Tunables in .env.

name: heretic2-charrp-reasoning

services:
  vllm-charrp-reasoning:
    image: ${REASONING_IMAGE:-vllm/vllm-openai:v0.24.0}
    container_name: ${REASONING_CONTAINER:-vllm-charrp-reasoning-nvfp4}
    restart: unless-stopped
    ipc: host
    ports:
      - "${REASONING_PORT:-8018}:8000"
    volumes:
      - /tank/aimodels:/tank/aimodels
      # The MTP draft-model quant workaround (sitecustomize.py). PYTHONPATH loads it in the
      # engine-core subprocess. See runbook landmine #4.
      - ./conf/mtp-workaround:/mtp-workaround:ro
    environment:
      - PYTHONPATH=/mtp-workaround
      - VLLM_API_KEY=${API_KEY:-}
    command:
      - ${REASONING_MODEL:-/tank/aimodels/heretic2-nvfp4-work/heretic2-modelopt-nvfp4-mtp}
      - --quantization
      - modelopt
      - --speculative-config
      - '{"method": "qwen3_5_mtp", "num_speculative_tokens": ${SPEC_TOKENS:-3}}'
      - --language-model-only
      - --mamba-cache-dtype
      - float32
      - --reasoning-parser
      - qwen3
      - --tool-call-parser
      - qwen3_coder
      - --enable-auto-tool-choice
      - --served-model-name
      - char-rp-reasoning
      - --max-model-len
      - "${REASONING_MAX_MODEL_LEN:-32768}"
      - --max-num-seqs
      - "${REASONING_MAX_NUM_SEQS:-4}"
      - --gpu-memory-utilization
      - "${REASONING_GPU_MEM_UTIL:-0.30}"
      - --kv-cache-dtype
      - fp8
      - --trust-remote-code
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              device_ids:
                - "${REASONING_GPU_ID:-0}"
              capabilities:
                - gpu
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 600s
    networks:
      - tnet
    labels:
      - homepage.group=AI - Inference
      - homepage.name=char-rp-reasoning (Heretic2 NVFP4+MTP)
      - homepage.icon=mdi-rocket-launch
      - homepage.description=NEO-CODE Heretic2 NVFP4 + native MTP, ~77 tok/s (ana-ml2 GPU0)
      - homepage.href=http://10.250.50.54:${REASONING_PORT:-8018}/docs

networks:
  tnet:
    name: traefik-net
    external: true
