Proxy API LLM CCX : Unifier Claude, Codex et Gemini
L’unification des endpoints LLM est un casse-tête technique majeur. Le Proxy API LLM CCX résout la fragmentation des formats de payload entre Anthropic, OpenAI et Google.
Chaque fournisseur impose sa propre structure de messages, ses paramètres de température et ses gestionnaires d’erreurs. Utiliser trois SDK différents augmente la surface de maintenance de 300%.
Ce guide détaille l’implémentation d’une couche d’abstraction technique. Vous apprendrez à router, transformer et normaliser vos requêtes vers n’importe quel modèle via un seul format standardisé.
🛠️ Prérequis
Environnement Linux (Debian/Ubuntu recommandé) avec les dépendances suivantes :
- Perl 5.38 ou supérieur
- Mojolicious 9.x (pour le serveur HTTP)
- Mojo::UserAgent (pour le proxying)
- JSON::MaybeXS (pour le parsing)
- LWP::Protocol::https (pour le support TLS)
Installation rapide :sudo apt update && sudo apt install perl libmojolicious-perl libjson-maybexs-perl liblwp-protocol-https-perl
📚 Comprendre Proxy API LLM CCX
Le Proxy API LLM CCX repose sur le pattern Adapter. Il intercepte une requête standardisée et la réécrit selon le fournisseur cible.
Client (Standard Format)
|
v
[ Proxy API LLM CCX ]
|
+--[ Logic: Model Mapping ]
|
+--[ Logic: Payload Transformation ]
|
v
[ Claude / Codex / Gemini API ]
Contrairement à un simple reverse proxy comme Nginx, le CCX modifie le corps de la requête (le JSON). Il extrait le champ ‘model’ pour décider de la destination. Il réorganise ensuite le tableau ‘messages’ car Claude utilise un champ ‘system’ séparé, contrairement à l’API OpenAI.
🐪 Le code — Proxy API LLM CCX
📖 Explication
Dans le script principal, la fonction transform_payload est le cœur de l’intelligence du Proxy API LLM CCX. J’ai choisi Mojo::UserAgent car il gère nativement le non-bloquant, crucial pour un proxy traitant plusieurs flux simultanés.
La ligne grep { $_->{role} ne 'system' } est une technique Perl classique pour filtrer les éléments d’un tableau. Elle permet d’isoler les messages de type ‘user’ ou ‘assistant’ pour les réinjecter dans le format Anthropic. L’utilisation de decode_json($res->body) est nécessaire car le corps de la réponse du fournisseur est une chaîne brute, et nous devons le ré-encapsuler pour le client.
Attention au piège : si vous ne gérez pas le cas où le message ‘system’ est absent, la variable $system->[0] provoquera une erreur de référence nulle (undef). L’opérateur // '' (defined-or) est utilisé ici pour assurer une chaîne vide par défaut.
🔄 Second exemple
▶️ Exemple d’utilisation
Exécution du proxy sur le port 3000 :perl proxy_server.pl daemon
Test via CURL vers le Proxy API LLM CCX :
curl -X POST http://localhost:3000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "claude-3",
"messages": [
{"role": "system", "content": "Tu es un expert Perl."},
{"role": "user", "content": "Explique le CPAN."}
]
}'
Sortie attendue (format normalisé) :
{
"choices": [
{
"message": {
"role": "assistant",
"content": "Le CPAN est le Comprehensive Perl Archive Network..."
}
}
],
"usage": { "total_tokens": 42 }
}
🚀 Cas d’usage avancés
1. A/B Testing de modèles
Configurez le Proxy API LLM CCX pour envoyer 10% du trafic vers Gemini et 90% vers Claude. Comparez la qualité des réponses via un script de scoring sans changer une seule ligne de code sur votre application mobile.
2. Audit de coût par utilisateur
Le proxy peut intercepter le nombre de tokens utilisés (présent dans la réponse JSON des fournisseurs) et incrémenter un compteur dans Redis. Cela permet de facturer vos utilisateurs au token réel consommé.
3. Cache de réponses identiques
Pour les prompts récurrents (ex: ‘Bonjour’), le Proxy API LLM CCX peut vérifier une clé dans Redis. Si le hash du prompt existe, il renvoie la réponse sans appeler l’API externe, réduant la latence de 500ms à 5ms.
✅ Bonnes pratiques
Pour un déploiement en production, respectez ces principes de robustesse :
- Utilisez des variables d’environnement pour toutes les configurations sensibles.
- Implémentez un logging structuré (JSON) pour faciliter l’analyse via ELK ou Loki.
- Utilisez un conteneur Docker léger (Alpine Linux) pour isoler le runtime Perl.
- Limitez le débit (Rate Limiting) au niveau du proxy pour éviter l’épuisement de votre budget API.
- Utilisez le mode ‘streaming’ (Server-Sent Events) si vous devez afficher la réponse mot à mot.
- Unification des formats de payload via le pattern Adapter.
- Transformation spécifique du champ 'system' pour Claude.
- Injection sécurisée des clés API côté serveur.
- Réduction de la complexité client de 3x à 1x.
- Gestion centralisée des timeouts et des retries.
- Possibilité d'implémenter un cache de réponses (Redis).
- Monitoring des coûts via l'interception des tokens.
- Architecture prête pour le circuit breaking.
❓ Questions fréquentes
Le proxy ajoute-t-il une latence significative ?
Sur un réseau local, l’overhead est inférieur à 2ms. L’essentiel de la latence provient de l’appel distant à l’API LLM elle-même.
Peut-on utiliser ce proxy avec du streaming ?
Oui, mais cela nécessite d’utiliser les méthodes de streaming de Mojolicious pour transmettre les chunks SSE sans attendre la fin de la réponse.
Est-ce sécurisé pour une application publique ?
Seulement si vous ajoutez une couche d’authentification (JWT ou API Key) avant le Proxy API LLM CCX pour empêcher l’usage abusif par des tiers.
Peut-on ajouter un modèle local (Llama 3) ?
Absolument. Il suffit d’ajouter l’URL de votre instance Ollama ou LocalAI dans la configuration du proxy.
📚 Sur le même blog
🔗 Le même sujet sur nos autres blogs
📝 Conclusion
Le Proxy API LLM CCX transforme une architecture fragmentée en un système cohérent et maintenable. En centralisant la logique de transformation, vous libérez vos développeurs des contraintes spécifiques à chaque fournisseur. Pour aller plus loin, explorez l’intégration de Prometheus pour monitorer les taux d’erreur en temps réel. Document référence : documentation Perl officielle. Un proxy bien conçu est invisible, mais ses pannes sont fatales.