Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[C#] bump: Migrate to OpenAI's official .NET SDK #1858

Merged
merged 9 commits into from
Jul 25, 2024
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,184 +1,205 @@
using Azure.AI.OpenAI;
using Microsoft.Teams.AI.AI.Models;
using Microsoft.Teams.AI.AI.Models;
using Microsoft.Teams.AI.Exceptions;
using OpenAI.Chat;
using ChatMessage = Microsoft.Teams.AI.AI.Models.ChatMessage;

namespace Microsoft.Teams.AI.Tests.AITests.Models
{
public class ChatMessageExtensionsTests
{
[Fact]
public void Test_InvalidRole_ToAzureSdkChatMessage()
public void Test_InvalidRole_ToOpenAISdkChatMessage()
{
// Arrange
var chatMessage = new ChatMessage(new AI.Models.ChatRole("InvalidRole"))
var chatMessage = new ChatMessage(new ChatRole("InvalidRole"))
{
Content = "test"
};

// Act
var ex = Assert.Throws<TeamsAIException>(() => chatMessage.ToChatRequestMessage());
var ex = Assert.Throws<TeamsAIException>(() => chatMessage.ToOpenAIChatMessage());

// Assert
Assert.Equal($"Invalid chat message role: InvalidRole", ex.Message);
}

[Fact]
public void Test_UserRole_StringContent_ToAzureSdkChatMessage()
public void Test_UserRole_StringContent_ToOpenAISdkChatMessage()
{
// Arrange
var chatMessage = new ChatMessage(AI.Models.ChatRole.User)
var chatMessage = new ChatMessage(ChatRole.User)
{
Content = "test-content",
Name = "author"
};

// Act
var result = chatMessage.ToChatRequestMessage();
var result = chatMessage.ToOpenAIChatMessage();

// Assert
Assert.Equal(Azure.AI.OpenAI.ChatRole.User, result.Role);
Assert.Equal(typeof(ChatRequestUserMessage), result.GetType());
Assert.Equal("test-content", ((ChatRequestUserMessage)result).Content);
Assert.Equal("author", ((ChatRequestUserMessage)result).Name);
var userMessage = result as UserChatMessage;
Assert.NotNull(userMessage);
Assert.Equal("test-content", result.Content[0].Text);
// TODO: Uncomment once participant name issue is resolved.
//Assert.Equal("author", userMessage.ParticipantName);
}

[Fact]
public void Test_UserRole_MultiModalContent_ToAzureSdkChatMessage()
public void Test_UserRole_MultiModalContent_ToOpenAISdkChatMessage()
{
// Arrange
var messageContentParts = new List<MessageContentParts>() { new TextContentPart() { Text = "test" }, new ImageContentPart { ImageUrl = "https://www.testurl.com" } };
var chatMessage = new ChatMessage(AI.Models.ChatRole.User)
var chatMessage = new ChatMessage(ChatRole.User)
{
Content = messageContentParts,
Name = "author"
};

// Act
var result = chatMessage.ToChatRequestMessage();
var result = chatMessage.ToOpenAIChatMessage();

// Assert
Assert.Equal(Azure.AI.OpenAI.ChatRole.User, result.Role);
Assert.Equal(typeof(ChatRequestUserMessage), result.GetType());
var userMessage = result as UserChatMessage;
Assert.NotNull(userMessage);
Assert.Equal("test", userMessage.Content[0].Text);
Assert.Equal("https://www.testurl.com", userMessage.Content[1].ImageUri.OriginalString);

var userMessage = (ChatRequestUserMessage)result;

Assert.Equal(null, userMessage.Content);
Assert.Equal("test", ((ChatMessageTextContentItem)userMessage.MultimodalContentItems[0]).Text);
Assert.Equal(typeof(ChatMessageImageContentItem), userMessage.MultimodalContentItems[1].GetType());
Assert.Equal("author", userMessage.Name);
// TODO: Uncomment once participant name issue is resolved.
//Assert.Equal("author", userMessage.ParticipantName);
}

[Fact]
public void Test_AssistantRole_ToAzureSdkChatMessage()
public void Test_AssistantRole_ToOpenAISdkChatMessage_FunctionCall()
{
// Arrange
var functionCall = new AI.Models.FunctionCall("test-name", "test-arg1");
var chatMessage = new ChatMessage(AI.Models.ChatRole.Assistant)
var functionCall = new FunctionCall("test-name", "test-arg1");
var chatMessage = new ChatMessage(ChatRole.Assistant)
{
Content = "test-content",
Name = "test-name",
FunctionCall = functionCall,
ToolCalls = new List<AI.Models.ChatCompletionsToolCall>()
};

// Act
var result = chatMessage.ToOpenAIChatMessage();

// Assert
var assistantMessage = result as AssistantChatMessage;
Assert.NotNull(assistantMessage);
Assert.Equal("test-content", assistantMessage.Content[0].Text);
// TODO: Uncomment when participant name issue is resolved.
//Assert.Equal("test-name", assistantMessage.ParticipantName);
Assert.Equal("test-arg1", assistantMessage.FunctionCall.FunctionArguments);
Assert.Equal("test-name", assistantMessage.FunctionCall.FunctionName);
}

[Fact]
public void Test_AssistantRole_ToOpenAISdkChatMessage_ToolCall()
{
// Arrange
var chatMessage = new ChatMessage(ChatRole.Assistant)
{
Content = "test-content",
Name = "test-name",
ToolCalls = new List<ChatCompletionsToolCall>()
{
new AI.Models.ChatCompletionsFunctionToolCall("test-id", "test-tool-name", "test-tool-arg1")
new ChatCompletionsFunctionToolCall("test-id", "test-tool-name", "test-tool-arg1")
}
};

// Act
var result = chatMessage.ToChatRequestMessage();
var result = chatMessage.ToOpenAIChatMessage();

// Assert
Assert.Equal(Azure.AI.OpenAI.ChatRole.Assistant, result.Role);
ChatRequestAssistantMessage? message = result as ChatRequestAssistantMessage;
Assert.NotNull(message);
Assert.Equal("test-content", message.Content);
Assert.Equal("test-name", message.Name);
Assert.Equal("test-arg1", message.FunctionCall.Arguments);
Assert.Equal("test-name", message.FunctionCall.Name);

Assert.Equal(1, message.ToolCalls.Count);
Azure.AI.OpenAI.ChatCompletionsFunctionToolCall? toolCall = message.ToolCalls[0] as Azure.AI.OpenAI.ChatCompletionsFunctionToolCall;
var assistantMessage = result as AssistantChatMessage;
Assert.NotNull(assistantMessage);
Assert.Equal("test-content", assistantMessage.Content[0].Text);
// TODO: Uncomment when participant name issue is resolved.
//Assert.Equal("test-name", assistantMessage.ParticipantName);

Assert.Equal(1, assistantMessage.ToolCalls.Count);
ChatToolCall toolCall = assistantMessage.ToolCalls[0];
Assert.NotNull(toolCall);
Assert.Equal("test-id", toolCall.Id);
Assert.Equal("test-tool-name", toolCall.Name);
Assert.Equal("test-tool-arg1", toolCall.Arguments);
Assert.Equal("test-tool-name", toolCall.FunctionName);
Assert.Equal("test-tool-arg1", toolCall.FunctionArguments);
}

[Fact]
public void Test_SystemRole_ToAzureSdkChatMessage()
public void Test_SystemRole_ToOpenAISdkChatMessage()
{
// Arrange
var chatMessage = new ChatMessage(AI.Models.ChatRole.System)
var chatMessage = new ChatMessage(ChatRole.System)
{
Content = "test-content",
Name = "author"
};

// Act
var result = chatMessage.ToChatRequestMessage();
var result = chatMessage.ToOpenAIChatMessage();

// Assert
Assert.Equal(Azure.AI.OpenAI.ChatRole.System, result.Role);
Assert.Equal(typeof(ChatRequestSystemMessage), result.GetType());
Assert.Equal("test-content", ((ChatRequestSystemMessage)result).Content);
Assert.Equal("author", ((ChatRequestSystemMessage)result).Name);
var systemMessage = result as SystemChatMessage;
Assert.NotNull(systemMessage);
Assert.Equal("test-content", systemMessage.Content[0].Text);
// TODO: Uncomment when participant name issue is resolved.
//Assert.Equal("author", systemMessage.ParticipantName);
}

[Fact]
public void Test_FunctionRole_ToAzureSdkChatMessage()
public void Test_FunctionRole_ToOpenAISdkChatMessage()
{
// Arrange
var chatMessage = new ChatMessage(AI.Models.ChatRole.Function)
var chatMessage = new ChatMessage(ChatRole.Function)
{
Content = "test-content",
Name = "function-name"
};

// Act
var result = chatMessage.ToChatRequestMessage();
var result = chatMessage.ToOpenAIChatMessage();

// Assert
Assert.Equal(Azure.AI.OpenAI.ChatRole.Function, result.Role);
Assert.Equal(typeof(ChatRequestFunctionMessage), result.GetType());
Assert.Equal("test-content", ((ChatRequestFunctionMessage)result).Content);
var functionMessage = result as FunctionChatMessage;

Check warning on line 163 in dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI.Tests/AITests/Models/ChatMessageExtensionsTests.cs

View workflow job for this annotation

GitHub Actions / Build/Test/Lint (6.0)

'FunctionChatMessage' is obsolete: 'This field is marked as deprecated.'

Check warning on line 163 in dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI.Tests/AITests/Models/ChatMessageExtensionsTests.cs

View workflow job for this annotation

GitHub Actions / Build/Test/Lint (6.0)

'FunctionChatMessage' is obsolete: 'This field is marked as deprecated.'

Check warning on line 163 in dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI.Tests/AITests/Models/ChatMessageExtensionsTests.cs

View workflow job for this annotation

GitHub Actions / Build/Test/Lint (7.0)

'FunctionChatMessage' is obsolete: 'This field is marked as deprecated.'

Check warning on line 163 in dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI.Tests/AITests/Models/ChatMessageExtensionsTests.cs

View workflow job for this annotation

GitHub Actions / Build/Test/Lint (7.0)

'FunctionChatMessage' is obsolete: 'This field is marked as deprecated.'

Check warning on line 163 in dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI.Tests/AITests/Models/ChatMessageExtensionsTests.cs

View workflow job for this annotation

GitHub Actions / Analyze

'FunctionChatMessage' is obsolete: 'This field is marked as deprecated.'

Check warning on line 163 in dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI.Tests/AITests/Models/ChatMessageExtensionsTests.cs

View workflow job for this annotation

GitHub Actions / Analyze

'FunctionChatMessage' is obsolete: 'This field is marked as deprecated.'
Assert.NotNull(functionMessage);
Assert.Equal("test-content", functionMessage.Content[0].Text);
}

[Fact]
public void Test_ToolRole_ToAzureSdkChatMessage()
public void Test_ToolRole_ToOpenAISdkChatMessage()
{
// Arrange
var chatMessage = new ChatMessage(AI.Models.ChatRole.Tool)
var chatMessage = new ChatMessage(ChatRole.Tool)
{
Content = "test-content",
Name = "tool-name",
ToolCallId = "tool-call-id"
};

// Act
var result = chatMessage.ToChatRequestMessage();
var result = chatMessage.ToOpenAIChatMessage();

// Assert
Assert.Equal(Azure.AI.OpenAI.ChatRole.Tool, result.Role);
Assert.Equal(typeof(ChatRequestToolMessage), result.GetType());
Assert.Equal("test-content", ((ChatRequestToolMessage)result).Content);
Assert.Equal("tool-call-id", ((ChatRequestToolMessage)result).ToolCallId);
var toolMessage = result as ToolChatMessage;
Assert.NotNull(toolMessage);
Assert.Equal("test-content", toolMessage.Content[0].Text);
Assert.Equal("tool-call-id", toolMessage.ToolCallId);
}

[Fact]
public void Test_ChatCompletionsToolCall_ToFunctionToolCall()
{
// Arrange
var functionToolCall = new AI.Models.ChatCompletionsFunctionToolCall("test-id", "test-name", "test-arg1");
var functionToolCall = new ChatCompletionsFunctionToolCall("test-id", "test-name", "test-arg1");

// Act
var azureSdkFunctionToolCall = functionToolCall.ToAzureSdkChatCompletionsToolCall();
var chatToolCall = functionToolCall.ToChatToolCall();

// Assert
var toolCall = azureSdkFunctionToolCall as Azure.AI.OpenAI.ChatCompletionsFunctionToolCall;
Assert.NotNull(toolCall);
Assert.Equal("test-id", toolCall.Id);
Assert.Equal("test-name", toolCall.Name);
Assert.Equal("test-arg1", toolCall.Arguments);
Assert.NotNull(chatToolCall);
Assert.Equal("test-id", chatToolCall.Id);
Assert.Equal("test-name", chatToolCall.FunctionName);
Assert.Equal("test-arg1", chatToolCall.FunctionArguments);
}

[Fact]
Expand All @@ -188,13 +209,13 @@
var functionToolCall = new InvalidToolCall();

// Act
var ex = Assert.Throws<TeamsAIException>(() => functionToolCall.ToAzureSdkChatCompletionsToolCall());
var ex = Assert.Throws<TeamsAIException>(() => functionToolCall.ToChatToolCall());

// Assert
Assert.Equal("Invalid tool type: invalidToolType", ex.Message);
}

private sealed class InvalidToolCall : AI.Models.ChatCompletionsToolCall
private sealed class InvalidToolCall : ChatCompletionsToolCall
{
public InvalidToolCall() : base("invalidToolType", "test-id")
{
Expand Down
Loading
Loading