e-naxosMAF COURSE / COURS
English

MICROSOFT AGENT FRAMEWORK · 0.16.0-rc.1

Demo350 — Graceful Degradation

La demande fixe contient production et login : le classifieur renvoie Access par ordre des mots-clés. Les quatre cas déterministes indiquent Origine=Heuristic, Confiance=null et une cause différente. Retour 0 pour résultat dégradé, 130 pour annulation. Aucun score mesuré, retry ou fournisseur de secours.

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/Demo350_GracefulDegradation/Demo350.App.csprojApplication
shared/Maf.Backlog/Maf.Backlog.csprojImplémentation partagée

Lancer depuis la racine

dotnet run --project demos/Demo350_GracefulDegradation/Demo350.App.csproj -c Release --no-build

Manipulations et variantes

Comparer lancement sans argument, --unavailable, --invalid et --timeout. Ajouter --live uniquement pour une tentative réelle via le profil choisi. Ctrl+C doit rester une annulation, sans fallback de remplacement.

public async Task<TriageResult> ClasserAsync(string request, ScenarioDemo scenario, CancellationToken cancellationToken)
{
    cancellationToken.ThrowIfCancellationRequested();
    if (scenario == ScenarioDemo.FallbackDirect)
        return fallback.Classer(request, "Explicit heuristic mode.");
    var pipeline = new ResiliencePipelineBuilder<TriageResult>().AddTimeout(
        scenario == ScenarioDemo.TimeoutSimule ? TimeSpan.FromSeconds(2) : timeout).Build();
    try
    {
        var result = await pipeline.ExecuteAsync(async token =>
        {
            if (scenario == ScenarioDemo.TimeoutSimule) await Task.Delay(Timeout.InfiniteTimeSpan, token);
            if (scenario == ScenarioDemo.OllamaIndisponibleSimule) throw new HttpRequestException("Simulated provider outage.");
            if (scenario == ScenarioDemo.SortieInvalideSimulee) throw new InvalidOperationException("Simulated invalid output.");
            var value = await model(request, token);
            if (value.Categorie is not ("Access" or "Billing" or "Incident" or "General")
                || string.IsNullOrWhiteSpace(value.Decision))
                throw new InvalidOperationException("Invalid triage output.");
            return value with { Origine = "Model", CauseBascule = null, Confiance = null,
                Explication = "Model classification; no calibrated confidence is available." };
        }, cancellationToken);
        cancellationToken.ThrowIfCancellationRequested();
        return result;
    }
    catch (OperationCanceledException) when (cancellationToken.IsCancellationRequested) { throw; }
    catch (Exception ex) when (ex is TimeoutRejectedException or OperationCanceledException
        or HttpRequestException or InvalidOperationException or System.Text.Json.JsonException)
    {
        cancellationToken.ThrowIfCancellationRequested();
        return fallback.Classer(request, ex.GetType().Name);

demos/Demo350_GracefulDegradation/ResilientAgentTriageService.cs · L25–L54 · 9a895c94534c

Code source · Demo350 · Dossier

dotnet run --project demos/Demo350_GracefulDegradation/Demo350.App.csproj -c Release --no-build -- --unavailable
dotnet run --project demos/Demo350_GracefulDegradation/Demo350.App.csproj -c Release --no-build -- --invalid
dotnet run --project demos/Demo350_GracefulDegradation/Demo350.App.csproj -c Release --no-build -- --timeout

Résultats, refus et preuves

La demande fixe contient production et login : le classifieur renvoie Access par ordre des mots-clés. Les quatre cas déterministes indiquent Origine=Heuristic, Confiance=null et une cause différente. Retour 0 pour résultat dégradé, 130 pour annulation. Aucun score mesuré, retry ou fournisseur de secours.

Sortie observée · 2026-10-24 · lot010-heuristic
{"Categorie":"Access","Decision":"Create a support request for human review.","Confiance":null,"Explication":"Degraded mode: keyword heuristic only; confidence has not been measured.","Origine":"Heuristic","CauseBascule":"Explicit heuristic mode."}

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