API Keural
Envoyez des requêtes au format OpenAI Chat Completions avec une clé d'API.
Appelez les modèles enregistrés dans Keural au format OpenAI Chat Completions.
L'URL de base a la forme https://<domaine public de votre API>/llm/v1. Le domaine public de l'API varie selon l'environnement : renseignez-vous auprès de votre administrateur.
| Méthode | Chemin | Description |
|---|---|---|
POST | /llm/v1/chat/completions | Crée une complétion de chat (streaming pris en charge) |
GET | /llm/v1/models | Liste les modèles connectés à la clé |
GET | /llm/v1/models/{model} | Affiche les informations d'un modèle connecté à la clé |
Les chemins pour les embeddings, la génération d'images, la voix et l'API Responses ne sont pas pris en charge. Une requête envoyée vers ces chemins renvoie 404.
Déroulement de l'utilisation
| Étape | Action |
|---|---|
| 1. Émettre la clé | Dans Paramètres → API, choisissez un modèle et obtenez une clé. Copiez l'ID du modèle et la clé. |
| 2. Connecter le client | Saisissez l'URL de base, la clé d'API et l'ID du modèle dans l'application ou le code. |
| 3. Utiliser et gérer | Depuis le même écran, consultez l'utilisation et, si besoin, réémettez ou révoquez la clé. |
Prérequis
| Élément | Détails |
|---|---|
| Compte Keural | Compte Keural permettant de vous connecter |
| Menu API | Si API n'apparaît pas dans les Paramètres, demandez à votre administrateur d'activer la fonction. |
| Autorisation de membre de l'organisation | Pour émettre une clé dans un espace de travail d'organisation, l'administrateur de l'organisation doit vous l'autoriser. Voir Autorisation API des membres de l'organisation. |
| URL de base | Adresse publique de l'API communiquée par votre administrateur |
| Client | Application ou SDK compatible avec les connexions OpenAI API |
Émettre une clé d'API
- Dans le menu de compte, ouvrez Paramètres → API. Dans les applications de bureau et mobiles, l'option se trouve dans le groupe Outils.
- Dans l'onglet API keys, choisissez l'espace de travail auquel appartient la clé (personnel ou organisation) et le Model ID.
- Si besoin, définissez une New key expiration (optional, Korea time). Si vous laissez ce champ vide, la clé reste valable jusqu'à sa révocation.
- Cliquez sur Issue key, puis copiez la clé avec Copy key et conservez-la en lieu sûr. La clé complète n'est affichée qu'à cette étape et ne peut plus être revue après la fermeture de l'écran.
- La clé est liée à l'espace de travail choisi et à un seul modèle. L'utilisation est attribuée à la personne qui a émis la clé.
- Chaque combinaison espace de travail et modèle ne peut avoir qu'une seule clé utilisable. Pour en obtenir une nouvelle, réémettez (Rotate) ou révoquez (Revoke) la clé existante.
- Si vous perdez la clé, réémettez-la ; l'ancienne clé cesse alors immédiatement de fonctionner.
- Si le message indiquant qu'aucun modèle n'est disponible s'affiche, vérifiez avec votre administrateur la visibilité des modèles, votre forfait et l'autorisation API de l'organisation.
Autorisation API des membres de l'organisation
Réservé aux propriétaires et administrateurs de l'organisation. Pour qu'un membre puisse émettre des clés dans un espace de travail d'organisation, l'administrateur doit d'abord l'autoriser. Par défaut, tous les membres sont bloqués.
Gestion de l'organisation → Organization API comprend les trois sections suivantes. Si le menu n'apparaît pas, la fonction API est désactivée ou votre compte n'a pas les droits d'administration de l'organisation.
| Section | Rôle |
|---|---|
| API permissions by user | Active ou désactive l'autorisation API de chaque membre. |
| Issued keys | Consulte l'état des clés émises dans l'organisation et les révoque. Le texte des clés ne peut pas être affiché. |
| API usage | Consulte les requêtes et l'utilisation de jetons des clés émises dans l'organisation. |
| Action | Résultat |
|---|---|
| Activer Allow API access | Le membre peut émettre des clés dans l'espace de travail de l'organisation. |
| Désactiver Allow API access | Les nouvelles émissions et les appels avec les clés existantes sont bloqués. Les clés déjà émises ne sont pas supprimées automatiquement ; révoquez-les dans Issued keys si nécessaire. |
Lorsqu'un membre quitte l'organisation ou en est retiré, les clés qu'il avait reçues dans l'organisation sont automatiquement révoquées.
Connecter un client
Saisissez les trois valeurs suivantes dans les applications compatibles avec OpenAI API (clients de chat, extensions d'IDE, outils d'automatisation, etc.).
| Valeur | Contenu à saisir | Nom du champ selon l'application |
|---|---|---|
| Base URL | L'adresse publique de l'API communiquée par votre administrateur (…/llm/v1) | Base URL, API Base, Endpoint, Host |
| API Key | La clé émise (sans espace au début ni à la fin) | API Key, Token, Secret Key, Authorization |
| Model | Le Model ID de l'écran d'émission. Il doit correspondre exactement au modèle connecté à la clé | Model, Model ID, Model Name |
- Dans les paramètres de l'application, ajoutez une connexion compatible OpenAI (Connection).
- Saisissez la Base URL et l'API Key, puis enregistrez.
- Choisissez un modèle dans la liste. La liste n'affiche que le modèle connecté à la clé.
- Envoyez un message court pour vérifier la réponse.
Les requêtes sont les suivantes.
| Type | Contenu |
|---|---|
| Requête de chat | POST <Base URL>/chat/completions |
| Consultation des modèles | GET <Base URL>/models |
| En-tête d'authentification | Authorization: Bearer <clé émise> |
| En-tête de contenu | Content-Type: application/json |
Première requête
export KEURAL_API_KEY='votre_clé_émise'
export KEURAL_BASE_URL='https://<votre-domaine-api>/llm/v1'
export MODEL_ID='ID_du_modèle_sur_l_écran_d_émission'
curl "$KEURAL_BASE_URL/chat/completions" \
-H "Authorization: Bearer $KEURAL_API_KEY" \
-H 'Content-Type: application/json' \
-d "{\"model\":\"$MODEL_ID\",\"messages\":[{\"role\":\"user\",\"content\":\"Bonjour.\"}]}"Le model du corps de la requête doit correspondre au modèle connecté à la clé. S'il y a un préfixe de chemin, comme provider/ID_du_modèle, la comparaison porte sur ce qui suit le dernier /. Si elles ne correspondent pas, l'API renvoie 403. La réponse contient toujours dans model l'ID du modèle de la clé.
from openai import OpenAI
import os
client = OpenAI(
api_key=os.environ["KEURAL_API_KEY"],
base_url=os.environ["KEURAL_BASE_URL"],
)
res = client.chat.completions.create(
model=os.environ["MODEL_ID"],
messages=[{"role": "user", "content": "Bonjour."}],
)
print(res.choices[0].message.content)Champs de requête acceptés
L'API n'accepte que ces 18 champs de premier niveau. Si vous en envoyez d'autres, la réponse est 400. Les champs facultatifs dont la valeur est null sont traités comme non envoyés.
| Champ | Règle |
|---|---|
model | Obligatoire. L'ID du modèle de la clé |
messages | Obligatoire. De 1 à 4 096 éléments |
stream · stream_options | stream_options n'est envoyé que si stream: true. Prend en charge include_usage. |
tools | 128 maximum. Le nom de fonction utilise [A-Za-z0-9_-], de 1 à 64 caractères |
tool_choice | none · auto · required · une fonction précise. required exige la présence de tools. |
parallel_tool_calls | Si le modèle ne le prend pas en charge, la réponse est 400 |
response_format | text · json_object · json_schema |
max_tokens · max_completion_tokens | N'en envoyez qu'un seul. Si aucun n'est envoyé, la valeur est 4 096 (ou la limite du modèle si elle est inférieure). Si la limite du modèle est dépassée, la réponse est 400. |
temperature | De 0 à 2. Si le modèle ne le prend pas en charge, la réponse est 400 |
top_p | De 0 à 1 |
frequency_penalty · presence_penalty | De -2 à 2 |
stop | Une chaîne ou un tableau de 4 éléments maximum |
seed | Entier |
user | 256 caractères maximum |
n | 1 uniquement |
Messages
| Rôle | Champs acceptés |
|---|---|
system · developer | content, name |
user | content (chaîne ou tableau de parties texte et image), name |
assistant | content, name, refusal, tool_calls |
tool | content, tool_call_id |
- Un message
toolne répond qu'une seule fois à chaqueiddestool_callsprécédents. - Les parties image (
image_url) ne sont incluses que dans les messagesuserdes modèles qui acceptent les images. Utilisez une adressehttpouhttps, ou une data URI base64 au format PNG, JPEG, GIF ou WebP.detailpeut valoirauto,lowouhigh.
Corps
| Élément | Limite |
|---|---|
| Content-Type | application/json |
| Taille | 1 MiB |
| Structure JSON | Un seul objet de premier niveau, profondeur d'imbrication de 64 au maximum, pas de clés en double |
| Durée de la requête | 600 secondes au maximum |
Si les règles du corps ne sont pas respectées, la réponse est 400 et param vaut body.
Streaming
Si la requête contient "stream": true, la réponse est envoyée en SSE. Chaque fragment est envoyé sous forme d'événement data: ..., et la fin est signalée par data: [DONE]. Avec "stream_options": {"include_usage": true}, un fragment supplémentaire contenant l'utilisation des jetons est envoyé juste avant [DONE].
Avec include_usage, tous les fragments contiennent usage: null, et le dernier fragment d'utilisation a un tableau choices vide. Les réponses sans streaming ne contiennent usage que lorsque les jetons d'entrée et de sortie ont été confirmés.
L'id de la réponse a la forme chatcmpl-<x-request-id>. Toutes les réponses contiennent l'en-tête x-request-id.
Si une erreur survient pendant le streaming, un événement data: contenant le JSON de l'erreur est envoyé, puis la connexion se ferme sans [DONE]. Si un fragment dépasse 1 MiB ou si la réponse dépasse 16 MiB, la connexion se termine avec 503.
curl -N "$KEURAL_BASE_URL/chat/completions" \
-H "Authorization: Bearer $KEURAL_API_KEY" \
-H 'Content-Type: application/json' \
-d "{\"model\":\"$MODEL_ID\",\"messages\":[{\"role\":\"user\",\"content\":\"Bonjour.\"}],\"stream\":true,\"stream_options\":{\"include_usage\":true}}"Limites d'utilisation
Les requêtes sont limitées par utilisateur, organisation et modèle : nombre de requêtes simultanées, requêtes par minute (RPM) et jetons par minute (TPM). Les valeurs réelles varient selon l'environnement.
Les jetons par minute sont déduits dès la réception de la requête. L'entrée compte 1 jeton pour 4 caractères en anglais, et les autres caractères comptent 1 jeton par caractère ; chaque image compte 2 000 jetons. La sortie est déduite selon max_tokens (4 096 au maximum) : si vous limitez la sortie au strict nécessaire, vous gagnez de la marge dans la limite.
Code 429 | Cause | Retry-After |
|---|---|---|
rate_limit_exceeded | Dépassement du RPM, du TPM ou du nombre de requêtes simultanées | 60 secondes pour RPM et TPM ; 1 seconde pour les requêtes simultanées |
api_busy | Capacité de traitement du serveur dépassée | Aucun. Patientez un peu puis réessayez. |
upstream_rate_limit | Limite dépassée chez le fournisseur du modèle | Aucun |
Gestion des clés
Dans l'onglet API keys de Paramètres → API, consultez l'état des clés (valide, expirée ou révoquée), puis réémettez-les ou révoquez-les.
Les clés sont des chaînes de 51 caractères commençant par krl_llm_. Chaque espace d'émission ne peut avoir qu'une seule clé ; si elle existe déjà, elle est réémise au lieu d'en créer une nouvelle. La date d'expiration ne peut être fixée qu'à partir d'aujourd'hui.
| Action | Résultat | Point d'attention |
|---|---|---|
| Réémettre (Rotate) | Une nouvelle clé est générée. | L'ancienne clé cesse immédiatement de fonctionner. Mettez aussi à jour la clé dans les applications connectées. |
| Révoquer (Revoke) | La clé est bloquée immédiatement. | À utiliser en cas de suspicion de fuite de la clé. Une clé révoquée ne peut pas être rétablie. |
Consulter l'utilisation
Les requêtes envoyées par l'API et les jetons consommés se consultent à deux endroits.
| Emplacement | Contenu |
|---|---|
| Paramètres → API → API usage | L'utilisation des clés que vous avez émises dans l'espace de travail actuel |
| Gestion de l'organisation → Organization API, section API usage | L'utilisation de toutes les clés émises dans l'organisation (propriétaires et administrateurs de l'organisation) |
Conditions de consultation
| Condition | Description |
|---|---|
| Heure de début · Heure de fin | Heure de Corée. L'heure de début est incluse, l'heure de fin ne l'est pas. Si elles sont vides, les 7 derniers jours sont affichés ; la consultation porte sur 90 jours maximum à la fois. |
| Model ID | N'affiche que les requêtes d'un modèle précis. Si le champ est vide, toutes les requêtes sont affichées. |
| Statut de la requête | Choisissez parmi Tous · En cours · Terminée · En échec · Interrompue · Non confirmée. |
Définissez les conditions, puis cliquez sur Rechercher. Pour inclure une requête récente, cliquez sur Actualiser.
Valeurs affichées à l'écran
- Période de consultation appliquée : la période réellement consultée. Si l'heure de début ou de fin était vide, ou si la période dépassait 90 jours, la période ajustée par le serveur s'affiche.
- Nombre de requêtes et totaux de jetons d'entrée · jetons de sortie · jetons totaux : seules les valeurs confirmées sont additionnées. Les jetons non encore confirmés s'affichent comme Non confirmé.
- Liste des requêtes : chaque requête occupe une ligne avec l'heure, le Model ID, le statut et les jetons d'entrée, de sortie et totaux. 20 lignes sont affichées par page ; utilisez Précédent et Suivant pour naviguer.
En cliquant sur Détails de la requête d'une ligne, les valeurs suivantes s'affichent.
| Élément | Description |
|---|---|
| ID de la requête | Valeur à communiquer lorsque vous contactez le support. |
| Mode de réponse | Streaming ou réponse classique |
| Statut de confirmation de l'utilisation | Confirmée · Partiellement confirmée · Non confirmée |
| Heure de fin · Temps de réponse (ms) | Moment où la requête s'est terminée et durée de traitement |
| Lecture du cache · Création du cache · Jetons de raisonnement | Affichés uniquement si le modèle renvoie ces valeurs. |
Les requêtes en streaming enregistrent l'utilisation sans stream_options.include_usage. Si une requête est interrompue en cours de route, elle peut rester Partiellement confirmée ou Non confirmée.
Format des erreurs
Les erreurs sont renvoyées au format compatible OpenAI.
{
"error": {
"message": "Description de l'erreur lisible par une personne",
"type": "authentication_error",
"code": "invalid_api_key",
"param": null
}
}type dépend du code d'état, et code précise la cause.
| Statut | type | code | Cause |
|---|---|---|---|
400 | invalid_request_error | invalid_request | Champ, valeur ou règle du corps non respecté. param indique le champ concerné |
400 | invalid_request_error | upstream_rejected_request | Le fournisseur du modèle a refusé la requête |
401 | authentication_error | invalid_api_key | Format de clé incorrect, clé absente, expirée, révoquée ou réémise, ou plusieurs en-têtes Authorization |
403 | permission_error | api_disabled | La fonction API de Keural est désactivée |
403 | permission_error | model_api_disabled | La publication du modèle pour l'API est désactivée |
403 | permission_error | model_not_allowed | model ne correspond pas au modèle de la clé, ou le membre n'a pas l'autorisation API |
404 | invalid_request_error | not_found | Chemin inexistant |
405 | invalid_request_error | method_not_allowed | Méthode incorrecte. L'en-tête Allow indique les méthodes autorisées |
429 | rate_limit_error | Tableau de Limites d'utilisation | Limite dépassée |
503 | server_error | upstream_timeout | La réponse n'a pas été complète en 600 secondes |
503 | server_error | invalid_upstream_response | Format de réponse anormal du fournisseur, ou taille de flux dépassée |
503 | server_error | dependency_unavailable · unsupported_provider | Problème interne temporaire. Contactez le support en indiquant x-request-id |
Résolution des problèmes
| Symptôme | Code de réponse | Point à vérifier en premier |
|---|---|---|
| La liste des modèles est vide ou la connexion échoue | 404 · 405 | Que la Base URL se termine par …/llm/v1 |
| L'authentification échoue | 401 | Fautes de frappe ou espaces dans la clé ; expiration, révocation ou réémission de la clé |
| La connexion fonctionne, mais le modèle est inutilisable | 403 | Que le Model ID corresponde à celui de la clé, et l'autorisation API de l'organisation |
| La réponse est lente ou échoue parfois | 429 | Limites d'utilisation |
| Aucune réponse pendant un moment | 5xx | Réessayez un peu plus tard |
| L'utilisation n'apparaît pas ou ne correspond pas à la réalité | — | La période de consultation et l'espace de travail auquel appartient la clé |
Si le problème persiste, contactez votre administrateur en lui transmettant les informations suivantes. N'envoyez ni le texte de la clé ni le contenu des prompts.
- Heure de survenue
- ID du modèle utilisé
- Nom et version de l'application cliente
- Valeur de
x-request-iddans l'en-tête de réponse - Message d'erreur affiché à l'écran