AIProxyServer - Guide

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

  1. Choisissez un fournisseur dans la liste Fournisseurs (par exemple OpenAI (ChatGPT))
  2. Cliquez sur Obtenir une clé API pour ouvrir la console du fournisseur dans votre navigateur, puis créez ou copiez une clé
  3. Cliquez sur Définir la clé API sur la même ligne et collez la valeur dans la boîte de dialogue
  4. 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

ChampDescription
ÉtatEn cours d'exécution lorsque l'écoute est active, Arrêté sinon.
URL de baseL'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êterActivez 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.
Attention : Si vous activez Autoriser l'accès au réseau local dans les Réglages sans activer le jeton, toute personne connectée au même réseau Wi-Fi peut utiliser votre proxy et vos clés API. Le texte d'aide sous le panneau du jeton vous avertit lorsque vous êtes dans cette situation.

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.

FournisseurPréfixe de routeCe dont vous avez besoin
OpenAI (ChatGPT)/openai/v1Clé API de platform.openai.com
Claude (Anthropic)/anthropic/v1Clé API depuis la console Anthropic
Gemini (Google)/gemini/v1Clé API depuis Google AI Studio
Grok (xAI)/grok/v1Clé API depuis la console xAI
Azure OpenAI (Copilot)/copilot/v1Clé API et URL du point de terminaison de votre déploiement
Perplexity/perplexity/v1Clé API depuis les réglages Perplexity
Groq/groq/v1Clé API depuis Groq Cloud
DeepSeek/deepseek/v1Clé API depuis la plateforme DeepSeek
Kimi (Moonshot)/kimi/v1Clé API depuis la console Moonshot
Qwen (DashScope)/qwen/v1Clé API depuis Alibaba DashScope
ERNIE (Baidu)/ernie/v1Clé 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-01 automatiquement.
  • 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éthodeCheminDescription
GET/healthVérification de disponibilité. Renvoie l'état du service et la liste des fournisseurs. Aucune authentification requise.
GET/v1/providersFournisseurs configurés et métadonnées.
GET/<provider>/v1/modelsListe des modèles du fournisseur indiqué, au format OpenAI.
POST/<provider>/v1/chat/completionsRequê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églageValeur par défautDescription
Port du proxy8421Port TCP sur lequel l'écoute est ouverte. Toute modification nécessite de redémarrer le proxy.
Démarrer le serveur automatiquementActivéDémarre le proxy au lancement de l'application.
Autoriser l'accès au réseau localDé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 BearerDé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
);
Appareils mobiles en Wi-Fi : remplacez 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/providers permet 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": true dans 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 dans master.key dispose 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.1 uniquement. 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.