# syntax=docker/dockerfile:1.7 ARG TORCHBASE_IMAGE=psyb0t/torchbase:py3.12-torch2.14-latest-cu126 FROM ghcr.io/astral-sh/uv:0.11.15@sha256:e590846f4776907b254ac0f44b5b380347af5d90d668138ca7938d1b0c2f98d3 AS uv FROM python:3.12-slim-bookworm@sha256:d193c6f51a7dbd10395d6328de3a7edb0516fb0608ca138036576f574c3e07d2 AS application-builder ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ UV_LINK_MODE=copy \ UV_PROJECT_ENVIRONMENT=/opt/app-venv COPY --from=ghcr.io/astral-sh/uv:0.11.15@sha256:e590846f4776907b254ac0f44b5b380347af5d90d668138ca7938d1b0c2f98d3 /uv /usr/local/bin/uv WORKDIR /app COPY pyproject.toml uv.lock README.md ./ COPY src ./src RUN --mount=type=cache,target=/root/.cache/uv \ uv sync --frozen --no-dev --no-editable \ && /opt/app-venv/bin/python -c "import decidealot" FROM ${TORCHBASE_IMAGE} AS provider-runtime ENV UV_LINK_MODE=copy USER root WORKDIR /build COPY requirements-providers-cuda.txt ./ RUN --mount=from=uv,source=/uv,target=/usr/local/bin/uv,readonly \ --mount=type=cache,target=/root/.cache/uv \ uv pip install --python /opt/torch-venv/bin/python --require-hashes -r requirements-providers-cuda.txt \ && /opt/torch-venv/bin/python -c "import laya, torch, von; assert torch.__version__ == '2.14.0+cu126'; assert torch.version.cuda == '12.6'" FROM provider-runtime AS runtime ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ HOME=/tmp \ PATH=/opt/app-venv/bin:$PATH \ DECIDEALOT_DEVICE=cuda \ DECIDEALOT_IMAGE_VARIANT=cuda \ DECIDEALOT_LOG_FILE=/tmp/decidealot.log \ PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True \ TORCHINDUCTOR_CACHE_DIR=/var/cache/torch-inductor \ TRITON_CACHE_DIR=/var/cache/triton \ TZ=UTC LABEL io.modelcontextprotocol.server.name="io.github.psyb0t/decidealot" RUN mkdir --parents /etc/decidealot /models /var/cache/torch-inductor /var/cache/triton \ && printf 'cuda\n' > /etc/decidealot/image-variant \ && chown --recursive 1000:1000 /models /var/cache COPY --from=application-builder /opt/app-venv /opt/app-venv COPY src/decidealot/clm_runtime.py /opt/decidealot/clm_runtime.py COPY src/decidealot/provider_entrypoint.py /opt/decidealot/provider_entrypoint.py USER 1000:1000 WORKDIR /app EXPOSE 8080 HEALTHCHECK --interval=10s --timeout=3s --start-period=900s --retries=5 \ CMD python -c "import sys, urllib.request; sys.exit(0 if urllib.request.urlopen('http://127.0.0.1:8080/health', timeout=2).status == 200 else 1)" ENTRYPOINT ["decidealot"]