// Copyright (c) Microsoft Corporation. All rights reserved. // Program.cs using System.Text.Json; using Microsoft.AutoGen.Agents; using Microsoft.AutoGen.Contracts; using Microsoft.AutoGen.Core; // send a message to the agent var local = true; if (Environment.GetEnvironmentVariable("AGENT_HOST") != null) { local = false; } var app = await Microsoft.AutoGen.Core.Grpc.AgentsApp.PublishMessageAsync("HelloAgents", new NewMessageReceived { Message = "World" }, local: local).ConfigureAwait(false); await app.WaitForShutdownAsync(); namespace Hello { [TopicSubscription("HelloAgents")] public class HelloAgent( IHostApplicationLifetime hostApplicationLifetime, [FromKeyedServices("AgentsMetadata")] AgentsMetadata typeRegistry) : Agent( typeRegistry), IHandleConsole, IHandle, IHandle, IHandle { private AgentState? State { get; set; } public async Task Handle(NewMessageReceived item, CancellationToken cancellationToken = default) { var response = await SayHello(item.Message).ConfigureAwait(false); var evt = new Output { Message = response }; Dictionary state = new() { { "data", "We said hello to " + item.Message }, { "workflow", "Active" } }; await StoreAsync(new AgentState { AgentId = this.AgentId, TextData = JsonSerializer.Serialize(state) }).ConfigureAwait(false); await PublishMessageAsync(evt).ConfigureAwait(false); var goodbye = new ConversationClosed { UserId = this.AgentId.Key, UserMessage = "Goodbye" }; await PublishMessageAsync(goodbye).ConfigureAwait(false); // send the shutdown message await PublishMessageAsync(new Shutdown { Message = this.AgentId.Key }).ConfigureAwait(false); } public async Task Handle(ConversationClosed item, CancellationToken cancellationToken = default) { State = await ReadAsync(this.AgentId).ConfigureAwait(false); var state = JsonSerializer.Deserialize>(State.TextData) ?? new Dictionary { { "data", "No state data found" } }; var goodbye = $"\nState: {state}\n********************* {item.UserId} said {item.UserMessage} ************************"; var evt = new Output { Message = goodbye }; await PublishMessageAsync(evt).ConfigureAwait(true); state["workflow"] = "Complete"; await StoreAsync(new AgentState { AgentId = this.AgentId, TextData = JsonSerializer.Serialize(state) }).ConfigureAwait(false); } public async Task Handle(Shutdown item, CancellationToken cancellationToken = default) { string? workflow = null; // make sure the workflow is finished while (workflow != "Complete") { State = await ReadAsync(this.AgentId).ConfigureAwait(true); var state = JsonSerializer.Deserialize>(State?.TextData ?? "{}") ?? new Dictionary(); workflow = state["workflow"]; await Task.Delay(1000).ConfigureAwait(true); } // now we can shut down... hostApplicationLifetime.StopApplication(); } public async Task SayHello(string ask) { var response = $"\n\n\n\n***************Hello {ask}**********************\n\n\n\n"; return response; } } }