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
- Observer Demo350 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/Demo350_GracefulDegradation/Demo350.App.csproj | Application |
| shared/Maf.Backlog/Maf.Backlog.csproj | Implémentation partagée |
Lancer depuis la racine
dotnet run --project demos/Demo350_GracefulDegradation/Demo350.App.csproj -c Release --no-buildManipulations 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);
Code source · Demo350 · Dossier
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 -- --timeoutRé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.
{"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