Responses API (Recommandé)
Créez des réponses de modèle. Prend en charge l’entrée de texte et d’images, génère une sortie texte ou JSON. Prend en charge l’appel de fonctions (Tool Calling), les réponses en streaming et les conversations multi-tours.
Recommandé pour les nouveaux projets. Il s’agit de la nouvelle génération d’API publiée par OpenAI. Comparée à Chat Completions, elle présente les avantages suivants :
- Prompt Caching natif —
instructionsetinputsont séparés, les instructions système servent automatiquement de préfixe de cache, le taux de hit du cache est plus élevé pour la partie préfixe inchangée lors des conversations multi-tours, permettant d’économiser jusqu’à 50 % des frais de tokens d’entrée tout en réduisant la latence - Mode item structuré — Formats d’entrée/sortie plus clairs, prise en charge native du flux d’appel d’outils
- Événements de streaming plus riches — Types d’événements SSE granulaires, facilitant le rendu UI en temps réel
Endpoint
POST https://api.ofox.io/v1/responsesParamètres de requête
Format Input
input prend en charge deux formats :
1. Chaîne simple — Passez directement le texte
{
"input": "Bonjour, présentez-vous brièvement"
}2. Tableau de messages structurés — Conversations multi-tours et entrée multimodale
interface InputItem {
type: 'message'
role: 'user' | 'assistant'
content: ContentPart[]
id?: string // Obligatoire pour les messages assistant
status?: 'completed' // Obligatoire pour les messages assistant
}
type ContentPart =
| { type: 'input_text'; text: string } // Entrée texte utilisateur
| { type: 'input_image'; image_url: string } // Entrée image
| { type: 'output_text'; text: string; annotations?: any[] } // Sortie texte assistantLorsque vous incluez des messages avec le rôle assistant dans une conversation multi-tours, les champs id et status sont obligatoires.
Responses API est conçue sans état, chaque requête doit transporter l’historique complet de la conversation.
Exemple de requête
cURL
curl https://api.ofox.io/v1/responses \
-H "Authorization: Bearer $OFOX_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "openai/gpt-6.1-sol",
"input": "Expliquez ce qu'est un API Gateway",
"instructions": "Vous êtes un assistant technique utile, répondez en français.",
"max_output_tokens": 1024
}'Format de réponse
{
"id": "resp_abc123",
"object": "response",
"created_at": 1703123456,
"model": "openai/gpt-6.1-sol",
"status": "completed",
"output": [
{
"type": "message",
"id": "msg_def456",
"status": "completed",
"role": "assistant",
"content": [
{
"type": "output_text",
"text": "Un API Gateway (passerelle d'API) est un...",
"annotations": []
}
]
}
],
"usage": {
"input_tokens": 25,
"output_tokens": 150,
"total_tokens": 175
}
}Description des champs de réponse
Entrée de messages structurés
Utilisez un tableau de messages structurés pour les conversations multi-tours :
Python
response = client.responses.create(
model="openai/gpt-6.1-sol",
input=[
{
"type": "message",
"role": "user",
"content": [
{"type": "input_text", "text": "Quelle est la capitale de la France ?"}
]
},
{
"type": "message",
"role": "assistant",
"id": "msg_abc123",
"status": "completed",
"content": [
{"type": "output_text", "text": "La capitale de la France est Paris.", "annotations": []}
]
},
{
"type": "message",
"role": "user",
"content": [
{"type": "input_text", "text": "Combien d'habitants y vivent ?"}
]
}
]
)
print(response.output_text)Réponse en streaming
Définissez stream: true pour activer la réponse en streaming SSE :
Python
stream = client.responses.create(
model="openai/gpt-6.1-sol",
input="Racontez-moi une blague sur la programmation",
stream=True
)
for event in stream:
if event.type == "response.output_text.delta":
print(event.delta, end="", flush=True)Types d’événements en streaming
La réponse en streaming envoie les événements suivants via SSE :
data: {"type":"response.created","response":{"id":"resp_abc123","object":"response","status":"in_progress"}}
data: {"type":"response.output_item.added","output_index":0,"item":{"type":"message","id":"msg_def456","role":"assistant","status":"in_progress","content":[]}}
data: {"type":"response.content_part.added","output_index":0,"content_index":0,"part":{"type":"output_text","text":""}}
data: {"type":"response.output_text.delta","output_index":0,"content_index":0,"delta":"Bon"}
data: {"type":"response.output_text.delta","output_index":0,"content_index":0,"delta":"jour"}
data: {"type":"response.output_item.done","output_index":0,"item":{"type":"message","id":"msg_def456","role":"assistant","status":"completed","content":[{"type":"output_text","text":"Bonjour..."}]}}
data: {"type":"response.completed","response":{"id":"resp_abc123","object":"response","status":"completed","usage":{"input_tokens":12,"output_tokens":45,"total_tokens":57}}}
data: [DONE]Function Calling
Responses API prend en charge nativement l’appel d’outils :
Python
response = client.responses.create(
model="openai/gpt-6.1-sol",
input="Quel temps fait-il aujourd'hui à Paris ?",
tools=[
{
"type": "function",
"name": "get_weather",
"description": "Obtenir la météo actuelle d'une ville donnée",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "Nom de la ville, ex. Paris"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"]
}
},
"required": ["location"]
}
}
],
tool_choice="auto"
)
# Traiter les appels d'outils
for item in response.output:
if item.type == "function_call":
print(f"Appel de fonction : {item.name}")
print(f"Arguments : {item.arguments}")Format de réponse d’appel d’outil
Lorsque le modèle appelle un outil, output contient un item de type function_call :
{
"id": "resp_abc123",
"object": "response",
"status": "completed",
"output": [
{
"type": "function_call",
"id": "fc_abc123",
"call_id": "call_xyz789",
"name": "get_weather",
"arguments": "{\"location\":\"Paris\",\"unit\":\"celsius\"}"
}
],
"usage": {
"input_tokens": 45,
"output_tokens": 25,
"total_tokens": 70
}
}Soumettre les résultats d’outils
Renvoyez les résultats d’exécution des outils au modèle, en incluant la chaîne d’appel complète dans input :
# Deuxième requête : soumettre les résultats d'outils
response = client.responses.create(
model="openai/gpt-6.1-sol",
input=[
{
"type": "message",
"role": "user",
"content": [{"type": "input_text", "text": "Quel temps fait-il aujourd'hui à Paris ?"}]
},
{
"type": "function_call",
"id": "fc_abc123",
"call_id": "call_xyz789",
"name": "get_weather",
"arguments": "{\"location\":\"Paris\",\"unit\":\"celsius\"}"
},
{
"type": "function_call_output",
"id": "fco_abc123",
"call_id": "call_xyz789",
"output": "{\"temperature\":\"22°C\",\"condition\":\"ensoleillé\"}"
}
]
)
print(response.output_text)
# => "Il fait beau aujourd'hui à Paris, avec une température de 22°C, idéal pour les activités en plein air."Options Tool Choice
Comparaison avec Chat Completions
Les deux API sont utilisables en production. Si vous avez déjà une intégration Chat Completions, aucune migration n’est nécessaire. Responses API est recommandée pour les nouveaux projets, surtout pour les scénarios nécessitant des flux d’appel d’outils complexes ou des appels à haute fréquence (qui peuvent pleinement tirer parti du cache pour réduire les coûts). Voir le guide d’appel de fonctions.