# Compatibilité OpenAI et Anthropic

> Ce que l'API Tukai reprend des API OpenAI et Anthropic, ce qu'elle ne reprend pas, et ce qu'il faut changer dans une intégration existante.

Source : https://developers.tuk-ai.com/docs/compatibility · Vérifié le 2026-10-04

L'API Tukai imite **quatre opérations** des API OpenAI et Anthropic, pour que les SDK officiels fonctionnent sans être modifiés. Elle n'est **pas** une copie complète de ces API : toute opération absente de cette page n'existe pas chez Tukai.

## Ce qui change dans votre intégration

| Réglage | SDK OpenAI | SDK Anthropic |
|---|---|---|
| URL de base | `https://chat.tuk-ai.com/v1` | `https://chat.tuk-ai.com` (le SDK ajoute lui-même `/v1`) |
| Clé | `tuk_sk_…` dans `apiKey` | `tuk_sk_…` dans `apiKey` |
| Identifiant de modèle | Un identifiant Tukai, par exemple `chat-anthropic-claude-haiku-4-5` | Le même identifiant Tukai |

Les identifiants de modèle sont **ceux de Tukai**, jamais ceux du fournisseur d'origine : `gpt-…` ou `claude-…` seuls sont refusés. La liste est sur la page [Modèles](https://developers.tuk-ai.com/models).

Le reste du code (messages, `max_tokens`, lecture de la réponse) ne change pas pour un appel de texte simple.

## Opérations disponibles

| Opération | Forme | État |
|---|---|---|
| `POST /v1/chat/completions` | OpenAI | Pris en charge texte, avec ou sans `stream` |
| `POST /v1/messages` | Anthropic | Pris en charge texte, avec ou sans `stream` ; `max_tokens` obligatoire |
| `POST /v1/messages/count_tokens` | Anthropic | Pris en charge estimation locale, gratuite, sans appel au modèle |
| `GET /v1/models` | Catalogue Tukai | Partiel public et sans clé ; les objets ont des champs Tukai (`display_name`, `available`…) en plus de `id` |
| `POST /v1/responses`, `embeddings`, `images`, `audio`, `files`, `batches`, `assistants` | OpenAI | Non pris en charge |
| `GET /v1/models/{id}`, Message Batches, Files | Anthropic | Non pris en charge |

## Fonctions avancées

| Fonction | État | Précision |
|---|---|---|
| Streaming (SSE) | Partiel | Codé et couvert par les tests du dépôt ; pas encore exécuté contre la production dans le cadre de cette documentation. Côté OpenAI, le flux se termine par `data: [DONE]`. |
| Images ou audio en entrée | Non pris en charge | Les parties `image_url` ou `input_audio` sont **ignorées** : la requête répond quand même, à partir du seul texte. N'envoyez pas d'image en comptant sur une analyse. |
| Outils (`tools`) côté OpenAI | Non pris en charge | La réponse `chat.completion` ne contient que du texte (`message.content`), jamais `tool_calls`. |
| Outils (`tools`) côté Anthropic | Non testé | La traduction `tool_use` ↔ `tool_calls` existe dans le code ; elle n'a pas été vérifiée de bout en bout ici. |
| `finish_reason` côté OpenAI | Partiel | Vaut toujours `stop`, même quand la sortie a été coupée par `max_tokens`. |
| Sortie structurée (`response_format`, JSON schema) | Non pris en charge | Ignorée sans avertissement : seuls `model`, `messages` (texte) et `max_tokens` sont transmis au modèle. |
| `temperature`, `top_p`, `stop` et autres réglages OpenAI | Non pris en charge | Acceptés par la validation mais ignorés sans avertissement. |
| `thinking`, `cache_control`, outils côté serveur Anthropic | Non pris en charge | Non portés ; signalés comme avertissement côté serveur. |
| Appel direct depuis un navigateur | Non pris en charge | Usage non pris en charge : une clé ne doit jamais se trouver dans du code exécuté chez vos utilisateurs. |

## En-têtes

| En-tête | Effet |
|---|---|
| `Authorization: Bearer tuk_sk_…` | Forme canonique (SDK OpenAI). |
| `x-api-key: tuk_sk_…` | Accepté (SDK Anthropic). Envoyez l'un ou l'autre, pas les deux : par l'URL publiée, seul `Authorization` est retenu quand les deux sont présents. |
| `anthropic-version`, `anthropic-beta` | Acceptés, non transmis au fournisseur. |
| `x-request-id` (réponse) | Identifiant de la requête, sur chaque réponse. Le SDK OpenAI l'expose (`requestID` en TypeScript) ; le SDK Anthropic ne le lit pas, il faut le relever dans les en-têtes HTTP. |
| `ratelimit-limit`, `ratelimit-remaining`, `ratelimit-reset` (réponse) | État du débit de la clé. |

## Erreurs

Les erreurs gardent l'enveloppe du fournisseur imité (`{"error": {...}}` pour OpenAI, `{"type": "error", "error": {...}}` pour Anthropic), pour que le SDK les lise normalement. Selon la cause, le message est en anglais ou en français : lisez le champ `type`. Détail des codes : [Erreurs](https://developers.tuk-ai.com/docs/errors).

## Versions vérifiées

Le 3 octobre 2026, contre la production, **sans appel payant** (clé volontairement invalide) :

- `openai` 7.27.0 (Node.js) : `models.list()` répond ; `chat.completions.create()` atteint la bonne route et lève `AuthenticationError` (401).
- `@anthropic-ai/sdk` 0.131.0 (Node.js) : `messages.create()` atteint la bonne route et lève `AuthenticationError` (401).

> **Ce qui n'a pas encore été vérifié**
>
> Une génération réussie de bout en bout, le streaming et les SDK Python n'ont pas été exécutés contre la production pour cette page : aucun compte de test payant n'est encore autorisé. Les exemples Python suivent la configuration standard des SDK officiels.
