Points forts des fonctionnalités
Chaque exemple montre une fonctionnalité en quelques lignes de Python, avec la sortie d'une exécution réelle.
Pour exécuter les exemples, installez le SDK et collez chacun d'eux dans main() du fichier ci-dessous. Ses outils renvoient un texte fixe.
main.py, utilisé par tous les exemples
import asyncio
from pydantic import BaseModel
from mistralai import agents
@agents.tool(annotations=agents.ToolAnnotations(read_only_hint=True))
async def get_order(order_id: str) -> str:
"""Get the status of an order."""
return f"Order {order_id}: delivered, 49 EUR"
@agents.tool(annotations=agents.ToolAnnotations(read_only_hint=True))
async def list_orders(country: str) -> list[str]:
"""List this week's orders for a country, or for every country with 'any'."""
return [f"order {number} ({country})" for number in range(1040, 1045)]
@agents.tool
async def refund_order(order_id: str) -> str:
"""Refund an order."""
return f"Order {order_id}: refunded"
agent = agents.Agent(
model="mistral-large-4",
name="support-agent",
instructions="Answer questions about orders in one plain sentence.",
tools=[get_order, list_orders, refund_order],
)
async def main() -> None:
... # paste an example's code here
if __name__ == "__main__":
asyncio.run(main())Approuver les appels d'outils
Avec permission_mode="ask", chaque appel d'outil nécessite une approbation. Votre code peut la donner, ou laisser une personne approuver l'appel.
def policy(
ctx: agents.ApprovalCallbackContext, request: agents.ApprovalRequest
) -> agents.AllowApproval | agents.KeepCallbackOpen:
if request.tool.annotations.read_only_hint:
return agents.AllowApproval()
return agents.KeepCallbackOpen() # anything else waits for a person
careful = agents.Agent(
model="mistral-large-4",
tools=[get_order, refund_order],
permission_mode="ask",
)
session = await careful.start_session(on_approval=policy)
state = await session.run("Check the status of order 1042, then refund it.")
while isinstance(state, agents.Blocked): # refund_order waits
turn = session.turn(state.turn_id)
for callback in state.callbacks:
await turn.answer(callback.id, agents.AllowApproval()) # a person allows
state = await turn.result(after=state)
if isinstance(state, agents.Completed):
print(state.text)
await session.cancel()Done! Here's a summary:
- **Status check:** Order **1042** was **delivered**, amount **49 EUR**.
- **Refund:** Order **1042** has been **refunded** ✅La boucle s'exécute jusqu'à la fin du tour : turn.result(after=state) attend de nouveau le tour, là où il s'était arrêté. Voir Approbations et Parcourir une session pas à pas.
Piloter un tour pendant son exécution
Envoyez un message à l'agent pendant qu'il travaille, pour modifier ce qu'il fait. on_event= affiche les événements du tour au fur et à mesure.
def show(event: agents.Event) -> None:
match event:
case agents.EntryCompleted(entry=agents.MessageEntry(role="user") as message):
print("user:", message.text)
case agents.EntryCompleted(entry=agents.ToolCallEntry(name, arguments)):
print("calling", name, arguments)
case agents.TextDelta(text=text):
print(text, end="", flush=True) # the reply, while the model writes it
session = await agent.start_session()
turn = await session.send_message("List this week's orders, then count them.")
await turn.steer("Only the orders from France.")
state = await turn.result(on_event=show)
print()
await session.cancel()user: List this week's orders, then count them.
user: Only the orders from France.
calling client.list_orders {'country': 'France'}
This week's orders from France:
1. order 1040 (France)
2. order 1041 (France)
3. order 1042 (France)
4. order 1043 (France)
5. order 1044 (France)
**Total: 5 orders**Le message de pilotage rejoint le tour en cours. Ici, il arrive avant le premier appel d'outil, si bien que l'agent ne liste que les commandes provenant de France. Voir Construire une application avec des sessions et Suivre un tour pendant l'attente.
Obtenir un résultat typé en un seul appel
run envoie un message et attend la réponse. Passez un modèle Pydantic en tant que output_type pour obtenir la réponse sous forme d'objet de ce modèle.
class Order(BaseModel):
order_id: str
delivered: bool
price_eur: int
typed = agents.Agent(model="mistral-medium-latest", tools=[get_order])
state = await typed.run("What is the status of order 1042?", output_type=Order)
if isinstance(state, agents.Completed):
print(state.output)order_id='1042' delivered=True price_eur=49Voir Un seul appel et Sortie structurée.
Interagir avec un agent
Une session conserve tout ce que l'agent a fait, si bien que chaque message s'appuie sur le travail précédent. Elle peut contenir un échange rapide ou un travail qui dure des heures.
session = await agent.start_session()
await session.run("My order is 1042.")
state = await session.run("Which order is mine?")
if isinstance(state, agents.Completed):
print(state.text)
await session.cancel() # ends the sessionYour order is 1042.Voir Sessions.
Déployer sur Mistral
Dans un projet créé par agents init, avec le main.py ci-dessus (son agent est support-agent) : discutez avec l'agent dans votre terminal, puis poussez-le et déployez-le. Le déploiement construit le commit que vous avez poussé vers GitHub, dans le dépôt que Déployer votre agent met en place :
uv run --env-file .env agents chat
git add --all && git commit -m "Support agent"
git push
uv run --env-file .env agents deployVotre application charge l'agent déployé par son nom, puis l'exécute comme un agent local :
agent = agents.Agent.load_from(agent_name="support-agent")
state = await agent.run("Has order 1042 shipped?")
if isinstance(state, agents.Completed):
print(state.text)Yes, order 1042 was delivered.Voir Déployer votre agent et Déployer.
Exécuter en arrière-plan
Une fois que vous avez déployé avec Studio, auto-hébergé ou géré par Mistral, l'exécution est durable et s'effectue en arrière-plan. Votre application peut s'arrêter et récupérer le résultat plus tard. Cet exemple utilise l'agent de Déployer sur Mistral.
agent = agents.Agent.load_from(agent_name="support-agent")
session = await agent.start_session()
turn = await session.send_message("List this week's orders, then count them.")
session_id, turn_id = session.id, turn.id # store them, then exit
# Later, after your app restarts:
agent = agents.Agent.load_from(agent_name="support-agent")
session = agent.session(session_id)
state = await session.turn(turn_id).result()
if isinstance(state, agents.Completed):
print(state.text)
await session.cancel()There are 5 orders this week.Voir Retrouver une session et Ouvrir une session à partir de son id.
Aller plus loin
- Guide de démarrage : construisez un premier agent et discutez avec lui, pas à pas.
- Déployer votre agent : exécutez-le sur Mistral et appelez-le depuis votre application.