Назад в блог

API и SDKИнструкция

Первый запрос из C# через openai-dotnet: endpoint, ключ, ответ

Отправьте первый запрос из консольного приложения на C#: Endpoint в официальной библиотеке OpenAI для .NET, ключ из переменной среды, текст ответа и finish reason.

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

Обложка: C# и библиотека OpenAI для .NET подключены к endpoint CheapTokens
Содержание
  1. Что понадобится
  2. Соберём консольное приложение
  3. Код по строкам
  4. Что вы увидите
  5. Переключаем готовый сервис
  6. Сколько стоит один запрос
  7. Если не работает

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

Допустим, у вас уже есть ASP.NET-сервис, который ходит в OpenAI, и вы хотите попробовать другой endpoint и другую модель, не трогая остальной код. Прежде чем встраивать, проверьте три места, где обычно ошибаются (ключ, endpoint, id модели), в маленьком консольном приложении. Его мы и соберём. Детали взяты из README библиотеки на GitHub (openai/openai-dotnet, сверено 5 ноября 2026) и из документации CheapTokens: тот же base URL указан на странице документации.

Что понадобится#

Пакет на NuGet называется OpenAI. Последняя стабильная версия на 5 ноября 2026 — 2.15.0 (запись в changelog от 4 ноября). Она рассчитана на .NET 8 и .NET Standard 2.0, а в README сказано, что библиотека совместима со всеми приложениями на .NET Standard 2.0, так что и более старый проект подойдёт.

В приложение пойдут три значения:

  • base URL: https://api.cheaptokens.dev/v1 (совместим с OpenAI Chat Completions);
  • id модели: deepseek-ai/DeepSeek-V4-Flash-0731. Нужен полный id, короткое имя из таблицы цен не принимается. У 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 показывает этот приём для «прокси или собственного OpenAI-совместимого LLM»: endpoint кладётся в 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. Список id, доступных вашему ключу, — один запрос, см. List models with GET /v1/models.

Сколько стоит один запрос#

Допустим, сервис обрабатывает 1000 запросов в день, в каждом около 300 токенов на входе и 400 на выходе. Один такой запрос на DeepSeek-V4-Flash стоит $0.000045. В таблице ниже те же 1000 запросов на трёх моделях рядом с 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 выходных токенов на запрос. Цены за 1M токенов актуальны и меняются вместе с нашими тарифами; столбец OpenRouter показывает справочные цены для той же нагрузки.

Если не работает#

  • 401. Ключ не задан или неверный. Выведите, задана ли переменная (проверка в коде это делает) и убедитесь, что dotnet run запущен в том же терминале, где вы выполнили export (или $env:): переменная живёт только в этом сеансе.
  • 404. Чаще всего дело в id модели: короткое имя вместо полного deepseek-ai/DeepSeek-V4-Flash-0731 или endpoint без /v1 (проверьте также, что OpenAIClientOptions действительно передан в ChatClient). Подробности — в статье API 401 or 404: wrong key, base URL or model id.
  • error CS0246: The type or namespace name 'ApiKeyCredential' could not be found. В начале Program.cs не хватает строки using System.ClientModel;.

Та же идея на другом языке: версия на Go с openai-go.