learn.chetana.fr

La boucle ReAct et le bus de tools

14 min de lectureEssentiel

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_database fait 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.

đŸ§© Quiz1/4

La boucle ReAct s'arrĂȘte quand


🃏 Flashcards1/4