Anthropic C# SDK предоставляет удобный доступ к Anthropic REST API из приложений, написанных на C#.
C# SDK в настоящее время находится в стадии бета-версии. API могут меняться между версиями.
Документацию по функциям API с примерами кода см. в справочнике по API. На этой странице рассматриваются специфичные для C# функции и настройки SDK.
Начиная с версии 10+, пакет Anthropic является официальным Anthropic SDK для C#. Версии пакета 3.X и ниже ранее использовались для SDK, созданного сообществом tryAGI, который переехал в tryAGI.Anthropic. Если вам нужно продолжить использовать прежний клиент в вашем проекте, обновите ссылку на пакет на tryAGI.Anthropic.
Установите пакет из NuGet:
dotnet add package AnthropicЭта библиотека требует .NET Standard 2.0 или более поздней версии.
using System;
using Anthropic;
using Anthropic.Models.Messages;
AnthropicClient client = new();
MessageCreateParams parameters = new()
{
MaxTokens = 1024,
Messages =
[
new()
{
Role = Role.User,
Content = "Hello, Claude",
},
],
Model = Model.ClaudeOpus4_8,
};
var message = await client.Messages.Create(parameters);
Console.WriteLine(message);Варианты аутентификации, включая Workload Identity Federation, см. в разделе Аутентификация.
Настройте клиент с помощью переменных окружения:
using Anthropic;
// Настраивается через переменные окружения ANTHROPIC_API_KEY, ANTHROPIC_AUTH_TOKEN и ANTHROPIC_BASE_URL
AnthropicClient client = new();Или вручную:
using Anthropic;
AnthropicClient client = new() { ApiKey = "my-anthropic-api-key" };Или используя комбинацию этих двух подходов.
Доступные параметры приведены в этой таблице:
| Свойство | Переменная окружения | Обязательно | Значение по умолчанию |
|---|---|---|---|
ApiKey | ANTHROPIC_API_KEY | false | - |
AuthToken | ANTHROPIC_AUTH_TOKEN | false | - |
BaseUrl | ANTHROPIC_BASE_URL | true | "https://api.anthropic.com" |
Чтобы временно использовать изменённую конфигурацию клиента, повторно используя те же пулы соединений и потоков, вызовите WithOptions на любом клиенте или сервисе:
using System;
var message = await client
.WithOptions(options =>
options with
{
BaseUrl = "https://example.com",
Timeout = TimeSpan.FromSeconds(42),
}
)
.Messages.Create(parameters);
Console.WriteLine(message);Использование выражения with упрощает создание изменённых параметров.
Метод WithOptions не влияет на исходный клиент или сервис.
SDK определяет методы, которые возвращают потоки «фрагментов» (chunks) ответа, где каждый фрагмент может быть обработан индивидуально сразу после его получения, вместо ожидания полного ответа. Методы потоковой передачи обычно соответствуют ответам в формате SSE или JSONL.
Метод потоковой передачи всегда имеет суффикс Streaming в своём имени, даже если у него нет непотокового варианта.
Эти методы потоковой передачи возвращают IAsyncEnumerable:
using System;
using Anthropic.Models.Messages;
MessageCreateParams parameters = new()
{
MaxTokens = 1024,
Messages =
[
new()
{
Role = Role.User,
Content = "Hello, Claude",
},
],
Model = Model.ClaudeOpus4_8,
};
await foreach (var message in client.Messages.CreateStreaming(parameters))
{
Console.WriteLine(message);
}SDK выбрасывает пользовательские типы непроверяемых исключений:
AnthropicApiException: базовый класс для ошибок API. В этой таблице указано, какой подкласс исключения выбрасывается для каждого кода состояния HTTP:| Статус | Исключение |
|---|---|
| 400 | AnthropicBadRequestException |
| 401 | AnthropicUnauthorizedException |
| 403 | AnthropicForbiddenException |
| 404 | AnthropicNotFoundException |
| 422 | AnthropicUnprocessableEntityException |
| 429 | AnthropicRateLimitException |
| 5xx | Anthropic5xxException |
| другие | AnthropicUnexpectedStatusCodeException |
Кроме того, все ошибки 4xx наследуются от Anthropic4xxException.
AnthropicSseException: выбрасывается для ошибок, возникших во время потоковой передачи SSE после успешного первоначального HTTP-ответа.
AnthropicIOException: сетевые ошибки ввода-вывода.
AnthropicInvalidDataException: ошибка интерпретации успешно разобранных данных. Например, при обращении к свойству, которое должно быть обязательным, но API неожиданно не включил его в ответ.
AnthropicException: базовый класс для всех исключений.
По умолчанию SDK автоматически выполняет 2 повторные попытки с короткой экспоненциальной задержкой между запросами.
Повторные попытки выполняются только для следующих типов ошибок:
API также может явно указать SDK повторить или не повторять запрос.
Чтобы задать пользовательское количество повторных попыток, настройте клиент с помощью свойства MaxRetries:
using Anthropic;
AnthropicClient client = new() { MaxRetries = 3 };Или настройте отдельный вызов метода с помощью WithOptions:
using System;
var message = await client
.WithOptions(options =>
options with { MaxRetries = 3 }
)
.Messages.Create(parameters);
Console.WriteLine(message);По умолчанию время ожидания запросов истекает через 10 минут.
Чтобы задать пользовательский тайм-аут, настройте клиент с помощью параметра Timeout:
using System;
using Anthropic;
AnthropicClient client = new() { Timeout = TimeSpan.FromSeconds(42) };Или настройте отдельный вызов метода с помощью WithOptions:
using System;
var message = await client
.WithOptions(options =>
options with { Timeout = TimeSpan.FromSeconds(42) }
)
.Messages.Create(parameters);
Console.WriteLine(message);SDK определяет методы, которые возвращают постраничные списки результатов. Он предоставляет удобные способы доступа к результатам либо по одной странице за раз, либо поэлементно по всем страницам.
Чтобы перебрать все результаты на всех страницах, используйте метод Paginate, который автоматически запрашивает дополнительные страницы по мере необходимости. Метод возвращает IAsyncEnumerable:
using System;
var page = await client.Messages.Batches.List(parameters);
await foreach (var item in page.Paginate())
{
Console.WriteLine(item);
}Чтобы получить доступ к отдельным элементам страницы и вручную запросить следующую страницу, используйте свойство Items, а также методы HasNext и Next:
var page = await client.Messages.Batches.List();
while (true)
{
foreach (var item in page.Items)
{
Console.WriteLine(item);
}
if (!page.HasNext())
{
break;
}
page = await page.Next();
}В редких случаях API может вернуть ответ, который не соответствует ожидаемому типу. По умолчанию SDK не выбрасывает исключение в этом случае. Он выбрасывает AnthropicInvalidDataException только при непосредственном обращении к свойству.
Если вы предпочитаете заранее проверить, что ответ полностью корректно типизирован, вызовите Validate:
var message = await client.Messages.Create(parameters);
message.Validate();Или настройте клиент с помощью параметра ResponseValidation:
using Anthropic;
AnthropicClient client = new() { ResponseValidation = true };Или настройте отдельный вызов метода с помощью WithOptions:
using System;
var message = await client
.WithOptions(options =>
options with { ResponseValidation = true }
)
.Messages.Create(parameters);
Console.WriteLine(message);SDK предоставляет реализацию интерфейса IChatClient из библиотеки Microsoft.Extensions.AI.Abstractions. Это позволяет использовать AnthropicClient (и Anthropic.Services.IBetaService) с другими библиотеками, которые интегрируются с этими базовыми абстракциями. Например, инструменты из библиотеки MCP C# SDK (ModelContextProtocol) можно использовать напрямую с AnthropicClient, предоставленным через IChatClient.
using Anthropic;
using Microsoft.Extensions.AI;
using ModelContextProtocol.Client;
// Настраивается через переменные окружения ANTHROPIC_API_KEY, ANTHROPIC_AUTH_TOKEN и ANTHROPIC_BASE_URL
AnthropicClient client = new();
IChatClient chatClient = client.AsIChatClient("claude-opus-4-8")
.AsBuilder()
.UseFunctionInvocation()
.Build();
// Использование McpClient из MCP C# SDK
McpClient learningServer = await McpClient.CreateAsync(
new HttpClientTransport(new() { Endpoint = new("https://learn.microsoft.com/api/mcp") }));
ChatOptions options = new() { Tools = [.. await learningServer.ListToolsAsync()] };
Console.WriteLine(await chatClient.GetResponseAsync("Tell me about IChatClient", options));Чтобы отправить запрос к Claude API, создайте экземпляр класса Params и передайте его в соответствующий метод клиента. Когда ответ получен, он десериализуется в экземпляр класса C#.
Например, client.Messages.Create следует вызывать с экземпляром MessageCreateParams, и он вернёт экземпляр Task<Message>.
SDK определяет методы, которые возвращают бинарные ответы, используемые для ответов API, которые не обязательно должны быть разобраны, например данные, отличные от JSON.
Эти методы возвращают HttpResponse:
using System;
using Anthropic.Models.Beta.Files;
FileDownloadParams parameters = new() { FileID = "file_id" };
var response = await client.Beta.Files.Download(parameters);
Console.WriteLine(response);Чтобы сохранить содержимое ответа в файл или любой Stream, используйте метод CopyToAsync:
using System.IO;
using var response = await client.Beta.Files.Download(parameters);
using var contentStream = await response.ReadAsStream();
using var fileStream = File.Open(path, FileMode.OpenOrCreate);
await contentStream.CopyToAsync(fileStream); // Or any other StreamSDK определяет методы, которые десериализуют ответы в экземпляры классов C#. Чтобы получить доступ к заголовкам ответа, коду состояния или необработанному телу ответа, добавьте префикс WithRawResponse к любому вызову HTTP-метода на клиенте или сервисе:
var response = await client.WithRawResponse.Messages.Create(parameters);
var statusCode = response.StatusCode;
var headers = response.Headers;Необработанный HttpResponseMessage также доступен через свойство RawMessage.
Для непотоковых ответов вы можете при необходимости десериализовать ответ в экземпляр класса C#:
using System;
using Anthropic.Models.Messages;
var response = await client.WithRawResponse.Messages.Create(parameters);
Message deserialized = await response.Deserialize();
Console.WriteLine(deserialized);Для потоковых ответов вы можете при необходимости десериализовать ответ в IAsyncEnumerable:
using System;
var response = await client.WithRawResponse.Messages.CreateStreaming(parameters);
await foreach (var item in response.Enumerate())
{
Console.WriteLine(item);
}Все сообщения журнала предназначены только для отладки. Формат и содержание сообщений журнала могут меняться между релизами.
Включите отладочное логирование, установив переменную окружения:
export ANTHROPIC_LOG=debugSDK типизирован для удобного использования документированного API. Однако он также поддерживает работу с недокументированными или ещё не поддерживаемыми частями API.
Подробные руководства по настройке платформ с примерами кода см. здесь:
C# SDK поддерживает следующие платформы через отдельные пакеты NuGet:
Anthropic.Bedrock. Используйте AnthropicBedrockMantleClient для конечной точки Bedrock с Messages API или AnthropicBedrockClient (путь bedrock-runtime). AnthropicBedrockMantleClient принимает необязательный объект конфигурации MantleAwsClientOptions; AnthropicBedrockClient принимает AnthropicBedrockCredentialsHelper.FromEnv() или явные учётные данные.Anthropic.Vertex. Настройку клиента см. в разделе Vertex AI.Anthropic.Foundry. Используйте AnthropicFoundryClient с DefaultAnthropicFoundryCredentials.FromEnv() или явными учётными данными.Используйте AnthropicBedrockMantleClient для новых проектов; AnthropicBedrockClient остаётся для существующих приложений, использующих Bedrock InvokeModel API.
Хотя этот пакет имеет версию 10+, в настоящее время он находится в стадии бета-версии. В течение бета-периода критические изменения могут появляться в минорных или патч-релизах. Как только библиотека достигнет стабильного релиза, соглашения SemVer будут соблюдаться более строго. Поделитесь отзывом, создав issue.
Этот пакет в целом следует соглашениям SemVer, хотя некоторые обратно несовместимые изменения могут выпускаться как минорные версии:
Обратная совместимость воспринимается серьёзно, чтобы вы могли рассчитывать на плавный процесс обновления.
Was this page helpful?
Anthropic.AwsAnthropicAwsClientWorkspaceIdANTHROPIC_AWS_WORKSPACE_ID