# API LLM

> Appelez des modèles directement depuis votre code avec une clé API endue, en gardant le SDK OpenAI ou Anthropic que vous utilisez déjà. Chaque appel est payé avec vos crédits.

L'**API LLM** permet à votre code d'appeler directement un modèle avec une clé API endue, dans le même format de requête que les API d'OpenAI et d'Anthropic, et règle chaque appel avec vos crédits.

## Quand l'utiliser

Quand vous voulez un modèle plutôt qu'un agent : une complétion dans votre propre application, du code qui communique déjà avec l'API OpenAI ou Anthropic, ou Claude Code. Vous changez l'URL de base et la clé ; le reste de votre code ne bouge pas.

Si vous voulez qu'un agent fasse le travail, avec son prompt, sa mémoire, ses outils et ses connecteurs, appelez-le plutôt via l'[API d'agent](/fr/docs/build/agent-api/).

## Faire un premier appel

<Steps>

1. **Créez une clé valable pour tout le compte** dans **Paramètres → Compte → Clés API**. Copiez-la au moment où elle s'affiche : elle ne s'affiche qu'une fois. Une clé créée depuis la section API d'un agent est limitée à cet agent et ne peut pas appeler de modèles directement.

2. **Gardez la clé hors de votre code.** Placez-la dans une variable d'environnement, par exemple `ENDUE_API_KEY`.

3. **Pointez votre SDK vers endue** avec cette URL de base, et appelez un modèle de la [liste des modèles](#modèles-et-tarifs) :

   ```
   https://platform.endue.ai/api/v1/llm
   ```

</Steps>

<Tabs syncKey="llm-api-lang">
  <TabItem label="Python">
    ```python
    import os
    from openai import OpenAI

    client = OpenAI(base_url="https://platform.endue.ai/api/v1/llm", api_key=os.environ["ENDUE_API_KEY"])
    res = client.chat.completions.create(
        model="openai/gpt-5.4",
        messages=[{"role": "user", "content": "Hello"}],
    )
    print(res.choices[0].message.content)
    ```
  </TabItem>
  <TabItem label="Node.js">
    ```js
    import OpenAI from 'openai';

    const client = new OpenAI({ baseURL: 'https://platform.endue.ai/api/v1/llm', apiKey: process.env.ENDUE_API_KEY });
    const res = await client.chat.completions.create({
      model: 'openai/gpt-5.4',
      messages: [{ role: 'user', content: 'Hello' }],
    });
    console.log(res.choices[0].message.content);
    ```
  </TabItem>
  <TabItem label="curl">
    ```bash
    curl https://platform.endue.ai/api/v1/llm/chat/completions \
      -H "Authorization: Bearer $ENDUE_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{"model":"openai/gpt-5.4","messages":[{"role":"user","content":"Hello"}]}'
    ```
  </TabItem>
  <TabItem label="SDK Anthropic">
    ```python
    import os
    import anthropic

    client = anthropic.Anthropic(base_url="https://platform.endue.ai/api/v1/llm", api_key=os.environ["ENDUE_API_KEY"])
    msg = client.messages.create(
        model="claude-sonnet-4-5",
        max_tokens=1024,
        messages=[{"role": "user", "content": "Hello"}],
    )
    print(msg.content[0].text)
    ```
  </TabItem>
  <TabItem label="Claude Code">
    ```bash
    export ANTHROPIC_BASE_URL=https://platform.endue.ai/api/v1/llm
    export ANTHROPIC_API_KEY=$ENDUE_API_KEY
    claude
    ```
  </TabItem>
</Tabs>

**Paramètres → Compte → API LLM** affiche la même URL de base et les mêmes exemples, prêts à copier.

## Modèles et tarifs

`GET https://platform.endue.ai/api/v1/llm/models` liste tous les modèles que vous pouvez appeler, avec leur longueur de contexte et leur prix. Cette liste se consulte sans clé.

- Les **identifiants de modèle** ont la forme `openai/gpt-5.4` ou `x-ai/grok-4.6` : le fournisseur, puis le modèle.
- Les **prix** sont exprimés en crédits par jeton, sous forme de chaînes décimales : `prompt` pour l'entrée, `completion` pour la sortie, et `input_cache_read` lorsque le modèle applique une remise sur les entrées en cache. Un crédit vaut un dollar américain.
- Certains modèles facturent davantage les prompts très longs. Ces prix figurent sous `overrides`, avec la longueur de prompt à partir de laquelle ils s'appliquent.

Vous pouvez parcourir les mêmes modèles sur la [page des modèles](/fr/models).

## Streaming

Ajoutez `"stream": true`. Vous recevez la réponse sous forme d'événements envoyés par le serveur (SSE), en fragments au format OpenAI, qui se terminent par `data: [DONE]`. Le dernier fragment avant `[DONE]` contient `usage`, qui inclut le coût de l'appel.

## Comment un appel est facturé

<Steps>

1. **Avant que le modèle ne s'exécute**, endue met de côté assez de crédits pour couvrir le coût maximal possible de l'appel : votre prompt plus `max_tokens` en sortie. Si votre solde est inférieur à ce montant, le modèle n'est pas appelé et vous recevez une erreur `402`.

2. **À la fin de l'appel**, seul son coût réel est débité, et le reste de la somme mise de côté revient sur votre solde.

3. **La réponse vous indique le montant débité.** `usage.cost` correspond aux crédits prélevés pour cet appel, et l'en-tête `X-Endue-Request-Id` identifie l'appel si vous avez une question à son sujet.

</Steps>

Si vous omettez `max_tokens` et que votre solde ne couvre pas la longueur de sortie maximale du modèle, l'appel a quand même lieu, avec `max_tokens` abaissé à ce que couvre votre solde, à condition que cela représente au moins 1 024 jetons. En dessous, vous recevez une erreur `402`.

Les appels à l'API LLM sont payés uniquement avec les **crédits achetés et promotionnels**. Le quota inclus dans votre offre est réservé aux agents et n'est pas utilisé ici. Les appels apparaissent dans le [tableau de bord d'utilisation](/fr/docs/account/usage/#sources), onglet **Sources**, sous la mention **API LLM**.

## Format Anthropic et Claude Code

La même URL de base accepte aussi le format Anthropic Messages. Le SDK Anthropic et Claude Code ajoutent eux-mêmes `/v1/messages` à l'URL de base : la configuration se résume donc aux deux lignes des onglets ci-dessus.

- Envoyez la clé dans `x-api-key` ou dans `Authorization: Bearer`.
- Les noms de modèles Claude s'écrivent comme chez Anthropic (`claude-sonnet-4-5`, ou avec une date comme `claude-sonnet-4-5-20250929`), à condition que le modèle figure dans la liste des modèles. Tout identifiant de la liste fonctionne aussi, y compris pour des modèles autres que Claude.
- Le streaming utilise le format d'événements d'Anthropic, et les erreurs suivent la structure d'erreur d'Anthropic.
- `/v1/messages/count_tokens` renvoie une estimation du nombre de jetons d'entrée. Cet appel n'est pas facturé, et le résultat est une approximation, pas un décompte exact par le tokeniseur.

## Erreurs

Les erreurs suivent la structure du format appelé : `{"error": {…}}` pour OpenAI, ou `{"type": "error", "error": {…}}` pour Anthropic.

| Statut | Ce qui s'est passé | Que faire |
| --- | --- | --- |
| `400` | La requête est mal formée, `n` est supérieur à 1, ou le modèle a rejeté l'entrée | Corrigez la requête ; le message indique ce qui ne va pas |
| `401` | La clé est absente, révoquée ou erronée | Vérifiez la clé et la façon dont vous l'envoyez |
| `402` | Votre solde de crédits ne couvre pas l'appel (`insufficient_credits`, ou `billing_error` au format Anthropic) | Achetez des crédits, ou réduisez `max_tokens` |
| `403` | La clé est limitée à un seul agent | Créez une clé valable pour tout le compte |
| `404` | Le modèle ne figure pas dans la liste des modèles | Choisissez un identifiant dans `/models` |
| `429` | Trop de requêtes | Attendez le nombre de secondes indiqué dans `Retry-After` |
| `502` | Le fournisseur du modèle a échoué | Réessayez |
| `503` | La facturation ou la liste des modèles est brièvement indisponible. Le modèle n'a pas été appelé et rien n'a été débité | Réessayez un peu plus tard |

## Limites

- Seuls les modèles de la liste des modèles peuvent être appelés.
- Deux formats sont pris en charge : OpenAI Chat Completions et Anthropic Messages. Il n'y a pas de points de terminaison pour les embeddings, les images, l'audio ou Responses.
- `n` doit valoir 1.
- Les champs qui sortent de la requête standard sont ignorés, par exemple une liste d'autres modèles de secours, le routage entre fournisseurs ou les plugins. Au format Anthropic, les outils côté serveur comme la recherche web sont refusés, et `top_k` est ignoré.
- Le quota de l'offre n'est pas utilisé ; les appels nécessitent des crédits achetés ou promotionnels.
- Une clé limitée à un seul agent ne peut pas appeler de modèles.
- Jusqu'à 100 appels par minute, comptés par clé et par compte. Le corps d'une requête peut atteindre 8 Mo.
- `count_tokens` fournit une estimation.

## Voir aussi

<CardGrid>
  <LinkCard
    title="API d'agent"
    href="/fr/docs/build/agent-api/"
    description="Appeler un agent, avec son prompt, sa mémoire et ses outils, plutôt qu'un modèle brut."
  />
  <LinkCard
    title="Tableau de bord d'utilisation"
    href="/fr/docs/account/usage/"
    description="Voir les dépenses de l'API LLM à côté de celles de vos agents, dans l'onglet Sources."
  />
  <LinkCard
    title="Choisir un modèle"
    href="/fr/docs/build/models/"
    description="Ce qui distingue les modèles, et ce qu'ils coûtent les uns par rapport aux autres."
  />
  <LinkCard
    title="Sécurité et autorisations"
    href="/fr/docs/account/security/"
    description="Ce qu'une clé peut atteindre, et comment la révoquer."
  />
</CardGrid>
