Главная / Статьи / Вызов GPT-6 Astra из .NET: Chat, Responses и уровень рассуждений

Вызов GPT-6 Astra из .NET: Chat, Responses и уровень рассуждений

Что SDK OpenAI из NuGet версии 2.13.0 даёт для GPT-6 Astra: стабильный чат-клиент, экспериментальный клиент Responses, особенности цен и уровни рассуждений xhigh и max.

1435 слов

OpenAI анонсировала GPT-6 Astra 3 сентября 2026 года и подаёт её как шаг вперёд в управлении компьютером, веб-сёрфинге, программировании и долгой агентной работе. Доступ открывают поэтапно. Первой получает его ограниченная группа компаний из программы кибербезопасности Daybreak. Затем модель приходит в ChatGPT Plus, Pro, Business и Enterprise, в OpenAI API, Microsoft Foundry на Azure и AWS Bedrock.

Пост о запуске мало что говорит о том, что ломается, когда .NET-проект переключают на новое имя модели. Полезная проверка — сравнить опубликованный API-контракт модели с живой документацией, а потом поставить настоящий пакет OpenAI из NuGet (на момент проверки версии 2.13.0) и посмотреть, что он на самом деле предоставляет, а не копировать пример из блога. Самое интересное как раз в расхождении между этими двумя источниками. Документация описывает намерения, а скомпилированная сборка показывает, что разработчик реально может написать, какие атрибуты блокируют компиляцию и какие члены перечислений существуют.

В сопутствующем репозитории лежат три запускаемых примера, по одному на стиль клиента: chat, meai и responses. Все три отправляют один и тот же промпт. Режим meai задаёт уровень рассуждений через абстракцию более высокого уровня (о ней ниже), поэтому его результаты нельзя точно сопоставить с двумя другими режимами. В README репозитория расписано, что запускает каждый режим.

Опубликованные характеристики модели

  • ID модели: gpt-6-astra
  • Контекстное окно: 1 050 000 токенов, вывод до 128 000 токенов
  • Место под вход: примерно 922 000 токенов, но это результат простого вычитания, а не цифра от OpenAI
  • Типы входа: текст и изображения; выход только текстовый
  • Граница знаний: 30 апреля 2026 года
  • Эндпоинты: Chat Completions, Responses и Batch, все со стримингом, структурированным выводом, входными изображениями и кешированием промптов
  • Уровень рассуждений: пять значений — low, medium, high, xhigh и max

Особенности цен

Как только запрос превышает 272K входных токенов, весь запрос тарифицируется по удвоенной ставке за вход и кеш и по ставке ×1,5 за выход, а не только превышение. Batch и Flex стоят половину стандартных ставок. Есть и режим Fast по двойным ставкам: он важен для путей, чувствительных к задержке, но сначала требует разговора о бюджете. На практике надбавку за длинный контекст стоит учитывать до того, как отправлять промпт размером с репозиторий: переход через порог меняет цену всего вызова. Документация фиксирует эту цену, но не обещает конкретного ускорения, поэтому и здесь никаких цифр ускорения не будет.

Два клиента в одном пакете

Команда dotnet add package OpenAI сегодня ставит 2.13.0. Эта версия обращается к модели через два разных клиента, и только одним из них можно пользоваться, не подписываясь на экспериментальный API.

Стабильный чат-клиент

У OpenAI.Chat.ChatClient нет атрибута Experimental. Это уже давно путь для продакшена, и новая модель работает через него как любая другая чат-модель.

using OpenAI.Chat;

ChatClient client = new("gpt-6-astra", Environment.GetEnvironmentVariable("OPENAI_API_KEY"));
ChatCompletion completion = await client.CompleteChatAsync(
    [new UserChatMessage("Refactor the DbContext lifetime across every endpoint in this project.")],
    new ChatCompletionOptions
    {
        ReasoningEffortLevel = ChatReasoningEffortLevel.High,
    });
Console.WriteLine(completion.Content[0].Text);

Мост Microsoft.Extensions.AI, который поставляется в отдельном пакете Microsoft.Extensions.AI.OpenAI, тоже обходится без сюрпризов. Это удобно командам, которые уже стандартизировались на IChatClient.

using OpenAI.Chat;
using Microsoft.Extensions.AI;

IChatClient client = new ChatClient("gpt-6-astra", Environment.GetEnvironmentVariable("OPENAI_API_KEY"))
    .AsIChatClient();
var response = await client.GetResponseAsync(
    "Refactor the DbContext lifetime across every endpoint in this project.");
Console.WriteLine(response);

У расширения AsIChatClient для ChatClient тоже нет атрибута Experimental. Именно эту схему стоит использовать, пока Astra только отвечает на вопросы и не вызывает инструменты.

Если добавить оба пакета, всплывает загвоздка с версиями. Microsoft.Extensions.AI.OpenAI 10.9.0 зависит от OpenAI версии не ниже 2.12.0, но ниже 2.13.0, а простое добавление OpenAI подтягивает 2.13.0 — на один патч за пределами диапазона. Поэтому наивный подход даёт предупреждение NU1608 о версии вне ограничения. Restore и сборка всё равно проходят, но если явно закрепить версию OpenAI, лог restore останется чистым.

Вызов инструментов живёт в экспериментальном клиенте

Оговорка про инструменты важнее, чем кажется. В заметках к релизу Astra OpenAI прямо пишет, что для вызова инструментов нужен Responses API, и есть руководство по миграции для тех, кто сейчас вызывает инструменты через Chat Completions на другой модели. Для этой модели все агентные возможности находятся в клиенте, который всё ещё закрыт диагностикой OPENAI001: вызовы функций, веб-поиск и поиск по файлам, интерпретатор кода, управление компьютером и MCP. Стабильный клиент отвечает на вопросы, а агентное поведение происходит в экспериментальном. Тем, кто планирует агента на этой модели, стоит заранее смириться с подавлением OPENAI001 и с тем, что поверхность API может переименовываться между релизами SDK.

OpenAI.Responses.ResponsesClient целиком помечен Experimental("OPENAI001"). Это не случайное предупреждение на одном методе: весь тип недоступен, пока диагностику не подавят — прагмой, настройкой проекта или правилом editorconfig. Попытка создать экземпляр останавливает компилятор, пока диагностика не подавлена.

#pragma warning disable OPENAI001
using OpenAI.Responses;

ResponsesClient client = new(Environment.GetEnvironmentVariable("OPENAI_API_KEY"));
ResponseResult result = await client.CreateResponseAsync(
    "gpt-6-astra",
    "Refactor the DbContext lifetime across every endpoint in this project.",
    previousResponseId: null);
Console.WriteLine(result.GetOutputText());

За пределами удобной перегрузки с тремя строками, то есть для инструментов, настроек рассуждений и структурированного вывода, нужен объект CreateResponseOptions. Тип называется именно CreateResponseOptions, а не ResponseCreationOptions, как можно было бы подумать по тексту самой документации.

ResponseResult result = await client.CreateResponseAsync(new CreateResponseOptions
{
    Model = "gpt-6-astra",
    InputItems = { ResponseItem.CreateUserMessageItem("Refactor the DbContext lifetime across every endpoint in this project.") },
    ReasoningOptions = new ResponseReasoningOptions
    {
        ReasoningEffortLevel = ResponseReasoningEffortLevel.High,
    },
});

Тот же пакет Microsoft.Extensions.AI.OpenAI поставляет и перегрузку AsIChatClient для ResponsesClient, и она последовательно несёт ту же метку OPENAI001.

Уровень рассуждений и недостающие члены перечисления

Задокументированные значения reasoning.effort для Astra — low, medium, high, xhigh и max. Значение none она явно не принимает. В этом есть ирония: оба удобных типа в .NET SDK, ChatReasoningEffortLevel для Chat Completions и ResponseReasoningEffortLevel для Responses, в версии 2.13.0 предоставляют ровно пять статических членов: None, Minimal, Low, Medium и High. То значение, к которому большинство тянется по привычке, эта модель как раз отвергает.

Ни у xhigh, ни у max нет именованного члена ни в одном из типов. SDK это не мешает их отправлять, только называть. Оба типа — расширяемые обёртки над строкой, а не настоящие перечисления C#, и у каждого есть публичный конструктор со строкой. Есть прямое доказательство, что так и задумано. Интеграция OpenAI внутри Microsoft.Extensions.AI делает это у себя. Пакет Abstractions версии 10.9.0 определяет настройку ReasoningEffort со значениями None, Low, Medium, High и ExtraHigh в ChatOptions.Reasoning. Маппинг внутри интеграции OpenAI отправляет ExtraHigh как ChatReasoningEffortLevel, созданный из строки xhigh. Мы убедились, что эта строка зашита прямо в выпущенную DLL 10.9.0, а не только в более свежий пример в основной ветке. Так что на уровне IChatClient сырая строка не нужна.

IChatClient client = new ChatClient("gpt-6-astra", Environment.GetEnvironmentVariable("OPENAI_API_KEY"))
    .AsIChatClient();

var response = await client.GetResponseAsync(
    "Refactor the DbContext lifetime across every endpoint in this project.",
    new ChatOptions { Reasoning = new ReasoningOptions { Effort = ReasoningEffort.ExtraHigh } });

Абстракция заканчивается на ExtraHigh, аналога для max нет. Чтобы получить max или использовать xhigh и max с сырыми типами SDK, строку придётся собирать вручную.

ReasoningEffortLevel = new ChatReasoningEffortLevel("max"),

Есть одна оговорка. Этот вызов не отправляли на живой эндпоинт Astra, чтобы убедиться, что API отвечает 200, а не ошибкой валидации. То, что SDK готов отправить произвольную строку, ещё не значит, что сервис её примет, а проверено только первое.

Что проверено, а что нет

Сверено с живой документацией и скомпилированной поверхностью SDK: характеристики модели, карточка цен, имена классов, атрибут Experimental и строка xhigh внутри выпущенной DLL Microsoft.Extensions.AI.OpenAI. Пока не проверено: принимает ли API max с ответом 200 и оправдывает ли реальная .NET-задача на high против xhigh через экспериментальный клиент Responses удвоенный расход токенов. Это сравнение запланировано на потом, когда модель выйдет из поэтапного запуска и станет доступна без приглашения в Daybreak.