API compatible OpenAI
Ce document décrit le proxy de complétion de chat compatible avec la spécification OpenAI exposé par la gateway DIMARC. Il est destiné à être branché tel quel dans des outils d’automatisation qui savent parler à un fournisseur « OpenAI API spec compatible » — la cible la plus courante est un module AI Agent dans Make.
Prérequis
Section intitulée « Prérequis »- Un compte DIMARC actif.
- Être administrateur de votre organisation.
- Votre token d’authentification (voir Authentification ci-dessous).
Base URL
Section intitulée « Base URL »https://api.dimarc.ai/openai/v1Utilisez cette base versionnée (/v1) dans la configuration de vos outils : c’est celle qui correspond à la convention des SDK et connecteurs OpenAI (qui attendent une base du type https://api.openai.com/v1). Le préfixe non versionné https://api.dimarc.ai/openai répond de façon strictement identique — conservé pour les intégrations qui normalisent elles-mêmes leur base URL en y ajoutant /v1 — mais ce n’est pas celui à saisir.
Authentification
Section intitulée « Authentification »Récupérez un token via GET /v2/token (voir Authentification pour l’obtention de vos identifiants client_id/client_secret) :
curl --location 'https://api.dimarc.ai/v2/token?client_id=votre-client-id&client_secret=votre-client-secret'{ "access_token": "**************", "token_type": "x-api-key", "expires_in": "3600"}Sans credential valide, toute requête renvoie 401 :
{ "error": { "message": "Missing API key. Provide it in the Authorization header as 'Bearer <key>'.", "type": "invalid_request_error", "code": "invalid_api_key" }}Si l’accès API est désactivé pour votre organisation, la requête renvoie 403 (type: "permission_error", code: "access_denied").
Modèles disponibles
Section intitulée « Modèles disponibles »| Identifiant | Description |
|---|---|
dimarc-large |
Modèle par défaut, meilleure qualité |
dimarc-small |
Modèle plus rapide/économique |
Ce sont des alias : le modèle réellement servi en arrière-plan peut changer sans préavis, sans casser vos intégrations. Un identifiant hors de cette liste est refusé en 400 ; un alias de la liste momentanément non servi renvoie 503 — c’est une indisponibilité temporaire, pas une erreur de votre requête. Interrogez GET /openai/v1/models pour obtenir la liste à jour :
curl 'https://api.dimarc.ai/openai/v1/models' \ --header 'Authorization: Bearer <votre_access_token>'{ "object": "list", "data": [ { "id": "dimarc-large", "object": "model", "created": 1732000000, "owned_by": "dimarc" }, { "id": "dimarc-small", "object": "model", "created": 1732000000, "owned_by": "dimarc" } ]}Configuration dans Make
Section intitulée « Configuration dans Make »- Dans votre scénario, ajoutez un module AI Agent.
- Comme LLM provider, choisissez OpenAI API spec compatible.
- Renseignez la Base URL :
https://api.dimarc.ai/openai/v1. - Renseignez l’API Key avec la valeur d’
access_tokenobtenue ci-dessus (voir l’avertissement sur letoken_typeplus haut — Make l’enverra enAuthorization: Bearer). - Choisissez le modèle :
dimarc-largeoudimarc-small. - Si votre agent doit déclencher des modules Make, attachez-les comme outils : un appel qui aboutit à un appel d’outil renvoie
finish_reason: "tool_calls", ce qui déclenche l’exécution du module.
Complétion de chat
Section intitulée « Complétion de chat »POST /openai/v1/chat/completionsRequête simple
Section intitulée « Requête simple »curl 'https://api.dimarc.ai/openai/v1/chat/completions' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <votre_access_token>' \ --data '{ "model": "dimarc-large", "messages": [ { "role": "user", "content": "Résume ce texte en une phrase : ..." } ] }'{ "id": "chatcmpl-abc123", "object": "chat.completion", "model": "dimarc-large", "choices": [ { "index": 0, "message": { "role": "assistant", "content": "..." }, "finish_reason": "stop" } ], "usage": { "prompt_tokens": 42, "completion_tokens": 18, "total_tokens": 60 }}Requête avec outils (tools)
Section intitulée « Requête avec outils (tools) »curl 'https://api.dimarc.ai/openai/v1/chat/completions' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <votre_access_token>' \ --data '{ "model": "dimarc-large", "messages": [ { "role": "user", "content": "Quel temps fait-il à Lyon ?" } ], "tools": [ { "type": "function", "function": { "name": "get_weather", "description": "Donne la météo actuelle d'\''une ville", "parameters": { "type": "object", "properties": { "city": { "type": "string" } }, "required": ["city"] } } } ] }'{ "choices": [ { "message": { "role": "assistant", "tool_calls": [ { "id": "call_abc123", "type": "function", "function": { "name": "get_weather", "arguments": "{\"city\":\"Lyon\"}" } } ] }, "finish_reason": "tool_calls" } ]}Requête en flux (stream: true)
Section intitulée « Requête en flux (stream: true) »curl 'https://api.dimarc.ai/openai/v1/chat/completions' \ --no-buffer \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <votre_access_token>' \ --data '{ "model": "dimarc-large", "messages": [{ "role": "user", "content": "Bonjour" }], "stream": true }'Réponse en flux text/event-stream, terminée par data: [DONE] :
data: {"id":"chatcmpl-abc123","choices":[{"delta":{"content":"Bonjour"}}]}
data: {"id":"chatcmpl-abc123","choices":[{"delta":{"content":" !"}}]}
data: [DONE]Si la génération échoue après le début du flux — erreur du modèle, rupture de la connexion amont, silence prolongé du modèle, ou génération interrompue avant son terme — le statut HTTP est déjà 200 : l’incident est signalé par une trame d’erreur au format OpenAI, suivie de data: [DONE].
data: {"error":{"message":"The model backend returned an error.","type":"api_error","code":"upstream"}}
data: [DONE]Traitez donc une trame portant error comme une fin de génération anormale : le contenu reçu avant elle est partiel. Le message est constant : le détail technique reste côté DIMARC.
Paramètres
Section intitulée « Paramètres »Relayés tels quels
Section intitulée « Relayés tels quels »messages (requis), tools, tool_choice, temperature, top_p, max_completion_tokens, max_tokens, presence_penalty, frequency_penalty, stop, stream, stream_options, response_format.
chat_template_kwargs est aussi relayé si fourni : c’est un paramètre avancé propre au moteur sous-jacent. En son absence, la gateway le force à { "enable_thinking": false } pour désactiver un raisonnement étendu par défaut ; fournissez-le explicitement pour le réactiver.
Valeurs acceptées : true (flux SSE), false, absent, ou explicitement null (ces trois derniers cas sont traités de façon identique : réponse JSON classique, non streamée). Toute autre valeur (chaîne, nombre, objet…) est refusée :
{ "error": { "message": "The 'stream' parameter must be a boolean.", "type": "invalid_request_error", "code": "invalid_value" }}→ 400. Ce refus a lieu avant tout appel au modèle : aucune consommation n’est facturée.
| Paramètre | Condition de refus |
|---|---|
n |
Valeur strictement supérieure à 1 (seule n: 1, le défaut, est acceptée) |
logprobs |
Toute valeur définie |
logit_bias |
Toute valeur définie |
Ces refus renvoient 400 :
{ "error": { "message": "The 'n' parameter is not supported.", "type": "invalid_request_error", "code": "unsupported_parameter" }}- Taille de requête : 2 Mo (2 097 152 octets, mesurés sur l’en-tête
Content-Length). Au-delà, la gateway renvoie413(code: "request_too_large") avant même de lire le corps. Une requête à corps qui ne déclare pas sa longueur — corps envoyé en morceaux (Transfer-Encoding: chunked) — est refusée en411(code: "missing_content_length") : les SDK OpenAI et les connecteurs comme Make sérialisent leur corps et déclarent toujours cette longueur. - Tokens de sortie : plafonnés à 8192 par réponse.
max_completion_tokens(nom actuel) etmax_tokens(déprécié) sont tous deux acceptés et plafonnés séparément ; une valeur au-delà du plafond est silencieusement ramenée à 8192 — ce n’est pas un motif de refus. Si aucun des deux n’est fourni, la réponse est bornée à 8192. Quand les deux sont fournis, c’estmax_completion_tokensqui s’applique. - Jetons : la consommation s’impute sur le quota de jetons inclus dans votre abonnement, apprécié sur le cumul du mois calendaire tous canaux facturables confondus (API publique et canal public). Au-delà, le dépassement est facturé à l’usage, comme sur le reste de l’API publique.
- Plafond de dépense : votre organisation peut fixer, depuis son espace d’abonnement, un plafond mensuel de dépassement en euros. Le plafond atteint, les requêtes sont refusées en
429(code: "spending_limit_reached") jusqu’à la période suivante ou jusqu’au relèvement du plafond. Sans plafond posé, aucune limite de montant ne s’applique. La liste des modèles reste accessible pour ne pas couper la configuration de votre client. - Générations simultanées : au moins 4 par organisation. Au-delà,
429(code: "concurrent_limit_exceeded") — réessayez quand une génération en cours se termine. - Durée d’un flux : 5 minutes. Un flux qui dépasse cette durée est interrompu — la trame d’erreur puis
data: [DONE]sont émises, et les jetons produits jusque-là sont facturés. - Débit : 100 requêtes par minute et par organisation, tous jetons confondus — obtenir un nouveau jeton ne remet pas le compteur à zéro. Au-delà,
429avec un headerRetry-After(secondes avant la prochaine fenêtre) :
{ "error": { "message": "Rate limit reached. Please slow down your requests.", "type": "rate_limit_error", "code": "rate_limit_exceeded" }}Format d’erreur
Section intitulée « Format d’erreur »Contrairement au reste de l’API DIMARC (enveloppe {status, code, error, detail}), cet endpoint suit strictement le format d’erreur OpenAI :
{ "error": { "message": "...", "type": "...", "code": "..." }}| Status | Code | Type | Cas |
|---|---|---|---|
| 400 | model_not_found |
invalid_request_error |
Identifiant de modèle hors de la liste GET /openai/v1/models |
| 400 | unsupported_parameter |
invalid_request_error |
n > 1, logprobs ou logit_bias fournis |
| 400 | invalid_value |
invalid_request_error |
stream n’est ni booléen, ni absent, ni null |
| 400 | invalid_request |
invalid_request_error |
Corps invalide : JSON malformé, messages manquant ou vide |
| 401 | invalid_api_key |
invalid_request_error |
Clé d’API absente ou invalide |
| 403 | access_denied |
permission_error |
Accès API désactivé pour l’organisation, ou organisation sans abonnement |
| 404 | not_found |
invalid_request_error |
Chemin inconnu sous /openai, ou méthode HTTP incorrecte sur un chemin connu |
| 411 | missing_content_length |
invalid_request_error |
Requête à corps sans en-tête Content-Length exploitable |
| 413 | request_too_large |
invalid_request_error |
Corps de requête de plus de 2 Mo |
| 429 | rate_limit_exceeded |
rate_limit_error |
Plus de 100 requêtes/minute pour cette organisation |
| 429 | concurrent_limit_exceeded |
rate_limit_error |
Trop de générations simultanées pour cette organisation |
| 429 | spending_limit_reached |
insufficient_quota |
Plafond de dépense de l’organisation atteint |
| 500 | internal_error |
api_error |
Échec interne inattendu : réessayer ne changera probablement rien. Le détail technique n’est jamais renvoyé, il reste côté DIMARC |
| 502 | upstream |
api_error |
Le modèle a renvoyé une erreur |
| 503 | unavailable |
api_error |
Indisponibilité temporaire : modèle annoncé mais non servi, non joignable, ou dépendance interne en échec — réessayez après le délai annoncé par l’en-tête Retry-After |
| 504 | timeout |
api_error |
Le modèle n’a pas répondu à temps |
Support et assistance
Section intitulée « Support et assistance »Pour toute question concernant l’API compatible OpenAI, contactez notre équipe de support à l’adresse contact@dimarc.fr