Sorties structurées

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.

response_format sur une complétion de clavardage demande du JSON : {"type": "json_object"} pour n’importe quel JSON, ou {"type": "json_schema", "json_schema": {"name", "schema", "strict"}} pour un JSON conforme à un schéma. Le même champ fonctionne avec tout modèle ; ce que chaque fournisseur reçoit diffère, et figure ci-dessous.

curl
curl https://autonomousrelay.com/v1/chat/completions \
  -H "Authorization: Bearer $AUTONOMOUSRELAY_API_KEY" \
  -H 'content-type: application/json' \
  -d '{
    "model": "anthropic/claude-sonnet-5",
    "messages": [{"role": "user", "content": "Extract the invoice number and total from: INV-2041, $1,250.00"}],
    "response_format": {
      "type": "json_schema",
      "json_schema": {
        "name": "invoice",
        "strict": true,
        "schema": {
          "type": "object",
          "properties": {"number": {"type": "string"}, "total_usd": {"type": "number"}},
          "required": ["number", "total_usd"],
          "additionalProperties": false
        }
      }
    }
  }'

Ce que reçoit chaque fournisseur

  • Les fournisseurs au protocole OpenAI (OpenAI, xAI, Mistral, Groq et les autres) : le champ tel que vous l’avez envoyé.
  • Gemini : le mode JSON, avec votre schéma comme schéma de réponse.
  • Anthropic : un json_schema devient les sorties structurées d’Anthropic. Les bornes qu’Anthropic n’applique pas (minimum, maxLength, maxItems et semblables) restent non vérifiées, et additionalProperties: false est présumé là où vous ne l’avez pas fixé. Un schéma qu’Anthropic ne peut pas exprimer — additionalProperties autre que false, un $ref récursif ou externe — est envoyé sans format, et json_object n’a pas d’équivalent chez Anthropic ; dans les deux cas, c’est l’invite qui demande du JSON.

Seulement les points d’accès qui le prennent en charge

Chaque point d’accès du catalogue déclare les paramètres qu’il prend en charge (Modèles et fournisseurs). Avec "provider": {"require_parameters": true}, la requête n’est acheminée qu’aux points d’accès qui déclarent chaque paramètre qu’elle envoie — response_format compris, avec tools, seed, les paramètres d’échantillonnage, stop, logprobs et reasoning. Un point d’accès qui ne déclare aucun ensemble de paramètres n’est pas exclu.

Réparer une réponse qui n’est pas du JSON

json
"plugins": [{"id": "response-healing"}]

Un modèle à qui l’on demande du JSON l’enveloppe parfois d’une clôture markdown ou d’une phrase, ou laisse une virgule en trop. Le plugiciel response-healing répare les clôtures, le texte environnant, les virgules finales, les commentaires, les clés sans guillemets et les crochets non fermés, et ne garde la réparation que si elle s’analyse : il ne rend jamais un texte qui n’est toujours pas du JSON, et ne touche jamais une réponse qui en est déjà. Une réponse coupée par max_tokens (finish_reason: "length") est renvoyée telle quelle — fermer les crochets d’un demi-objet inventerait une réponse. Pas en diffusion en continu. Quand il a changé la réponse, la liste pipeline des métadonnées de la requête contient response_healing.

Agents hébergés

Le output.schema d’une définition d’agent (un objet JSON Schema d’au plus 8 Ko) est envoyé comme response_format sur la réponse finale de l’exécution, et l’enveloppe de résultat porte alors output_json à côté du texte.