e-naxosMAF COURSE / COURS
English

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

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
Projets nécessaires
ProjetRôle
demos/Demo340_LoopControl/Demo340.App.csprojApplication
shared/Maf.Control/Maf.Control.csprojImplémentation partagée

Lancer depuis la racine

dotnet run --project demos/Demo340_LoopControl/Demo340.App.csproj -c Release --no-build

Manipulations 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;

shared/Maf.Control/ExecutionScope.cs · L75–L95 · 9a895c94534c

Code source · Maf.Control · Dossier

dotnet run --project demos/Demo340_LoopControl/Demo340.App.csproj -c Release --no-build -- complete
dotnet run --project demos/Demo340_LoopControl/Demo340.App.csproj -c Release --no-build -- repeat
dotnet run --project demos/Demo340_LoopControl/Demo340.App.csproj -c Release --no-build -- forbidden
dotnet run --project demos/Demo340_LoopControl/Demo340.App.csproj -c Release --no-build -- budget
dotnet run --project demos/Demo340_LoopControl/Demo340.App.csproj -c Release --no-build -- changing
dotnet run --project demos/Demo340_LoopControl/Demo340.App.csproj -c Release --no-build -- deadline
dotnet run --project demos/Demo340_LoopControl/Demo340.App.csproj -c Release --no-build -- incomplete

Ré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

Relier aux contrats et prérequis

Prérequis

Pour poursuivre

Dossier complet de la démo · README

lot010-controls-1 · 2026-10-24 · 9a895c94534cd5fc6f3da883e37e5f7856e588c1