Funk-lab/ansible/roles/litellm/README.md
ALI YESILKAYA 577d61ebaa
feat: anti-502 LLM — heartbeat (litellm) + watchdog auto-réparation (llama_server) (#23)
* feat(litellm): heartbeat anti-502 + request_timeout 20s

Cause racine du 502 « 1ʳᵉ demande après une pause » : la connexion keep-alive
LiteLLM↔llama-server devient inactive → llama-server la ferme → LiteLLM garde le
socket mort → la requête suivante part dans le vide → timeout → 502.

- llm-heartbeat : service systemd qui appelle hermes-default toutes les 15s
  (max_tokens:1, /no_think → ~10ms GPU) → la connexion n'est jamais inactive,
  jamais périmée. Logge les échecs → sert aussi de sonde (vraie génération).
- request_timeout 60→20s : un socket périmé échoue vite, dans la fenêtre où
  num_retries:2 peut rejouer sur une connexion neuve (sinon le client abandonnait
  avant le retry → 502 sec).
- Doc : admin/incidents-llm-gpu.md (fix racine) + README rôle.

⚠️ heartbeat appelle hermes-default en continu → si bascule sur Claude (facturé),
mettre llm_heartbeat_enabled: false. request_timeout global → remonter si Claude.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* feat(llama_server): watchdog auto-réparation du wedge ROCm

Service systemd local sur gpu-01 qui sonde une vraie génération sur :1234
(pas juste /health, qui ment quand le slot d'inférence est figé). Sur N
échecs consécutifs → systemctl restart llama-server en local (root, sans
SSH/sudo distant). Gère le 503 "Loading model" post-restart sans le compter
comme échec.

Complète le llm-heartbeat (rôle litellm) : le heartbeat empêche la péremption
par inactivité de la connexion ; le watchdog répare le figeage du serveur lui-même.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 20:52:29 +02:00

41 lines
2.6 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# litellm
Proxy LLM multi-modèles sur storage-01 (`:4000`) — point d'entrée unique pour Hermes, n8n, Open WebUI et ask-agent. Route vers llama-server (gpu-01) ou l'API Anthropic.
## Ce que fait le rôle
- venv `/opt/litellm/venv` avec `litellm[proxy]`, user système `litellm`
- Config `/etc/litellm/config.yaml` : alias `hermes-default`, `qwen3-8b`, `system`, `monitor`, `claude…`
- Service systemd + scripts utilitaires :
- `/usr/local/bin/ask-agent` — délégation inter-agents (texte → profil system/monitor/brain)
- `/usr/local/bin/hermes-switch` — bascule l'alias `hermes-default` entre qwen (local) et claude (API), puis restart litellm
- `/usr/local/bin/funk-cluster` — orchestration start/stop/status du homelab
- `/usr/local/bin/llm-heartbeat` (+ service `llm-heartbeat`) — garde chaud le tuyau
LiteLLM↔llama-server : petit appel à `hermes-default` toutes les `llm_heartbeat_interval` s.
Empêche la connexion keep-alive de devenir périmée → supprime le 502 « 1ʳᵉ demande après
une pause » (cf. `admin/incidents-llm-gpu.md`). Logge les échecs (`journalctl -u llm-heartbeat`).
## Variables principales
| Variable | Défaut |
|---|---|
| `litellm_host` / `litellm_port` | `0.0.0.0` / 4000 |
| `litellm_master_key` | `lm-studio` (clé API attendue par les clients) |
| `litellm_local_llm_base_url` | `http://192.168.10.20:1234/v1` |
| `litellm_anthropic_api_key` | `{{ vault_anthropic_api_key }}` |
| `llm_heartbeat_enabled` | `true` |
| `llm_heartbeat_interval` | `15` (s — doit rester < à l'idle keep-alive du llama-server) |
| `llm_heartbeat_model` / `llm_heartbeat_timeout` | `hermes-default` / `20` |
## Timeouts & résilience (anti-502 « connexion périmée »)
`litellm_settings` : `request_timeout: 20` (court un socket périmé échoue vite) + `num_retries: 2`
(rejoue sur une connexion neuve). Combiné au **heartbeat** (connexion jamais inactive) et au
retry côté STT-server : la chaîne tolère les blips et les redémarrages de llama-server.
`request_timeout` est global si `hermes-default` passe sur **Claude** (raisonnement long), le remonter.
## Caveat
- L'alias `hermes-default` est **ce que Hermes consomme** changer le modèle derrière l'alias ne nécessite pas de reconfigurer Hermes
- `hermes-switch` modifie `/etc/litellm/config.yaml` **en dehors d'Ansible** : un `--tags litellm` réécrit la config et peut écraser un switch manuel vers claude
- Le **heartbeat** appelle `hermes-default` en continu : si tu bascules sur Claude (API facturée), pense à `llm_heartbeat_enabled: false` pour ne pas générer de coût en arrière-plan