AotCheckpointing sample
Demonstrates JSON checkpointing of a declarative workflow under
reflection-disabled System.Text.Json -- the same constraint imposed by
AOT / trim-aggressive deployments.
What it shows
- A 3-action declarative workflow
(
SetVariable->InvokeAzureAgent->SendActivity) checkpointed after every superstep. - The csproj sets
<JsonSerializerIsReflectionEnabledByDefault>false</JsonSerializerIsReflectionEnabledByDefault>. Every JSON operation must resolve type info via a source-genJsonSerializerContextor fail withInvalidOperationException: No JSON type info is available for type 'X'. - The experimental
DeclarativeWorkflowJsonOptions.DefaultJsonSerializerOptionsinstance covers every declarative-package type that flows through the checkpoint pipeline. Pass it toCheckpointManager.CreateJson. - JSON round-trip is verified in two phases:
- Run + drain -- every
[checkpoint x<n>]line is a successful JSON write. ResumeStreamingAsyncon a fresh workflow instance -- a clean return is the proof JSON reads round-trip too. The resumed run is disposed immediately; without a pending external request it would park inWaitForInputAsyncindefinitely.
- Run + drain -- every
DeclarativeWorkflowJsonOptions is marked
[Experimental("MAAI001")]. Suppress that diagnostic in your csproj to
use it.
Registering user-defined types
For workflows whose inputs or custom ActionExecutorResult.Result
payloads are user-defined, clone Default and append your own resolver:
JsonSerializerOptions options = new(DeclarativeWorkflowJsonOptions.Default);
options.TypeInfoResolverChain.Add(MyAppJsonContext.Default);
options.MakeReadOnly();
CheckpointManager manager = CheckpointManager.CreateJson(store, options);
Run
Prerequisites:
-
Azure Foundry project with a deployed model.
-
az login. -
Configuration (user secrets or env):
Setting Description AZURE_AI_PROJECT_ENDPOINTFoundry project endpoint URL. AZURE_AI_MODEL_DEPLOYMENT_NAMEModel deployment name. See the parent README for the full walkthrough.
cd dotnet/samples/03-workflows/Declarative/AotCheckpointing
dotnet run "Hello, my name is Ada."
Expected output:
[checkpoint x<n>]lines after each superstep.- The agent's streamed response.
ACTIVITY: [Sample] Workflow completed. ...WORKFLOW: Verifying read path by resuming from checkpoint <id>WORKFLOW: Checkpoint deserialized successfullyWORKFLOW: Done!
The chk-*/ checkpoint folder is deleted at the end.
Observe the failure mode
Drop the options argument:
CheckpointManager checkpointManager = CheckpointManager.CreateJson(store, DeclarativeWorkflowJsonOptions.Default);
becomes
CheckpointManager checkpointManager = CheckpointManager.CreateJson(store);
Clean rebuild, then re-run. Expected on the first checkpoint commit:
System.InvalidOperationException: No JSON type info is available for type
'Microsoft.Agents.AI.Workflows.Declarative.Kit.ActionExecutorResult'.
This is what dotnet publish -p:PublishAot=true would surface at runtime.
Notes
PublishAot=trueis not set. TheJsonSerializerIsReflectionEnabledByDefault=falseflag is the minimum constraint that reproduces the AOT failure for JSON checkpointing.- JSON code paths inside transitive dependencies (e.g. Foundry SDK) that rely on reflection would also fail under this flag; those are outside the workflow framework's responsibility.