Tout le monde demande : « Câest quoi ce dĂ©lire de boucle ? » Mais personne ne pose la question qui tue : quâest-ce qui fait tourner la boucle ?
Le dĂ©bat sur lâIA sâest cristallisĂ© autour des boucles en tant que primitive centrale des systĂšmes agentiques. Matt Van Horn (@mvanhorn) a retracĂ© la gĂ©nĂ©alogie des boucles dâagents, de ReAct Ă lâutilisation dâoutils, des boucles dâorchestration aux boucles qui supervisent dâautres boucles. Addy Osmani (@addyosmani) a dĂ©composĂ© les blocs de construction Ă lâintĂ©rieur des boucles : automatisations, arbres de travail, compĂ©tences, connecteurs, sous-agents. Van Horn a mis lâaccent sur la durabilitĂ©, arguant quâune boucle qui ne survit pas Ă un redĂ©marrage nâest pas une vĂ©ritable boucle. Le fil conducteur dâOsmani Ă©tait lâorchestration : concevoir le systĂšme qui invite lâagent Ă agir, plutĂŽt que de le faire vous-mĂȘme.
Je veux pousser leurs idĂ©es plus loin. La durabilitĂ© nâest pas quâune propriĂ©tĂ© de la boucle. Câest toute la couche dâexĂ©cution qui la sous-tend. Le fait important est quâune orchestration durable est fondamentale pour construire lâarchitecture de votre boucle dâagent. DĂ©composons cette architecture.
LĂ oĂč les boucles se cassent
Les modĂšles /loop et /goal fonctionnent bien pour un agent unique et une session unique. Un agent boucle jusquâĂ ce quâune tĂąche soit terminĂ©e. Cela couvre beaucoup de cas. Mais lâĂ©tape suivante (lâĂ©tape 5 dans le cadre de Van Horn) est lĂ oĂč tout sâeffondre :
- Des boucles qui supervisent dâautres boucles
- Des boucles qui sâexĂ©cutent selon un planning, pas seulement dĂ©clenchĂ©es par un humain
- Des boucles qui survivent aux redémarrages de processus, aux déploiements et aux crashs
- Des boucles qui lancent des sous-agents et attendent leurs résultats (parfois des heures plus tard)
- Des boucles qui doivent ĂȘtre observables aprĂšs coup
Ce nâest pas un problĂšme de prompt. Câest un problĂšme dâinfrastructure.
Van Horn cite @runes_leo : « La chose la plus coĂ»teuse dans le codage IA nâest plus dâĂ©crire du code, câest de gĂ©rer la boucle dâagent. » Un while True dans un terminal ne vous donne rien de tout cela. Pas plus quâun processus de longue durĂ©e sur une VM ou dans un sandbox.
Pensez Ă ce qui se produit quand vous exĂ©cutez une boucle dâagent sur un serveur. Le processus va mourir ou redĂ©marrer. Un dĂ©ploiement, un OOM, une rĂ©cupĂ©ration dâinstance spot. La boucle redĂ©marre. Mais quâĂ©tait-elle en train de faire ? Ă quelle Ă©tape en Ă©tait-elle ? Avait-elle dĂ©jĂ envoyĂ© ce message Slack ? Avait-elle dĂ©jĂ invoquĂ© le sous-agent ?
Vous ne le savez pas. Elle recommence à zéro. Elle récupÚre des données déjà obtenues. Elle rappelle le LLM pour des décisions déjà prises. Elle envoie une notification en double. Elle lance un sous-agent en double. Vous vous réveillez avec trois messages Slack identiques et une équipe perplexe.
La solution nâest pas une « meilleure gestion des erreurs » â câest un modĂšle dâexĂ©cution oĂč chaque Ă©tape est enregistrĂ©e par points de contrĂŽle, chaque dĂ©cision est persistĂ©e, et la reprise signifie reprendre Ă partir de la derniĂšre Ă©tape rĂ©ussie.
Lâarchitecture de la boucle dâagent en trois couches
Trois couches. Chacune correspond Ă une primitive concrĂšte.
Couche 1 : La boucle
Une boucle, câest un cron plus un dĂ©cideur. Elle sâexĂ©cute selon un planning (ou un dĂ©clencheur), Ă©value lâĂ©tat et dĂ©cide de la suite.
Câest la dĂ©finition de Van Horn rendue concrĂšte : ce que cron nâa jamais eu, câest la dĂ©cision au milieu. Câest lâagent qui dĂ©cide, pas vous. Le cron est le battement de cĆur. Le LLM est le dĂ©cideur. Les Ă©tapes sont lâexĂ©cution durable qui enregistre lâavancement.
1export const infraHealthCheck = inngest.createFunction(2 { id: "infra-health-check" },3 { cron: "*/30 * * * *" }, // Toutes les 30 minutes4 async ({ step }) => {5 const metrics = await step.run("fetch-service-metrics", async () => {6 return await fetchServiceMetrics(); // taux d'erreur, latence, mémoire, CPU7 });89 const assessment = await step.run("assess-health", async () => {10 return await callLLM({11 prompt: `Compte tenu de ces métriques de service, classez l'état général du systÚme12 comme "normal", "dégradé" ou "critique". Expliquez votre raisonnement.13 Métriques : ${JSON.stringify(metrics)}`,14 });15 });1617 if (assessment.status === "degraded" || assessment.status === "critical") {18 await step.invoke("triage-incident", {19 function: incidentTriage,20 data: { metrics, assessment, services: assessment.affectedServices },21 });22 }23 }24);
Chaque lundi Ă 9h, la boucle se dĂ©clenche. Elle rĂ©cupĂšre les donnĂ©es, demande au LLM si un rapport est justifiĂ©, et invoque une compĂ©tence si câest le cas. Si le processus redĂ©marre entre deux Ă©tapes, les Ă©tapes dĂ©jĂ terminĂ©es ne sont pas rĂ©exĂ©cutĂ©es. VoilĂ la boucle. Pas le LLM, la boucle autour du LLM.
Couche 2 : La compétence
Dans ce contexte, une compĂ©tence nâest pas un prompt. Câest un workflow durable. Multi-Ă©tapes, rĂ©essayable, composable, dĂ©ployable indĂ©pendamment.
Van Horn : « La boucle est la plomberie. Lâactif, câest la compĂ©tence quâelle appelle. » Câest la partie qui sâaccumule. Chaque nouvelle compĂ©tence apprise par le systĂšme rend chaque boucle plus capable.
1export const incidentTriage = inngest.createFunction(2 { id: "incident-triage", retries: 3 },3 { event: "infra.incident.triage" },4 async ({ event, step }) => {5 const details = await step.run("fetch-detailed-metrics", async () => {6 return await fetchDetailedMetrics({ services: event.data.services });7 });89 const deploys = await step.run("fetch-deploy-history", async () => {10 return await fetchRecentDeploys({ since: hoursAgo(2) });11 });1213 const analysis = await step.run("correlate-incident", async () => {14 return await callLLM({15 prompt: `Corrélez ces métriques de service avec les déploiements récents.16 Identifiez la cause racine probable et la sévérité.17 Métriques : ${JSON.stringify(details)}18 Déploiements récents : ${JSON.stringify(deploys)}`,19 });20 });2122 await step.run("post-triage-summary", async () => {23 await slack.postMessage({24 channel: "#incidents",25 text: formatTriageSummary({26 analysis,27 affectedServices: event.data.services,28 recommendedActions: analysis.recommendations,29 }),30 });31 });3233 return analysis;34 }35);
Cette compĂ©tence rĂ©cupĂšre, classe et achemine. Câest une unitĂ© de travail avec une tolĂ©rance aux pannes intĂ©grĂ©e. La compĂ©tence peut ĂȘtre un workflow IA avec un LLM au milieu, ou du code dĂ©terministe.
Couche 3 : Lâorchestrateur
Lâorchestrateur est le moteur qui fait tourner tout ça : il planifie les crons, exĂ©cute les Ă©tapes, gĂšre les tentatives, applique les limites de concurrence, stocke lâhistorique des exĂ©cutions, et dĂ©ploie Ă chaud de nouvelles fonctions/workflows sans perturber les exĂ©cutions en cours.
Câest la couche dont personne ne parle parce quâelle est censĂ©e ĂȘtre invisible. Pourtant, elle est fondamentale.
La plupart des gens voient les agents comme « LLM + outils ». Lâarchitecture de boucle dâagent reformule cela : les agents sont « boucles + compĂ©tences + orchestration ». Le LLM + les outils sont Ă lâintĂ©rieur des boucles. Les LLM et les outils peuvent ĂȘtre Ă©changĂ©s ou modifiĂ©s alors que lâarchitecture reste. Lâorchestration rend lâarchitecture possible.
Ce qui se passe quand les choses cassent
Le chemin heureux est facile. Mais câest un logiciel en production : est-ce que tout se passe vraiment comme prĂ©vu ?
Votre compĂ©tence de triage dâincident se dĂ©clenche et lâAPI de mĂ©triques expire. La lecture a dĂ» aller sur le disque et le cache mĂ©moire ne contenait pas les donnĂ©es. LâĂ©tape qui appelle cette API rĂ©essaie et frappe Ă nouveau lâAPI. Les donnĂ©es sont maintenant partiellement en cache et lâAPI aboutit. La compĂ©tence continue avec lâĂ©tape suivante comme si de rien nâĂ©tait.
Parfois, ce nâest pas aussi simple. Et si une clĂ© API expire, ou si votre hĂ©bergeur est indisponible pendant 30 minutes ? Toutes vos tentatives sont Ă©puisĂ©es. Que se passe-t-il alors ? Vous devez aussi gĂ©rer les Ă©checs.
1export const incidentTriage = inngest.createFunction(2 {3 id: "incident-triage",4 retries: 3,5 onFailure: async ({ error, event, step }) => {6 // La fonction a Ă©chouĂ© aprĂšs avoir Ă©puisĂ© les tentatives.7 // Nous avons toujours les donnĂ©es de l'Ă©vĂ©nement d'origine. Rien n'est perdu.8 await step.run("notify-failure", async () => {9 await slack.postMessage({10 channel: "#agent-ops",11 text: `â ïž Le triage d'incident a Ă©chouĂ© : ${error.message}. ` +12 `Nouvelle tentative au prochain cycle de vĂ©rification de santĂ©. ` +13 `Services concernĂ©s : ${event.data.services.join(", ")}`,14 });15 });16 },17 },18 { event: "infra.incident.triage" },19 async ({ event, step }) => {20 /* la mĂȘme logique que la compĂ©tence ci-dessus */21 }22);
Le gestionnaire \onFailure\ se dĂ©clenche aprĂšs lâĂ©puisement de toutes les tentatives. Il publie dans un canal ops pour que quelquâun soit informĂ©. LâĂ©vĂ©nement est conservĂ©, rien nâest perdu. La prochaine exĂ©cution planifiĂ©e reprend lĂ oĂč celle qui a Ă©chouĂ© nâa pas pu.
Une orchestration durable doit vous offrir des tentatives au niveau de lâĂ©tape pour les erreurs transitoires, et des hooks de gestion dâĂ©chec pour les erreurs non rĂ©cupĂ©rables. Sans cela, les choses cassent (comme câest le cas), et vous le dĂ©couvrez des heures ou des jours plus tard.
Les erreurs transitoires sont aussi coĂ»teuses. Si votre compĂ©tence ou agent rĂ©essaie depuis le dĂ©but, vous appelez les LLM plusieurs fois et brĂ»lez des tokens inutilement. Lâappel LLM peut ĂȘtre enregistrĂ© par point de contrĂŽle. Multipliez cela par 10 ou 30 agents dans votre systĂšme. Câest coĂ»teux.
Lâenregistrement par points de contrĂŽle au niveau de lâĂ©tape nâest pas quâune fonctionnalitĂ© de correction. Câest un Ă©conomiseur dâargent.
Lâagent qui construit ses propres compĂ©tences
Câest lĂ que ça devient plus intĂ©ressant. Le systĂšme nâest pas statique, il est conçu pour Ă©voluer et sâĂ©tendre lui-mĂȘme.
Lâagent ne se contente pas de sâexĂ©cuter Ă lâintĂ©rieur des boucles â il crĂ©e de nouvelles boucles et les enregistre dans le moteur dâorchestration. Chaque fonction dĂ©ployĂ©e est une compĂ©tence durable qui sâexĂ©cute de maniĂšre indĂ©pendante, dĂ©clenchable depuis une boucle ou un agent, ou selon un planning, avec sa propre logique de tentative. Les compĂ©tences sâaccumulent.
Câest un agent conscient de lâorchestration.
Voici comment ça fonctionne. Un agent IA a accĂšs au SDK dâorchestration en tant quâoutil. Il peut Ă©crire de nouvelles fonctions, les enregistrer dans le moteur, et elles commencent Ă sâexĂ©cuter immĂ©diatement. Le processus de lâagent recharge Ă chaud les nouvelles fonctions sans redĂ©marrer ni perturber les exĂ©cutions en cours.
Prenons un exemple concret :
1. Un humain exprime un besoin. LâingĂ©nieur dit : « Nos services ont des pics de latence la nuit et personne ne le remarque avant le matin. » Câest le dĂ©clencheur. Lâagent nâa pas besoin de dĂ©duire un motif vague Ă partir de donnĂ©es ambiantes. Il a des instructions claires.
2. Lâagent Ă©crit une compĂ©tence. Deux fonctions multi-Ă©tapes : une boucle de vĂ©rification de santĂ© qui sâexĂ©cute toutes les 30 minutes, rĂ©cupĂ©rant les taux dâerreur, la latence et lâutilisation des ressources, le LLM classant lâĂ©tat du systĂšme comme normal, dĂ©gradĂ© ou critique. Et une compĂ©tence de triage dâincident qui rĂ©cupĂšre les mĂ©triques dĂ©taillĂ©es et lâhistorique des dĂ©ploiements rĂ©cents, corrĂšle les causes racines avec un LLM, et publie un rĂ©sumĂ© de triage dans Slack avec des actions recommandĂ©es. Gestion des erreurs : si lâAPI de mĂ©triques est en panne, patienter et rĂ©essayer. Si le LLM Ă©choue, se rabattre sur une classification de sĂ©vĂ©ritĂ© basĂ©e sur des rĂšgles.
3. Lâagent dĂ©ploie la compĂ©tence. Lâagent Ă©crit le code de la fonction qui est pris en charge par un processus sidecar. Les nouvelles fonctions sont enregistrĂ©es automatiquement. Elles sont actives immĂ©diatement, sans pipeline de dĂ©ploiement, sans PR.
4. La compĂ©tence sâexĂ©cute de maniĂšre autonome. Toutes les 30 minutes, le moteur dĂ©clenche la vĂ©rification de santĂ©. Si quelque chose ne va pas, il invoque la compĂ©tence de triage. Aucun humain dans la boucle. Totalement durable.
5. Lâagent itĂšre sur le signal. Câest la partie que les gens survolent, donc je vais ĂȘtre prĂ©cis sur ce que signifie « itĂ©rer ». Lâagent ne remarque pas les motifs par magie. Il a une boucle de rĂ©vision sĂ©parĂ©e : une fonction dĂ©clenchĂ©e par cron qui sâexĂ©cute chaque semaine, lit lâhistorique des exĂ©cutions de lâorchestrateur, et Ă©value la performance :
1export const reviewSkillPerformance = inngest.createFunction(2 { id: "review-skill-performance" },3 { cron: "0 10 * * 5" }, // Tous les vendredis à 10h4 async ({ step }) => {5 const runs = await step.run("fetch-run-history", async () => {6 return await getInngestRuns({7 functionId: "incident-triage",8 since: daysAgo(7),9 });10 });1112 const analysis = await step.run("analyze-performance", async () => {13 const successRate = runs.filter(r => r.status === "completed").length / runs.length;14 const avgDuration = average(runs.map(r => r.duration));15 const incidents = await fetchIncidentOutcomes(); // Les incidents étaient-ils corrélés à des pannes réelles ?1617 return await callLLM({18 prompt: `Examinez la performance de cette compétence au cours de la semaine écoulée.19 Taux de réussite : ${successRate}20 Durée moyenne : ${avgDuration}ms21 Incidents corrélés à des pannes réelles : ${incidents.confirmed}/${incidents.total}22 Faux positifs : ${incidents.falsePositives}23 L'équipe a agi sur les alertes : ${incidents.actedOn}/${incidents.total}2425 Devons-nous ajuster les seuils ou la classification ? Quels changements spécifiques ?`,26 });27 });2829 if (analysis.shouldModify) {30 await step.invoke("update-skill", {31 function: coreAgent,32 data: { prompt: `Mettez à jour les compétences de triage d'incident en fonction des changements proposés suivants : ${analysis.proposedChanges}` },33 });34 }35 }36);
La « rĂ©vision » est une fonction. Elle lit lâhistorique des exĂ©cutions, vĂ©rifie si les incidents Ă©taient corrĂ©lĂ©s Ă des pannes rĂ©elles, et alimente ce signal au LLM. Si la vĂ©rification de santĂ© ne cesse de signaler un service comme dĂ©gradĂ© mais que lâĂ©quipe lâignore parce que les seuils sont trop sensibles, la boucle de rĂ©vision le dĂ©tecte et la compĂ©tence est mise Ă jour pour ajuster la classification. Pas de magie. Un cron job avec un LLM dans le siĂšge de dĂ©cision.
Quâen est-il de la validation ? Lâagent qui Ă©crit du code nâest aussi bon que les garde-fous qui lâentourent. Le code peut ĂȘtre vĂ©rifiĂ© par typage. Lâagent peut invoquer la fonction lui-mĂȘme pour la tester, car il peut interagir avec le moteur dâorchestration. Ce nâest pas infaillible, mais vous donnez Ă lâagent central la capacitĂ© de dĂ©boguer les compĂ©tences quâil Ă©crit nativement dans le systĂšme oĂč il opĂšre. La boucle de rĂ©vision dĂ©tecte les problĂšmes non capturĂ©s lors du dĂ©bogage initial.
En poussant un peu plus loin, lâagent peut utiliser les hooks onFailure pour se dĂ©clencher lui-mĂȘme et Ă©valuer un Ă©chec donnĂ©. Câest une boucle de rĂ©troaction qui sâamĂ©liore en continu.
Quâen est-il des conflits ? Les contrĂŽles de flux, notamment les contrĂŽles de concurrence ou les singletons, traitent le cas simple (concurrency : \{ limit: 1, key: "[event.data.service" }]), ce qui signifie quâun seul triage dâincident sâexĂ©cute Ă la fois par service. Mais la question plus profonde est : que se passe-t-il si deux vĂ©rifications de santĂ© dĂ©tectent toutes deux des problĂšmes sur le mĂȘme service simultanĂ©ment ? Lâorchestrateur les met en file dâattente. Le deuxiĂšme triage attend que le premier soit terminĂ©. Pas dâalertes en double, pas de conditions de course. Ce nâest pas thĂ©orique. Câest la mĂȘme primitive de concurrence que vous utiliseriez dans nâimporte quelle file dâattente de jobs.
Lâagent ne se contente pas dâexĂ©cuter des tĂąches. Il construit sa propre infrastructure. Chaque compĂ©tence persiste au-delĂ de la conversation qui lâa créée. Tue le processus de lâagent et redĂ©marre-le. Les compĂ©tences continuent de tourner. Remplace le modĂšle sous-jacent. Les compĂ©tences continuent de tourner. Lâagent est Ă©phĂ©mĂšre â son rĂ©sultat est durable.

Vue dâensemble de lâarchitecture de la boucle dâagent
Le point de vue du développeur
Câest important parce que si le dĂ©veloppeur ne peut pas voir ce que lâagent a dĂ©ployĂ©, dĂ©boguer ce qui a cassĂ©, et auditer ce qui sâest exĂ©cutĂ© Ă 3h du matin, toute lâarchitecture est une lourde responsabilitĂ©.
Le moteur dâorchestration stocke chaque exĂ©cution, chaque Ă©tape, chaque entrĂ©e, chaque sortie, chaque tentative. Une compĂ©tence que lâagent a dĂ©ployĂ©e mardi dernier et qui a Ă©chouĂ© Ă 4h du matin ? Vous pouvez voir exactement quelle Ă©tape a Ă©chouĂ©, quelle Ă©tait lâentrĂ©e, quelle erreur a Ă©tĂ© levĂ©e, et combien de tentatives ont Ă©tĂ© faites avant dâabandonner. Des traces complĂštes jusquâau niveau de lâĂ©tape sont la sortie mĂȘme du moteur dâorchestration.
Ce nâest pas un tableau de bord ajoutĂ© aprĂšs coup. Câest inhĂ©rent Ă lâexĂ©cution durable. Chaque step.run() est un point de contrĂŽle. Chaque point de contrĂŽle est observable. Quand celui qui Ă©crit le code nâest pas un humain, lâobservabilitĂ© nâest pas un luxe â câest la couche de confiance.
Au quotidien, le flux de travail du dĂ©veloppeur ressemble Ă ceci : le matin, consultez le tableau de bord des exĂ©cutions. Voyez quelles compĂ©tences ont tournĂ© pendant la nuit, lesquelles ont rĂ©ussi, lesquelles ont Ă©chouĂ©. Si une compĂ©tence Ă©crite par lâagent se comporte mal, vous pouvez lire le code directement, le modifier, le supprimer, ou demander Ă lâagent de le corriger. Lâagent lâa créée, mais vous en ĂȘtes propriĂ©taire. Lâagent et ses compĂ©tences restent un jardin que vous devez entretenir.
Pourquoi la durabilité est fondamentale
Van Horn : « Ces choses doivent survivre à un redémarrage. »
Voici ce que signifie la durabilité en pratique :
Exigence
Ce que ça implique
Pourquoi une simple boucle while échoue
Tentative indépendante par étape
Si lâĂ©tape 3 sur 5 Ă©choue, rĂ©essayer lâĂ©tape 3, pas les Ă©tapes 1 et 2
Un redémarrage de boucle réexécute tout depuis le début
Cycle de vie des sous-agents
Lancer une tĂąche enfant, lâattendre (parfois des heures), lâannuler si le parent est annulĂ©
Pas de gestion native du cycle de vie parent-enfant
Distribution garantie des événements
Si un Ă©vĂ©nement se dĂ©clenche pendant que lâagent est hors ligne, il doit quand mĂȘme ĂȘtre traitĂ©
Les événements sont perdus si le processus ne tourne pas
Observabilité a posteriori
Voir ce qui sâest passĂ© aprĂšs coup : chaque Ă©tape, chaque dĂ©cision, chaque tentative
Les logs sont votre seule option, et ils sont éphémÚres
Déploiement à chaud sans interruption
Déployer une nouvelle version de fonction sans tuer les exécutions en cours
Un redémarrage de processus tue tout
ContrĂŽle de concurrence
ExĂ©cuter seulement N instances dâune compĂ©tence Ă la fois
Pas de primitives de concurrence intégrées
« ExĂ©cutez-le simplement dans un conteneur » vous donne de la disponibilitĂ©. Ăa ne vous donne pas de la correction. Un conteneur qui redĂ©marre aprĂšs un crash ramĂšne le processus, mais chaque boucle en cours recommence depuis le dĂ©but. Chaque Ă©tape est rĂ©exĂ©cutĂ©e. Chaque appel LLM est refait. La boucle a lâair de tourner, mais elle tourne Ă lâaveugle.
Comparaison avec les outils existants
Certains outils peuvent vous offrir une solution « clĂ© en main » Ă©lĂ©gante pour ce type de systĂšme, ou vous pourriez choisir de bricoler des outils de plus bas niveau et crĂ©er votre propre systĂšme. Aucun choix nâest mauvais, mais la bonne couche dâarchitecture doit vous permettre, ainsi quâĂ votre agent, dâĂ©voluer dans le temps. Flexible, dynamique, durable.
Des primitives dâexĂ©cution durable qui sâintĂšgrent bien Ă un agent, que lâagent peut facilement Ă©crire, et lâobservabilitĂ© et les API pour observer et permettre Ă lâagent lui-mĂȘme dâĂȘtre conscient de lâorchestration.
Un exemple fonctionnel
Nous testons ces modĂšles en interne chez Inngest et vous pouvez en voir un concept dans le dĂ©pĂŽt du projet « utah » ici : https://github.com/inngest/utah. Câest un harnais dâagent construit sur lâorchestration durable dâInngest, qui est Ă©galement conscient de lâorchestration.
Le systĂšme comprend un processus sidecar qui permet Ă lâagent principal dâĂ©crire et de modifier des fonctions Inngest dans son propre espace de travail, sâĂ©tendant ainsi avec des « compĂ©tences » (dans le contexte de cet article). BientĂŽt, nous prĂ©voyons de fournir un systĂšme complet avec des boucles de dĂ©marrage en exemple, mais les idĂ©es qui y sont prĂ©sentes peuvent illustrer les concepts de cet article de maniĂšre plus claire.
La boucle qui sâaccumule
Le rĂ©cent article de Satya Nadella a nommĂ© quelque chose que lâindustrie ressentait : le fossĂ© nâest pas le modĂšle â câest la boucle.
Sa dĂ©finition : il existe deux types de capital. Le capital humain, les connaissances et le jugement que votre Ă©quipe a bĂątis au fil des ans. Et ce quâil appelle le capital de tokens, les workflows IA, les schĂ©mas de dĂ©cision et les compĂ©tences apprises quâune entreprise construit par-dessus les modĂšles fondamentaux.
La thĂšse : ces deux capitaux sâaccumulent. Chaque workflow amĂ©liorĂ© gĂ©nĂšre un meilleur signal. Un meilleur signal produit un comportement IA plus prĂ©cis. Un comportement plus prĂ©cis libĂšre de lâattention humaine pour un travail Ă plus haut jugement. Une machine Ă grimper les collines.
Câest ce que lâarchitecture de boucle dâagent permet concrĂštement :
- Chaque compĂ©tence durable dĂ©ployĂ©e par lâagent est une connaissance institutionnelle encodĂ©e sous forme dâinfrastructure exĂ©cutable. Elle persiste. Elle sâexĂ©cute quâun humain regarde ou non.
- Une boucle de rĂ©vision dĂ©clenchĂ©e par cron qui Ă©value la performance des compĂ©tences et itĂšre. Câest la machine Ă grimper les collines rendue rĂ©elle. Pas un diagramme de volant dâinertie dans un deck. Une fonction avec un dĂ©clencheur cron.
- Si vos compĂ©tences meurent au redĂ©marrage du processus, lâaccumulation revient Ă zĂ©ro. La durabilitĂ© est ce qui fait que lâinvestissement persiste.
Le point clĂ© de Nadella : « Une entreprise devrait pouvoir remplacer un modĂšle âgĂ©nĂ©ralisteâ sans perdre lâexpertise de âvĂ©tĂ©ran de lâentrepriseâ intĂ©grĂ©e dans son systĂšme dâapprentissage. » Câest le modĂšle de la bibliothĂšque de compĂ©tences. Les fonctions durables ne se soucient pas du LLM qui les appelle.
Construisez en conséquence
La conversation a porté sur ce que font les agents : boucles, outils, raisonnement, ingénierie de contexte. La prochaine conversation porte sur ce qui fait tourner les agents.
Trois couches : boucle, compĂ©tence, orchestrateur. La boucle est lâunitĂ© de travail. La compĂ©tence est lâactif. Le moteur dâorchestration est ce qui rend les deux durables. Le modĂšle sidecar est lâapproche : un agent Ă©crit ses propres compĂ©tences durables, les dĂ©ploie, examine leur performance et itĂšre. Pas une expĂ©rience de pensĂ©e. Câest un modĂšle fonctionnel.
Nous avons construit Inngest pour ĂȘtre le moteur dâorchestration pour cela : step.run(), step.invoke(), dĂ©clencheurs cron, contrĂŽle de flux pilotĂ© par Ă©vĂ©nements, contrĂŽles de concurrence, et observabilitĂ© complĂšte au niveau de lâĂ©tape. Mais le modĂšle architectural est plus grand que nâimporte quel outil unique. Si vous construisez des boucles dâagent en production, dĂ©finissez les trois couches.
Les primitives existent aujourdâhui. Construisez en consĂ©quence.





