API Responses
L'API Responses est le format plus récent d'OpenAI, attendu par défaut par certains outils (Codex CLI notamment). CloudZIR l'expose : mêmes modèles, mêmes tarifs, mêmes limites que Chat Completions.
Endpoint#
POST https://api.cloudzir.com/v1/responses
from openai import OpenAI
client = OpenAI(api_key="zir_ai_...", base_url="https://api.cloudzir.com/v1")
reponse = client.responses.create(
model="mina-low",
instructions="Tu es un assistant concis, en français.",
input="Explique le DNS en trois phrases.",
max_output_tokens=300,
)
print(reponse.output_text)curl https://api.cloudzir.com/v1/responses \
-H "Authorization: Bearer $CLOUDZIR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "mina-low",
"instructions": "Tu es un assistant concis, en français.",
"input": "Explique le DNS en trois phrases.",
"max_output_tokens": 300
}'Réponse#
{
"id": "resp_4334a6f158894999",
"object": "response",
"created_at": 1766400000,
"status": "completed",
"model": "mina-low",
"output": [{
"type": "message",
"id": "msg_4334a6f158894999",
"status": "completed",
"role": "assistant",
"content": [{"type": "output_text", "text": "Le DNS traduit…", "annotations": []}]
}],
"output_text": "Le DNS traduit…",
"incomplete_details": null,
"usage": {
"input_tokens": 28, "output_tokens": 96, "total_tokens": 124,
"input_tokens_details": {"cached_tokens": 0},
"output_tokens_details": {"reasoning_tokens": 0}
}
}
Champs supportés#
| Champ | Description |
|---|---|
model requis | mina-flash, mina-low, mina-full. |
input requis | Chaîne, ou liste de messages avec parts input_text / input_image. |
instructions | Équivalent d'un message système. |
max_cost_micro_dzd | Plafond de dépense en micro-DZD, uniquement avec mina-auto. La requête échoue si elle le dépasse. |
max_output_tokens | Plafonné par le modèle. |
temperature, top_p, user | Comme sur Chat Completions. |
reasoning.effort | minimal / low / medium / high, ou none pour couper le raisonnement : Mode de pensée. |
text.format | {"type": "json_object"} : Sortie JSON. |
tools, tool_choice | Vos propres fonctions (forme à plat de Responses ou forme imbriquée). |
stream | Événements response.output_text.delta, puis response.completed. |
Ce qui est refusé (et pourquoi)#
previous_response_id et store: true sont refusés par un
400 explicite. CloudZIR ne conserve pas vos réponses : les accepter en
silence produirait un modèle amnésique, il répondrait sans le contexte que vous croyez avoir
transmis. Renvoyez l'historique complet dans input, comme sur
Chat Completions.
Les outils intégrés (web_search, code_interpreter,
file_search) ne sont pas disponibles : déclarez vos propres fonctions
(Appels d'outils). Ils sont refusés explicitement plutôt
qu'ignorés.
Dans input, les éléments message, function_call et
function_call_output sont traités. Un élément reasoning (celui que la
réponse peut contenir dans output, et qu'un outil sans état comme Codex rejoue au tour
suivant) est accepté puis ignoré : il décrit le raisonnement d'un tour passé et n'est pas
transmis au modèle. Un élément d'un autre type est refusé par un 400 dont le
paramètre est input[i].type.
Images#
reponse = client.responses.create(
model="mina-low",
input=[{
"role": "user",
"content": [
{"type": "input_text", "text": "Que montre cette image ?"},
{"type": "input_image", "image_url": f"data:image/png;base64,{image}"},
],
}],
)
Mêmes règles que sur Chat Completions : voir Vision.
Streaming#
event: response.created
data: {"type":"response.created","response":{"id":"resp_…","status":"in_progress",…}}
event: response.output_text.delta
data: {"type":"response.output_text.delta","delta":"Le ","output_index":0,…}
event: response.output_text.done
data: {"type":"response.output_text.done","text":"Le DNS traduit…",…}
event: response.completed
data: {"type":"response.completed","response":{…,"status":"completed","usage":{…}}}
Correspondance avec Chat Completions#
| Responses | Chat Completions |
|---|---|
input | messages |
instructions | message system |
max_output_tokens | max_tokens |
output_text | choices[0].message.content |
usage.input_tokens | usage.prompt_tokens |
status: "incomplete" | finish_reason: "length" |
Les deux mènent au même moteur, au même prix. Prenez Responses si votre outil l'attend (Codex), sinon Chat Completions reste le format le plus largement supporté.