2024-09-30 16:32:48 -07:00
// Copyright (c) Microsoft Corporation. All rights reserved.
2024-04-26 09:21:46 -07:00
// SemanticKernelAgentTest.cs
2024-05-09 15:36:20 -07:00
using AutoGen.Core ;
2024-04-26 09:21:46 -07:00
using AutoGen.SemanticKernel.Extension ;
2024-05-09 15:36:20 -07:00
using AutoGen.Tests ;
2024-04-26 09:21:46 -07:00
using FluentAssertions ;
using Microsoft.SemanticKernel ;
2024-05-08 23:50:36 -04:00
using Microsoft.SemanticKernel.Agents ;
2024-04-26 09:21:46 -07:00
using Microsoft.SemanticKernel.ChatCompletion ;
2024-05-08 23:50:36 -04:00
using Microsoft.SemanticKernel.Connectors.OpenAI ;
2025-02-03 11:49:08 -05:00
using Xunit ;
2024-04-26 09:21:46 -07:00
2024-05-09 15:36:20 -07:00
namespace AutoGen.SemanticKernel.Tests ;
2024-04-26 09:21:46 -07:00
2025-02-03 11:49:08 -05:00
[Trait("Category", "UnitV1")]
2024-04-26 09:21:46 -07:00
public partial class SemanticKernelAgentTest
{
/// <summary>
/// Get the weather for a location.
/// </summary>
/// <param name="location">location</param>
/// <returns></returns>
[Function]
public async Task < string > GetWeatherAsync ( string location )
{
return $"The weather in {location} is sunny." ;
}
2024-06-14 06:53:12 -07:00
[ApiKeyFact("AZURE_OPENAI_API_KEY", "AZURE_OPENAI_ENDPOINT", "AZURE_OPENAI_DEPLOY_NAME")]
2024-04-26 09:21:46 -07:00
public async Task BasicConversationTestAsync ( )
{
var endpoint = Environment . GetEnvironmentVariable ( "AZURE_OPENAI_ENDPOINT" ) ? ? throw new Exception ( "Please set AZURE_OPENAI_ENDPOINT environment variable." ) ;
var key = Environment . GetEnvironmentVariable ( "AZURE_OPENAI_API_KEY" ) ? ? throw new Exception ( "Please set AZURE_OPENAI_API_KEY environment variable." ) ;
2024-06-14 06:53:12 -07:00
var deploymentName = Environment . GetEnvironmentVariable ( "AZURE_OPENAI_DEPLOY_NAME" ) ? ? throw new Exception ( "Please set AZURE_OPENAI_DEPLOY_NAME environment variable." ) ;
2024-04-26 09:21:46 -07:00
var builder = Kernel . CreateBuilder ( )
2024-06-14 06:53:12 -07:00
. AddAzureOpenAIChatCompletion ( deploymentName , endpoint , key ) ;
2024-04-26 09:21:46 -07:00
var kernel = builder . Build ( ) ;
var skAgent = new SemanticKernelAgent ( kernel , "assistant" ) ;
2025-02-25 21:39:45 +01:00
await TestBasicConversationAsync ( skAgent ) ;
}
2024-04-26 09:21:46 -07:00
2025-02-25 21:39:45 +01:00
[ApiKeyFact("AZURE_OPENAI_API_KEY", "AZURE_OPENAI_ENDPOINT", "AZURE_OPENAI_DEPLOY_NAME")]
public async Task BasicConversationTestWithKeyedServiceAsync ( )
{
var endpoint = Environment . GetEnvironmentVariable ( "AZURE_OPENAI_ENDPOINT" ) ? ? throw new Exception ( "Please set AZURE_OPENAI_ENDPOINT environment variable." ) ;
var key = Environment . GetEnvironmentVariable ( "AZURE_OPENAI_API_KEY" ) ? ? throw new Exception ( "Please set AZURE_OPENAI_API_KEY environment variable." ) ;
var deploymentName = Environment . GetEnvironmentVariable ( "AZURE_OPENAI_DEPLOY_NAME" ) ? ? throw new Exception ( "Please set AZURE_OPENAI_DEPLOY_NAME environment variable." ) ;
var modelServiceId = "my-service-id" ;
var builder = Kernel . CreateBuilder ( )
. AddAzureOpenAIChatCompletion ( deploymentName , endpoint , key , modelServiceId ) ;
2024-04-26 09:21:46 -07:00
2025-02-25 21:39:45 +01:00
var kernel = builder . Build ( ) ;
var skAgent = new SemanticKernelAgent ( kernel , "assistant" , modelServiceId : modelServiceId ) ;
2024-04-26 09:21:46 -07:00
2025-02-25 21:39:45 +01:00
await TestBasicConversationAsync ( skAgent ) ;
2024-04-26 09:21:46 -07:00
}
2024-06-14 06:53:12 -07:00
[ApiKeyFact("AZURE_OPENAI_API_KEY", "AZURE_OPENAI_ENDPOINT", "AZURE_OPENAI_DEPLOY_NAME")]
2024-04-26 09:21:46 -07:00
public async Task SemanticKernelChatMessageContentConnectorTestAsync ( )
{
var endpoint = Environment . GetEnvironmentVariable ( "AZURE_OPENAI_ENDPOINT" ) ? ? throw new Exception ( "Please set AZURE_OPENAI_ENDPOINT environment variable." ) ;
var key = Environment . GetEnvironmentVariable ( "AZURE_OPENAI_API_KEY" ) ? ? throw new Exception ( "Please set AZURE_OPENAI_API_KEY environment variable." ) ;
2024-06-14 06:53:12 -07:00
var deploymentName = Environment . GetEnvironmentVariable ( "AZURE_OPENAI_DEPLOY_NAME" ) ? ? throw new Exception ( "Please set AZURE_OPENAI_DEPLOY_NAME environment variable." ) ;
2024-04-26 09:21:46 -07:00
var builder = Kernel . CreateBuilder ( )
2024-06-14 06:53:12 -07:00
. AddAzureOpenAIChatCompletion ( deploymentName , endpoint , key ) ;
2024-04-26 09:21:46 -07:00
var kernel = builder . Build ( ) ;
var skAgent = new SemanticKernelAgent ( kernel , "assistant" )
2024-05-05 07:51:00 -07:00
. RegisterMessageConnector ( ) ;
2024-04-26 09:21:46 -07:00
var messages = new IMessage [ ]
{
MessageEnvelope . Create ( new ChatMessageContent ( AuthorRole . Assistant , "Hello" ) ) ,
2024-05-08 23:50:36 -04:00
new TextMessage ( Role . Assistant , "Hello" , from : "user" ) , new MultiModalMessage ( Role . Assistant ,
2024-04-26 09:21:46 -07:00
[
new TextMessage ( Role . Assistant , "Hello" , from : "user" ) ,
] ,
from : "user" ) ,
} ;
foreach ( var message in messages )
{
var reply = await skAgent . SendAsync ( message ) ;
reply . Should ( ) . BeOfType < TextMessage > ( ) ;
reply . As < TextMessage > ( ) . From . Should ( ) . Be ( "assistant" ) ;
}
// test streaming
foreach ( var message in messages )
{
2024-05-05 07:51:00 -07:00
var reply = skAgent . GenerateStreamingReplyAsync ( [ message ] ) ;
2024-04-26 09:21:46 -07:00
await foreach ( var streamingMessage in reply )
{
streamingMessage . Should ( ) . BeOfType < TextMessageUpdate > ( ) ;
streamingMessage . As < TextMessageUpdate > ( ) . From . Should ( ) . Be ( "assistant" ) ;
}
}
}
2024-06-14 06:53:12 -07:00
[ApiKeyFact("AZURE_OPENAI_API_KEY", "AZURE_OPENAI_ENDPOINT", "AZURE_OPENAI_DEPLOY_NAME")]
2024-04-26 09:21:46 -07:00
public async Task SemanticKernelPluginTestAsync ( )
{
var endpoint = Environment . GetEnvironmentVariable ( "AZURE_OPENAI_ENDPOINT" ) ? ? throw new Exception ( "Please set AZURE_OPENAI_ENDPOINT environment variable." ) ;
var key = Environment . GetEnvironmentVariable ( "AZURE_OPENAI_API_KEY" ) ? ? throw new Exception ( "Please set AZURE_OPENAI_API_KEY environment variable." ) ;
2024-06-14 06:53:12 -07:00
var deploymentName = Environment . GetEnvironmentVariable ( "AZURE_OPENAI_DEPLOY_NAME" ) ? ? throw new Exception ( "Please set AZURE_OPENAI_DEPLOY_NAME environment variable." ) ;
2024-04-26 09:21:46 -07:00
var builder = Kernel . CreateBuilder ( )
2024-06-14 06:53:12 -07:00
. AddAzureOpenAIChatCompletion ( deploymentName , endpoint , key ) ;
2024-04-26 09:21:46 -07:00
var parameters = this . GetWeatherAsyncFunctionContract . Parameters ! . Select ( p = > new KernelParameterMetadata ( p . Name ! )
{
Description = p . Description ,
DefaultValue = p . DefaultValue ,
IsRequired = p . IsRequired ,
ParameterType = p . ParameterType ,
} ) ;
var function = KernelFunctionFactory . CreateFromMethod ( this . GetWeatherAsync , this . GetWeatherAsyncFunctionContract . Name , this . GetWeatherAsyncFunctionContract . Description , parameters ) ;
builder . Plugins . AddFromFunctions ( "plugins" , [ function ] ) ;
var kernel = builder . Build ( ) ;
var skAgent = new SemanticKernelAgent ( kernel , "assistant" )
. RegisterMessageConnector ( ) ;
skAgent . StreamingMiddlewares . Count ( ) . Should ( ) . Be ( 1 ) ;
var question = "What is the weather in Seattle?" ;
var reply = await skAgent . SendAsync ( question ) ;
reply . GetContent ( ) ! . ToLower ( ) . Should ( ) . Contain ( "seattle" ) ;
reply . GetContent ( ) ! . ToLower ( ) . Should ( ) . Contain ( "sunny" ) ;
}
2024-05-08 23:50:36 -04:00
2024-06-14 06:53:12 -07:00
[ApiKeyFact("AZURE_OPENAI_API_KEY", "AZURE_OPENAI_ENDPOINT", "AZURE_OPENAI_DEPLOY_NAME")]
2024-05-08 23:50:36 -04:00
public async Task BasicSkChatCompletionAgentConversationTestAsync ( )
{
var endpoint = Environment . GetEnvironmentVariable ( "AZURE_OPENAI_ENDPOINT" ) ? ? throw new Exception ( "Please set AZURE_OPENAI_ENDPOINT environment variable." ) ;
var key = Environment . GetEnvironmentVariable ( "AZURE_OPENAI_API_KEY" ) ? ? throw new Exception ( "Please set AZURE_OPENAI_API_KEY environment variable." ) ;
2024-06-14 06:53:12 -07:00
var deploymentName = Environment . GetEnvironmentVariable ( "AZURE_OPENAI_DEPLOY_NAME" ) ? ? throw new Exception ( "Please set AZURE_OPENAI_DEPLOY_NAME environment variable." ) ;
2024-05-08 23:50:36 -04:00
var builder = Kernel . CreateBuilder ( )
2024-06-14 06:53:12 -07:00
. AddAzureOpenAIChatCompletion ( deploymentName , endpoint , key ) ;
2024-05-08 23:50:36 -04:00
var kernel = builder . Build ( ) ;
var agent = new ChatCompletionAgent ( )
{
Kernel = kernel ,
Name = "assistant" ,
Instructions = "You are a helpful AI assistant"
} ;
var skAgent = new SemanticKernelChatCompletionAgent ( agent ) ;
var chatMessageContent = MessageEnvelope . Create ( new ChatMessageContent ( AuthorRole . Assistant , "Hello" ) ) ;
var reply = await skAgent . SendAsync ( chatMessageContent ) ;
reply . Should ( ) . BeOfType < MessageEnvelope < ChatMessageContent > > ( ) ;
reply . As < MessageEnvelope < ChatMessageContent > > ( ) . From . Should ( ) . Be ( "assistant" ) ;
}
2024-06-14 06:53:12 -07:00
[ApiKeyFact("AZURE_OPENAI_API_KEY", "AZURE_OPENAI_ENDPOINT", "AZURE_OPENAI_DEPLOY_NAME")]
2024-05-08 23:50:36 -04:00
public async Task SkChatCompletionAgentChatMessageContentConnectorTestAsync ( )
{
var endpoint = Environment . GetEnvironmentVariable ( "AZURE_OPENAI_ENDPOINT" ) ? ? throw new Exception ( "Please set AZURE_OPENAI_ENDPOINT environment variable." ) ;
var key = Environment . GetEnvironmentVariable ( "AZURE_OPENAI_API_KEY" ) ? ? throw new Exception ( "Please set AZURE_OPENAI_API_KEY environment variable." ) ;
2024-06-14 06:53:12 -07:00
var deploymentName = Environment . GetEnvironmentVariable ( "AZURE_OPENAI_DEPLOY_NAME" ) ? ? throw new Exception ( "Please set AZURE_OPENAI_DEPLOY_NAME environment variable." ) ;
2024-05-08 23:50:36 -04:00
var builder = Kernel . CreateBuilder ( )
2024-06-14 06:53:12 -07:00
. AddAzureOpenAIChatCompletion ( deploymentName , endpoint , key ) ;
2024-05-08 23:50:36 -04:00
var kernel = builder . Build ( ) ;
var connector = new SemanticKernelChatMessageContentConnector ( ) ;
var agent = new ChatCompletionAgent ( )
{
Kernel = kernel ,
Name = "assistant" ,
Instructions = "You are a helpful AI assistant"
} ;
var skAgent = new SemanticKernelChatCompletionAgent ( agent )
. RegisterMiddleware ( connector ) ;
var messages = new IMessage [ ]
{
MessageEnvelope . Create ( new ChatMessageContent ( AuthorRole . Assistant , "Hello" ) ) ,
new TextMessage ( Role . Assistant , "Hello" , from : "user" ) , new MultiModalMessage ( Role . Assistant ,
[
new TextMessage ( Role . Assistant , "Hello" , from : "user" ) ,
] ,
from : "user" ) ,
} ;
foreach ( var message in messages )
{
var reply = await skAgent . SendAsync ( message ) ;
reply . Should ( ) . BeOfType < TextMessage > ( ) ;
reply . As < TextMessage > ( ) . From . Should ( ) . Be ( "assistant" ) ;
}
}
2024-06-14 06:53:12 -07:00
[ApiKeyFact("AZURE_OPENAI_API_KEY", "AZURE_OPENAI_ENDPOINT", "AZURE_OPENAI_DEPLOY_NAME")]
2024-05-08 23:50:36 -04:00
public async Task SkChatCompletionAgentPluginTestAsync ( )
{
var endpoint = Environment . GetEnvironmentVariable ( "AZURE_OPENAI_ENDPOINT" ) ? ? throw new Exception ( "Please set AZURE_OPENAI_ENDPOINT environment variable." ) ;
var key = Environment . GetEnvironmentVariable ( "AZURE_OPENAI_API_KEY" ) ? ? throw new Exception ( "Please set AZURE_OPENAI_API_KEY environment variable." ) ;
2024-06-14 06:53:12 -07:00
var deploymentName = Environment . GetEnvironmentVariable ( "AZURE_OPENAI_DEPLOY_NAME" ) ? ? throw new Exception ( "Please set AZURE_OPENAI_DEPLOY_NAME environment variable." ) ;
2024-05-08 23:50:36 -04:00
var builder = Kernel . CreateBuilder ( )
2024-06-14 06:53:12 -07:00
. AddAzureOpenAIChatCompletion ( deploymentName , endpoint , key ) ;
2024-05-08 23:50:36 -04:00
var parameters = this . GetWeatherAsyncFunctionContract . Parameters ! . Select ( p = > new KernelParameterMetadata ( p . Name ! )
{
Description = p . Description ,
DefaultValue = p . DefaultValue ,
IsRequired = p . IsRequired ,
ParameterType = p . ParameterType ,
} ) ;
var function = KernelFunctionFactory . CreateFromMethod ( this . GetWeatherAsync , this . GetWeatherAsyncFunctionContract . Name , this . GetWeatherAsyncFunctionContract . Description , parameters ) ;
builder . Plugins . AddFromFunctions ( "plugins" , [ function ] ) ;
var kernel = builder . Build ( ) ;
var agent = new ChatCompletionAgent ( )
{
Kernel = kernel ,
Name = "assistant" ,
Instructions = "You are a helpful AI assistant" ,
2024-08-27 14:37:47 -07:00
Arguments = new KernelArguments ( new OpenAIPromptExecutionSettings ( )
{
ToolCallBehavior = ToolCallBehavior . AutoInvokeKernelFunctions
} )
2024-05-08 23:50:36 -04:00
} ;
var skAgent =
new SemanticKernelChatCompletionAgent ( agent ) . RegisterMiddleware (
new SemanticKernelChatMessageContentConnector ( ) ) ;
var question = "What is the weather in Seattle?" ;
var reply = await skAgent . SendAsync ( question ) ;
reply . GetContent ( ) ! . ToLower ( ) . Should ( ) . Contain ( "seattle" ) ;
reply . GetContent ( ) ! . ToLower ( ) . Should ( ) . Contain ( "sunny" ) ;
}
2025-02-25 21:39:45 +01:00
private static async Task TestBasicConversationAsync ( SemanticKernelAgent agent )
{
var chatMessageContent = MessageEnvelope . Create ( new ChatMessageContent ( AuthorRole . Assistant , "Hello" ) ) ;
var reply = await agent . SendAsync ( chatMessageContent ) ;
reply . Should ( ) . BeOfType < MessageEnvelope < ChatMessageContent > > ( ) ;
reply . As < MessageEnvelope < ChatMessageContent > > ( ) . From . Should ( ) . Be ( "assistant" ) ;
// test streaming
var streamingReply = agent . GenerateStreamingReplyAsync ( new [ ] { chatMessageContent } ) ;
await foreach ( var streamingMessage in streamingReply )
{
streamingMessage . Should ( ) . BeOfType < MessageEnvelope < StreamingChatMessageContent > > ( ) ;
streamingMessage . As < MessageEnvelope < StreamingChatMessageContent > > ( ) . From . Should ( ) . Be ( "assistant" ) ;
}
}
2024-04-26 09:21:46 -07:00
}