La boucle ReAct et le bus de tools
Un « agent », c'est une boucle while
Le copilot conversationnel n'a rien de magique :
async def run_react_turn(messages, tools):
for _ in range(MAX_ITERATIONS): # garde-fou anti-boucle infinie
response = await llm.stream(messages, tools=tools)
if response.stop_reason != "tool_use":
return response # le modÚle a fini : il répond
results = await asyncio.gather(*[ # tools du tour en PARALLĂLE
execute_tool(call) for call in response.tool_calls
])
messages += [response, tool_results(results)] # ré-injecter et re-boucler
Le modĂšle raisonne (« il me faut le stock ») â agit (appelle get_stock) â observe (le rĂ©sultat revient dans les messages) â recommence, jusqu'Ă produire une rĂ©ponse finale. ReAct = Reason + Act. Le MAX_ITERATIONS n'est pas un dĂ©tail : c'est le circuit breaker de l'agent.
Les tools : un registre déclaré et contraint
Chaque tool est une définition typée (nom, description, schéma d'arguments JSON, permission: read|write), enregistrée dans un ToolBus :
- la whitelist par contexte : l'agent ne reçoit que les tools autorisĂ©s pour ce tenant/cette page â pas « tout le SDK » ;
- l'idempotence : chaque exĂ©cution porte une clĂ© d'idempotence â un retry ne crĂ©e pas deux devis ;
- les tools write passent (par design) par une Ă©tape d'approbation humaine â le hook HITL du module 6 ;
- cas remarquable : le tool
query_databasefait analyser le SQL gĂ©nĂ©rĂ© par le LLM avec sqlglot (re-qualification, rejet des Ă©critures) avant exĂ©cution â on ne fait jamais confiance au SQL d'un modĂšle.
L'invariant privacy : model_view vs ui_events
La trouvaille architecturale du projet. Chaque résultat de tool a deux surfaces :
model_view: ce qui est rĂ©-injectĂ© au LLM â compact (ids, compteurs, statuts). Le modĂšle n'a PAS besoin des 200 lignes de rĂ©sultat pour raisonner ;ui_events: le payload complet, streamĂ© au front pour affichage â jamais vu par le LLM.
Double gain : les donnĂ©es sensibles (prix dĂ©taillĂ©s, PII) ne transitent pas par le modĂšle, et le contexte reste petit (coĂ»t, latence, fenĂȘtre). Le LLM raconte, l'UI rend.
La boucle ReAct s'arrĂȘte quandâŠ