Fournisseurs Personnalisés
AISCouncil supporte n'importe quelle API LLM qui implémente le format de complétions de chat OpenAI. Cela vous permet de vous connecter à des modèles auto-hébergés, des passerelles LLM d'entreprise, des fournisseurs alternatifs et des serveurs d'inférence locaux.
Que Sont les Fournisseurs Personnalisés
Les fournisseurs personnalisés sont des endpoints LLM définis par l'utilisateur qui utilisent le format d'API compatible OpenAI (/v1/chat/completions avec streaming SSE). La plupart des serveurs d'inférence modernes et passerelles LLM implémentent ce format, ce qui en fait le standard de facto pour les APIs LLM.
Cas d'Usage
- Modèles auto-hébergés — Connectez-vous à vLLM, Text Generation Inference, ou LocalAI s'exécutant sur votre propre matériel
- Passerelles LLM d'entreprise — Routez via le proxy API de votre entreprise avec authentification et journalisation
- Proxys locaux — Utilisez LiteLLM ou des outils similaires pour unifier plusieurs fournisseurs derrière un seul endpoint
- Fournisseurs alternatifs — Connectez-vous à tout fournisseur pas encore intégré dans l'application
- Modèles fine-tunés — Accédez à vos modèles personnalisés fine-tunés sur toute plateforme d'hébergement compatible
- Déploiements cloisonnés — Utilisez des modèles s'exécutant sur un réseau local sans accès internet
Ajouter un Fournisseur Personnalisé via Settings
- Ouvrez Settings (cliquez sur l'icône engrenage ou pressez
Ctrl+Shift+S) - Allez à la section API Keys
- Défilez jusqu'à Custom Providers
- Remplissez les champs :
| Champ | Requis | Description |
|---|---|---|
| Provider ID | Oui | Un identifiant court (ex., my-llm). Doit être unique, minuscules, sans espaces |
| Display Name | Oui | Nom lisible montré dans le menu déroulant des fournisseurs |
| Endpoint URL | Oui | URL complète vers l'endpoint de complétions de chat (ex., https://my-api.example.com/v1/chat/completions) |
| API Key | Non | Token Bearer pour l'authentification (laissez vide si non requis) |
| Models | Oui | Liste de modèles disponibles à cet endpoint séparés par des virgules |
- Cliquez sur Save
- Le fournisseur apparaît dans le menu déroulant des fournisseurs lors de la création ou configuration d'un bot
Enregistrement Programmatique
Vous pouvez enregistrer des fournisseurs personnalisés depuis la console du navigateur ou depuis un script :
AIS.Providers.registerCustom("my-provider", {
name: "Mon Fournisseur",
endpoint: "https://my-api.example.com/v1/chat/completions",
models: [
{ id: "my-model-7b", name: "Mon Modèle 7B" },
{ id: "my-model-70b", name: "Mon Modèle 70B" },
],
apiStyle: "openai",
});
Options d'Enregistrement
| Option | Type | Défaut | Description |
|---|---|---|---|
name | string | ID du fournisseur | Nom d'affichage |
endpoint | string | Requis | URL complète vers l'endpoint de complétions de chat |
models | array | [{id: 'default', name: id}] | Modèles disponibles |
apiStyle | string | 'openai' | Format API (actuellement seul 'openai' est supporté) |
extraHeaders | object | {} | En-têtes HTTP additionnels à inclure dans chaque requête |
pricing | object | null | Infos de prix (pour le suivi des coûts) |
maxInput | number | 0 | Longueur max du contexte d'entrée (pour affichage uniquement) |
En-Têtes Supplémentaires
Si votre endpoint nécessite des en-têtes personnalisés (ex., pour des schémas d'authentification autres que les tokens Bearer) :
AIS.Providers.registerCustom("corp-gateway", {
name: "Passerelle Corporate",
endpoint: "https://llm.corp.internal/v1/chat/completions",
models: [{ id: "gpt-4o", name: "GPT-4o (via gateway)" }],
extraHeaders: {
"X-Corp-Token": "votre-token-interne",
"X-Department": "engineering",
},
});
Persistance
Les fournisseurs personnalisés sont automatiquement sauvegardés dans localStorage sous la clé ais-custom-providers. Ils sont restaurés à chaque chargement de page, donc vous n'avez besoin de les enregistrer qu'une seule fois.
Gestion des Fournisseurs Personnalisés
Lister les fournisseurs personnalisés enregistrés
const customIds = AIS.Providers.listCustom();
// ['my-provider', 'corp-gateway']
Supprimer un fournisseur personnalisé
AIS.Providers.removeCustom("my-provider");
Cela le supprime à la fois du registre runtime et de localStorage.
Lister tous les fournisseurs (intégrés + personnalisés)
const all = AIS.Providers.list();
// [{ name: 'anthropic', models: [...] }, { name: 'my-provider', models: [...] }, ...]
Comment Ça Fonctionne en Interne
Les fournisseurs personnalisés utilisent la même factory de streaming SSE openaiCompatible() qui alimente les fournisseurs intégrés OpenAI, xAI, OpenRouter, DeepSeek, Groq et autres. Cette factory :
- Construit un corps de requête au format OpenAI standard (model, messages, temperature, max_tokens, stream, etc.)
- Envoie une requête POST avec l'en-tête
Authorization: Bearer {apiKey} - Analyse le flux SSE (lignes
data: {...}) pour les deltas de contenu - Gère à la fois les formats de réponse streaming (delta) et non-streaming (message)
- Extrait l'utilisation des tokens du champ
usagesi présent
Tous les champs de config fonctionnent avec les fournisseurs personnalisés : température, top_p, frequency_penalty, presence_penalty, séquences d'arrêt, format de réponse et effort de raisonnement.
Services Compatibles
Les services suivants implémentent le format d'API compatible OpenAI et fonctionnent comme fournisseurs personnalisés :
| Service | Endpoint | Notes |
|---|---|---|
| LiteLLM | http://localhost:4000/v1/chat/completions | Proxy qui unifie 100+ fournisseurs |
| LocalAI | http://localhost:8080/v1/chat/completions | Exécutez des modèles open-source localement |
| vLLM | http://localhost:8000/v1/chat/completions | Serveur d'inférence haute performance |
| Text Generation Inference | http://localhost:8080/v1/chat/completions | Serveur d'inférence Hugging Face |
| Ollama | http://localhost:11434/v1/chat/completions | Déjà intégré, mais peut être ajouté comme personnalisé aussi |
| llama.cpp (mode serveur) | http://localhost:8080/v1/chat/completions | Inférence C++ légère |
| Jan | http://localhost:1337/v1/chat/completions | Application de bureau avec modèles locaux |
| LM Studio | http://localhost:1234/v1/chat/completions | Application de bureau avec gestion de modèles |
| Cloudflare Workers AI | https://api.cloudflare.com/client/v4/accounts/{id}/ai/v1/chat/completions | Intégré, mais peut personnaliser |
| Azure OpenAI | https://{resource}.openai.azure.com/openai/deployments/{deployment}/chat/completions?api-version=2024-02-01 | Nécessite l'en-tête api-key |
Dépannage
Erreurs CORS
Lorsque le navigateur appelle un endpoint API directement, le serveur doit inclure des en-têtes CORS dans sa réponse. Sans eux, le navigateur bloque la requête pour des raisons de sécurité.
Si vous voyez une erreur CORS dans la console, votre endpoint personnalisé doit retourner ces en-têtes :
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Allow-Methods: POST, OPTIONS
Pour les services locaux :
- Ollama : Définir la variable d'environnement
OLLAMA_ORIGINS=*avant de démarrer - vLLM : Ajouter le flag
--allowed-origins '*' - LiteLLM : Ajouter le flag
--corsou définirLITELLM_ALLOW_ORIGINS=* - LocalAI : CORS est activé par défaut
Pour les services distants derrière un reverse proxy (Nginx) :
location /v1/ {
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization' always;
add_header 'Access-Control-Allow-Methods' 'POST, OPTIONS' always;
if ($request_method = 'OPTIONS') {
return 204;
}
proxy_pass http://localhost:8000;
}
Connexion Refusée
- Vérifiez que l'URL de l'endpoint est correcte et que le service est en cours d'exécution
- Pour les services locaux, assurez-vous que le serveur écoute sur le port attendu
- Pour les services
localhost, essayez127.0.0.1à la place (ou vice versa) - Vérifiez qu'aucun pare-feu ne bloque le port
Erreurs d'Authentification
- Vérifiez que votre clé API est correcte
- Certains services utilisent différents en-têtes d'auth — utilisez
extraHeaderssi le service n'utilise pas le format standardAuthorization: Bearer - Azure OpenAI utilise l'en-tête
api-keyau lieu deAuthorization
Réponses Vides ou Corrompues
- Confirmez que l'endpoint retourne le format SSE compatible OpenAI (
data: {"choices":[{"delta":{"content":"..."}}]}) - Certains services nécessitent
stream: truedans le corps de la requête (l'application envoie cela par défaut) - Vérifiez que l'ID du modèle correspond à ce que le service attend
- Ouvrez l'onglet Réseau du navigateur dans DevTools pour inspecter la requête et réponse brutes