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

Содержание
Чтобы отправить запрос из C# в CheapTokens, оставьте официальную библиотеку OpenAI для .NET и задайте OpenAIClientOptions. равным https:/. Модель указывайте полным id, например deepseek-, а ключ берите из переменной среды. Вызовы 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:/(совместим с OpenAI Chat Completions);/ api. cheaptokens. dev/ v1 - id модели:
deepseek-. Нужен полный id, короткое имя из таблицы цен не принимается. У DeepSeek-V4-Flash контекст 380K, до 32 768 токенов в ответе и одна цена в любое время суток;ai/ DeepSeek- V4- Flash- 0731 - API-ключ из вашего аккаунта CheapTokens в переменной среды. Если не уверены, как его хранить, прочитайте как безопасно хранить API-ключ.
Соберём консольное приложение#
Шаг за шагом
Создаём проект и запускаем
Создайте консольный проект
dotnet new console -o FirstRequest
cd FirstRequestДобавьте пакет
dotnet add package OpenAIПоложите ключ в переменную среды
В bash или zsh:
export CHEAPTOKENS_API_KEY=your-keyВ Windows PowerShell:
$env:CHEAPTOKENS_API_KEY = "your-key"Вставьте код и запустите
Замените содержимое Program.cs кодом из следующего раздела и выполните dotnet run.

Код по строкам#
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., отсюда первый using). Проверка вверху — наша: она выдаёт понятное сообщение, если переменная не задана.
CompleteChat со строкой отправляет одно сообщение пользователя и ждёт ответ целиком. Текст ответа лежит в completion., причина остановки — в completion..

Что вы увидите#
Вы получите короткое объяснение, что такое токен, и строку с причиной остановки; при обычном завершении это Stop (README сравнивает FinishReason с ChatFinishReason.). Формулировки ответа от запуска к запуску меняются.
Вторая строка — та, что стоит прочитать. README сравнивает FinishReason с ChatFinishReason. (модель закончила сама) и ChatFinishReason. (модель хочет вызвать инструмент). Всё, что не Stop, в обычном чате значит, что ответ закончился по другой причине, и чаще всего это лимит длины. Если ответ обрывается на полуслове, об этом — статья про finish_reason и max_tokens.
Переключаем готовый сервис#
Если сервис уже создаёт ChatClient для OpenAI, меняются две вещи: строка модели и параметры. Остальные вызовы продолжают работать.
Сравнение
Тот же клиент, две изменённые строки
Было
ChatClient client = new(
model: "your-current-model",
credential: new ApiKeyCredential(apiKey));Стало
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- (контекст 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.
| Модель | Вход $/1M | Выход $/1M | За запрос | 1 000 запросов | OpenRouter, 1 000 запросов |
|---|---|---|---|---|---|
| GLM-5.3-Flash | $0.02 | $0.04 | $0.000022 | $0.022 | $0.0433 |
| DeepSeek-V4-Flash | $0.015 | $0.10 | $0.000045 | $0.0445 | $0.077 |
| MiniMax-M2.7 | $0.05 | $0.15 | $0.000075 | $0.075 | $0.90 |
300 входных и 400 выходных токенов на запрос. Цены за 1M токенов актуальны и меняются вместе с нашими тарифами; столбец OpenRouter показывает справочные цены для той же нагрузки.
Если не работает#
- 401. Ключ не задан или неверный. Выведите, задана ли переменная (проверка в коде это делает) и убедитесь, что
dotnet runзапущен в том же терминале, где вы выполнилиexport(или$env:): переменная живёт только в этом сеансе. - 404. Чаще всего дело в id модели: короткое имя вместо полного
deepseek-или endpoint безai/ DeepSeek- V4- Flash- 0731 /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.



