MICROSOFT AGENT FRAMEWORK · 0.16.0-rc.1
Usage nullable et journal
Vérifier les inconnues d’usage et une preuve de commit relue dans un autre processus.
Objectifs
- Utiliser cette page pour comprendre : Usage nullable et journal.
Préparer les contrôles sans modèle
Préparer la solution Release, un fichier SQLite neuf et les tests Maf.Observability.Tests. L’exercice utilise des fixtures et un vrai stockage local, sans serveur modèle. Garder les archives et bases historiques intactes. Le résultat à rendre est un tableau attribuant chaque valeur à sa fixture ou à son exécution.
Produire les trois preuves
dotnet test tests/Maf.Observability.Tests/Maf.Observability.Tests.csproj -m:1 -c Release --no-build --no-restore$journal = Join-Path $env:TEMP ("maf-lot012-" + [guid]::NewGuid().ToString("N") + ".db")dotnet run --project demos/Demo430_BusinessAudit/Demo430.App.csproj -c Release --no-build -- --deterministic --db $journal1. Lire MissingUsageIsNotZero : noter Input, Output, DerivedTotal, CharacterEstimate et EstimatedCost pour usage absent, zéro et usage partiel. 2. Noter le GUID du succès, terminer puis relire avec --read dans un nouveau processus. 3. Exécuter --fail avec le même fichier ; conserver son autre GUID et relire. Expliquer pourquoi son code de lecture peut être 0 sans action.
dotnet run --project demos/Demo430_BusinessAudit/Demo430.App.csproj -c Release --no-build -- --deterministic --fail --db $journal$executionId = Read-Host 'ExecutionId to inspect'dotnet run --project demos/Demo430_BusinessAudit/Demo430.App.csproj -c Release --no-build -- --db $journal --read $executionIdSéparer les conclusions
Relever la date, la révision, le fichier, le GUID, TraceId, Kind, ActionId et HasAction. La durée d’un span répond à une question technique ; ActionCommitted avec HasAction répond à la question du commit local ; aucun des deux n’atteste la qualité d’une réponse. Une estimation de contexte peut être connue alors que l’usage fournisseur est null.
Relier chaque attente au contrôle existant
var input = usage?.InputTokenCount;
var output = usage?.OutputTokenCount;
long? derived = input.HasValue && output.HasValue ? checked(input.Value + output.Value) : null;
decimal? cost = rate is not null && input.HasValue && output.HasValue
? (input.Value * rate.InputPerMillion + output.Value * rate.OutputPerMillion) / 1_000_000m : null;
return new(input, output, usage?.TotalTokenCount, derived,
contextCharacters.HasValue ? ((long)contextCharacters.Value + 3) / 4 : null,
cost, rate?.Currency, rate?.Version);
Code source · Maf.Observability · Dossier
public bool HasAction(Guid executionId, long actionId)
{
using var connection = Open();
using var command = connection.CreateCommand();
command.CommandText = "SELECT COUNT(*) FROM RecordedDecisions WHERE ExecutionId=$id AND Id=$action";
command.Parameters.AddWithValue("$id", executionId.ToString("N"));
command.Parameters.AddWithValue("$action", actionId);
return (long)command.ExecuteScalar()! == 1;
Code source · Maf.Observability · Dossier
MissingUsageIsNotZero conserve null malgré CharacterEstimate=100 pour 400 caractères de fixture. CommittedActionSurvivesRestartAndReplay vérifie une action et un événement après rejeu du même GUID. IntentAndFailureDoNotProveAction interdit de créer la preuve par Append. RetentionAndErasurePreserveBusinessEffect démontre que suppression de métadonnées ne signifie pas rollback. Ce sont des contrôles applicatifs, pas des mesures de modèle.
Indices de vérification
Avant la correction, consigner la prédiction et le résultat observé. Distinguer texte généré, statut terminal, décision et état persistant. En cas d’écart, suivre le fichier et le test nommés dans la procédure ; ne pas supprimer le garde-fou pour obtenir le résultat attendu.
Ne pas élargir la preuve
La manipulation ne démontre ni effet distant, ni trace continue après redémarrage, ni facturation réelle. Ne publier ni fichier SQLite ni transcript brut. Pour une expérience de tarif, utiliser une hypothèse explicitement fictive et versionnée ; aucun tarif réel n’est nécessaire à l’exercice.
