Complétions de conversation

Un point d’accès /v1 pour tous les fournisseurs. Pointez votre client OpenAI vers une autre URL et une clé, avec vos clés et 0 % de majoration.

POST/v1/chat/completions

Le point d’accès principal, compatible OpenAI. Les corps de requête et de réponse suivent le format Chat Completions d’OpenAI ; les clients et trousses SDK existants fonctionnent sans adaptateur.

Paramètres

  • model — un identifiant du catalogue, auteur/modèle. Requis sauf si models est fourni.
  • messages — la conversation, comme chez OpenAI.
  • stream — événements diffusés par le serveur. Voir Diffusion en continu.
  • max_completion_tokens (ou max_tokens) — un entier de 1 à 10 000 000 ; toute autre valeur est un 400 — temperature, top_p, top_k, stop, seed
  • frequency_penalty, presence_penalty, logit_bias, logprobs, top_logprobs; min_p et repetition_penalty là où un hébergeur de modèles ouverts les prend en charge
  • tools, tool_choice, parallel_tool_calls, response_format, reasoning
  • user — un identifiant stable pour votre utilisateur final, transmis au fournisseur pour l’attribution des abus.
  • models — une chaîne de repli. Voir plus bas.
  • provider — préférences d’acheminement. Voir Acheminement.

Le contenu d’un message est une chaîne ou une liste de parties — text, image_url, input_audio, file, video_url. Les appels d’outils et leurs résultats fonctionnent chez tous les fournisseurs, pas seulement ceux compatibles OpenAI. Si un point d’accès ne peut pas recevoir l’une de vos parties — de l’audio envoyé à Anthropic, par exemple — la requête passe au point d’accès suivant qui le peut, et échoue avec un 400 si aucun ne le peut.

Les paramètres inconnus sont ignorés, non rejetés. Les points d’accès diffèrent dans ce qu’ils acceptent, et faire échouer une requête parce qu’un fournisseur ne comprend pas un champ rendrait votre code spécifique à ce fournisseur — c’est-à-dire précisément ce que vous cherchiez à éviter. Quelques paramètres OpenAI sont ignorés délibérément, parce qu’ils changeraient ce qui vous est facturé ou ce que le fournisseur conserve — n, store, service_tier et web_search_options.

Repli entre modèles

Passez models au lieu de model pour donner une chaîne ordonnée. Si le premier ne peut être servi, le suivant est essayé, jusqu’à trois tentatives.

json
{
  "models": [
    "anthropic/claude-sonnet-5",
    "openai/gpt-5.5",
    "google/gemini-3.1-pro"
  ],
  "messages": [{"role": "user", "content": "Bonjour"}]
}

La chaîne est parcourue jusqu’au bout plutôt que réessayée une seule fois, et chaque tentative est consignée pour qu’un échec soit imputable après coup.

Réponse

json
{
  "id": "gen-...",
  "model": "anthropic/claude-sonnet-5",
  "choices": [{
    "index": 0,
    "message": {"role": "assistant", "content": "Bonjour."},
    "finish_reason": "stop",
    "native_finish_reason": "end_turn"
  }],
  "usage": {"prompt_tokens": 9, "completion_tokens": 3, "total_tokens": 12}
}

native_finish_reason est la valeur propre au fournisseur, conservée telle quelle à côté de la valeur normalisée. Les fournisseurs ne s’entendent pas sur ce que « stop » signifie, et effacer cette distinction ferait perdre une information dont vous pourriez avoir besoin.

Le décompte de jetons est celui du fournisseur, pas notre estimation. Vous êtes facturé sur ce qu’il a déclaré.

Attribution à une application

Envoyez HTTP-Referer avec l’URL de votre application et X-Title avec son nom, et chaque requête est enregistrée au nom de votre application. X-App-Title et X-OpenRouter-Title sont acceptés comme X-Title : un client déjà configuré pour un autre routeur n’a rien à changer.

curl
curl -X POST https://autonomousrelay.com/v1/chat/completions \
  -H "Authorization: Bearer $AUTONOMOUSRELAY_API_KEY" \
  -H 'HTTP-Referer: https://myapp.example' \
  -H 'X-Title: My App' \
  -H 'content-type: application/json' \
  -d '{"model": "anthropic/claude-sonnet-5", "messages": [{"role": "user", "content": "Hello"}]}'
  • Seuls le schéma, l’hôte et le chemin du référent sont conservés. La chaîne de requête et le fragment sont retirés avant tout enregistrement.
  • X-App-Visibility: hidden rend l’application privée : elle n’apparaîtra jamais dans une liste publique d’applications. L’en-tête n’est lu qu’à la première requête de l’application.
  • X-App-Categories accepte jusqu’à deux catégories séparées par des virgules par requête, et une application en conserve jusqu’à dix.
  • Un référent localhost ou une adresse IP est enregistré sur la requête, mais ne crée pas d’application.

L’API Messages d’Anthropic

POST/v1/messages

Réglez l’URL de base d’une trousse SDK d’Anthropic sur cet hôte et elle fonctionne telle quelle : la clé dans x-api-key, la requête et la réponse au format d’Anthropic, et la diffusion en continu selon ses événements. La requête passe par le même pipeline qu’une complétion de clavardage : acheminement, budgets, garde-fous, préréglages et outils serveur s’appliquent, et n’importe quel modèle peut répondre. Un nom Claude comme claude-opus-4-8 désigne anthropic/claude-opus-4.8 ; fallbacks accepte jusqu’à trois objets {"model": ...}. Les outils serveur propres à Anthropic sont refusés avec une erreur 400 : déclarez plutôt des outils autonomousrelay:*.

L’API Responses d’OpenAI

POST/v1/responses

L’API Responses, diffusion en continu comprise, servie par le même pipeline qu’une complétion de clavardage et sur n’importe quel modèle. Elle est sans état : envoyez toute la conversation dans input. store: true, previous_response_id, conversation et background exigent une réponse enregistrée et sont refusés avec une erreur 400 qui le dit. Les outils de type fonction et les outils serveur autonomousrelay:* fonctionnent ; les outils intégrés d’OpenAI sont refusés.

Anciennes complétions de texte

POST/v1/completions

Pour les clients qui l’appellent encore. Le prompt est envoyé comme un seul message utilisateur, acheminé comme n’importe quelle complétion de clavardage, et la réponse revient dans choices[0].text. Une invite par requête ; suffix, echo, best_of, n supérieur à 1 et logprobs exigent un vrai modèle de complétion et sont refusés avec une erreur 400.

Plongements

POST/v1/embeddings

La requête et la réponse d’OpenAI. input est une chaîne ou une liste d’au plus 2 048 chaînes ; encoding_format vaut float ou base64 ; dimensions fonctionne là où le modèle peut raccourcir sa sortie. model, models et provider acheminent exactement comme ici, par les mêmes budgets, filtres de contenu et garde-fous, et la requête est facturée selon le nombre de jetons d’invite que déclare le fournisseur. Seuls les modèles de plongement sont candidats : nommer un modèle de clavardage donne une erreur 400 qui le dit.

Reclassement

POST/v1/rerank

Envoyez une query et jusqu’à 1 000 documents (des chaînes, ou {"text": ...}) ; chacun revient avec un relevance_score, du plus pertinent au moins pertinent. top_n limite la liste, return_documents inclut le texte, et instruction oriente la tâche sur les modèles qui l’acceptent. Acheminé et facturé comme les plongements. Les reclasseurs Qwen3 sont servis par DeepInfra.

Images

POST/v1/images/generations

La requête et la réponse d’OpenAI : un prompt, jusqu’à 4 images (n) et une taille size comme 1024x1024. Les images reviennent en b64_json. Chacune est facturée au prix publié du modèle, par image ou par mégapixel de la taille, que la liste des points d’accès du modèle indique avec son unité. Un modèle dont le prix ne peut être calculé à partir de la requête n’est pas encore servi.

Audio

POST/v1/audio/speech
POST/v1/audio/transcriptions

L’API audio d’OpenAI. La synthèse prend un texte input et renvoie l’audio, facturé au caractère ; chaque modèle a ses propres noms de voix voice. La transcription prend un fichier file en multipart d’au plus 25 Mo et renvoie son texte (json, verbose_json ou text), facturé à la seconde d’audio. Comme la réponse de synthèse est de l’audio, l’identifiant de la requête figure dans l’en-tête x-autonomous-relay-generation-id.

Lots

POST/v1/batches

Jusqu’à 10 000 requêtes de clavardage, chacune {"custom_id": ..., "body": {...}}, exécutées par l’API de lot du fournisseur à son prix de lot, en moins de 24 heures, avec votre clé de fournisseur. Interrogez GET /v1/batches/:id ; une fois le lot terminé, GET /v1/batches/:id/results renvoie une ligne par requête. Le lot est facturé une seule fois, à sa fin, selon l’usage de ses requêtes. Tout modèle ayant une entrée :batch au catalogue, chez six fournisseurs ; API de lots donne le détail.

Examiner une requête après coup

GET/v1/generation?id=gen-...

Retourne les métadonnées d’une requête : quel point d’accès l’a servie, le nombre de jetons, la latence, le coût, la version de prix appliquée et l’application d’où elle provient. Jamais le contenu : ce point d’accès ne le retourne sous aucun réglage. Si votre organisation active la journalisation des requêtes — désactivée par défaut, et pas encore activable — le contenu conservé se lit à partir d’un point d’accès distinct.

Rétroaction

POST/v1/generation/feedback

Associez une note à une requête faite par votre application, avec la même clé d’inférence, et voyez sur la page Activité quels modèles vos utilisateurs apprécient. value va de -1 (pouce vers le bas) à 1 (pouce vers le haut) ; ramenez une note plus fine dans cet intervalle. label est un identifiant court facultatif, comme helpful. Une nouvelle soumission avec la même clé remplace la note. Il n’y a pas de champ de commentaire : le texte libre est du contenu, et le contenu n’est pas conservé.

curl
curl -X POST https://autonomousrelay.com/v1/generation/feedback \
  -H "Authorization: Bearer $AUTONOMOUSRELAY_API_KEY" \
  -H 'content-type: application/json' \
  -d '{"id": "gen-...", "value": 1, "label": "helpful"}'

GET /v1/generation/feedback?id=gen-... relit les notes ; l’identifiant d’une autre organisation donne une erreur 404.

Mise en cache

Une mémoire cache à correspondance exacte, désactivée par défaut et activée clé d’inférence par clé d’inférence, sert une requête répétée sans diffusion en continu avec x-cache: HIT, sans frais. Mémoire cache des réponses décrit ce qu’est une réponse en cache, ce qui n’est jamais mis en cache et la vue qu’en a l’organisation.