Aller au contenu
KeuralDocs
Développeurs

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éthodeCheminDescription
POST/llm/v1/chat/completionsCrée une complétion de chat (streaming pris en charge)
GET/llm/v1/modelsListe 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

ÉtapeAction
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 clientSaisissez l'URL de base, la clé d'API et l'ID du modèle dans l'application ou le code.
3. Utiliser et gérerDepuis le même écran, consultez l'utilisation et, si besoin, réémettez ou révoquez la clé.

Prérequis

ÉlémentDétails
Compte KeuralCompte Keural permettant de vous connecter
Menu APISi API n'apparaît pas dans les Paramètres, demandez à votre administrateur d'activer la fonction.
Autorisation de membre de l'organisationPour é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 baseAdresse publique de l'API communiquée par votre administrateur
ClientApplication ou SDK compatible avec les connexions OpenAI API

Émettre une clé d'API

  1. Dans le menu de compte, ouvrez Paramètres → API. Dans les applications de bureau et mobiles, l'option se trouve dans le groupe Outils.
  2. Dans l'onglet API keys, choisissez l'espace de travail auquel appartient la clé (personnel ou organisation) et le Model ID.
  3. 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.
  4. 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.

SectionRôle
API permissions by userActive ou désactive l'autorisation API de chaque membre.
Issued keysConsulte l'état des clés émises dans l'organisation et les révoque. Le texte des clés ne peut pas être affiché.
API usageConsulte les requêtes et l'utilisation de jetons des clés émises dans l'organisation.
ActionRésultat
Activer Allow API accessLe membre peut émettre des clés dans l'espace de travail de l'organisation.
Désactiver Allow API accessLes 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.).

ValeurContenu à saisirNom du champ selon l'application
Base URLL'adresse publique de l'API communiquée par votre administrateur (…/llm/v1)Base URL, API Base, Endpoint, Host
API KeyLa clé émise (sans espace au début ni à la fin)API Key, Token, Secret Key, Authorization
ModelLe Model ID de l'écran d'émission. Il doit correspondre exactement au modèle connecté à la cléModel, Model ID, Model Name
  1. Dans les paramètres de l'application, ajoutez une connexion compatible OpenAI (Connection).
  2. Saisissez la Base URL et l'API Key, puis enregistrez.
  3. Choisissez un modèle dans la liste. La liste n'affiche que le modèle connecté à la clé.
  4. Envoyez un message court pour vérifier la réponse.

Les requêtes sont les suivantes.

TypeContenu
Requête de chatPOST <Base URL>/chat/completions
Consultation des modèlesGET <Base URL>/models
En-tête d'authentificationAuthorization: Bearer <clé émise>
En-tête de contenuContent-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.

ChampRègle
modelObligatoire. L'ID du modèle de la clé
messagesObligatoire. De 1 à 4 096 éléments
stream · stream_optionsstream_options n'est envoyé que si stream: true. Prend en charge include_usage.
tools128 maximum. Le nom de fonction utilise [A-Za-z0-9_-], de 1 à 64 caractères
tool_choicenone · auto · required · une fonction précise. required exige la présence de tools.
parallel_tool_callsSi le modèle ne le prend pas en charge, la réponse est 400
response_formattext · json_object · json_schema
max_tokens · max_completion_tokensN'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.
temperatureDe 0 à 2. Si le modèle ne le prend pas en charge, la réponse est 400
top_pDe 0 à 1
frequency_penalty · presence_penaltyDe -2 à 2
stopUne chaîne ou un tableau de 4 éléments maximum
seedEntier
user256 caractères maximum
n1 uniquement

Messages

RôleChamps acceptés
system · developercontent, name
usercontent (chaîne ou tableau de parties texte et image), name
assistantcontent, name, refusal, tool_calls
toolcontent, tool_call_id
  • Un message tool ne répond qu'une seule fois à chaque id des tool_calls précédents.
  • Les parties image (image_url) ne sont incluses que dans les messages user des modèles qui acceptent les images. Utilisez une adresse http ou https, ou une data URI base64 au format PNG, JPEG, GIF ou WebP. detail peut valoir auto, low ou high.

Corps

ÉlémentLimite
Content-Typeapplication/json
Taille1 MiB
Structure JSONUn seul objet de premier niveau, profondeur d'imbrication de 64 au maximum, pas de clés en double
Durée de la requête600 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 429CauseRetry-After
rate_limit_exceededDépassement du RPM, du TPM ou du nombre de requêtes simultanées60 secondes pour RPM et TPM ; 1 seconde pour les requêtes simultanées
api_busyCapacité de traitement du serveur dépasséeAucun. Patientez un peu puis réessayez.
upstream_rate_limitLimite dépassée chez le fournisseur du modèleAucun

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.

ActionRésultatPoint 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.

EmplacementContenu
Paramètres → API → API usageL'utilisation des clés que vous avez émises dans l'espace de travail actuel
Gestion de l'organisation → Organization API, section API usageL'utilisation de toutes les clés émises dans l'organisation (propriétaires et administrateurs de l'organisation)

Conditions de consultation

ConditionDescription
Heure de début · Heure de finHeure 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 IDN'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êteChoisissez 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émentDescription
ID de la requêteValeur à communiquer lorsque vous contactez le support.
Mode de réponseStreaming ou réponse classique
Statut de confirmation de l'utilisationConfirmé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 raisonnementAffiché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.

StatuttypecodeCause
400invalid_request_errorinvalid_requestChamp, valeur ou règle du corps non respecté. param indique le champ concerné
400invalid_request_errorupstream_rejected_requestLe fournisseur du modèle a refusé la requête
401authentication_errorinvalid_api_keyFormat de clé incorrect, clé absente, expirée, révoquée ou réémise, ou plusieurs en-têtes Authorization
403permission_errorapi_disabledLa fonction API de Keural est désactivée
403permission_errormodel_api_disabledLa publication du modèle pour l'API est désactivée
403permission_errormodel_not_allowedmodel ne correspond pas au modèle de la clé, ou le membre n'a pas l'autorisation API
404invalid_request_errornot_foundChemin inexistant
405invalid_request_errormethod_not_allowedMéthode incorrecte. L'en-tête Allow indique les méthodes autorisées
429rate_limit_errorTableau de Limites d'utilisationLimite dépassée
503server_errorupstream_timeoutLa réponse n'a pas été complète en 600 secondes
503server_errorinvalid_upstream_responseFormat de réponse anormal du fournisseur, ou taille de flux dépassée
503server_errordependency_unavailable · unsupported_providerProblème interne temporaire. Contactez le support en indiquant x-request-id

Résolution des problèmes

SymptômeCode de réponsePoint à vérifier en premier
La liste des modèles est vide ou la connexion échoue404 · 405Que la Base URL se termine par …/llm/v1
L'authentification échoue401Fautes de frappe ou espaces dans la clé ; expiration, révocation ou réémission de la clé
La connexion fonctionne, mais le modèle est inutilisable403Que le Model ID corresponde à celui de la clé, et l'autorisation API de l'organisation
La réponse est lente ou échoue parfois429Limites d'utilisation
Aucune réponse pendant un moment5xxRé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-id dans l'en-tête de réponse
  • Message d'erreur affiché à l'écran

Sur cette page