e-naxosMAF COURSE / COURS
English

MICROSOFT AGENT FRAMEWORK · 0.16.0-rc.1

Bornes et annulation

Prédire puis observer répétition, budgets, annulation et dépendance indisponible.

Objectifs

Préparer une expérience sans modèle

Utiliser une distribution complète compilée et commencer sans --live. Le transport est scripté mais les agents natifs, la boucle et les outils gardés sont réels. Relever commande, code de sortie, Status, nombre de ModelCall/ToolCall et raison d’arrêt. Aucune base métier n’est nécessaire.

Même argument, arguments différents, aucun outil

dotnet run --project demos/Demo330_BoundedHarness/Demo330.App.csproj -c Release --no-build -- repeat
dotnet run --project demos/Demo330_BoundedHarness/Demo330.App.csproj -c Release --no-build -- changing
dotnet run --project demos/Demo330_BoundedHarness/Demo330.App.csproj -c Release --no-build -- budget
dotnet run --project demos/Demo330_BoundedHarness/Demo330.App.csproj -c Release --no-build -- incomplete

repeat : une tentative admise puis RepeatedCall. changing : quatre tentatives admises sur des identifiants différents, puis ToolBudget. budget : première lecture admise, puis ModelBudget au nouvel appel modèle. incomplete : zéro outil, texte « Review finished. » conservé sous Incomplete. Tous ces cas retournent 2. Comparer les résultats aux limites plutôt que compter les seuls messages affichés.

Sortie observée · 2026-10-24 · lot010-repeat
{"Status":"RepeatedCall","Text":null,"Events":[{"Kind":"ModelCall","Name":"model","Count":1},{"Kind":"Middleware","Name":"read_ticket","Count":0},{"Kind":"ToolCall","Name":"read_ticket","Count":1},{"Kind":"ModelCall","Name":"model","Count":2},{"Kind":"Middleware","Name":"read_ticket","Count":1},{"Kind":"RepeatedCall","Name":"read_ticket","Count":1}]}

Refus, délai et indisponibilité

dotnet run --project demos/Demo330_BoundedHarness/Demo330.App.csproj -c Release --no-build -- forbidden
dotnet run --project demos/Demo330_BoundedHarness/Demo330.App.csproj -c Release --no-build -- deadline
dotnet run --project demos/Demo330_BoundedHarness/Demo330.App.csproj -c Release --no-build -- complete --live --AI:ChatProvider=Ollama --AI:LocalChat:Endpoint=http://127.0.0.1:1/ --AI:TimeoutSeconds=3

forbidden : PermissionDenied avant tout corps d’outil ; deadline : expiration après une seconde ; endpoint local fermé : ProviderUnavailable avec une seule tentative transport et aucun outil. Le dernier essai sélectionne explicitement Ollama et un endpoint de panne de test ; il n’appelle aucun cloud. Ne pas arrêter un serveur utilisé par une autre application pour fabriquer cette panne.

Sortie observée · 2026-10-24 · lot010-provider-unavailable
{"Status":"ProviderUnavailable","Text":null,"Events":[{"Kind":"ModelCall","Name":"model","Count":1}]}

Pour l’annulation manuelle, lancer deadline puis Ctrl+C avant l’expiration : l’issue attendue est 130, pas DeadlineExceeded ou un résultat de secours. Cette course peut être difficile à produire à la main ; les tests déclenchent l’annulation de façon contrôlée dans le Harness et dans un corps d’outil. Le lot vérifie cette annulation par les tests, sans prétendre avoir envoyé un Ctrl+C interactif pendant la recette CLI.

Lire le corrigé à la frontière d’exécution

dotnet test tests/Maf.Control.Tests/Maf.Control.Tests.csproj -m:1 -c Release --no-build --no-restore

TwoStepTaskCompletesOnBothNativeAgents vérifie trois appels modèle et deux outils. DirectInvocationCannotBypassPermission teste le refus hors boucle ; ConcurrentDuplicateCallsReachBodyOnce vérifie une seule entrée de corps sur huit appels concurrents. CallerCancellationThroughNativeHarnessPropagates et CancellationReachesToolBody couvrent le token. Ep011CancellationCannotBecomeFallback vérifie la course panne/annulation. Ces tests gardent MAF et les outils réels avec un transport scripté.

Indices de vérification

Avant la correction, consigner la prédiction et le résultat observé. Distinguer texte généré, statut terminal, décision et état persistant. En cas d’écart, suivre le fichier et le test nommés dans la procédure ; ne pas supprimer le garde-fou pour obtenir le résultat attendu.

Expliquer ce que la borne ne fait pas

Une nouvelle invocation crée un nouveau scope : le même read_ticket redevient admissible. Modifier Repetitions à deux et ToolCalls à trois dans une copie locale permet de prévoir les tentatives, mais ne crée pas une autorisation durable. L’exercice ne prouve ni coût monétaire maximal, ni arrêt forcé d’un fournisseur ignorant l’annulation, ni résistance générale aux injections. Pour le rejeu d’un effet déjà commis, utiliser le protocole persistant du chapitre précédent.

Comparer les autres issues

Prérequis

Pour poursuivre

lot014-consolidation-1 · 2026-10-24 · 9a895c94534cd5fc6f3da883e37e5f7856e588c1