Skip to content

Commit 16436e1

Browse files
committed
Major update for the initial version
1 parent 6be72d4 commit 16436e1

39 files changed

+1553
-831
lines changed

Anthropic.Playground/Program.cs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using Anthropic.Extensions;
2+
using Anthropic.ObjectModels.RequestModels;
23
using Anthropic.Playground.TestHelpers;
34
using Anthropic.Services;
45
using LaserCatEyes.HttpClientListener;
@@ -28,10 +29,8 @@
2829
var serviceProvider = serviceCollection.BuildServiceProvider();
2930
var sdk = serviceProvider.GetRequiredService<IAnthropicService>();
3031

31-
32-
//await ChatTestHelper.RunSimpleChatTest(sdk);
33-
await ChatTestHelper.RunSimpleCompletionStreamTest(sdk);
34-
35-
32+
await ChatTestHelper.RunChatCompletionTest(sdk);
33+
await ChatTestHelper.RunChatCompletionStreamTest(sdk);
34+
await ChatToolUseTestHelper.RunChatCompletionWithToolUseTest(sdk);
3635
Console.WriteLine("Press any key to exit...");
3736
Console.ReadLine();
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using System.Text.Json.Serialization;
2+
3+
namespace Anthropic.Playground.SampleModels;
4+
5+
public class WeatherInput
6+
{
7+
[JsonPropertyName("location")]
8+
public string Location { get; set; }
9+
10+
[JsonPropertyName("unit")]
11+
public string? Unit { get; set; }
12+
}
Lines changed: 57 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,92 +1,108 @@
1-
using Anthropic.ObjectModels;
1+
using Anthropic.ObjectModels.ResponseModels;
2+
using Anthropic.ObjectModels.SharedModels;
23
using Anthropic.Services;
34

45
namespace Anthropic.Playground.TestHelpers;
56

7+
/// <summary>
8+
/// Helper class for testing chat functionalities of the Anthropic SDK.
9+
/// </summary>
610
internal static class ChatTestHelper
711
{
8-
public static async Task RunSimpleChatTest(IAnthropicService sdk)
12+
/// <summary>
13+
/// Runs a simple chat completion test using the Anthropic SDK.
14+
/// </summary>
15+
/// <param name="anthropicService">The Anthropic service instance.</param>
16+
public static async Task RunChatCompletionTest(IAnthropicService anthropicService)
917
{
10-
Console.WriteLine("Messsaging Testing is starting:");
11-
18+
Console.WriteLine("Starting Chat Completion Test:");
1219
try
1320
{
14-
Console.WriteLine("Chat Completion Test:", ConsoleColor.DarkCyan);
15-
var completionResult = await sdk.Messages.Create(new()
21+
Console.WriteLine("Sending chat completion request...");
22+
var chatCompletionResult = await anthropicService.Messages.Create(new()
1623
{
17-
Messages = new List<Message>
18-
{
24+
Messages =
25+
[
1926
Message.FromUser("Hello there."),
2027
Message.FromAssistant("Hi, I'm Claude. How can I help you?"),
2128
Message.FromUser("Can you explain LLMs in plain English?")
22-
},
23-
MaxTokens = 50,
29+
],
30+
MaxTokens = 200,
2431
Model = "claude-3-5-sonnet-20240620"
2532
});
2633

27-
if (completionResult.Successful)
34+
if (chatCompletionResult.Successful)
2835
{
29-
Console.WriteLine(completionResult.Content.First().Text);
36+
Console.WriteLine("Chat Completion Response:");
37+
Console.WriteLine(chatCompletionResult.ToString());
3038
}
3139
else
3240
{
33-
if (completionResult.Error == null)
41+
if (chatCompletionResult.Error == null)
3442
{
35-
throw new("Unknown Error");
43+
throw new("Unknown Error Occurred");
3644
}
3745

38-
Console.WriteLine($"{completionResult.HttpStatusCode}: {completionResult.Error.Message}");
46+
Console.WriteLine($"Error: {chatCompletionResult.HttpStatusCode}: {chatCompletionResult.Error.Message}");
3947
}
4048
}
41-
catch (Exception e)
49+
catch (Exception ex)
4250
{
43-
Console.WriteLine(e);
51+
Console.WriteLine($"Exception occurred: {ex}");
4452
throw;
4553
}
54+
Console.WriteLine("---- 0 ----");
55+
4656
}
4757

48-
public static async Task RunSimpleCompletionStreamTest(IAnthropicService sdk)
58+
/// <summary>
59+
/// Runs a simple chat completion stream test using the Anthropic SDK.
60+
/// </summary>
61+
/// <param name="anthropicService">The Anthropic service instance.</param>
62+
public static async Task RunChatCompletionStreamTest(IAnthropicService anthropicService)
4963
{
50-
Console.WriteLine("Chat Completion Stream Testing is starting:", ConsoleColor.Cyan);
64+
Console.WriteLine("Starting Chat Completion Stream Test:");
5165
try
5266
{
53-
Console.WriteLine("Chat Completion Stream Test:", ConsoleColor.DarkCyan);
54-
var completionResult = sdk.Messages.CreateAsStream(new()
67+
Console.WriteLine("Initiating chat completion stream...");
68+
var chatCompletionStream = anthropicService.Messages.CreateAsStream(new()
5569
{
56-
Messages = new List<Message>
57-
{
70+
Messages =
71+
[
5872
Message.FromUser("Hello there."),
5973
Message.FromAssistant("Hi, I'm Claude. How can I help you?"),
60-
Message.FromUser("Tell me really long story about how a purple color became human?(in Turkish)")
61-
},
62-
MaxTokens = 1024,
74+
Message.FromUser("Tell me a really long story about how the color purple became human.")
75+
],
76+
MaxTokens = 10,
6377
Model = "claude-3-5-sonnet-20240620"
6478
});
6579

66-
await foreach (var completion in completionResult)
80+
await foreach (var streamResponse in chatCompletionStream)
6781
{
68-
if (completion.Successful)
82+
if (streamResponse.IsMessageResponse())
6983
{
70-
Console.Write(completion?.Content?.First().Text);
84+
var messageCompletion = streamResponse.As<MessageResponse>();
85+
Console.Write(messageCompletion.ToString());
7186
}
72-
else
87+
else if (streamResponse.IsError())
7388
{
74-
if (completion.Error == null)
75-
{
76-
throw new("Unknown Error");
77-
}
78-
79-
Console.WriteLine($"{completion.HttpStatusCode}: {completion.Error.Message}");
89+
var errorResponse = streamResponse.As<BaseResponse>();
90+
Console.WriteLine($"Error: {errorResponse.HttpStatusCode}: {errorResponse.Error?.Message}");
91+
}
92+
else if (streamResponse.IsPingResponse())
93+
{
94+
// Optionally handle ping responses
95+
// Console.WriteLine("Ping received");
8096
}
8197
}
8298

83-
Console.WriteLine("");
84-
Console.WriteLine("Complete");
99+
Console.WriteLine("\nStream completed");
85100
}
86-
catch (Exception e)
101+
catch (Exception ex)
87102
{
88-
Console.WriteLine(e);
103+
Console.WriteLine($"Exception occurred: {ex}");
89104
throw;
90105
}
106+
Console.WriteLine("---- 0 ----");
91107
}
92-
}
108+
}
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
using Anthropic.Extensions;
2+
using Anthropic.ObjectModels.ResponseModels;
3+
using Anthropic.ObjectModels.SharedModels;
4+
using Anthropic.Playground.SampleModels;
5+
using Anthropic.Services;
6+
7+
namespace Anthropic.Playground.TestHelpers;
8+
9+
/// <summary>
10+
/// Helper class for testing chat functionalities with tool use in the Anthropic SDK.
11+
/// </summary>
12+
internal static class ChatToolUseTestHelper
13+
{
14+
/// <summary>
15+
/// Runs a chat completion stream test with tool use using the Anthropic SDK.
16+
/// </summary>
17+
/// <param name="anthropicService">The Anthropic service instance.</param>
18+
public static async Task RunChatCompletionWithToolUseTest(IAnthropicService anthropicService)
19+
{
20+
Console.WriteLine("Starting Chat Completion Stream Test with Tool Use:");
21+
try
22+
{
23+
Console.WriteLine("Initiating chat completion stream...");
24+
var chatCompletionStream = anthropicService.Messages.CreateAsStream(new()
25+
{
26+
Messages = [Message.FromUser("What is the weather like in San Francisco?")],
27+
MaxTokens = 2024,
28+
Model = "claude-3-5-sonnet-20240620",
29+
Tools =
30+
[
31+
new()
32+
{
33+
Name = "get_weather",
34+
Description = "Get the current weather in a given location",
35+
InputSchema = PropertyDefinition.DefineObject(new Dictionary<string, PropertyDefinition>
36+
{
37+
{ "location", PropertyDefinition.DefineString("The city and state, e.g. San Francisco, CA") }
38+
}, ["location"], null, null, null)
39+
}
40+
]
41+
// ToolChoice = new() { Type = "any" }
42+
});
43+
44+
await foreach (var streamResponse in chatCompletionStream)
45+
{
46+
if (streamResponse.IsMessageResponse())
47+
{
48+
var messageResponse = streamResponse.As<MessageResponse>();
49+
var content = messageResponse.Content?.FirstOrDefault();
50+
if (content == null)
51+
{
52+
continue;
53+
}
54+
switch (content.Type)
55+
{
56+
case "text":
57+
Console.Write(content.Text);
58+
break;
59+
case "tool_use" when content.Name == "get_weather":
60+
if (content.TryGetInputAs<WeatherInput>(out var weatherInput))
61+
{
62+
Console.WriteLine($"\nWeather request for \"{weatherInput.Location}\" in \"{weatherInput.Unit}\"");
63+
}
64+
65+
break;
66+
case "tool_use":
67+
throw new InvalidOperationException($"Unknown tool use: {content.Name}");
68+
default:
69+
Console.WriteLine($"\nUnknown content type: {content.Type}");
70+
break;
71+
}
72+
}
73+
else if (streamResponse.IsError())
74+
{
75+
var errorResponse = streamResponse.As<BaseResponse>();
76+
Console.WriteLine($"Error: {errorResponse.HttpStatusCode}: {errorResponse.Error?.Message}");
77+
}
78+
else if (streamResponse.IsPingResponse())
79+
{
80+
// Optionally handle ping responses
81+
// Console.WriteLine("Ping received");
82+
}
83+
}
84+
85+
Console.WriteLine("\nStream completed");
86+
}
87+
catch (Exception ex)
88+
{
89+
Console.WriteLine($"Exception occurred: {ex}");
90+
throw;
91+
}
92+
93+
Console.WriteLine("---- 0 ----");
94+
}
95+
}

Anthropic/Anthropic.csproj

Lines changed: 44 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,57 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

3-
<PropertyGroup>
4-
<TargetFrameworks>net8.0;net6.0;netstandard2.0</TargetFrameworks>
5-
<ImplicitUsings>enable</ImplicitUsings>
6-
<Nullable>enable</Nullable>
7-
<LangVersion>Latest</LangVersion>
8-
<Copyright>Betalgo Up Ltd.</Copyright>
9-
<PackageProjectUrl>https://www.anthropic.com/</PackageProjectUrl>
10-
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
11-
<Title>Anthropic SDK by Betalgo</Title>
12-
<Version>0.0.1</Version>
13-
<Authors>Tolga Kayhan, Betalgo</Authors>
14-
<Company>Betalgo Up Ltd.</Company>
15-
<Product>Anthropic Claude dotnet SDK</Product>
16-
<Description>Dotnet SDK for Anthropic Claude</Description>
17-
<RepositoryUrl>https://github.com/betalgo/anthropic/</RepositoryUrl>
18-
<PackageTags>Anthropic,Claude,ai,betalgo,NLP</PackageTags>
19-
<PackageId>Betalgo.Ranul.Anthropic</PackageId>
20-
<PackageReadmeFile>Readme.md</PackageReadmeFile>
21-
<GenerateDocumentationFile>True</GenerateDocumentationFile>
22-
<RepositoryUrl>https://github.com/betalgo/anthropic.git</RepositoryUrl>
23-
<RepositoryType>git</RepositoryType>
24-
<EnforceCodeStyleInBuild>True</EnforceCodeStyleInBuild>
25-
<PackageLicenseExpression>MIT</PackageLicenseExpression>
26-
<EmbedUntrackedSources>true</EmbedUntrackedSources>
27-
<IncludeSymbols>true</IncludeSymbols>
28-
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
29-
</PropertyGroup>
3+
<PropertyGroup>
4+
<TargetFrameworks>net8.0;net6.0;netstandard2.0</TargetFrameworks>
5+
<ImplicitUsings>enable</ImplicitUsings>
6+
<Nullable>enable</Nullable>
7+
<LangVersion>Latest</LangVersion>
8+
<Copyright>Betalgo Up Ltd.</Copyright>
9+
<PackageProjectUrl>https://www.anthropic.com/</PackageProjectUrl>
10+
<PackageIcon>Ranul-Anthropic-Icon.png</PackageIcon>
11+
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
12+
<Title>Anthropic Claude C# .NET library by Ranul Betalgo</Title>
13+
<Version>8.0.0</Version>
14+
<Authors>Tolga Kayhan, Betalgo, Ranul</Authors>
15+
<Company>Betalgo Up Ltd.</Company>
16+
<Product>Anthropic Claude C# .NET library by Ranul Betalgo</Product>
17+
<Description>Anthropic Claude C# .NET library by Ranul Betalgo</Description>
18+
<RepositoryUrl>https://github.com/betalgo/anthropic/</RepositoryUrl>
19+
<PackageTags>Anthropic,Claude,ai,betalgo,NLP,Ranul</PackageTags>
20+
<PackageId>Betalgo.Ranul.Anthropic</PackageId>
21+
<PackageReadmeFile>Readme.md</PackageReadmeFile>
22+
<GenerateDocumentationFile>True</GenerateDocumentationFile>
23+
<RepositoryUrl>https://github.com/betalgo/anthropic.git</RepositoryUrl>
24+
<RepositoryType>git</RepositoryType>
25+
<EnforceCodeStyleInBuild>True</EnforceCodeStyleInBuild>
26+
<PackageLicenseExpression>MIT</PackageLicenseExpression>
27+
<EmbedUntrackedSources>true</EmbedUntrackedSources>
28+
<IncludeSymbols>true</IncludeSymbols>
29+
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
30+
</PropertyGroup>
3031

31-
<ItemGroup>
32-
<Folder Include="Interfaces\" />
33-
</ItemGroup>
32+
<ItemGroup>
33+
<Compile Remove="Interfaces\**" />
34+
<EmbeddedResource Remove="Interfaces\**" />
35+
<None Remove="Interfaces\**" />
36+
</ItemGroup>
3437
<ItemGroup>
3538
<None Include="..\Readme.md">
3639
<Pack>True</Pack>
3740
<PackagePath>\</PackagePath>
3841
</None>
39-
42+
<None Include="Ranul-Anthropic-Icon.png">
43+
<Pack>True</Pack>
44+
<PackagePath>\</PackagePath>
45+
</None>
46+
</ItemGroup>
47+
<ItemGroup>
48+
<PackageReference Include="Microsoft.Extensions.Http" Version="8.0.0" />
49+
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="8.0.0" />
50+
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="8.0.0" PrivateAssets="All" />
51+
<PackageReference Include="System.Text.Json" Version="8.0.4" />
4052
</ItemGroup>
41-
<ItemGroup>
42-
<PackageReference Include="Microsoft.Extensions.Http" Version="8.0.0" />
43-
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="8.0.0" />
44-
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="8.0.0" PrivateAssets="All" />
45-
</ItemGroup>
4653
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
4754
<PackageReference Include="System.Net.Http.Json" Version="8.0.0" />
4855
</ItemGroup>
4956

50-
</Project>
57+
</Project>

Anthropic/EndpointProviders/AnthropicEndpointProvider.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
public class AnthropicEndpointProvider : IAnthropicEndpointProvider
44
{
5-
65
private readonly string _apiVersion;
76

87
public AnthropicEndpointProvider(string apiVersion)

Anthropic/Extensions/AnthropicServiceCollectionExtensions.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using Anthropic.Services;
1+
using Anthropic.ObjectModels;
2+
using Anthropic.Services;
23
using Microsoft.Extensions.DependencyInjection;
34

45
namespace Anthropic.Extensions;

0 commit comments

Comments
 (0)