# fablefusion-charrp-probe — THROWAWAY evaluation seat for
# kkuspa/Qwen3.6-27B-Fable-Fusion-711-Uncensored-Heretic-NM-DAU-MTP-NVFP4A16
# on ana-ml2 GPU1, served as `char-rp-probe` on :8019.
#
# ⚠️ THIS IS NOT A PRODUCTION SEAT. It exists to A/B against the live
# Dark-Scarlett `char-rp-reasoning` seat (:8018) on refusal rate. It is
# deliberately NOT wired into any LiteLLM alias — see the "no false aliases"
# rule: nothing may answer to `char-rp-reasoning` except the real seat.
#
# ⚠️ GPU1 IS ZERO-SUM. The card sits at ~94.9/97.9 GB with the utility cluster
# co-resident. This seat CANNOT run alongside darkscarlett-charrp-reasoning —
# it takes DS's vacated slot at the same util. Sequence:
#     docker compose -p darkscarlett-charrp-reasoning down
#     docker compose -p fablefusion-charrp-probe up -d      # probe
#     docker compose -p fablefusion-charrp-probe down
#     docker compose -p darkscarlett-charrp-reasoning up -d # restore
#
# Differences from the DS seat, and why:
#   --speculative-config : FF ships its 15 MTP tensors in bf16 and lists them
#                          in quantization_config.ignore, so MTP actually
#                          loads here (DS's quant dropped them). Depth 3 to
#                          match the gen seat, not the card's 5 — the card's
#                          1.56x was measured GREEDY, and acceptance falls at
#                          the temp 1.0 this seat is probed at.
#   --served-model-name  : char-rp-probe, never char-rp-reasoning.

name: fablefusion-charrp-probe

services:
  vllm-fablefusion-probe:
    image: ${FF_IMAGE:-vllm/vllm-openai:latest}
    container_name: ${FF_CONTAINER:-vllm-fablefusion-probe}
    restart: "no"          # throwaway: never resurrect itself across a reboot
    ipc: host
    ports:
      - "${FF_PORT:-8019}:8000"
    volumes:
      - /tank/aimodels:/tank/aimodels
    environment:
      - PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True
      - VLLM_API_KEY=${API_KEY:-}
    command:
      - ${FF_MODEL:-/tank/aimodels/fable-fusion-711-nvfp4a16}
      - --quantization
      - compressed-tensors
      - --language-model-only
      - --served-model-name
      - char-rp-probe
      - --reasoning-parser
      - qwen3
      - --tool-call-parser
      - qwen3_coder
      - --enable-auto-tool-choice
      - --max-model-len
      - "${FF_MAX_MODEL_LEN:-262144}"
      - --max-num-seqs
      - "${FF_MAX_NUM_SEQS:-32}"
      - --gpu-memory-utilization
      - "${FF_GPU_MEM_UTIL:-0.44}"
      - --kv-cache-dtype
      - fp8
      - --speculative-config
      - '{"method":"qwen3_5_mtp","num_speculative_tokens":${FF_MTP_DEPTH:-3}}'
      - --trust-remote-code
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              device_ids:
                - "${FF_GPU_ID:-1}"
              capabilities:
                - gpu
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 600s
    networks:
      - tnet

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