API i SDKPrzewodnik
Pierwsze żądanie w C# z openai-dotnet: endpoint, klucz, odpowiedź
Wyślij pierwsze uzupełnienie czatu z aplikacji konsolowej C#: ustaw Endpoint w oficjalnej bibliotece OpenAI .NET, odczytaj klucz ze zmiennej środowiskowej, wypisz odpowiedź i powód zakończenia.

Na tej stronie
Aby wysłać żądanie z C# do CheapTokens, zachowaj oficjalną bibliotekę OpenAI dla .NET i ustaw OpenAIClientOptions. na https:/. Podaj pełny identyfikator modelu, na przykład deepseek-, a klucz odczytaj ze zmiennej środowiskowej. Wywołania ChatClient i CompleteChat pozostają dokładnie takie, jak w przykładach OpenAI.
Załóżmy, że masz już usługę ASP.NET, która komunikuje się z OpenAI, i chcesz wypróbować inny endpoint i model bez ruszania reszty kodu. Zanim cokolwiek do niej podłączysz, sprawdź w małej aplikacji konsolowej trzy rzeczy, które zwykle idą nie tak (klucz, endpoint, identyfikator modelu). To właśnie budujemy tutaj. Poniższe szczegóły pochodzą z README biblioteki na GitHubie (openai/openai-dotnet, sprawdzone 5 listopada 2026) oraz z dokumentacji CheapTokens: strona dokumentacji podaje ten sam bazowy URL.
Czego potrzebujesz#
Pakiet nazywa się OpenAI w NuGet. Najnowsza stabilna wersja na 5 listopada 2026 to 2.15.0 (wpis w changelogu jest datowany na 4 listopada). Obsługuje .NET 8 i .NET Standard 2.0, a README mówi, że działa ze wszystkimi aplikacjami .NET Standard 2.0, więc starszy projekt też jest w porządku.
Do aplikacji trafiają trzy wartości:
- bazowy URL:
https:/(zgodny z OpenAI Chat Completions);/ api. cheaptokens. dev/ v1 - identyfikator modelu:
deepseek-. Używaj pełnego identyfikatora, krótka nazwa z tabeli cen nie jest akceptowana. DeepSeek-V4-Flash ma okno kontekstu 380K i do 32 768 tokenów wyjściowych na odpowiedź, jedna cena o każdej porze dnia;ai/ DeepSeek- V4- Flash- 0731 - klucz API z Twojego konta CheapTokens, trzymany w zmiennej środowiskowej. Jeśli nie wiesz, jak go przechowywać, przeczytaj jak bezpiecznie przechowywać klucz API.
Zbuduj aplikację konsolową#
Krok po kroku
Utwórz projekt i uruchom go
Utwórz projekt konsolowy
dotnet new console -o FirstRequest
cd FirstRequestDodaj pakiet
dotnet add package OpenAIUmieść klucz w zmiennej środowiskowej
W bashu lub zsh:
export CHEAPTOKENS_API_KEY=your-keyW Windows PowerShell:
$env:CHEAPTOKENS_API_KEY = "your-key"Wklej kod i uruchom
Zastąp zawartość Program.cs kodem z następnej sekcji, a następnie uruchom dotnet run.

Kod, linia po linii#
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 pokazuje ten wzorzec dla "proxiego lub samodzielnie hostowanego LLM zgodnego z OpenAI": endpoint trafia do OpenAIClientOptions, klucz do ApiKeyCredential (znajduje się w System., stąd pierwszy using). Sprawdzenie na górze jest nasze: daje jasny komunikat, jeśli zmienna nie jest ustawiona.
CompleteChat ze zwykłym stringiem wysyła jedną wiadomość użytkownika i czeka na całą odpowiedź. Tekst odpowiedzi jest w completion.. Powód zakończenia jest w completion..

Co powinieneś zobaczyć#
Powinieneś otrzymać krótkie wyjaśnienie tokenów i linię z powodem zakończenia; po normalnym zakończeniu to Stop (README porównuje FinishReason z ChatFinishReason.). Treść odpowiedzi zmienia się z każdym uruchomieniem.
Druga linia jest tą, którą warto przeczytać. README porównuje FinishReason z ChatFinishReason. (model zakończył samodzielnie) i ChatFinishReason. (model chce wywołać narzędzie). Cokolwiek innego niż Stop w zwykłym czacie oznacza, że odpowiedź zakończyła się z innego powodu, a zwykłym podejrzanym jest limit długości. Jeśli widzisz odpowiedź, która urywa się w połowie zdania, ten artykuł wyjaśnia finish_reason i max_tokens.
Przełączanie istniejącej usługi#
Jeśli Twoja usługa już tworzy ChatClient dla OpenAI, zmieniasz dwie rzeczy: string modelu i opcje. Reszta wywołań działa dalej.
Porównaj
Ten sam klient, dwie zmienione linie
Przed
ChatClient client = new(
model: "your-current-model",
credential: new ApiKeyCredential(apiKey));Po
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")
});Dla krótkich żądań jest druga opcja: zai- (kontekst 390K, do 8 192 tokenów wyjściowych). Zmieniasz tylko string model. Lista identyfikatorów, których może użyć Twój klucz, jest o jedno żądanie stąd, zobacz Lista modeli z GET /v1/models.
Ile kosztuje jedno żądanie#
Załóżmy, że usługa obsługuje 1000 żądań dziennie, każde około 300 tokenów na wejściu i 400 tokenów na wyjściu. Jedno takie żądanie kosztuje $0.000045 na DeepSeek-V4-Flash. Poniższa tabela pokazuje te same 1000 żądań na wszystkich trzech modelach obok OpenRouter. W sumie, licząc wejście i wyjście razem, DeepSeek-V4-Flash jest tańszy niż OpenRouter. Aktualne ceny są na stronie cen, a strona DeepSeek wymienia, co oferuje model.
| Model | Wejście $/1M | Wyjście $/1M | Za żądanie | 1000 żądań | OpenRouter, 1000 żądań |
|---|---|---|---|---|---|
| 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 tokenów wejściowych i 400 tokenów wyjściowych na żądanie. Ceny za 1 mln tokenów są aktualne i zmieniają się wraz z naszymi taryfami; kolumna OpenRouter pokazuje ceny referencyjne dla tego samego obciążenia.
Jeśli nie działa#
- 401. Brakuje klucza lub jest błędny. Wypisz, czy zmienna jest ustawiona (sprawdzenie w kodzie to robi) i upewnij się, że
dotnet runjest uruchomiony w tym samym terminalu, w którym uruchomiłeśexport(lub$env:): zmienna żyje tylko w tej sesji. - 404. Najczęściej identyfikator modelu: krótka nazwa zamiast pełnego
deepseek-albo endpoint bezai/ DeepSeek- V4- Flash- 0731 /v1(sprawdź też, czyOpenAIClientOptionsjest naprawdę przekazywany doChatClient). Szczegóły są w API 401 lub 404: zły klucz, bazowy URL lub identyfikator modelu. - error CS0246: The type or namespace name 'ApiKeyCredential' could not be found. Brakuje linii
using System.na górzeClientModel; Program.cs.
Ten sam pomysł w innym języku: wersja w Go z openai-go.



