Aller au contenu

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.

  • Un compte DIMARC actif.
  • Être administrateur de votre organisation.
  • Votre token d’authentification (voir Authentification ci-dessous).
https://api.dimarc.ai/openai/v1

Utilisez 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.

Récupérez un token via GET /v2/token (voir Authentification pour l’obtention de vos identifiants client_id/client_secret) :

Fenêtre de terminal
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").

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 :

Fenêtre de terminal
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" }
]
}
  1. Dans votre scénario, ajoutez un module AI Agent.
  2. Comme LLM provider, choisissez OpenAI API spec compatible.
  3. Renseignez la Base URL : https://api.dimarc.ai/openai/v1.
  4. Renseignez l’API Key avec la valeur d’access_token obtenue ci-dessus (voir l’avertissement sur le token_type plus haut — Make l’enverra en Authorization: Bearer).
  5. Choisissez le modèle : dimarc-large ou dimarc-small.
  6. 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.
POST /openai/v1/chat/completions
Fenêtre de terminal
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 }
}
Fenêtre de terminal
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"
}
]
}
Fenêtre de terminal
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.

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 renvoie 413 (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 en 411 (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) et max_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’est max_completion_tokens qui 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à, 429 avec un header Retry-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"
}
}

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

Pour toute question concernant l’API compatible OpenAI, contactez notre équipe de support à l’adresse contact@dimarc.fr