MICROSOFT AGENT FRAMEWORK · 0.16.0-rc.1
Demo340 — Loop Control
ChatClientAgent natif, sans HarnessAgent, avec le même Maf.Control. Le défaut retourne RepeatedCall et code 2 après une tentative admise. Il n’existe plus de menu naïf/protégé ni de boucle non bornée dans cette entrée actuelle.
Objectifs
- Observer Demo340 et ses variantes ; relier le résultat aux concepts du chapitre.
Préparer la démo
Depuis la racine de la distribution complète compilée en Release ; conserver les projets partagés et les fichiers copiés près des exécutables. Transport scripté ou heuristique par défaut : aucun modèle, embedding, secret ou conteneur nécessaire. --live sélectionne explicitement le chat commun, sans fallback cloud.
dotnet build BaseTechnique.slnx -m:1 -c Release| Projet | Rôle |
|---|---|
| demos/Demo340_LoopControl/Demo340.App.csproj | Application |
| shared/Maf.Control/Maf.Control.csproj | Implémentation partagée |
Lancer depuis la racine
dotnet run --project demos/Demo340_LoopControl/Demo340.App.csproj -c Release --no-buildManipulations et variantes
Lancer sans argument pour répéter read_ticket(42). Comparer complete puis changing. Lire les événements Middleware séparément des ToolCall.
public AIFunction CreateTool<T>(string name, string capability,
Func<T, CancellationToken, Task<string>> body)
{
return AIFunctionFactory.Create(async (T input, CancellationToken cancellationToken) =>
{
using var linked = CancellationTokenSource.CreateLinkedTokenSource(Token, cancellationToken);
linked.Token.ThrowIfCancellationRequested();
lock (sync)
{
CheckCancellation();
if (!capabilities.Contains(capability)) Halt("PermissionDenied", name, tools);
if (tools >= Limits.ToolCalls) Halt("ToolBudget", name, tools);
var key = name + ":" + Canonical(JsonSerializer.SerializeToElement(input));
var count = repetitions.GetValueOrDefault(key);
if (count >= Limits.Repetitions) Halt("RepeatedCall", name, count);
repetitions[key] = count + 1;
events.Add(new("ToolCall", name, ++tools));
}
var result = await body(input, linked.Token);
CheckCancellation();
return result;
Code source · Maf.Control · Dossier
- shared/Maf.Control/Maf.Control.csproj
- demos/Demo330_BoundedHarness/Demo330.App.csproj
- demos/Demo340_LoopControl/Demo340.App.csproj
- demos/Demo380_RoleBasedTools/Demo380.App.csproj
dotnet run --project demos/Demo340_LoopControl/Demo340.App.csproj -c Release --no-build -- completedotnet run --project demos/Demo340_LoopControl/Demo340.App.csproj -c Release --no-build -- repeatdotnet run --project demos/Demo340_LoopControl/Demo340.App.csproj -c Release --no-build -- forbiddendotnet run --project demos/Demo340_LoopControl/Demo340.App.csproj -c Release --no-build -- budgetdotnet run --project demos/Demo340_LoopControl/Demo340.App.csproj -c Release --no-build -- changingdotnet run --project demos/Demo340_LoopControl/Demo340.App.csproj -c Release --no-build -- deadlinedotnet run --project demos/Demo340_LoopControl/Demo340.App.csproj -c Release --no-build -- incompleteRésultats, refus et preuves
ChatClientAgent natif, sans HarnessAgent, avec le même Maf.Control. Le défaut retourne RepeatedCall et code 2 après une tentative admise. Il n’existe plus de menu naïf/protégé ni de boucle non bornée dans cette entrée actuelle.
Limites du contrôle
Les résultats scriptés vérifient orchestration et contrôles réels, sans qualifier un modèle ni toute attaque. Les compteurs sont par run ; aucune idempotence durable ou écriture métier. L’annulation reste coopérative.
dotnet test tests/Maf.Control.Tests/Maf.Control.Tests.csproj -m:1 -c Release --no-build --no-restore