mirror of https://github.com/microsoft/autogen.git
170 lines
6.7 KiB
C#
170 lines
6.7 KiB
C#
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// MiddlewareAgentCodeSnippet.cs
|
|
|
|
using AutoGen.Core;
|
|
using System.Text.Json;
|
|
using AutoGen.OpenAI;
|
|
using FluentAssertions;
|
|
|
|
namespace AutoGen.BasicSample.CodeSnippet;
|
|
|
|
public class MiddlewareAgentCodeSnippet
|
|
{
|
|
public async Task CreateMiddlewareAgentAsync()
|
|
{
|
|
#region create_middleware_agent_with_original_agent
|
|
// Create an agent that always replies "Hello World"
|
|
IAgent agent = new DefaultReplyAgent(name: "assistant", defaultReply: "Hello World");
|
|
|
|
// Create a middleware agent on top of default reply agent
|
|
var middlewareAgent = new MiddlewareAgent(innerAgent: agent);
|
|
middlewareAgent.Use(async (messages, options, agent, ct) =>
|
|
{
|
|
var lastMessage = messages.Last() as TextMessage;
|
|
lastMessage.Content = $"[middleware 0] {lastMessage.Content}";
|
|
return await agent.GenerateReplyAsync(messages, options, ct);
|
|
});
|
|
|
|
var reply = await middlewareAgent.SendAsync("Hello World");
|
|
reply.GetContent().Should().Be("[middleware 0] Hello World");
|
|
#endregion create_middleware_agent_with_original_agent
|
|
|
|
#region register_middleware_agent
|
|
middlewareAgent = agent.RegisterMiddleware(async (messages, options, agent, ct) =>
|
|
{
|
|
var lastMessage = messages.Last() as TextMessage;
|
|
lastMessage.Content = $"[middleware 0] {lastMessage.Content}";
|
|
return await agent.GenerateReplyAsync(messages, options, ct);
|
|
});
|
|
#endregion register_middleware_agent
|
|
|
|
#region short_circuit_middleware_agent
|
|
// This middleware will short circuit the agent and return the last message directly.
|
|
middlewareAgent.Use(async (messages, options, agent, ct) =>
|
|
{
|
|
var lastMessage = messages.Last() as TextMessage;
|
|
lastMessage.Content = $"[middleware shortcut]";
|
|
return lastMessage;
|
|
});
|
|
#endregion short_circuit_middleware_agent
|
|
}
|
|
|
|
public async Task RegisterStreamingMiddlewareAsync()
|
|
{
|
|
IStreamingAgent streamingAgent = default;
|
|
#region register_streaming_middleware
|
|
var connector = new OpenAIChatRequestMessageConnector();
|
|
var agent = streamingAgent!
|
|
.RegisterStreamingMiddleware(connector);
|
|
#endregion register_streaming_middleware
|
|
}
|
|
|
|
public async Task CodeSnippet1()
|
|
{
|
|
#region code_snippet_1
|
|
// Create an agent that always replies "Hello World"
|
|
IAgent agent = new DefaultReplyAgent(name: "assistant", defaultReply: "Hello World");
|
|
|
|
// Create a middleware agent on top of default reply agent
|
|
var middlewareAgent = new MiddlewareAgent(innerAgent: agent);
|
|
|
|
// Since no middleware is added, middlewareAgent will simply proxy into the inner agent to generate reply.
|
|
var reply = await middlewareAgent.SendAsync("Hello World");
|
|
reply.From.Should().Be("assistant");
|
|
reply.GetContent().Should().Be("Hello World");
|
|
#endregion code_snippet_1
|
|
|
|
#region code_snippet_2
|
|
middlewareAgent.Use(async (messages, options, agent, ct) =>
|
|
{
|
|
var lastMessage = messages.Last() as TextMessage;
|
|
lastMessage.Content = $"[middleware 0] {lastMessage.Content}";
|
|
return await agent.GenerateReplyAsync(messages, options, ct);
|
|
});
|
|
|
|
reply = await middlewareAgent.SendAsync("Hello World");
|
|
reply.Should().BeOfType<TextMessage>();
|
|
var textReply = (TextMessage)reply;
|
|
textReply.Content.Should().Be("[middleware 0] Hello World");
|
|
#endregion code_snippet_2
|
|
#region code_snippet_2_1
|
|
middlewareAgent = agent.RegisterMiddleware(async (messages, options, agnet, ct) =>
|
|
{
|
|
var lastMessage = messages.Last() as TextMessage;
|
|
lastMessage.Content = $"[middleware 0] {lastMessage.Content}";
|
|
return await agent.GenerateReplyAsync(messages, options, ct);
|
|
});
|
|
|
|
reply = await middlewareAgent.SendAsync("Hello World");
|
|
reply.GetContent().Should().Be("[middleware 0] Hello World");
|
|
#endregion code_snippet_2_1
|
|
#region code_snippet_3
|
|
middlewareAgent.Use(async (messages, options, agent, ct) =>
|
|
{
|
|
var lastMessage = messages.Last() as TextMessage;
|
|
lastMessage.Content = $"[middleware 1] {lastMessage.Content}";
|
|
return await agent.GenerateReplyAsync(messages, options, ct);
|
|
});
|
|
|
|
reply = await middlewareAgent.SendAsync("Hello World");
|
|
reply.GetContent().Should().Be("[middleware 0] [middleware 1] Hello World");
|
|
#endregion code_snippet_3
|
|
|
|
#region code_snippet_4
|
|
middlewareAgent.Use(async (messages, options, next, ct) =>
|
|
{
|
|
var lastMessage = messages.Last() as TextMessage;
|
|
lastMessage.Content = $"[middleware shortcut]";
|
|
|
|
return lastMessage;
|
|
});
|
|
|
|
reply = await middlewareAgent.SendAsync("Hello World");
|
|
reply.GetContent().Should().Be("[middleware shortcut]");
|
|
#endregion code_snippet_4
|
|
|
|
#region retrieve_inner_agent
|
|
var innerAgent = middlewareAgent.Agent;
|
|
#endregion retrieve_inner_agent
|
|
|
|
#region code_snippet_logging_to_console
|
|
var agentWithLogging = middlewareAgent.RegisterMiddleware(async (messages, options, agent, ct) =>
|
|
{
|
|
var reply = await agent.GenerateReplyAsync(messages, options, ct);
|
|
var formattedMessage = reply.FormatMessage();
|
|
Console.WriteLine(formattedMessage);
|
|
|
|
return reply;
|
|
});
|
|
#endregion code_snippet_logging_to_console
|
|
|
|
#region code_snippet_response_format_forcement
|
|
var jsonAgent = middlewareAgent.RegisterMiddleware(async (messages, options, agent, ct) =>
|
|
{
|
|
var maxAttempt = 5;
|
|
var reply = await agent.GenerateReplyAsync(messages, options, ct);
|
|
while (maxAttempt-- > 0)
|
|
{
|
|
if (JsonSerializer.Deserialize<Dictionary<string, object>>(reply.GetContent()) is { } dict)
|
|
{
|
|
return reply;
|
|
}
|
|
else
|
|
{
|
|
await Task.Delay(1000);
|
|
var reviewPrompt = @"The format is not json, please modify your response to json format
|
|
-- ORIGINAL MESSAGE --
|
|
{reply.Content}
|
|
-- END OF ORIGINAL MESSAGE --
|
|
|
|
Reply again with json format.";
|
|
reply = await agent.SendAsync(reviewPrompt, messages, ct);
|
|
}
|
|
}
|
|
|
|
throw new Exception("agent fails to generate json response");
|
|
});
|
|
#endregion code_snippet_response_format_forcement
|
|
}
|
|
}
|