Exécutez un proxy local compatible OpenAI pour tous les grands services d'IA dans le cloud. Enregistrez vos clés API une seule fois et laissez n'importe quelle application cliente — ordinateur, mobile ou web — dialoguer avec http://localhost au lieu d'enregistrer vos clés dans chaque outil.
Premiers pas
1. Lancer l'application
Ouvrez AIProxyServer. Au premier lancement, le proxy démarre automatiquement et écoute sur le port 8421 de votre machine locale. La fenêtre principale affiche trois sections :
- Serveur proxy — état actuel, URL de base et un bouton pour démarrer ou arrêter l'écoute
- Jeton Bearer — option d'authentification facultative et affichage du jeton
- Fournisseurs — tous les fournisseurs d'IA cloud pris en charge, avec un bouton Définir la clé API sur chaque ligne
2. Ajouter votre première clé API
- Choisissez un fournisseur dans la liste Fournisseurs (par exemple OpenAI (ChatGPT))
- Cliquez sur Obtenir une clé API pour ouvrir la console du fournisseur dans votre navigateur, puis créez ou copiez une clé
- Cliquez sur Définir la clé API sur la même ligne et collez la valeur dans la boîte de dialogue
- Cliquez sur Enregistrer. Le libellé d'état passe à Configuré en vert
3. Connecter une application cliente
Dirigez n'importe quel client compatible OpenAI vers le proxy. L'URL de base est http://localhost:8421/<provider>/v1. Le segment du fournisseur détermine quel cloud reçoit la requête.
# Example: OpenAI Python SDK pointed at the proxy
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8421/openai/v1",
api_key="not-used-but-required-by-sdk",
)
resp = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "Hello"}],
)
print(resp.choices[0].message.content)
Le client ne voit jamais la véritable clé. AIProxyServer ajoute les identifiants en amont au moment de transmettre la requête.
Présentation de l'interface
Panneau Serveur proxy
| Champ | Description |
|---|---|
| État | En cours d'exécution lorsque l'écoute est active, Arrêté sinon. |
| URL de base | L'adresse que les applications clientes doivent utiliser, nom d'hôte et port compris. Cliquez sur Copier pour la copier dans le presse-papiers. |
| Bouton Démarrer / Arrêter | Activez ou désactivez l'écoute HTTP sans quitter l'application. |
Panneau Jeton Bearer
- Exiger l'authentification par jeton Bearer — case à cocher qui active ou désactive l'authentification. Désactivée par défaut pour une utilisation locale sans contrainte.
- Champ Jeton — affichage en lecture seule du jeton actuel. Affiché sous forme de points ; utilisez Copier pour le récupérer.
- Régénérer — génère un nouveau jeton aléatoire. Les clients existants doivent être mis à jour avec la nouvelle valeur.
Panneau Fournisseurs
Une ligne par fournisseur cloud pris en charge. Chaque ligne affiche :
- Le nom affiché (par exemple Claude (Anthropic))
- L'état de la configuration — vert Configuré lorsqu'une clé API est enregistrée, gris Non configuré sinon
- Le chemin d'URL utilisé par vos clients, par ex.
/anthropic/v1/chat/completions - Définir la clé API — ouvre une boîte de dialogue pour saisir les identifiants
- Obtenir une clé API — ouvre la console du fournisseur dans votre navigateur
Fournisseurs pris en charge
Onze services d'IA cloud sont inclus. La plupart utilisent nativement le format OpenAI Chat Completions et sont relayés tels quels. Trois d'entre eux (Anthropic, Gemini, ERNIE) parlent leur propre protocole ; AIProxyServer traduit alors les requêtes et les réponses à la volée, si bien que votre client ne voit jamais que des formats OpenAI.
| Fournisseur | Préfixe de route | Ce dont vous avez besoin |
|---|---|---|
| OpenAI (ChatGPT) | /openai/v1 | Clé API de platform.openai.com |
| Claude (Anthropic) | /anthropic/v1 | Clé API depuis la console Anthropic |
| Gemini (Google) | /gemini/v1 | Clé API depuis Google AI Studio |
| Grok (xAI) | /grok/v1 | Clé API depuis la console xAI |
| Azure OpenAI (Copilot) | /copilot/v1 | Clé API et URL du point de terminaison de votre déploiement |
| Perplexity | /perplexity/v1 | Clé API depuis les réglages Perplexity |
| Groq | /groq/v1 | Clé API depuis Groq Cloud |
| DeepSeek | /deepseek/v1 | Clé API depuis la plateforme DeepSeek |
| Kimi (Moonshot) | /kimi/v1 | Clé API depuis la console Moonshot |
| Qwen (DashScope) | /qwen/v1 | Clé API depuis Alibaba DashScope |
| ERNIE (Baidu) | /ernie/v1 | Clé API et clé secrète depuis Baidu Qianfan |
Remarques propres à chaque fournisseur
- Azure OpenAI — collez l'URL complète du point de terminaison de déploiement dans le champ URL de base du point de terminaison , par exemple
https://my-resource.openai.azure.com/openai/deployments/gpt-4o. Le proxy ajoute/chat/completions?api-version=2024-02-01automatiquement. - ERNIE — Baidu Qianfan utilise OAuth : les deux champs Clé API et Clé secrète sont requis. AIProxyServer demande et met en cache les jetons d'accès en arrière-plan.
- Gemini — l'authentification se fait par paramètre d'URL ; le proxy l'ajoute pour vous. Les quotas par minute de l'offre gratuite restent applicables.
Référence de l'API
Points de terminaison
| Méthode | Chemin | Description |
|---|---|---|
| GET | /health | Vérification de disponibilité. Renvoie l'état du service et la liste des fournisseurs. Aucune authentification requise. |
| GET | /v1/providers | Fournisseurs configurés et métadonnées. |
| GET | /<provider>/v1/models | Liste des modèles du fournisseur indiqué, au format OpenAI. |
| POST | /<provider>/v1/chat/completions | Requête OpenAI Chat Completions. Transmettez stream:true pour utiliser le SSE. |
Diffusion en continu
Lorsque le client envoie "stream": true, le proxy répond avec des Server-Sent Events au format OpenAI :
data: {"id":"chatcmpl-...","object":"chat.completion.chunk","choices":[{"delta":{"role":"assistant"},...}]}
data: {"id":"chatcmpl-...","object":"chat.completion.chunk","choices":[{"delta":{"content":"Hello"},...}]}
data: [DONE]
Les flux natifs d'Anthropic et de Gemini sont convertis vers ce format afin que tous les clients puissent utiliser un seul et même analyseur.
En-tête d'authentification
Lorsque Exiger l'authentification par jeton Bearer est activé, envoyez le jeton affiché dans la fenêtre principale à chaque requête :
Authorization: Bearer <token-shown-in-app>
Réglages
Ouvrez la fenêtre des réglages depuis l'icône d'engrenage de la barre d'outils inférieure.
| Réglage | Valeur par défaut | Description |
|---|---|---|
| Port du proxy | 8421 | Port TCP sur lequel l'écoute est ouverte. Toute modification nécessite de redémarrer le proxy. |
| Démarrer le serveur automatiquement | Activé | Démarre le proxy au lancement de l'application. |
| Autoriser l'accès au réseau local | Désactivé | Lorsque l'option est désactivée, le proxy n'écoute que sur 127.0.0.1. Lorsqu'elle est activée, les autres appareils de votre réseau Wi-Fi peuvent atteindre le proxy. |
| Exiger un jeton Bearer | Désactivé | Lorsque cette option est activée, chaque requête doit inclure le jeton affiché dans la fenêtre principale. Vivement recommandé dès que l'accès au réseau local est autorisé. |
Exemples de clients
cURL
# OpenAI (passthrough)
curl http://localhost:8421/openai/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o-mini",
"messages": [{"role": "user", "content": "Hello"}]
}'
# Claude via the same OpenAI shape
curl http://localhost:8421/anthropic/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-4-5",
"messages": [{"role": "user", "content": "Hello"}],
"max_tokens": 1024
}'
SDK Python OpenAI
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8421/gemini/v1",
api_key="placeholder", # ignored when Bearer Token is off
)
stream = client.chat.completions.create(
model="gemini-2.0-flash",
messages=[{"role": "user", "content": "Tell me a joke"}],
stream=True,
)
for chunk in stream:
print(chunk.choices[0].delta.content or "", end="", flush=True)
Flutter / Dart
// Using any OpenAI-compatible Dart client
final client = OpenAIClient(
baseUrl: 'http://localhost:8421/anthropic/v1',
apiKey: '', // unused when Bearer Token is off
);
localhost par l'adresse IP locale de votre Mac (affichée dans le champ URL de base lorsque Autoriser l'accès au réseau local est activé).Astuces
- Laissez le jeton Bearer désactivé pendant vos développements en local ; activez-le dès que vous autorisez l'accès au réseau local.
- Utilisez une URL de base distincte par fournisseur dans le code de votre client : vous pourrez changer de fournisseur en modifiant une seule constante.
- Le proxy démarre automatiquement, mais vous pouvez l'arrêter temporairement depuis la fenêtre principale en cas de conflit de port.
- Si l'offre gratuite d'un fournisseur limite votre débit, le message d'erreur en amont est transmis tel quel. Aucune logique de nouvelle tentative n'est masquée au client.
- Le point de terminaison
/v1/providerspermet de savoir quels fournisseurs sont configurés à l'exécution.
Dépannage
Le proxy ne démarre pas
- Un autre processus utilise peut-être déjà le port 8421. Changez de port dans les réglages et redémarrez le proxy.
- Consultez le journal système pour lire le message d'erreur affiché au démarrage.
Une requête renvoie 401 Unauthorized
- L'exigence de jeton Bearer est activée, mais le client n'a pas envoyé l'en-tête
Authorization: Bearer ...correspondant. - La clé API du fournisseur est peut-être invalide — l'erreur en amont étant transmise telle quelle, vérifiez le corps du message.
Une requête renvoie « API key is not configured »
- Ouvrez la liste des fournisseurs et cliquez sur Définir la clé API pour le fournisseur concerné.
- Pour ERNIE, la clé API et la clé secrète doivent toutes deux être renseignées. Pour Azure OpenAI, l'URL de base du point de terminaison est également requise.
L'appareil mobile n'atteint pas le proxy
- Activez Autoriser l'accès au réseau local dans les réglages.
- Utilisez l'adresse IP locale affichée dans le champ URL de base, et non
localhost. - Vérifiez que les deux appareils sont sur le même réseau Wi-Fi et que votre pare-feu autorise les connexions entrantes sur le port du proxy.
Les réponses en continu arrivent d'un seul bloc
- Assurez-vous que votre client envoie
"stream": truedans le corps JSON. - Certaines bibliothèques HTTP mettent le SSE en mémoire tampon par défaut — désactivez la mise en tampon des réponses côté client.
Confidentialité
- Les clés API sont stockées chiffrées avec Fernet dans
~/Library/Application Support/AIProxyServer/credentials.enc. La clé de chiffrement contenue dansmaster.keydispose des permissions 0600. - Le jeton Bearer, lorsqu'il est activé, est lui aussi conservé uniquement dans le coffre chiffré et n'est jamais écrit dans le fichier de réglages ordinaire.
- Le proxy ne transmet des requêtes qu'aux fournisseurs que vous avez explicitement configurés. Il n'effectue aucun autre appel sortant.
- Aucune télémétrie, aucune analyse d'usage, aucun rapport de plantage.
- Par défaut, la liaison réseau se limite à
127.0.0.1uniquement. L'exposition au réseau local se fait sur activation volontaire. - Le contenu des conversations n'est pas conservé. AIProxyServer transmet les octets et les oublie aussitôt.