Skip to content

tryAGI/Anthropic

Anthropic

Nuget package dotnet License: MIT Discord

Disclaimer: This package is not affiliated with, endorsed by, or sponsored by Anthropic. Anthropic and Claude are trademarks of Anthropic, PBC.

Features 🔥

  • Fully generated C# SDK based on official OpenAPI specification using AutoSDK
  • Automatic releases of new preview versions if there was an update to the OpenAPI specification
  • Source generator to define tools natively through C# interfaces
  • All modern .NET features - nullability, trimming, NativeAOT, etc.
  • Support .Net Framework/.Net Standard 2.0
  • Supporting Microsoft.Extensions.AI
  • Supports all endpoints of the API, including batch requests, count tokens, and prompt caching.

Usage

using Anthropic;

using var client = new AnthropicClient(apiKey);

var messageParams = new CreateMessageParams()
{   
    Model = new Model(ModelVariant6.Claude35SonnetLatest),
    Messages = [
        new InputMessage(InputMessageRole.User, "What's the weather like today?"),
        new InputMessage(InputMessageRole.Assistant, "Sure! Could you please provide me with your location?"),
        new InputMessage(InputMessageRole.User, "Dubai, UAE")
    ],
    MaxTokens = 250
};
var response = await client.Messages.MessagesPostAsync(messageParams);

Tools

using CSharpToJsonSchema;

public enum Unit
{
    Celsius,
    Fahrenheit,
}

public class Weather
{
    public string Location { get; set; } = string.Empty;
    public double Temperature { get; set; }
    public Unit Unit { get; set; }
    public string Description { get; set; } = string.Empty;
}

[GenerateJsonSchema]
public interface IWeatherFunctions
{
    [Description("Get the current weather in a given location")]
    public Weather GetCurrentWeather(
        [Description("The city and state, e.g. San Francisco, CA")] string location,
        Unit unit = Unit.Celsius);
    
    [Description("Get the current weather in a given location")]
    public Task<Weather> GetCurrentWeatherAsync(
        [Description("The city and state, e.g. San Francisco, CA")] string location,
        Unit unit = Unit.Celsius,
        CancellationToken cancellationToken = default);
}

public class WeatherService : IWeatherFunctions
{
    public Weather GetCurrentWeather(string location, Unit unit = Unit.Celsius)
    {
        return new Weather
        {
            Location = location,
            Temperature = 22.0,
            Unit = unit,
            Description = "Sunny",
        };
    }
    
    public Task<Weather> GetCurrentWeatherAsync(string location, Unit unit = Unit.Celsius, CancellationToken cancellationToken = default)
    {
        return Task.FromResult(new Weather
        {
            Location = location,
            Temperature = 22.0,
            Unit = unit,
            Description = "Sunny",
        });
    }
}
using Anthropic;

using var client = new AnthropicClient(apiKey);

var service = new WeatherService();
var tools = service.AsTools();

var messageParams = new CreateMessageParams()
{   
    Model = new Model(ModelVariant6.Claude35SonnetLatest),
    Messages = [new InputMessage(InputMessageRole.User, "What is the current temperature in Dubai, UAE in Celsius?")],
    MaxTokens = 4096,
    System = "You are a helpful weather assistant.",
    ToolChoice = new ToolChoice(new ToolChoiceAuto()),
    Tools = tools
};
var response = await client.Messages.MessagesPostAsync(messageParams);

messageParams.Messages.Add(response.AsInputMessage());

foreach (var toolUse in response.Content.Value2!
     .Where(x => x.IsToolUse)
     .Select(x => x.ToolUse))
{
    var json = await service.CallAsync(
        functionName: toolUse!.Name,
        argumentsAsJson: toolUse.Input.AsJson());
    messageParams.Messages.Add(json.AsToolCall(toolUse));
}

response = await client.Messages.MessagesPostAsync(messageParams);

Microsoft.Extensions.AI

The SDK implements IChatClient for seamless integration with the .NET AI ecosystem:

using Anthropic;
using Microsoft.Extensions.AI;

IChatClient chatClient = new AnthropicClient(apiKey);

var response = await chatClient.GetResponseAsync(
    [new ChatMessage(ChatRole.User, "Hello!")],
    new ChatOptions { ModelId = "claude-sonnet-4-20250514" });

Console.WriteLine(response.Text);

Chat Client Five Random Lines

using var client = GetAuthenticatedChatClient();

var response = await client.GetResponseAsync(
    messages: [new ChatMessage(ChatRole.User, "Generate 5 random words.")],
    new ChatOptions
    {
        ModelId = DefaultModel,
        ResponseFormat = ChatResponseFormatForType<StringArraySchema>(),
        Tools = new List<AITool>(),
    });

Console.WriteLine(response.ToString());

Chat Client Five Random Words Streaming

using var client = GetAuthenticatedChatClient();

var enumerable = client.GetStreamingResponseAsync(
    messages: [new ChatMessage(ChatRole.User, "Generate 5 random words.")],
    new ChatOptions
    {
        ModelId = DefaultModel,
    });

var deltas = new List<string>();
await foreach (var response in enumerable)
{
    Console.Write(response.ToString());

    deltas.Add(response.ToString());
}

Chat Client Five Random Words

using var client = GetAuthenticatedChatClient();

var response = await client.GetResponseAsync(
    messages: [new ChatMessage(ChatRole.User, "Generate 5 random words.")],
    new ChatOptions
    {
        ModelId = DefaultModel,
    });

Console.WriteLine(response.ToString());

Complete History

using var client = new AnthropicClient(apiKey);

var response = await client.MessagesPostAsync(
    model: DefaultModel,
    messages: [
        "What's the weather like today?",
        "Sure! Could you please provide me with your location?".AsAssistantMessage(),
        "Dubai, UAE",
    ],
    maxTokens: 300,
    temperature: 0);

Console.WriteLine(response.AsSimpleText());

Five Random Words

using var client = new AnthropicClient(apiKey);

var response = await client.MessagesPostAsync(
    model: DefaultModel,
    messages: ["Generate 5 random words."],
    maxTokens: 300,
    temperature: 0);

Console.WriteLine(response.AsSimpleText());

Streaming

using var client = new AnthropicClient(apiKey);

var enumerable = client.CreateMessageAsStreamAsync(new CreateMessageParams
{
    Model = DefaultModel,
    Messages = ["Once upon a time"],
    MaxTokens = 250,
});

var deltas = new List<string>();
await foreach (var response in enumerable)
{
    Console.Write(response.ContentBlockDelta?.Delta.TextDelta?.Text);

    deltas.Add(response.ContentBlockDelta?.Delta.TextDelta?.Text ?? string.Empty);
}

Support

Priority place for bugs: https://github.com/tryAGI/Anthropic/issues
Priority place for ideas and general questions: https://github.com/tryAGI/Anthropic/discussions
Discord: https://discord.gg/Ca2xhfBf3v

Acknowledgments

JetBrains logo

This project is supported by JetBrains through the Open Source Support Program.