user@works: ~/llm-proxy online http://127.0.0.1:8080

$ cat PRESENTATION.md

Tous vos outils de code branchés sur Albert

llm-proxy est une passerelle HTTP locale entre les harnais agentiques et l'API Albert d'Etalab. Elle répare les appels d'outils, adapte les requêtes, régule le quota et traduit le format Anthropic vers OpenAI. Elle couvre toute l'API Albert : conversation, vision, OCR, audio, embeddings et reclassement.

langage Rust licence Ouverte 2.0 cible https://albert.api.etalab.gouv.fr/v1

trace --aller-retour

Anthropic OpenAI balises XML appel d'outil votre agent Claude Code llm-proxy 127.0.0.1:8080 quota de la minute attente Albert API d'Etalab Anthropic OpenAI balises XML appel d'outil votre agent Claude Code llm-proxy 127.0.0.1:8080 quota de la minute attente Albert API d'Etalab
  1. INFOSi l'agent parle Anthropic ou l'API Responses, le proxy traduit sa requête en OpenAI.
  2. WARNSi le quota de la minute est plein, le proxy retient la requête le temps qu'une place se libère.
  3. WARNSi l'appel d'un outil est en XML, le proxy le corrige.
  4. OKL'agent reçoit une réponse qu'il sait lire.

features --list

INFO

Votre agent est câblé en une ligne

Le proxy écoute sur 127.0.0.1:8080. Tout agent qui parle OpenAI, Anthropic ou l'API Responses s'y branche, sans clé Albert à gérer.

INFO

La traduction Anthropic vers OpenAI, dans les deux sens

Le proxy traduit une requête Anthropic vers OpenAI avant de l'envoyer à Albert. La réponse fait le chemin inverse, sans que l'agent le remarque.

OK

Le quota tient, même sous rafale

Le régulateur de débit compte ce qu'Albert a déjà reçu dans la minute, prédit le coût du tour suivant et ne retient que ce qu'il faut. Mesuré sur la même conversation : 8 refus sans lui, 0 avec.

fenêtre pleine avant l'envoi      la requête attend la place
fenêtre pleine après la réponse   la fin de réponse attend, ping toutes les 15 s
rafale d'un agent                 la cadence est lissée, pause maximale d'une quinzaine de secondes
429 malgré tout                   reprise après réouverture, 6 s au moins
quota du jour                     le modèle est mis en pause jusqu'à minuit UTC
WARN

La réponse arrive en balises XML au lieu d'un appel d'outil

"content": "<tool_call><function=write_file>..."
"tool_calls": []          // vide
"finish_reason": "stop"   // devrait être tool_calls

Le proxy lit les balises, génère un identifiant et reconstruit la structure JSON attendue par le harnais.

"content": null
"tool_calls": [{ "id": "call_a3f9", "function": { "name": "write_file", ... } }]
"finish_reason": "tool_calls"
INFO

Albert est strict sur les spécifications

Le proxy adapte chaque requête avant transmission, dans les deux sens, pour qu'un harnais écrit pour OpenAI ou Anthropic fonctionne sans modification.

INFO

Toute l'API Albert, plus une supervision

servi en permanence
/v1/chat/completionsclients compatibles OpenAI, vision et OCR compris
/v1/responsesAPI Responses d'OpenAI, pour DBeaver
/v1/messagesClaude Code, format Anthropic
/v1/messages/count_tokensestimation du nombre de jetons
/v1/audio/transcriptionstranscription audio
/v1/embeddingsRAG, par le régulateur de débit
/v1/rerankreclassement, par le régulateur de débit
/v1/collectionsRAG, relayé tel quel, comme /v1/documents, /v1/chunks et /v1/search
/v1/modelstous les modèles d'Albert
/api/v1/modelsles modèles de conversation, forme LM Studio
/v1/me/info, /v1/me/usagelimites et consommation du compte
servi si STATUS_ENABLED=true, interface locale seulement
/page d'état, rafraîchie chaque seconde
/statusle même état, en JSON
/chatbac à sable, pour vérifier l'installation
/logle journal en direct et /journal en JSON
/majy a-t-il une version plus récente ?
INFO

Ce que le proxy a vu passer

La vue direct montre ce que le régulateur retient à l'instant, la saturation du quota par minute et son histogramme sur la dernière demi-heure, les appels par agent et par modèle. La vue bilan dit ce que le proxy a évité depuis son installation, ses cumuls survivent au redémarrage. Elle n'accepte que l'interface locale.

Page d'état du proxy : douze cartes, le régulateur de débit en tête avec ses attentes et ses plafonds, puis la saturation du quota par minute et son histogramme sur une demi-heure, les appels aboutis par modèle puis par client, les corrections appliquées, la fidélité de la traduction, les refus 429 et cooldowns, les requêtes par endpoint, les fenêtres de contexte connues, les réglages du proxy et le bilan face à un branchement direct

./llm-proxy

INFO  proxy::http: en écoute sur 127.0.0.1:8080
INFO  proxy::albert: modèles du compte découverts

Chaque archive contient l'exécutable et la documentation de la version. Il reste à poser votre clé Albert dans un fichier .env.

Écrit par Jérôme Bousquié de Université Toulouse Capitole et Olivier Booklage de académie de Bordeaux. Code sous Licence Ouverte 2.0 (Etalab).