Funk-lab/ansible/roles/litellm/templates/config.yaml.j2
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

46 lines
1.8 KiB
Django/Jinja
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

model_list:
# Alias Hermes — changer uniquement ce bloc pour switcher le modèle de Hermes
# sans toucher à la configuration de Hermes lui-même
- model_name: hermes-default
litellm_params:
model: openai/qwen3-8b
api_base: {{ litellm_local_llm_base_url }}
api_key: {{ litellm_local_llm_api_key }}
# Pour passer Hermes sur Claude : remplacer les 3 lignes ci-dessus par :
# model: anthropic/claude-sonnet-4-6
# api_key: os.environ/ANTHROPIC_API_KEY
# Modèles accessibles directement par nom
- model_name: qwen3-8b
litellm_params:
model: openai/qwen3-8b
api_base: {{ litellm_local_llm_base_url }}
api_key: {{ litellm_local_llm_api_key }}
- model_name: claude-sonnet-4-6
litellm_params:
model: anthropic/claude-sonnet-4-6
api_key: os.environ/ANTHROPIC_API_KEY
- model_name: claude-opus-4-7
litellm_params:
model: anthropic/claude-opus-4-7
api_key: os.environ/ANTHROPIC_API_KEY
litellm_settings:
drop_params: true
# Timeout PAR tentative. Doit rester COURT : sur une connexion keep-alive périmée
# (llama-server ferme les sockets inactifs), la 1ʳᵉ tentative hang jusqu'à ce timeout.
# Il doit être < au budget total du STT-server (2×30s) pour que `num_retries`
# ci-dessous ait le temps de rejouer AVANT que le client abandonne (sinon 502 sec).
# qwen3-8b /no_think répond en <8s → 20s laisse une grosse marge.
# ⚠️ Si on bascule hermes-default sur Claude (raisonnement long), remonter cette valeur.
request_timeout: 20
# Rejoue une requête échouée (timeout/erreur réseau) : la 2ᵉ tentative évince la
# connexion morte du pool → repart sur une connexion neuve. Avec request_timeout=20,
# un blip « connexion périmée » se résorbe en ~20s au lieu d'un 502.
num_retries: 2
general_settings:
master_key: {{ litellm_master_key }}