| # Restore from 4bac0e2 + patch frontend + backend models | |
| FROM node:20-alpine AS frontend-builder | |
| RUN apk add --no-cache git python3 | |
| RUN git clone --depth 1 https://huggingface.co/spaces/smolagents/ml-intern /source | |
| # Patch frontend: add Gemini + Qwen3 models to dropdown | |
| COPY patch_frontend.py /tmp/patch_frontend.py | |
| RUN python3 /tmp/patch_frontend.py | |
| WORKDIR /source/frontend | |
| RUN npm install && npm run build | |
| # Stage 2: Production | |
| FROM python:3.12-slim | |
| COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/ | |
| RUN useradd -m -u 1000 user | |
| WORKDIR /app | |
| RUN apt-get update && apt-get install -y --no-install-recommends git curl ca-certificates && rm -rf /var/lib/apt/lists/* | |
| RUN git clone --depth 1 https://huggingface.co/spaces/smolagents/ml-intern /tmp/source && \ | |
| cp /tmp/source/pyproject.toml /tmp/source/uv.lock ./ && \ | |
| cp -r /tmp/source/agent ./agent && \ | |
| cp -r /tmp/source/backend ./backend && \ | |
| cp -r /tmp/source/configs ./configs && \ | |
| rm -rf /tmp/source | |
| RUN uv sync --no-dev --frozen | |
| COPY --from=frontend-builder /source/frontend/dist ./static/ | |
| COPY configs/frontend_agent_config.json ./configs/frontend_agent_config.json | |
| # Patch backend: accept new model IDs | |
| COPY patch_models.py /tmp/patch_models.py | |
| RUN python /tmp/patch_models.py | |
| RUN mkdir -p /app/session_logs && chown -R user:user /app | |
| USER user | |
| ENV HOME=/home/user \ | |
| PYTHONUNBUFFERED=1 \ | |
| PYTHONPATH=/app \ | |
| PATH="/app/.venv/bin:$PATH" | |
| EXPOSE 7860 | |
| WORKDIR /app/backend | |
| # python:slim does not include bash by default; start.sh is POSIX-compatible. | |
| CMD ["sh", "start.sh"] | |