Головна / Статті / Виклик 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.