Виклик GPT-6 Astra з .NET: Chat, Responses і рівень міркувань
Що SDK OpenAI з NuGet версії 2.13.0 дає для GPT-6 Astra: стабільний чат-клієнт, експериментальний клієнт Responses, особливості цін і рівні міркувань xhigh та max.
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.