Назад до блогу

API та SDKПосібник

Перший запит на C# з openai-dotnet: кінцева точка, ключ, відповідь

Надішліть свій перший chat completion із консольного застосунку C#: встановіть Endpoint в офіційній бібліотеці OpenAI для .NET, прочитайте ключ зі змінної середовища, надрукуйте відповідь і причину завершення.

Автор: CheapTokens TeamОпубліковано 4 хв читання

Обкладинка: C# і бібліотека OpenAI для .NET, підключені до кінцевої точки CheapTokens
На цій сторінці
  1. Що вам потрібно
  2. Створення консольного застосунку
  3. Код, рядок за рядком
  4. Що ви маєте побачити
  5. Перемикання наявної служби
  6. Скільки коштує один запит
  7. Якщо не працює

Щоб надіслати запит із C# до CheapTokens, залиште офіційну бібліотеку OpenAI для .NET і встановіть OpenAIClientOptions.Endpoint у https://api.cheaptokens.dev/v1. Передайте повний ідентифікатор моделі, наприклад deepseek-ai/DeepSeek-V4-Flash-0731, а ключ читайте зі змінної середовища. Виклики ChatClient і CompleteChat залишаються точно такими, як у прикладах OpenAI.

Припустімо, у вас уже є служба ASP.NET, яка працює з OpenAI, і ви хочете спробувати іншу кінцеву точку та модель, не змінюючи решту коду. Перш ніж підключати щось до неї, перевірте три речі, які зазвичай ідуть не так (ключ, кінцева точка, ідентифікатор моделі), у крихітному консольному застосунку. Саме це ми тут і створюємо. Деталі нижче взяті з README бібліотеки на GitHub (openai/openai-dotnet, перевірено 5 листопада 2026 року) і з документації CheapTokens: на сторінці документації вказано той самий базовий URL.

Що вам потрібно#

Пакет називається OpenAI на NuGet. Остання стабільна версія станом на 5 листопада 2026 року — 2.15.0 (запис у журналі змін датований 4 листопада). Він підтримує .NET 8 і .NET Standard 2.0, а в README сказано, що він працює з усіма застосунками .NET Standard 2.0, тож старіший проєкт теж підійде.

У застосунок потрапляють три значення:

  • базовий URL: https://api.cheaptokens.dev/v1 (сумісний з OpenAI Chat Completions);
  • ідентифікатор моделі: deepseek-ai/DeepSeek-V4-Flash-0731. Використовуйте повний ідентифікатор, коротка назва з таблиці цін не приймається. DeepSeek-V4-Flash має контекстне вікно 380K і до 32 768 вихідних токенів на відповідь, одна ціна в будь-який час доби;
  • API-ключ із вашого облікового запису CheapTokens, який зберігається у змінній середовища. Якщо ви не впевнені, як його зберігати, прочитайте як безпечно зберігати API-ключ.

Створення консольного застосунку#

Крок за кроком

Створіть проєкт і запустіть його

Створення консольного проєкту

bash
dotnet new console -o FirstRequest
cd FirstRequest

Додавання пакета

bash
dotnet add package OpenAI

Розміщення ключа у змінній середовища

У bash або zsh:

bash
export CHEAPTOKENS_API_KEY=your-key

У Windows PowerShell:

powershell
$env:CHEAPTOKENS_API_KEY = "your-key"

Вставте код і запустіть

Замініть вміст Program.cs кодом із наступного розділу, потім запустіть dotnet run.

Термінал із п'ятьма командами, які створюють і запускають консольний застосунок
П'ять команд: створити проєкт, перейти в папку, додати пакет, встановити ключ, запустити.

Код, рядок за рядком#

csharp
using System.ClientModel;
using OpenAI;
using OpenAI.Chat;

string? apiKey = Environment.GetEnvironmentVariable("CHEAPTOKENS_API_KEY");
if (string.IsNullOrEmpty(apiKey))
{
    Console.WriteLine("Set CHEAPTOKENS_API_KEY first.");
    return;
}

ChatClient client = new(
    model: "deepseek-ai/DeepSeek-V4-Flash-0731",
    credential: new ApiKeyCredential(apiKey),
    options: new OpenAIClientOptions
    {
        Endpoint = new Uri("https://api.cheaptokens.dev/v1")
    });

ChatCompletion completion = client.CompleteChat("Explain in two sentences what a token is.");

Console.WriteLine(completion.Content[0].Text);
Console.WriteLine($"finish_reason: {completion.FinishReason}");

У README показано цей шаблон для «проксі або самостійно розміщеної LLM, сумісної з OpenAI»: кінцева точка передається в OpenAIClientOptions, ключ — в ApiKeyCredential (він живе в System.ClientModel, звідси перший using). Перевірка на початку — наша: вона дає зрозуміле повідомлення, якщо змінна не встановлена.

CompleteChat із простим рядком надсилає одне повідомлення користувача й чекає на всю відповідь. Текст відповіді міститься в completion.Content[0].Text. Причина завершення — в completion.FinishReason.

Потік: ключ зі змінної середовища, ChatClient з Endpoint, CompleteChat, текст і FinishReason
Що відбувається в програмі від ключа до надрукованої відповіді.

Що ви маєте побачити#

Ви маєте отримати коротке пояснення токенів і рядок із причиною завершення; після нормального завершення це Stop (у README порівнюються FinishReason і ChatFinishReason.Stop). Формулювання відповіді змінюється від запуску до запуску.

Другий рядок варто прочитати. У README порівнюються FinishReason і ChatFinishReason.Stop (модель завершила сама) та ChatFinishReason.ToolCalls (модель хоче викликати інструмент). Будь-що, крім Stop, у звичайному чаті означає, що відповідь завершилася з іншої причини, і зазвичай це обмеження довжини. Якщо ви бачите відповідь, що обривається посеред речення, ця стаття пояснює finish_reason і max_tokens.

Перемикання наявної служби#

Якщо ваша служба вже створює ChatClient для OpenAI, ви змінюєте дві речі: рядок моделі та параметри. Решта викликів продовжують працювати.

Порівняйте

Той самий клієнт, два змінені рядки

До

csharp
ChatClient client = new(
    model: "your-current-model",
    credential: new ApiKeyCredential(apiKey));

Після

csharp
ChatClient client = new(
    model: "deepseek-ai/DeepSeek-V4-Flash-0731",
    credential: new ApiKeyCredential(apiKey),
    options: new OpenAIClientOptions
    {
        Endpoint = new Uri("https://api.cheaptokens.dev/v1")
    });

Для коротких запитів є другий варіант: zai-org/GLM-5.3-Flash (контекст 390K, до 8 192 вихідних токенів). Ви змінюєте лише рядок model. Список ідентифікаторів, які може використовувати ваш ключ, — за один запит, див. Список моделей за допомогою GET /v1/models.

Скільки коштує один запит#

Припустімо, служба обробляє 1 000 запитів на день, кожен приблизно 300 токенів на вході та 400 токенів на виході. Один такий запит коштує $0.000045 на DeepSeek-V4-Flash. Таблиця нижче показує ті самі 1 000 запитів на всіх трьох моделях поряд з OpenRouter. Загалом, з урахуванням входу й виходу разом, DeepSeek-V4-Flash дешевший за OpenRouter. Актуальні ціни на сторінці цін, а сторінка DeepSeek перелічує можливості моделі.

Модель За запит 1 000 запитів OpenRouter, 1 000 запитів
GLM-5.3-Flash $0.000022 $0.022 $0.0433
DeepSeek-V4-Flash $0.000045 $0.0445 $0.077
MiniMax-M2.7 $0.000075 $0.075 $0.90

300 вхідних і 400 вихідних токенів на запит. Ціни за 1 млн токенів актуальні та змінюються разом із нашими тарифами; стовпець OpenRouter показує довідкові ціни для того самого навантаження.

Якщо не працює#

  • 401. Ключ відсутній або неправильний. Надрукуйте, чи встановлена змінна (перевірка в коді це робить), і переконайтеся, що dotnet run запущено в тому самому терміналі, де ви виконували export (або $env:): змінна існує лише в цій сесії.
  • 404. Найчастіше це ідентифікатор моделі: коротка назва замість повного deepseek-ai/DeepSeek-V4-Flash-0731 або кінцева точка без /v1 (також перевірте, що OpenAIClientOptions справді передається в ChatClient). Деталі в API 401 або 404: неправильний ключ, базовий URL або ідентифікатор моделі.
  • error CS0246: The type or namespace name 'ApiKeyCredential' could not be found. Бракує рядка using System.ClientModel; на початку Program.cs.

Та сама ідея іншою мовою: версія для Go з openai-go.