C# SDK
Установка и настройка Anthropic C# SDK для приложений .NET с интеграцией IChatClient
Anthropic C# SDK обеспечивает удобный доступ к Claude API из приложений, написанных на C#.
Установка
Установите пакет из 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.ClaudeOpus5,
};
var message = await client.Messages.Create(parameters);
foreach (var block in message.Content)
{
if (block.TryPickText(out var textBlock))
{
Console.WriteLine(textBlock.Text);
}
}Варианты аутентификации, включая Workload Identity Federation, описаны в разделе Аутентификация. Если ваш ключ API является персональным ключом или ключом сервисного аккаунта с доступом к нескольким рабочим пространствам, укажите идентификатор рабочего пространства в заголовке запроса anthropic-workspace-id; в разделе Выбор рабочего пространства показан вариант настройки для отдельного запроса в этом SDK.
Конфигурация клиента
Настройте клиент с помощью переменных окружения:
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 определяет методы, возвращающие потоки «фрагментов» (chunk) ответа, где каждый фрагмент может быть обработан отдельно сразу по мере поступления, не дожидаясь полного ответа. Методы «streaming» (потоковой передачи) обычно соответствуют ответам 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.ClaudeOpus5,
};
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 повторные попытки с короткой экспоненциальной задержкой между запросами.
Повторяются только следующие типы ошибок:
- Ошибки соединения (например, из-за проблем с сетевым подключением)
- 408 Request Timeout
- 409 Conflict
- 429 Rate Limit (ограничение скорости)
- 5xx Internal
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);Интеграция с IChatClient
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-5")
.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.Files;
FileDownloadParams parameters = new() { FileID = "file_id" };
var response = await client.Files.Download(parameters);
Console.WriteLine(response);Чтобы сохранить содержимое ответа в файл или любой Stream, используйте метод CopyToAsync:
using System.IO;
using var response = await client.Files.Download(parameters);
using var contentStream = await response.ReadAsStream();
using var fileStream = File.Open(path, FileMode.OpenOrCreate);
await contentStream.CopyToAsync(fileStream); // Or any other StreamНеобработанные ответы
SDK определяет методы, десериализующие ответы в экземпляры классов 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=debugНедокументированная функциональность API
SDK типизирован для удобного использования документированного API. Однако он также поддерживает работу с недокументированными или ещё не поддерживаемыми частями API.
Интеграции с платформами
C# SDK поддерживает следующие платформы через отдельные пакеты NuGet:
- Agent Platform:
Anthropic.Vertex. Настройку клиента см. в разделе Claude на Google Cloud. - Bedrock:
Anthropic.Bedrock. ИспользуйтеAnthropicBedrockMantleClientдля конечной точки Bedrock с Messages API илиAnthropicBedrockClient(путьbedrock-runtime).AnthropicBedrockMantleClientпринимает необязательный объект конфигурацииMantleAwsClientOptions;AnthropicBedrockClientпринимаетAnthropicBedrockCredentialsHelper.FromEnv()или явные учётные данные. - Claude Platform на AWS:
Anthropic.Aws. ИспользуйтеAnthropicAwsClient; задайтеWorkspaceIdна клиенте или переменную окруженияANTHROPIC_AWS_WORKSPACE_ID(см. Рабочие пространства). Доступно в бета-версии. - Foundry:
Anthropic.Foundry. ИспользуйтеAnthropicFoundryClientсDefaultAnthropicFoundryCredentials.FromEnv()или явными учётными данными.
Используйте AnthropicBedrockMantleClient для новых проектов; AnthropicBedrockClient остаётся для существующих приложений, использующих API Bedrock InvokeModel.
Семантическое версионирование
Этот пакет в целом следует соглашениям SemVer, хотя некоторые обратно несовместимые изменения могут выпускаться как минорные версии:
- Изменения во внутренних компонентах библиотеки, которые технически являются публичными, но не предназначены и не документированы для внешнего использования.
- Изменения, которые, как ожидается, на практике не затронут подавляющее большинство пользователей.
К обратной совместимости относятся серьёзно, чтобы вы могли рассчитывать на беспроблемное обновление.
Дополнительные ресурсы
Was this page helpful?