Outils et sorties structurées
tools, tool_choice, response_format (json_schema) et les messages role: "tool" sont transmis verbatim au modèle, et les réponses tool_calls reviennent intactes. Cette transparence est verrouillée par les tests de contrat d'OpenMulti — pas seulement constatée : une régression casserait la CI.
Concrètement : tout ce qui fonctionne avec le SDK OpenAI fonctionne à l'identique via OpenMulti, y compris avec model: "auto".
Appel d'outils (function calling)
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "Météo actuelle d'une ville",
"parameters": {
"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"],
},
},
}]
r = client.chat.completions.create(
model="auto",
messages=[{"role": "user", "content": "Quel temps à Nice ?"}],
tools=tools,
)
call = r.choices[0].message.tool_calls[0]
# call.function.name == "get_weather", call.function.arguments == '{"city": "Nice"}'
Renvoyez ensuite le résultat de l'outil avec un message role: "tool", comme avec l'API OpenAI :
messages.append(r.choices[0].message)
messages.append({
"role": "tool",
"tool_call_id": call.id,
"content": '{"temp_c": 24, "sky": "clear"}',
})
r2 = client.chat.completions.create(model="auto", messages=messages, tools=tools)
tool_choice ("auto", "none", "required" ou un outil précis) passe tel quel.
Conseil — pour les boucles agentiques,
openmulti.purpose: "agent"oriente le routage vers les modèles solides en appel d'outils et en code.
Sorties structurées (JSON Schema)
r = client.chat.completions.create(
model="auto",
messages=[{"role": "user", "content": "Extrait le nom et l'email : ..."}],
response_format={
"type": "json_schema",
"json_schema": {
"name": "contact",
"schema": {
"type": "object",
"properties": {"name": {"type": "string"}, "email": {"type": "string"}},
"required": ["name", "email"],
},
},
},
)
response_format: {"type": "json_object"} fonctionne aussi.
Note — le support effectif de ces capacités dépend du modèle qui sert la requête. Si votre code en dépend strictement, restreignez les candidats avec
openmulti.allow, ou passez un id concret.