Last active
February 16, 2024 13:39
-
-
Save asabla/78f163a6a5bbe6b99c91430525e9ede3 to your computer and use it in GitHub Desktop.
Semantic Kernel Native Math plugin example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Copyright (c) Microsoft. All rights reserved. | |
using System.ComponentModel; | |
using Microsoft.SemanticKernel; | |
namespace Plugins; | |
public class MathPlugin | |
{ | |
[KernelFunction, Description("Take the square root of a number")] | |
public static double Sqrt( | |
[Description("The number to take a square root of")] double number1 | |
) | |
{ | |
return Math.Sqrt(number1); | |
} | |
[KernelFunction, Description("Add two numbers")] | |
public static double Add( | |
[Description("The first number to add")] double number1, | |
[Description("The second number to add")] double number2 | |
) | |
{ | |
return number1 + number2; | |
} | |
[KernelFunction, Description("Subtract two numbers")] | |
public static double Subtract( | |
[Description("The first number to subtract from")] double number1, | |
[Description("The second number to subtract away")] double number2 | |
) | |
{ | |
return number1 - number2; | |
} | |
[KernelFunction, Description("Multiply two numbers. When increasing by a percentage, don't forget to add 1 to the percentage.")] | |
public static double Multiply( | |
[Description("The first number to multiply")] double number1, | |
[Description("The second number to multiply")] double number2 | |
) | |
{ | |
return number1 * number2; | |
} | |
[KernelFunction, Description("Divide two numbers")] | |
public static double Divide( | |
[Description("The first number to divide from")] double number1, | |
[Description("The second number to divide by")] double number2 | |
) | |
{ | |
return number1 / number2; | |
} | |
[KernelFunction, Description("Raise a number to a power")] | |
public static double Power( | |
[Description("The number to raise")] double number1, | |
[Description("The power to raise the number to")] double number2 | |
) | |
{ | |
return Math.Pow(number1, number2); | |
} | |
[KernelFunction, Description("Take the log of a number")] | |
public static double Log( | |
[Description("The number to take the log of")] double number1, | |
[Description("The base of the log")] double number2 | |
) | |
{ | |
return Math.Log(number1, number2); | |
} | |
[KernelFunction, Description("Round a number to the target number of decimal places")] | |
public static double Round( | |
[Description("The number to round")] double number1, | |
[Description("The number of decimal places to round to")] double number2 | |
) | |
{ | |
return Math.Round(number1, (int)number2); | |
} | |
[KernelFunction, Description("Take the absolute value of a number")] | |
public static double Abs( | |
[Description("The number to take the absolute value of")] double number1 | |
) | |
{ | |
return Math.Abs(number1); | |
} | |
[KernelFunction, Description("Take the floor of a number")] | |
public static double Floor( | |
[Description("The number to take the floor of")] double number1 | |
) | |
{ | |
return Math.Floor(number1); | |
} | |
[KernelFunction, Description("Take the ceiling of a number")] | |
public static double Ceiling( | |
[Description("The number to take the ceiling of")] double number1 | |
) | |
{ | |
return Math.Ceiling(number1); | |
} | |
[KernelFunction, Description("Take the sine of a number")] | |
public static double Sin( | |
[Description("The number to take the sine of")] double number1 | |
) | |
{ | |
return Math.Sin(number1); | |
} | |
[KernelFunction, Description("Take the cosine of a number")] | |
public static double Cos( | |
[Description("The number to take the cosine of")] double number1 | |
) | |
{ | |
return Math.Cos(number1); | |
} | |
[KernelFunction, Description("Take the tangent of a number")] | |
public static double Tan( | |
[Description("The number to take the tangent of")] double number1 | |
) | |
{ | |
return Math.Tan(number1); | |
} | |
[KernelFunction, Description("Take the arcsine of a number")] | |
public static double Asin( | |
[Description("The number to take the arcsine of")] double number1 | |
) | |
{ | |
return Math.Asin(number1); | |
} | |
[KernelFunction, Description("Take the arccosine of a number")] | |
public static double Acos( | |
[Description("The number to take the arccosine of")] double number1 | |
) | |
{ | |
return Math.Acos(number1); | |
} | |
[KernelFunction, Description("Take the arctangent of a number")] | |
public static double Atan( | |
[Description("The number to take the arctangent of")] double number1 | |
) | |
{ | |
return Math.Atan(number1); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using Azure.Identity; | |
using Microsoft.SemanticKernel; | |
using Plugins; | |
var builder = Kernel.CreateBuilder(); | |
builder.Services.AddAzureOpenAIChatCompletion( | |
deploymentName: "<model deployment name here>", | |
endpoint: "<openAI endpoint here>", | |
credentials: new DefaultAzureCredential()); | |
builder.Plugins.AddFromType<MathPlugin>(); | |
var kernel = builder.Build(); | |
double answer = await kernel.InvokeAsync<double>( | |
pluginName: "MathPlugin", | |
functionName: "Sqrt", | |
arguments: new() { | |
{ "number1", 12 } | |
}); | |
Console.WriteLine($"The square root of 12 is {answer}."); | |
ChatHistory chatHistory = new(); | |
var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>(); | |
var openAIPromptExecutionSettings = new OpenAIPromptExecutionSettings | |
{ | |
ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions, | |
}; | |
while (true) | |
{ | |
Console.Write("User > "); | |
chatHistory.AddUserMessage(Console.ReadLine()!); | |
var result = chatCompletionService.GetStreamingChatMessageContentsAsync( | |
chatHistory: chatHistory, | |
executionSettings: openAIPromptExecutionSettings, | |
kernel: kernel); | |
string fullMessage = ""; | |
var first = true; | |
await foreach (var content in result) | |
{ | |
if (content.Role.HasValue && first) | |
{ | |
Console.WriteLine("Assistant > "); | |
first = false; | |
} | |
Console.Write(content.Content); | |
fullMessage += content.Content; | |
} | |
Console.WriteLine(); | |
chatHistory.AddAssistantMessage(fullMessage); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<Project Sdk="Microsoft.NET.Sdk"> | |
<PropertyGroup> | |
<OutputType>Exe</OutputType> | |
<TargetFramework>net8.0</TargetFramework> | |
<ImplicitUsings>enable</ImplicitUsings> | |
<Nullable>enable</Nullable> | |
</PropertyGroup> | |
<ItemGroup> | |
<PackageReference Include="Azure.Identity" Version="1.10.4" /> | |
<PackageReference Include="Microsoft.Extensions.Azure" Version="1.7.2" /> | |
<PackageReference Include="Microsoft.SemanticKernel" Version="1.4.0" /> | |
</ItemGroup> | |
</Project> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Models and model versions tested: