Complétions de chat

Générez des complétions de chat à partir d'une liste de messages — le point d'accès principal pour la génération de texte avec tous les modèles pris en charge.

POST/v1/chat/completions

Générez une complétion de chat à partir d'une liste de messages. C'est le point d'accès principal pour la génération de texte avec tous les modèles pris en charge.

Les tableaux de paramètres ci-dessous répertorient les champs communs partagés par tous les modèles. Chaque modèle peut prendre en charge des paramètres supplémentaires qui lui sont propres (par ex. entrée vision, appel d'outils, mode JSON). Pour la liste exhaustive des paramètres acceptés par un modèle donné, ouvrez sa page de détails sur Modèles et basculez vers l'onglet API — la référence des paramètres y est générée à partir des capacités déclarées du modèle.

Corps de la requête

ParamètreTypeRequisDescription
modelstringOuiID du modèle (par ex. « gpt-4o-mini », « claude-sonnet-4-6 »)
messagesarrayOuiTableau d'objets message. Chacun possède un role (system, user ou assistant) et un content qui est soit une simple chaîne, soit un tableau de blocs de contenu (text, image_url, document_url). system définit le comportement de l'IA ; user est votre message ; assistant est une réponse antérieure de l'IA.
temperaturenumberNonContrôle l'aléatoire. 0 = déterministe/ciblé, 1 = équilibré (par défaut), 2 = très créatif/aléatoire.
max_tokensintegerNonNombre maximal de tokens à générer
streambooleanNonDiffuse la réponse en SSE. Par défaut : false
top_pnumberNonParamètre d'échantillonnage par noyau (0–1)
stopstring | string[]NonJusqu'à 4 séquences d'arrêt. Le modèle cesse de générer dès qu'il en rencontre une.
frequency_penaltynumberNon-2.0 à 2.0. Les valeurs positives pénalisent les tokens répétés. Par défaut : 0
presence_penaltynumberNon-2.0 à 2.0. Les valeurs positives orientent le modèle vers de nouveaux sujets. Par défaut : 0
seedintegerNonGraine de reproductibilité. La même graine + les mêmes paramètres renvoient une sortie similaire (au mieux).
response_formatobjectNon{ type: "json_object" } ou { type: "json_schema", json_schema: ... } pour une sortie structurée. La prise en charge varie selon le modèle — voir l'onglet API du modèle.
toolsarrayNonDéfinitions de fonctions que le modèle peut appeler. Associé à tool_choice. Disponible uniquement sur les modèles compatibles avec les outils.

Entrée PDF. Joignez un PDF à un message user en passant un bloc de contenu avec { type: "document_url", document_url: { url: ... } }. Jusqu'à 5 PDF par requête, 32 Mo chacun. Seuls les modèles dotés de la capacité documents acceptent ce bloc — tous les modèles Claude, les familles GPT-4.1, GPT-5 et GPT-6, les modèles Gemini et Nova 2 Lite. Vérifiez capabilities.documents sur GET /v1/models ou l'onglet API du modèle ; les autres modèles renvoient un 400 avec details.code: "documents_not_supported".

Exemple de requête

import Tchavi from '@tchavi/sdk';

const client = new Tchavi({ apiKey: 'YOUR_API_KEY' });

const response = await client.chat.completions.create({
  model: 'gpt-4o-mini',
  messages: [
    { role: 'system', content: 'Tu es un assistant utile.' },
    { role: 'user', content: 'Quelle est la capitale du Bénin ?' },
  ],
  temperature: 0.7,
});

console.log(response.choices[0].message.content);
console.log('Crédits utilisés :', response.tchavi.credits_used);

Exemple de réponse

JSON
{
  "id": "chatcmpl-abc123",
  "object": "chat.completion",
  "created": 1711234567,
  "model": "gpt-4o-mini",
  "system_fingerprint": null,
  "service_tier": null,
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "La capitale du Bénin est Porto-Novo.",
        "refusal": null
      },
      "finish_reason": "stop",
      "logprobs": null
    }
  ],
  "usage": {
    "prompt_tokens": 24,
    "completion_tokens": 12,
    "total_tokens": 36,
    "prompt_tokens_details": { "cached_tokens": 0, "cache_write_tokens": 0, "audio_tokens": 0 },
    "completion_tokens_details": { "reasoning_tokens": 0, "audio_tokens": 0 }
  },
  "tchavi": {
    "budget_group": "BUDGET",
    "model_credits_per_1k": { "input": 1, "output": 2 },
    "model_type": "chat",
    "credits_used": 3,
    "credits_remaining": 1297
  }
}

L'objet tchavi est ajouté à chaque réponse non streamée : credits_used est le coût de cet appel, credits_remaining votre solde après celui-ci, et model_credits_per_1k les taux du modèle. Les SDK OpenAI ignorent ce champ supplémentaire.

Ce que la réponse garantit

Tchavi dessert plusieurs fournisseurs derrière une seule API, et le modèle que vous nommez peut être servi par un autre. Ces garanties valent quel que soit celui qui répond : vous n'avez jamais besoin d'un cas particulier par fournisseur.

model est l'identifiant que vous avez demandé — jamais le nom que le fournisseur lui donne. Demandez gpt-5-nano et vous recevez gpt-5-nano, pas gpt-5-nano-2025-08-07 : la réponse reste donc toujours comparable à votre requête.

id est l'identifiant de cette requête. C'est chatcmpl- suivi de la valeur de l'en-tête X-Request-Id (resp_ sur /v1/responses, msg_ sur /v1/messages). Tous les fragments d'un flux portent le même. Communiquez-le au support et la requête peut être retrouvée.

La forme ne varie pas. system_fingerprint et service_tier sont toujours présents et toujours null : ils décrivent une configuration serveur en amont et un palier commercial OpenAI, que cette API ne vend pas — votre propre palier se trouve dans tchavi. refusal et les deux blocs de détail d'usage sont eux aussi toujours présents : les lire ne renvoie jamais undefined.

Le texte de raisonnement suit le modèle que vous avez nommé. Les modèles qui publient leur raisonnement renvoient message.reasoning, et delta.reasoning en streaming. Ceux qui ne le font pas — dont la famille de modèles de raisonnement d'OpenAI — ne renvoient aucun texte, tout en déclarant completion_tokens_details.reasoning_tokens, facturés comme de la sortie. C'est le comportement natif de chaque modèle.

Streaming

Définissez stream: true pour recevoir la réponse token par token sous forme de Server-Sent Events (SSE). Cela vous permet d'afficher le texte au fur et à mesure de son arrivée plutôt que d'attendre la réponse complète.

import Tchavi from '@tchavi/sdk';

const client = new Tchavi({ apiKey: process.env.TCHAVI_API_KEY });

const stream = await client.chat.completions.create({
  model: 'gpt-4o-mini',
  messages: [{ role: 'user', content: 'Raconte-moi une courte histoire.' }],
  stream: true,
});

for await (const chunk of stream) {
  process.stdout.write(chunk.choices[0]?.delta?.content ?? '');
}

Sur cette page