// Copyright (c) Microsoft. All rights reserved. using System.Text.Json; namespace Microsoft.Extensions.AI.Agents.Runtime.Samples; /// /// Example demonstrating how to use the InMemoryActorStateStorage. /// public static class InMemoryActorStateStorageExample { /// /// Demonstrates the basic usage of InMemoryActorStateStorage. /// /// A task representing the asynchronous operation. public static async Task RunAsync() { // Create an in-memory actor state storage var storage = new InMemoryActorStateStorage(); // Create an actor ID var actorId = new ActorId("ExampleActor", "instance1"); Console.WriteLine("=== InMemoryActorStateStorage Example ==="); Console.WriteLine(); // 1. Write some initial state Console.WriteLine("1. Writing initial state..."); var initialOperations = new List { new SetValueOperation("name", JsonSerializer.SerializeToElement("John Doe")), new SetValueOperation("age", JsonSerializer.SerializeToElement(30)), new SetValueOperation("city", JsonSerializer.SerializeToElement("Seattle")) }; var writeResult = await storage.WriteStateAsync(actorId, initialOperations, "0").ConfigureAwait(false); Console.WriteLine($" Write successful: {writeResult.Success}"); Console.WriteLine($" New ETag: {writeResult.ETag}"); Console.WriteLine($" Actor count: {storage.ActorCount}"); Console.WriteLine($" Key count for actor: {storage.GetKeyCount(actorId)}"); Console.WriteLine(); // 2. Read the state back Console.WriteLine("2. Reading state back..."); var readOperations = new List { new GetValueOperation("name"), new GetValueOperation("age"), new GetValueOperation("city"), new GetValueOperation("nonexistent"), // This won't exist new ListKeysOperation(continuationToken: null) // List all keys }; var readResult = await storage.ReadStateAsync(actorId, readOperations).ConfigureAwait(false); Console.WriteLine($" Current ETag: {readResult.ETag}"); Console.WriteLine(" Results:"); foreach (var result in readResult.Results) { switch (result) { case GetValueResult getValue: Console.WriteLine($" - Get value: {getValue.Value?.ToString() ?? "null"}"); break; case ListKeysResult listKeys: Console.WriteLine($" - Keys: [{string.Join(", ", listKeys.Keys)}]"); break; } } Console.WriteLine(); // 3. Update some values Console.WriteLine("3. Updating state..."); var updateOperations = new List { new SetValueOperation("age", JsonSerializer.SerializeToElement(31)), // Update age new SetValueOperation("email", JsonSerializer.SerializeToElement("john@example.com")), // Add email new RemoveKeyOperation("city") // Remove city }; var updateResult = await storage.WriteStateAsync(actorId, updateOperations, writeResult.ETag).ConfigureAwait(false); Console.WriteLine($" Update successful: {updateResult.Success}"); Console.WriteLine($" New ETag: {updateResult.ETag}"); Console.WriteLine($" Key count for actor: {storage.GetKeyCount(actorId)}"); Console.WriteLine(); // 4. Try to update with wrong ETag (should fail) Console.WriteLine("4. Trying to update with wrong ETag..."); var failingOperations = new List { new SetValueOperation("shouldFail", JsonSerializer.SerializeToElement("this should fail")) }; var failResult = await storage.WriteStateAsync(actorId, failingOperations, "wrong-etag").ConfigureAwait(false); Console.WriteLine($" Update successful: {failResult.Success}"); Console.WriteLine($" Current ETag: {failResult.ETag}"); Console.WriteLine(); // 5. Read final state Console.WriteLine("5. Reading final state..."); var finalReadOperations = new List { new ListKeysOperation(continuationToken: null) }; var finalReadResult = await storage.ReadStateAsync(actorId, finalReadOperations).ConfigureAwait(false); var finalKeys = finalReadResult.Results.OfType().First(); Console.WriteLine($" Final keys: [{string.Join(", ", finalKeys.Keys)}]"); // 6. Read each value foreach (var key in finalKeys.Keys) { var valueReadOperations = new List { new GetValueOperation(key) }; var valueReadResult = await storage.ReadStateAsync(actorId, valueReadOperations).ConfigureAwait(false); var getValue = valueReadResult.Results.OfType().First(); Console.WriteLine($" - {key}: {getValue.Value}"); } Console.WriteLine(); Console.WriteLine("=== Example Complete ==="); } }