e-naxosMAF COURSE / COURS
Français

MICROSOFT AGENT FRAMEWORK · 0.16.0-rc.1

Demo350 — Graceful Degradation

The fixed request contains production and login: keyword ordering returns Access. The four deterministic cases report Origine=Heuristic, Confiance=null and different causes. Return 0 for a degraded result, 130 for cancellation. No measured score, retry or backup provider.

Objectives

Prepare the demo

Start at the root of the complete distribution built in Release; retain shared projects and files copied beside executables. Scripted transport or heuristic by default: no model, embeddings, secret or container required. --live explicitly selects common chat without cloud fallback.

dotnet build BaseTechnique.slnx -m:1 -c Release
Required projects
ProjectRole
demos/Demo350_GracefulDegradation/Demo350.App.csprojApp
shared/Maf.Backlog/Maf.Backlog.csprojShared implementation

Run from the root

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

Procedures and variants

Compare no argument, --unavailable, --invalid and --timeout. Add --live only for a real attempt through the selected profile. Ctrl+C must remain cancellation without replacement fallback.

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

Source code · Demo350 · Folder

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

Results, refusal and evidence

The fixed request contains production and login: keyword ordering returns Access. The four deterministic cases report Origine=Heuristic, Confiance=null and different causes. Return 0 for a degraded result, 130 for cancellation. No measured score, retry or backup provider.

Observed output · 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."}

Control limits

Scripted results verify actual orchestration and controls without qualifying a model or every attack. Counters are run-local; no durable idempotency or business write. Cancellation remains cooperative.

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

Connect contracts and prerequisites

Prerequisites

Continue reading

Complete demo folder · README

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