# PrismML Ternary-Bonsai 27B server (llama-server OpenAI-compatible API)
# Uses prebuilt binaries from PrismML-Eng/llama.cpp — required for Q2_0 g128 GGUFs.
#
# Build args:
#   BONSAI_BACKEND = cpu (default) | vulkan
#     cpu     — safe default for any host (SER5 PRO works well here)
#     vulkan  — AMD Radeon 680M offload; needs /dev/dri on the host + Mesa

ARG BONSAI_BACKEND=cpu

FROM ubuntu:24.04 AS base

ARG BONSAI_BACKEND
ENV DEBIAN_FRONTEND=noninteractive \
    BONSAI_BACKEND=${BONSAI_BACKEND} \
    PRISM_RELEASE=prism-b9596-9fcaed7

RUN apt-get update && apt-get install -y --no-install-recommends \
        ca-certificates curl tar libgomp1 \
    && if [ "$BONSAI_BACKEND" = "vulkan" ]; then \
         apt-get install -y --no-install-recommends \
           libvulkan1 mesa-vulkan-drivers vulkan-tools; \
       fi \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /opt/bonsai

# Prebuilt Prism llama.cpp (group-128 Q2_0 kernels)
RUN set -eux; \
    BASE="https://github.com/PrismML-Eng/llama.cpp/releases/download/${PRISM_RELEASE}"; \
    case "$BONSAI_BACKEND" in \
      vulkan) ASSET="llama-${PRISM_RELEASE}-bin-ubuntu-vulkan-x64.tar.gz"; DEST=bin/vulkan ;; \
      cpu|*)  ASSET="llama-${PRISM_RELEASE}-bin-ubuntu-x64.tar.gz";        DEST=bin/cpu ;; \
    esac; \
    mkdir -p "$DEST"; \
    curl -fL --retry 3 "$BASE/$ASSET" -o /tmp/llama.tgz; \
    tar -xzf /tmp/llama.tgz -C "$DEST" --strip-components=1 2>/dev/null \
      || tar -xzf /tmp/llama.tgz -C "$DEST"; \
    rm -f /tmp/llama.tgz; \
    test -x "$DEST/llama-server"; \
    ln -sf "/opt/bonsai/$DEST/llama-server" /usr/local/bin/llama-server; \
    printf '%s\n' "$PRISM_RELEASE" > "$DEST/.llama_release"

COPY entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh

# Models mounted at runtime: /models
VOLUME ["/models"]
EXPOSE 8080

ENV LD_LIBRARY_PATH=/opt/bonsai/bin/cpu:/opt/bonsai/bin/vulkan \
    MODEL_PATH=/models/Ternary-Bonsai-27B-Q2_0.gguf \
    HOST=0.0.0.0 \
    PORT=8080 \
    NGL=0 \
    CTX_SIZE=16384 \
    TEMP=0.7 \
    TOP_P=0.95 \
    TOP_K=20 \
    THREADS=0 \
    KV4=0 \
    EXTRA_ARGS=

HEALTHCHECK --interval=30s --timeout=10s --start-period=120s --retries=5 \
  CMD curl -fsS "http://127.0.0.1:${PORT}/health" || exit 1

ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
