#!/usr/bin/env bash
# llama-embed-heartbeat — garde chaud le slot d'embedding nomic (:1238).
#
# Le piège (cf. admin/ia/stt.md) : l'instance d'embedding part à froid après une pause
# (slot GPU inactif) → la 1ʳᵉ requête est lente (5-8 s) et dépasse le timeout du STT-server
# (4 s) → recall mémoire vide ET RAG documentaire raté (`docs=0`) → réponses non ancrées.
#
# Un petit embed périodique (modèle minuscule, ~10-50 ms GPU) garde le slot résident → la
# 1ʳᵉ vraie requête tombe sur un slot chaud. Pendant logique au `llm-heartbeat` (rôle litellm)
# qui garde chaud le slot de CHAT. Logge les échecs → sert aussi de sonde de l'instance embed.
set -u

URL="http://127.0.0.1:{{ llama_embed_port }}/v1/embeddings"
MODEL="{{ llama_embed_model_alias }}"
INTERVAL="{{ llama_embed_heartbeat_interval }}"
TIMEOUT="{{ llama_embed_heartbeat_timeout }}"

payload="{\"model\":\"${MODEL}\",\"input\":\"ping\"}"

fails=0
while true; do
  code=$(curl -s -m "$TIMEOUT" -o /dev/null -w '%{http_code}' \
    "$URL" -H 'Content-Type: application/json' -d "$payload" 2>/dev/null || echo "000")
  if [ "$code" = "200" ]; then
    fails=0
  else
    fails=$((fails + 1))
    echo "embed-heartbeat: KO (HTTP ${code}) — ${fails} échec(s) consécutif(s)"
  fi
  sleep "$INTERVAL"
done
