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
- Return an explicit degraded outcome on timeout or dependency failure.
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| Project | Role |
|---|---|
| demos/Demo350_GracefulDegradation/Demo350.App.csproj | App |
| shared/Maf.Backlog/Maf.Backlog.csproj | Shared implementation |
Run from the root
dotnet run --project demos/Demo350_GracefulDegradation/Demo350.App.csproj -c Release --no-buildProcedures 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);
Source code · Demo350 · Folder
dotnet run --project demos/Demo350_GracefulDegradation/Demo350.App.csproj -c Release --no-build -- --unavailabledotnet run --project demos/Demo350_GracefulDegradation/Demo350.App.csproj -c Release --no-build -- --invaliddotnet run --project demos/Demo350_GracefulDegradation/Demo350.App.csproj -c Release --no-build -- --timeoutResults, 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.
{"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