* add getting start sample project

* update

* update

* revert change
This commit is contained in:
Xiaoyun Zhang 2024-06-20 10:47:31 -07:00 committed by GitHub
parent 29997f0cf1
commit 393f6fc76c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
11 changed files with 575 additions and 15 deletions

View File

@ -57,8 +57,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AutoGen.Gemini", "src\AutoG
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AutoGen.Gemini.Tests", "test\AutoGen.Gemini.Tests\AutoGen.Gemini.Tests.csproj", "{8EA16BAB-465A-4C07-ABC4-1070D40067E9}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AutoGen.Gemini.Sample", "sample\AutoGen.Gemini.Sample\AutoGen.Gemini.Sample.csproj", "{19679B75-CE3A-4DF0-A3F0-CA369D2760A4}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AutoGen.AotCompatibility.Tests", "test\AutoGen.AotCompatibility.Tests\AutoGen.AotCompatibility.Tests.csproj", "{6B82F26D-5040-4453-B21B-C8D1F913CE4C}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AutoGen.Gemini.Sample", "sample\AutoGen.Gemini.Sample\AutoGen.Gemini.Sample.csproj", "{19679B75-CE3A-4DF0-A3F0-CA369D2760A4}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AutoGen.AotCompatibility.Tests", "test\AutoGen.AotCompatibility.Tests\AutoGen.AotCompatibility.Tests.csproj", "{6B82F26D-5040-4453-B21B-C8D1F913CE4C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution

View File

@ -6,6 +6,7 @@
<ImplicitUsings>enable</ImplicitUsings>
<GenerateDocumentationFile>True</GenerateDocumentationFile>
<NoWarn>$(NoWarn);CS8981;CS8600;CS8602;CS8604;CS8618;CS0219;SKEXP0054;SKEXP0050;SKEXP0110</NoWarn>
<IncludeResourceFolder>true</IncludeResourceFolder>
</PropertyGroup>
<ItemGroup>
@ -15,10 +16,4 @@
<PackageReference Include="FluentAssertions" Version="$(FluentAssertionVersion)" />
<PackageReference Include="Microsoft.SemanticKernel.Plugins.Web" Version="$(SemanticKernelExperimentalVersion)" />
</ItemGroup>
<ItemGroup>
<None Update="ImageResources\square.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>

View File

@ -61,7 +61,7 @@ The image is generated from prompt {prompt}
var gpt4vConfig = autogen.GetOpenAIConfigList(openAIKey, new[] { "gpt-4-vision-preview" });
var openAIClient = new OpenAIClient(openAIKey);
var instance = new Example05_Dalle_And_GPT4V(openAIClient);
var imagePath = Path.Combine(Environment.CurrentDirectory, "image.jpg");
var imagePath = Path.Combine("resource", "images", "background.png");
if (File.Exists(imagePath))
{
File.Delete(imagePath);

View File

@ -14,7 +14,7 @@ namespace AutoGen.BasicSample;
/// </summary>
public static class Example15_GPT4V_BinaryDataImageMessage
{
private static readonly string ImageResourcePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ImageResources");
private static readonly string ImageResourcePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "resource", "images");
private static Dictionary<string, string> _mediaTypeMappings = new()
{
@ -28,13 +28,14 @@ public static class Example15_GPT4V_BinaryDataImageMessage
public static async Task RunAsync()
{
var openAIKey = Environment.GetEnvironmentVariable("OPENAI_API_KEY") ?? throw new Exception("Please set OPENAI_API_KEY environment variable.");
var openAiConfig = new OpenAIConfig(openAIKey, "gpt-4-vision-preview");
var openAiConfig = new OpenAIConfig(openAIKey, "gpt-4o");
var visionAgent = new GPTAgent(
name: "gpt",
systemMessage: "You are a helpful AI assistant",
config: openAiConfig,
temperature: 0);
temperature: 0)
.RegisterPrintMessage();
List<IMessage> messages =
[new TextMessage(Role.User, "What is this image?", from: "user")];

View File

@ -0,0 +1,80 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Agent_Middleware.cs
#region Using
using AutoGen.Core;
using AutoGen.OpenAI;
using AutoGen.OpenAI.Extension;
using Azure.AI.OpenAI;
#endregion Using
using FluentAssertions;
namespace AutoGen.BasicSample;
public class Agent_Middleware
{
public static async Task RunTokenCountAsync()
{
#region Create_Agent
var apiKey = Environment.GetEnvironmentVariable("OPENAI_API_KEY") ?? throw new InvalidOperationException("Please set the environment variable OPENAI_API_KEY");
var model = "gpt-3.5-turbo";
var openaiClient = new OpenAIClient(apiKey);
var openaiMessageConnector = new OpenAIChatRequestMessageConnector();
var totalTokenCount = 0;
var agent = new OpenAIChatAgent(
openAIClient: openaiClient,
name: "agent",
modelName: model,
systemMessage: "You are a helpful AI assistant")
.RegisterMiddleware(async (messages, option, innerAgent, ct) =>
{
var reply = await innerAgent.GenerateReplyAsync(messages, option, ct);
if (reply is MessageEnvelope<ChatCompletions> chatCompletions)
{
var tokenCount = chatCompletions.Content.Usage.TotalTokens;
totalTokenCount += tokenCount;
}
return reply;
})
.RegisterMiddleware(openaiMessageConnector);
#endregion Create_Agent
#region Chat_With_Agent
var reply = await agent.SendAsync("Tell me a joke");
Console.WriteLine($"Total token count: {totalTokenCount}");
#endregion Chat_With_Agent
#region verify_reply
reply.Should().BeOfType<TextMessage>();
totalTokenCount.Should().BeGreaterThan(0);
#endregion verify_reply
}
public static async Task RunRagTaskAsync()
{
#region Create_Agent
var apiKey = Environment.GetEnvironmentVariable("OPENAI_API_KEY") ?? throw new InvalidOperationException("Please set the environment variable OPENAI_API_KEY");
var model = "gpt-3.5-turbo";
var openaiClient = new OpenAIClient(apiKey);
var openaiMessageConnector = new OpenAIChatRequestMessageConnector();
var agent = new OpenAIChatAgent(
openAIClient: openaiClient,
name: "agent",
modelName: model,
systemMessage: "You are a helpful AI assistant")
.RegisterMessageConnector()
.RegisterMiddleware(async (messages, option, innerAgent, ct) =>
{
var today = DateTime.UtcNow;
var todayMessage = new TextMessage(Role.System, $"Today is {today:yyyy-MM-dd}");
messages = messages.Concat(new[] { todayMessage });
return await innerAgent.GenerateReplyAsync(messages, option, ct);
})
.RegisterPrintMessage();
#endregion Create_Agent
#region Chat_With_Agent
var reply = await agent.SendAsync("what's the date today");
#endregion Chat_With_Agent
}
}

View File

@ -0,0 +1,59 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Chat_With_Agent.cs
#region Using
using AutoGen.Core;
using AutoGen.OpenAI;
using AutoGen.OpenAI.Extension;
using Azure.AI.OpenAI;
#endregion Using
using FluentAssertions;
namespace AutoGen.BasicSample;
public class Chat_With_Agent
{
public static async Task RunAsync()
{
#region Create_Agent
var apiKey = Environment.GetEnvironmentVariable("OPENAI_API_KEY") ?? throw new Exception("Please set OPENAI_API_KEY environment variable.");
var model = "gpt-3.5-turbo";
var openaiClient = new OpenAIClient(apiKey);
var agent = new OpenAIChatAgent(
openAIClient: openaiClient,
name: "agent",
modelName: model,
systemMessage: "You are a helpful AI assistant")
.RegisterMessageConnector(); // convert OpenAI message to AutoGen message
#endregion Create_Agent
#region Chat_With_Agent
var reply = await agent.SendAsync("Tell me a joke");
reply.Should().BeOfType<TextMessage>();
if (reply is TextMessage textMessage)
{
Console.WriteLine(textMessage.Content);
}
#endregion Chat_With_Agent
#region Chat_With_History
reply = await agent.SendAsync("summarize the conversation", chatHistory: [reply]);
#endregion Chat_With_History
#region Streaming_Chat
var question = new TextMessage(Role.User, "Tell me a long joke");
await foreach (var streamingReply in agent.GenerateStreamingReplyAsync([question]))
{
if (streamingReply is TextMessageUpdate textMessageUpdate)
{
Console.WriteLine(textMessageUpdate.Content);
}
}
#endregion Streaming_Chat
#region verify_reply
reply.Should().BeOfType<TextMessage>();
#endregion verify_reply
}
}

View File

@ -0,0 +1,91 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Dynamic_GroupChat.cs
using AutoGen.Core;
using AutoGen.OpenAI;
using AutoGen.OpenAI.Extension;
using AutoGen.SemanticKernel;
using AutoGen.SemanticKernel.Extension;
using Azure.AI.OpenAI;
using Microsoft.SemanticKernel;
namespace AutoGen.BasicSample;
public class Dynamic_Group_Chat
{
public static async Task RunAsync()
{
var apiKey = Environment.GetEnvironmentVariable("OPENAI_API_KEY") ?? throw new Exception("Please set OPENAI_API_KEY environment variable.");
var model = "gpt-3.5-turbo";
#region Create_Coder
var openaiClient = new OpenAIClient(apiKey);
var coder = new OpenAIChatAgent(
openAIClient: openaiClient,
name: "coder",
modelName: model,
systemMessage: "You are a C# coder, when writing csharp code, please put the code between ```csharp and ```")
.RegisterMessageConnector() // convert OpenAI message to AutoGen message
.RegisterPrintMessage(); // print the message content
#endregion Create_Coder
#region Create_Commenter
var kernel = Kernel
.CreateBuilder()
.AddOpenAIChatCompletion(modelId: model, apiKey: apiKey)
.Build();
var commenter = new SemanticKernelAgent(
kernel: kernel,
name: "commenter",
systemMessage: "You write inline comments for the code snippet and add unit tests if necessary")
.RegisterMessageConnector() // register message connector so it support AutoGen built-in message types like TextMessage.
.RegisterPrintMessage(); // pretty print the message to the console
#endregion Create_Commenter
#region Create_UserProxy
var userProxy = new DefaultReplyAgent("user", defaultReply: "END")
.RegisterPrintMessage(); // print the message content
#endregion Create_UserProxy
#region Create_Group
var admin = new OpenAIChatAgent(
openAIClient: openaiClient,
name: "admin",
modelName: model)
.RegisterMessageConnector(); // convert OpenAI message to AutoGen message
var group = new GroupChat(
members: [coder, commenter, userProxy],
admin: admin);
#endregion Create_Group
#region Chat_With_Group
var workflowInstruction = new TextMessage(
Role.User,
"""
Here is the workflow of this group chat:
User{Ask a question} -> Coder{Write code}
Coder{Write code} -> Commenter{Add comments to the code}
Commenter{Add comments to the code} -> User{END}
""");
var question = new TextMessage(Role.User, "How to calculate the 100th Fibonacci number?");
var chatHistory = new List<IMessage> { workflowInstruction, question };
while (true)
{
var replies = await group.CallAsync(chatHistory, maxRound: 1);
var lastReply = replies.Last();
chatHistory.Add(lastReply);
if (lastReply.From == userProxy.Name)
{
break;
}
}
#endregion Chat_With_Group
#region Summarize_Chat_History
var summary = await coder.SendAsync("summarize the conversation", chatHistory: chatHistory);
#endregion Summarize_Chat_History
}
}

View File

@ -0,0 +1,201 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// FSM_Group_Chat.cs
using System.Text;
#region Using
using AutoGen.Core;
using AutoGen.OpenAI;
using AutoGen.OpenAI.Extension;
using Azure.AI.OpenAI;
#endregion Using
namespace AutoGen.BasicSample;
#region FillFormTool
public partial class FillFormTool
{
private string? name = null;
private string? email = null;
private string? phone = null;
private string? address = null;
private bool? receiveUpdates = null;
[Function]
public async Task<string> SaveProgress(
string name,
string email,
string phone,
string address,
bool? receiveUpdates)
{
this.name = !string.IsNullOrEmpty(name) ? name : this.name;
this.email = !string.IsNullOrEmpty(email) ? email : this.email;
this.phone = !string.IsNullOrEmpty(phone) ? phone : this.phone;
this.address = !string.IsNullOrEmpty(address) ? address : this.address;
this.receiveUpdates = receiveUpdates ?? this.receiveUpdates;
var missingInformationStringBuilder = new StringBuilder();
if (string.IsNullOrEmpty(this.name))
{
missingInformationStringBuilder.AppendLine("Name is missing.");
}
if (string.IsNullOrEmpty(this.email))
{
missingInformationStringBuilder.AppendLine("Email is missing.");
}
if (string.IsNullOrEmpty(this.phone))
{
missingInformationStringBuilder.AppendLine("Phone is missing.");
}
if (string.IsNullOrEmpty(this.address))
{
missingInformationStringBuilder.AppendLine("Address is missing.");
}
if (this.receiveUpdates == null)
{
missingInformationStringBuilder.AppendLine("ReceiveUpdates is missing.");
}
if (missingInformationStringBuilder.Length > 0)
{
return missingInformationStringBuilder.ToString();
}
else
{
return "Application information is saved to database.";
}
}
}
#endregion FillFormTool
public class FSM_Group_Chat
{
public static async Task<IAgent> CreateSaveProgressAgent(OpenAIClient client, string model)
{
#region Create_Save_Progress_Agent
var tool = new FillFormTool();
var functionCallMiddleware = new FunctionCallMiddleware(
functions: [tool.SaveProgressFunctionContract],
functionMap: new Dictionary<string, Func<string, Task<string>>>
{
{ tool.SaveProgressFunctionContract.Name!, tool.SaveProgressWrapper },
});
var chatAgent = new OpenAIChatAgent(
openAIClient: client,
name: "application",
modelName: model,
systemMessage: """You are a helpful application form assistant who saves progress while user fills application.""")
.RegisterMessageConnector()
.RegisterMiddleware(functionCallMiddleware)
.RegisterMiddleware(async (msgs, option, agent, ct) =>
{
var lastUserMessage = msgs.Last() ?? throw new Exception("No user message found.");
var prompt = $"""
Save progress according to the most recent information provided by user.
```user
{lastUserMessage.GetContent()}
```
""";
return await agent.GenerateReplyAsync([lastUserMessage], option, ct);
});
#endregion Create_Save_Progress_Agent
return chatAgent;
}
public static async Task<IAgent> CreateAssistantAgent(OpenAIClient openaiClient, string model)
{
#region Create_Assistant_Agent
var chatAgent = new OpenAIChatAgent(
openAIClient: openaiClient,
name: "assistant",
modelName: model,
systemMessage: """You create polite prompt to ask user provide missing information""")
.RegisterMessageConnector()
.RegisterPrintMessage()
.RegisterMiddleware(async (msgs, option, agent, ct) =>
{
var lastReply = msgs.Last() ?? throw new Exception("No reply found.");
var reply = await agent.GenerateReplyAsync(msgs, option, ct);
// if application is complete, exit conversation by sending termination message
if (lastReply.GetContent()?.Contains("Application information is saved to database.") is true)
{
return new TextMessage(Role.Assistant, GroupChatExtension.TERMINATE, from: agent.Name);
}
else
{
return reply;
}
});
#endregion Create_Assistant_Agent
return chatAgent;
}
public static async Task<IAgent> CreateUserAgent(OpenAIClient openaiClient, string model)
{
#region Create_User_Agent
var chatAgent = new OpenAIChatAgent(
openAIClient: openaiClient,
name: "user",
modelName: model,
systemMessage: """
You are a user who is filling an application form. Simply provide the information as requested and answer the questions, don't do anything else.
here's some personal information about you:
- name: John Doe
- email: 1234567@gmail.com
- phone: 123-456-7890
- address: 1234 Main St, Redmond, WA 98052
- want to receive update? true
""")
.RegisterMessageConnector()
.RegisterPrintMessage();
#endregion Create_User_Agent
return chatAgent;
}
public static async Task RunAsync()
{
var apiKey = Environment.GetEnvironmentVariable("OPENAI_API_KEY") ?? throw new Exception("Please set OPENAI_API_KEY environment variable.");
var model = "gpt-3.5-turbo";
var openaiClient = new OpenAIClient(apiKey);
var applicationAgent = await CreateSaveProgressAgent(openaiClient, model);
var assistantAgent = await CreateAssistantAgent(openaiClient, model);
var userAgent = await CreateUserAgent(openaiClient, model);
#region Create_Graph
var userToApplicationTransition = Transition.Create(userAgent, applicationAgent);
var applicationToAssistantTransition = Transition.Create(applicationAgent, assistantAgent);
var assistantToUserTransition = Transition.Create(assistantAgent, userAgent);
var workflow = new Graph(
[
userToApplicationTransition,
applicationToAssistantTransition,
assistantToUserTransition,
]);
#endregion Create_Graph
#region Group_Chat
var groupChat = new GroupChat(
members: [userAgent, applicationAgent, assistantAgent],
workflow: workflow);
#endregion Group_Chat
var initialMessage = await assistantAgent.SendAsync("Generate a greeting meesage for user and start the conversation by asking what's their name.");
var chatHistory = await userAgent.SendMessageToGroupAsync(groupChat, [initialMessage], maxRound: 30);
var lastMessage = chatHistory.Last();
Console.WriteLine(lastMessage.GetContent());
}
}

View File

@ -0,0 +1,50 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Image_Chat_With_Agent.cs
using AutoGen.Core;
using AutoGen.OpenAI;
using AutoGen.OpenAI.Extension;
using Azure.AI.OpenAI;
using FluentAssertions;
namespace AutoGen.BasicSample;
public class Image_Chat_With_Agent
{
public static async Task RunAsync()
{
#region Create_Agent
var apiKey = Environment.GetEnvironmentVariable("OPENAI_API_KEY") ?? throw new Exception("Please set OPENAI_API_KEY environment variable.");
var model = "gpt-4o"; // The model needs to support multimodal inputs
var openaiClient = new OpenAIClient(apiKey);
var agent = new OpenAIChatAgent(
openAIClient: openaiClient,
name: "agent",
modelName: model,
systemMessage: "You are a helpful AI assistant")
.RegisterMessageConnector() // convert OpenAI message to AutoGen message
.RegisterPrintMessage();
#endregion Create_Agent
#region Prepare_Image_Input
var backgoundImagePath = Path.Combine("resource", "images", "background.png");
var imageBytes = File.ReadAllBytes(backgoundImagePath);
var imageMessage = new ImageMessage(Role.User, BinaryData.FromBytes(imageBytes, "image/png"));
#endregion Prepare_Image_Input
#region Chat_With_Agent
var reply = await agent.SendAsync("what's in the picture", chatHistory: [imageMessage]);
#endregion Chat_With_Agent
#region Prepare_Multimodal_Input
var textMessage = new TextMessage(Role.User, "what's in the picture");
var multimodalMessage = new MultiModalMessage(Role.User, [textMessage, imageMessage]);
reply = await agent.SendAsync(multimodalMessage);
#endregion Prepare_Multimodal_Input
#region verify_reply
reply.Should().BeOfType<TextMessage>();
#endregion verify_reply
}
}

View File

@ -0,0 +1,85 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Use_Tools_With_Agent.cs
#region Using
using AutoGen.Core;
using AutoGen.OpenAI;
using AutoGen.OpenAI.Extension;
using Azure.AI.OpenAI;
#endregion Using
using FluentAssertions;
namespace AutoGen.BasicSample;
public partial class Tools
{
/// <summary>
/// Get the weather of the city.
/// </summary>
/// <param name="city"></param>
[Function]
public async Task<string> GetWeather(string city)
{
return $"The weather in {city} is sunny.";
}
}
public class Use_Tools_With_Agent
{
public static async Task RunAsync()
{
#region Create_tools
var tools = new Tools();
#endregion Create_tools
#region Create_Agent
var apiKey = Environment.GetEnvironmentVariable("OPENAI_API_KEY") ?? throw new Exception("Please set OPENAI_API_KEY environment variable.");
var model = "gpt-3.5-turbo";
var openaiClient = new OpenAIClient(apiKey);
var functionCallMiddleware = new FunctionCallMiddleware(
functions: [tools.GetWeatherFunctionContract],
functionMap: new Dictionary<string, Func<string, Task<string>>>()
{
{ tools.GetWeatherFunctionContract.Name!, tools.GetWeatherWrapper },
});
var agent = new OpenAIChatAgent(
openAIClient: openaiClient,
name: "agent",
modelName: model,
systemMessage: "You are a helpful AI assistant")
.RegisterMessageConnector() // convert OpenAI message to AutoGen message
.RegisterMiddleware(functionCallMiddleware) // pass function definition to agent.
.RegisterPrintMessage(); // print the message content
#endregion Create_Agent
#region Single_Turn_Tool_Call
var question = new TextMessage(Role.User, "What is the weather in Seattle?");
var toolCallReply = await agent.SendAsync(question);
#endregion Single_Turn_Tool_Call
#region verify_too_call_reply
toolCallReply.Should().BeOfType<ToolCallAggregateMessage>();
#endregion verify_too_call_reply
#region Multi_Turn_Tool_Call
var finalReply = await agent.SendAsync(chatHistory: [question, toolCallReply]);
#endregion Multi_Turn_Tool_Call
#region verify_reply
finalReply.Should().BeOfType<TextMessage>();
#endregion verify_reply
#region parallel_tool_call
question = new TextMessage(Role.User, "What is the weather in Seattle, New York and Vancouver");
toolCallReply = await agent.SendAsync(question);
#endregion parallel_tool_call
#region verify_parallel_tool_call_reply
toolCallReply.Should().BeOfType<ToolCallAggregateMessage>();
(toolCallReply as ToolCallAggregateMessage)!.Message1.ToolCalls.Count().Should().Be(3);
#endregion verify_parallel_tool_call_reply
#region Multi_Turn_Parallel_Tool_Call
finalReply = await agent.SendAsync(chatHistory: [question, toolCallReply]);
#endregion Multi_Turn_Parallel_Tool_Call
}
}

View File

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8323d0b8eceb752e14c29543b2e28bb2fc648ed9719095c31b7708867a4dc918
size 491