# Sidecar-служба локального агента (intent+slots) для планшета. # route.ts зовёт её по HTTP (AGENT_URL) и исполняет команды-действия офлайн. # # Веса дообученной модели (joint_model/, ~115 МБ) в git НЕ идут и в образ НЕ # пекутся — они МОНТИРУЮТСЯ томом в /app/joint_model при запуске (см. RUNBOOK). # Базовая ruBERT-tiny2 запекается в образ при сборке, чтобы на старте не ходить # в интернет. FROM python:3.12-slim WORKDIR /app ENV HF_HUB_DISABLE_XET=1 # CPU-torch из cpu-индекса (без CUDA — образ легче). RUN pip install --no-cache-dir --index-url https://download.pytorch.org/whl/cpu torch \ && pip install --no-cache-dir transformers sentencepiece # Запекаем базовую модель в кэш образа (runtime без сети). RUN python -c "from transformers import AutoModel, AutoTokenizer; \ AutoModel.from_pretrained('cointegrated/rubert-tiny2'); \ AutoTokenizer.from_pretrained('cointegrated/rubert-tiny2')" COPY joint_model_def.py tablet_map.py predict.py ./ ENV THRESHOLD=0.7 EXPOSE 8091 # Модель ждём в /app/joint_model (том). predict.py --serve поднимает HTTP: # POST /predict {"text": "..."} -> {intent, slots, score, tool} CMD ["python", "predict.py", "--serve", "--port", "8091"]