Jacob Alber 8029572f3f
fix: Unhandled Messages should not error when no deserializer is found (#5549)
Right now if a remote agent sends a message that local agents do not
listen to (and thus will never configure a deserializer for), or if the
first agent in the iteration is one such, the runtime will throw an
unnecessary exception an come down, even though the deserialized message
will never actually be needed before a deserializer is registered.

The fix will downgrade that to a warning.

* Also updates the HelloAgent sample to be more amenable to being used
with gRPC directly, without configuring environment variables.
2025-02-14 10:27:29 -05:00

83 lines
2.8 KiB
C#

// Copyright (c) Microsoft Corporation. All rights reserved.
// Program.cs
using Microsoft.AutoGen.Agents;
using Microsoft.AutoGen.Contracts;
using Microsoft.AutoGen.Core;
using Microsoft.AutoGen.Core.Grpc;
using Samples;
string? hostAddress = null;
bool in_host_address = false;
bool sendHello = true;
foreach (string arg in args)
{
switch (arg)
{
case "--host":
in_host_address = true;
break;
case "--nosend":
sendHello = false;
break;
case "-h":
case "--help":
PrintHelp();
Environment.Exit(0);
break;
default:
if (in_host_address)
{
hostAddress = arg;
}
break;
}
}
hostAddress ??= Environment.GetEnvironmentVariable("AGENT_HOST");
var appBuilder = new AgentsAppBuilder(); // Create app builder
// if we are using distributed, we need the AGENT_HOST var defined and then we will use the grpc runtime
bool usingGrpc = false;
if (hostAddress is string agentHost)
{
usingGrpc = true;
Console.WriteLine($"connecting to {agentHost}");
appBuilder.AddGrpcAgentWorker(agentHost)
.AddAgent<HelloAgent>("HelloAgent");
}
else
{
// Set up app builder for in-process runtime, allow message delivery to self, and add the Hello agent
appBuilder.UseInProcessRuntime(deliverToSelf: true).AddAgent<HelloAgent>("HelloAgent");
}
var app = await appBuilder.BuildAsync(); // Build the app
await app.StartAsync();
// Create a custom message type from proto and define message
if (sendHello)
{
var message = new NewMessageReceived { Message = "Hello World!" };
await app.PublishMessageAsync(message, new TopicId("HelloTopic")).ConfigureAwait(false); // Publish custom message (handler has been set in HelloAgent)
}
else if (!usingGrpc)
{
Console.Write("Warning: Using --nosend with the InProcessRuntime will hang. Terminating.");
Environment.Exit(-1);
}
await app.WaitForShutdownAsync().ConfigureAwait(false); // Wait for shutdown from agent
static void PrintHelp()
{
/*
HelloAgent [--host <hostAddress>] [--nosend]
--host Use gRPC gateway at <hostAddress>; this can also be set using the AGENT_HOST Environment Variable
--nosend Do not send the starting message. Note: This means HelloAgent will wait until some other agent will send
that message. This will not work when using the InProcessRuntime.
*/
Console.WriteLine("HelloAgent [--host <hostAddress>] [--nosend]");
Console.WriteLine(" --host \tUse gRPC gateway at <hostAddress>; this can also be set using the AGENT_HOST Environment Variable");
Console.WriteLine(" --nosend \tDo not send the starting message. Note: This means HelloAgent will wait until some other agent will send");
}