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

.Net: Anthropic - samples #8585

Merged
Show file tree
Hide file tree
Changes from 3 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
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
// Copyright (c) Microsoft. All rights reserved.

using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;

namespace ChatCompletion;

public sealed class Anthropic_ChatCompletion(ITestOutputHelper output) : BaseTest(output)
{
[Fact]
public async Task SampleAsync()
{
Console.WriteLine("============= Anthropic - Claude Chat Completion =============");

string apiKey = TestConfiguration.AnthropicAI.ApiKey;
string modelId = TestConfiguration.AnthropicAI.ModelId;

if (apiKey is null || modelId is null)
Krzysztof318 marked this conversation as resolved.
Show resolved Hide resolved
{
Console.WriteLine("Anthropic credentials not found. Skipping example.");
return;
}

Kernel kernel = Kernel.CreateBuilder()
.AddAnthropicChatCompletion(
modelId: modelId,
apiKey: apiKey)
.Build();

await SimpleChatAsync(kernel);
}

private async Task SimpleChatAsync(Kernel kernel)
{
Console.WriteLine("======== Simple Chat ========");

var chatHistory = new ChatHistory("You are an expert in the tool shop.");
var chat = kernel.GetRequiredService<IChatCompletionService>();

// First user message
chatHistory.AddUserMessage("Hi, I'm looking for new power tools, any suggestion?");
await MessageOutputAsync(chatHistory);

// First bot assistant message
var reply = await chat.GetChatMessageContentAsync(chatHistory);
chatHistory.Add(reply);
await MessageOutputAsync(chatHistory);

// Second user message
chatHistory.AddUserMessage("I'm looking for a drill, a screwdriver and a hammer.");
await MessageOutputAsync(chatHistory);

// Second bot assistant message
reply = await chat.GetChatMessageContentAsync(chatHistory);
chatHistory.Add(reply);
await MessageOutputAsync(chatHistory);
}

/// <summary>
/// Outputs the last message of the chat history
/// </summary>
private Task MessageOutputAsync(ChatHistory chatHistory)
{
var message = chatHistory.Last();

Console.WriteLine($"{message.Role}: {message.Content}");
Console.WriteLine("------------------------");

return Task.CompletedTask;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
// Copyright (c) Microsoft. All rights reserved.

using System.Text;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;

namespace ChatCompletion;

public sealed class Anthropic_ChatCompletionStream(ITestOutputHelper output) : BaseTest(output)

Check failure on line 9 in dotnet/samples/Concepts/ChatCompletion/Anthropic_ChatCompletionStream.cs

View workflow job for this annotation

GitHub Actions / dotnet-build-and-test (8.0, ubuntu-latest, Release, true)

Rename type name Anthropic_ChatCompletionStream so that it does not end in 'Stream' (https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1711)

Check failure on line 9 in dotnet/samples/Concepts/ChatCompletion/Anthropic_ChatCompletionStream.cs

View workflow job for this annotation

GitHub Actions / dotnet-build-and-test (8.0, ubuntu-latest, Release, true)

Rename type name Anthropic_ChatCompletionStream so that it does not end in 'Stream' (https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1711)

Check failure on line 9 in dotnet/samples/Concepts/ChatCompletion/Anthropic_ChatCompletionStream.cs

View workflow job for this annotation

GitHub Actions / dotnet-build-and-test (8.0, windows-latest, Debug)

Rename type name Anthropic_ChatCompletionStream so that it does not end in 'Stream' (https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1711)

Check failure on line 9 in dotnet/samples/Concepts/ChatCompletion/Anthropic_ChatCompletionStream.cs

View workflow job for this annotation

GitHub Actions / dotnet-build-and-test (8.0, windows-latest, Debug)

Rename type name Anthropic_ChatCompletionStream so that it does not end in 'Stream' (https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1711)

Check failure on line 9 in dotnet/samples/Concepts/ChatCompletion/Anthropic_ChatCompletionStream.cs

View workflow job for this annotation

GitHub Actions / dotnet-build-and-test (8.0, windows-latest, Release)

Rename type name Anthropic_ChatCompletionStream so that it does not end in 'Stream' (https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1711)

Check failure on line 9 in dotnet/samples/Concepts/ChatCompletion/Anthropic_ChatCompletionStream.cs

View workflow job for this annotation

GitHub Actions / dotnet-build-and-test (8.0, windows-latest, Release)

Rename type name Anthropic_ChatCompletionStream so that it does not end in 'Stream' (https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1711)
{
[Fact]
public async Task SampleAsync()
{
Console.WriteLine("============= Anthropic - Claude Chat Streaming =============");

string apiKey = TestConfiguration.AnthropicAI.ApiKey;
string modelId = TestConfiguration.AnthropicAI.ModelId;

if (apiKey is null || modelId is null)
{
Console.WriteLine("Anthropic credentials not found. Skipping example.");
return;
}

Kernel kernel = Kernel.CreateBuilder()
.AddAnthropicChatCompletion(
modelId: modelId,
apiKey: apiKey)
.Build();

await this.StreamingChatAsync(kernel);
}

private async Task StreamingChatAsync(Kernel kernel)
{
Console.WriteLine("======== Streaming Chat ========");

var chatHistory = new ChatHistory("You are an expert in the tool shop.");
var chat = kernel.GetRequiredService<IChatCompletionService>();

// First user message
chatHistory.AddUserMessage("Hi, I'm looking for alternative coffee brew methods, can you help me?");
await MessageOutputAsync(chatHistory);

// First bot assistant message
var streamingChat = chat.GetStreamingChatMessageContentsAsync(chatHistory);
var reply = await MessageOutputAsync(streamingChat);
chatHistory.Add(reply);

// Second user message
chatHistory.AddUserMessage("Give me the best speciality coffee roasters.");
await MessageOutputAsync(chatHistory);

// Second bot assistant message
streamingChat = chat.GetStreamingChatMessageContentsAsync(chatHistory);
reply = await MessageOutputAsync(streamingChat);
chatHistory.Add(reply);
}

/// <summary>
/// Outputs the last message of the chat history
/// </summary>
private Task MessageOutputAsync(ChatHistory chatHistory)
{
var message = chatHistory.Last();

Console.WriteLine($"{message.Role}: {message.Content}");
Console.WriteLine("------------------------");

return Task.CompletedTask;
}

private async Task<ChatMessageContent> MessageOutputAsync(IAsyncEnumerable<StreamingChatMessageContent> streamingChat)
{
bool first = true;
StringBuilder messageBuilder = new();
await foreach (var chatMessage in streamingChat)
{
if (first)
{
Console.Write($"{chatMessage.Role}: ");
first = false;
}

Console.Write(chatMessage.Content);
messageBuilder.Append(chatMessage.Content);
}

Console.WriteLine();
Console.WriteLine("------------------------");
return new ChatMessageContent(AuthorRole.Assistant, messageBuilder.ToString());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
// Copyright (c) Microsoft. All rights reserved.

using Microsoft.SemanticKernel;

namespace ChatCompletion;

/// <summary>
/// This sample shows how to setup different providers for anthropic.
/// </summary>
public sealed class Anthropic_ProvidersSetup(ITestOutputHelper output) : BaseTest(output)
{
public void AnthropicProvider()
{
var kernel = Kernel.CreateBuilder()
.AddAnthropicChatCompletion(
modelId: "modelId",
apiKey: "apiKey")
.Build();
}

/// <summary>
/// For more information on how to setup the Vertex AI provider, go to <see cref="Google_GeminiChatCompletion"/> sample.
/// </summary>
public void VertexAiProvider()
{
var kernel = Kernel.CreateBuilder()
.AddAnthropicVertextAIChatCompletion(
modelId: "modelId",
bearerTokenProvider: () => ValueTask.FromResult("bearer"),
endpoint: new Uri("https://your-endpoint"))
.Build();
}
}
55 changes: 55 additions & 0 deletions dotnet/samples/Concepts/ChatCompletion/Anthropic_Vision.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
// Copyright (c) Microsoft. All rights reserved.

using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Resources;

namespace ChatCompletion;

public sealed class Anthropic_Vision(ITestOutputHelper output) : BaseTest(output)
{
[Fact]
public async Task SampleAsync()
{
Console.WriteLine("============= Anthropic - Claude Chat Completion =============");

string apiKey = TestConfiguration.AnthropicAI.ApiKey;
string modelId = TestConfiguration.AnthropicAI.ModelId;

if (apiKey is null || modelId is null)
{
Console.WriteLine("Anthropic credentials not found. Skipping example.");
return;
}

Kernel kernel = Kernel.CreateBuilder()
.AddAnthropicChatCompletion(
modelId: modelId,
apiKey: apiKey)
.Build();

var chatHistory = new ChatHistory("Your job is describing images.");
var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();

// Load the image from the resources
await using var stream = EmbeddedResource.ReadStream("sample_image.jpg")!;
using var binaryReader = new BinaryReader(stream);
var bytes = binaryReader.ReadBytes((int)stream.Length);

chatHistory.AddUserMessage(
[
new TextContent("What’s in this image?"),
// Vertex AI Gemini API supports both base64 and URI format
// You have to always provide the mimeType for the image
new ImageContent(bytes, "image/jpeg"),
// The Cloud Storage URI of the image to include in the prompt.
// The bucket that stores the file must be in the same Google Cloud project that's sending the request.
// new ImageContent(new Uri("gs://generativeai-downloads/images/scones.jpg"),
// metadata: new Dictionary<string, object?> { { "mimeType", "image/jpeg" } })
]);

var reply = await chatCompletionService.GetChatMessageContentAsync(chatHistory);

Console.WriteLine(reply.Content);
}
}
1 change: 1 addition & 0 deletions dotnet/samples/Concepts/Concepts.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
<ProjectReference Include="..\..\src\Agents\Core\Agents.Core.csproj" />
<ProjectReference Include="..\..\src\Agents\OpenAI\Agents.OpenAI.csproj" />
<ProjectReference Include="..\..\src\Connectors\Connectors.Google\Connectors.Google.csproj" />
<ProjectReference Include="..\..\src\Connectors\Connectors.Anthropic\Connectors.Anthropic.csproj" />
<ProjectReference Include="..\..\src\Connectors\Connectors.HuggingFace\Connectors.HuggingFace.csproj" />
<ProjectReference Include="..\..\src\Connectors\Connectors.Memory.AzureAISearch\Connectors.Memory.AzureAISearch.csproj" />
<ProjectReference Include="..\..\src\Connectors\Connectors.Memory.AzureCosmosDBMongoDB\Connectors.Memory.AzureCosmosDBMongoDB.csproj" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ public static void Initialize(IConfigurationRoot configRoot)
public static ChatGPTRetrievalPluginConfig ChatGPTRetrievalPlugin => LoadSection<ChatGPTRetrievalPluginConfig>();
public static MsGraphConfiguration MSGraph => LoadSection<MsGraphConfiguration>();
public static MistralAIConfig MistralAI => LoadSection<MistralAIConfig>();
public static AnthropicAIConfig AnthropicAI => LoadSection<AnthropicAIConfig>();
public static GoogleAIConfig GoogleAI => LoadSection<GoogleAIConfig>();
public static VertexAIConfig VertexAI => LoadSection<VertexAIConfig>();
public static AzureCosmosDbMongoDbConfig AzureCosmosDbMongoDb => LoadSection<AzureCosmosDbMongoDbConfig>();
Expand Down Expand Up @@ -194,6 +195,12 @@ public class MistralAIConfig
public string EmbeddingModelId { get; set; }
}

public class AnthropicAIConfig
{
public string ApiKey { get; set; }
public string ModelId { get; set; }
}

public class GoogleAIConfig
{
public string ApiKey { get; set; }
Expand Down
Loading