MICROSOFT AGENT FRAMEWORK · 0.16.0-rc.1
Demo320 — Durable Approval
Après start : Waiting, zéro ligne. Après approve : Completed, StoredItem et ItemId. Après le même resume : même ItemId, une seule ligne. Conserver le reçu d’attente pour forcer le rejeu réel du checkpoint.
Objectifs
- Observer Demo320 et ses variantes ; relier le résultat aux concepts du chapitre.
Préparer le programme
Aucun modèle, embedding, conteneur ou secret nécessaire. Depuis la racine de la distribution complète. Préserver les projets partagés et les fichiers de configuration. Certains prompts et libellés historiques de Demo260–290 sont encore en français dans le code public ; les commandes et identifiants restent ceux de cette révision.
dotnet build BaseTechnique.slnx -m:1 -c Release| Projet | Rôle |
|---|---|
| demos/Demo320_DurableApproval/Demo320.App.csproj | Application |
| shared/Maf.Durable/Maf.Durable.csproj | Implémentation partagée |
Commandes depuis la racine
$state = Join-Path $env:TEMP ('maf-demo320-' + [guid]::NewGuid().ToString('N'))dotnet run --project demos/Demo320_DurableApproval/Demo320.App.csproj -c Release --no-build -- start $statedotnet run --project demos/Demo320_DurableApproval/Demo320.App.csproj -c Release --no-build -- status $statedotnet run --project demos/Demo320_DurableApproval/Demo320.App.csproj -c Release --no-build -- resume $state approvedotnet run --project demos/Demo320_DurableApproval/Demo320.App.csproj -c Release --no-build -- resume $state approvedotnet run --project demos/Demo320_DurableApproval/Demo320.App.csproj -c Release --no-build -- status $stateManipulations et variantes
Exécuter la séquence ci-dessous puis l’exercice refus/rejeu. Chaque commande est un processus séparé et doit réutiliser le même répertoire.
public ApprovalState Apply(ApprovalDecision decision)
{
RecordDecision(decision);
using var connection = Open();
using var transaction = connection.BeginTransaction();
using var command = connection.CreateCommand();
command.Transaction = transaction;
command.CommandText = """
INSERT INTO ApprovedBacklogItems (OperationId,Draft,CreatedUtc)
SELECT OperationId,Draft,$utc FROM Approvals WHERE OperationId=$id AND Status IN ('Approved','Completed')
ON CONFLICT(OperationId) DO NOTHING;
UPDATE Approvals SET Status='Completed' WHERE OperationId=$id AND Status='Approved';
""";
command.Parameters.AddWithValue("$id", decision.OperationId);
command.Parameters.AddWithValue("$utc", DateTimeOffset.UtcNow.ToString("O"));
command.ExecuteNonQuery();
transaction.Commit();
return Read(decision.OperationId);
Ce qui doit être observable
Après start : Waiting, zéro ligne. Après approve : Completed, StoredItem et ItemId. Après le même resume : même ItemId, une seule ligne. Conserver le reçu d’attente pour forcer le rejeu réel du checkpoint.
Ces résultats sont attendus à partir du code lié. Les observations effectivement rejouées pour ce lot sont distinguées dans les exercices et la réception ; aucune sortie live non mesurée n’est donnée comme observée.
Limites et état conservé
Demo300 répond dans le processus vivant ; Demo310 conserve son manager en mémoire ; seule Demo320 conserve les checkpoints sur disque pour une reprise dans un autre processus. La base SQLite existe dans les trois variantes. Unicité locale de la ligne, aucun exactly-once distribué. La CLI fait confiance à son opérateur, sans authentification de relecteur.
dotnet test tests/Maf.Durable.Tests/Maf.Durable.Tests.csproj -m:1 -c Release --no-build --no-restore