FROM python:3.11-slim WORKDIR /app # Install system dependencies + redis-server for sidecar RUN apt-get update && apt-get install -y --no-install-recommends \ curl \ git \ build-essential \ redis-server \ && rm -rf /var/lib/apt/lists/* # Install Python dependencies # torch CPU FIRST (the PyPI default wheel is the CUDA build, ~2.5 GB) — the # risk-scorer and advisory layers run on PyTorch (the ONNX export was unreliable). RUN pip install --no-cache-dir torch --index-url https://download.pytorch.org/whl/cpu COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # Part B Change 4 — persistent local-model cache. # Model weights are downloaded ONCE at build time from the public HF Hub # (free, unmetered — Hub downloads are NOT Inference API calls) into # /app/models, and HF_HOME points there for the runtime. A running container # therefore makes ZERO network calls for scoring: no Inference API, no token, # no credits. If AI_SCORER_MODEL is changed at runtime without a rebuild, the # pipeline transparently downloads the new checkpoint on first use. ENV HF_HOME=/app/models RUN python3 -c "from transformers import pipeline; pipeline('zero-shot-classification', model='typeform/distilbert-base-uncased-mnli', device=-1)" \ && echo "[BUILD] local scorer checkpoint baked into image" # Copy app source AND entrypoint COPY app/ ./app/ COPY entrypoint.py . EXPOSE 7860 # Use the entrypoint that starts redis + celery worker + uvicorn CMD ["python3", "entrypoint.py"]