API e SDKGuida
Prima richiesta in C# con openai-dotnet: endpoint, chiave, risposta
Invia il tuo primo chat completion da un'app console C#: imposta l'Endpoint nella libreria ufficiale OpenAI .NET, leggi la chiave dall'env, stampa la risposta e il motivo di completamento.

In questa pagina
Per inviare una richiesta da C# a CheapTokens, mantieni la libreria ufficiale OpenAI per .NET e imposta OpenAIClientOptions. su https:/. Passa l'id completo del modello, ad esempio deepseek-, e leggi la chiave da una variabile d'ambiente. Le chiamate ChatClient e CompleteChat restano esattamente come negli esempi di OpenAI.
Supponi di avere già un servizio ASP.NET che parla con OpenAI e di voler provare un altro endpoint e un altro modello senza toccare il resto del codice. Prima di collegare qualsiasi cosa, verifica le tre cose che di solito vanno storte (chiave, endpoint, id del modello) in una piccola app console. È quello che costruiamo qui. I dettagli seguenti provengono dal README della libreria su GitHub (openai/openai-dotnet, verificato il 5 novembre 2026) e dalla documentazione di CheapTokens: la pagina della documentazione riporta lo stesso base URL.
Cosa ti serve#
Il pacchetto si chiama OpenAI su NuGet. La versione stabile più recente al 5 novembre 2026 è la 2.15.0 (la voce del changelog è datata 4 novembre). Supporta .NET 8 e .NET Standard 2.0, e il README afferma che funziona con tutte le applicazioni .NET Standard 2.0, quindi va bene anche un progetto più vecchio.
Tre valori vanno nell'app:
- base URL:
https:/(compatibile con OpenAI Chat Completions);/ api. cheaptokens. dev/ v1 - id del modello:
deepseek-. Usa l'id completo, il nome breve di una tabella prezzi non è accettato. DeepSeek-V4-Flash ha una finestra di contesto di 380K e fino a 32.768 token di output per risposta, un unico prezzo a qualsiasi ora del giorno;ai/ DeepSeek- V4- Flash- 0731 - una chiave API del tuo account CheapTokens, conservata in una variabile d'ambiente. Se non sai come conservarla, leggi come conservare in sicurezza una chiave API.
Crea l'app console#
Passo dopo passo
Crea il progetto ed eseguilo
Crea un progetto console
dotnet new console -o FirstRequest
cd FirstRequestAggiungi il pacchetto
dotnet add package OpenAIMetti la chiave in una variabile d'ambiente
In bash o zsh:
export CHEAPTOKENS_API_KEY=your-keyIn Windows PowerShell:
$env:CHEAPTOKENS_API_KEY = "your-key"Incolla il codice ed esegui
Sostituisci il contenuto di Program.cs con il codice della sezione successiva, poi esegui dotnet run.

Il codice, riga per riga#
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}");Il README mostra questo schema per "un proxy o un LLM self-hosted compatibile con OpenAI": l'endpoint va in OpenAIClientOptions, la chiave in un ApiKeyCredential (vive in System., da cui il primo using). Il controllo in cima è nostro: fornisce un messaggio chiaro se la variabile non è impostata.
CompleteChat con una semplice stringa invia un messaggio utente e attende l'intera risposta. Il testo della risposta è in completion.. Il motivo di completamento è in completion..

Cosa dovresti vedere#
Dovresti ottenere una breve spiegazione dei token e una riga con il motivo di completamento; dopo una fine normale è Stop (il README confronta FinishReason con ChatFinishReason.). La formulazione della risposta cambia da un'esecuzione all'altra.
La seconda riga è quella che vale la pena leggere. Il README confronta FinishReason con ChatFinishReason. (il modello ha terminato da solo) e ChatFinishReason. (il modello vuole chiamare uno strumento). Qualsiasi cosa diversa da Stop in una chat semplice significa che la risposta è terminata per un altro motivo, e il sospetto abituale è un limite di lunghezza. Se vedi una risposta che si interrompe a metà frase, questo articolo spiega finish_reason e max_tokens.
Passare un servizio esistente#
Se il tuo servizio crea già un ChatClient per OpenAI, cambi due cose: la stringa del modello e le opzioni. Il resto delle chiamate continua a funzionare.
Confronta
Stesso client, due righe cambiate
Prima
ChatClient client = new(
model: "your-current-model",
credential: new ApiKeyCredential(apiKey));Dopo
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")
});Per richieste brevi c'è una seconda opzione: zai- (contesto 390K, fino a 8.192 token di output). Cambi solo la stringa model. Un elenco degli id che la tua chiave può usare è a una richiesta di distanza, vedi Elenca i modelli con GET /v1/models.
Quanto costa una richiesta#
Supponi che un servizio gestisca 1.000 richieste al giorno, ciascuna con circa 300 token in input e 400 token in output. Una richiesta così costa $0.000045 su DeepSeek-V4-Flash. La tabella seguente mostra le stesse 1.000 richieste su tutti e tre i modelli accanto a OpenRouter. In totale, contando insieme input e output, DeepSeek-V4-Flash è più economico di OpenRouter. I prezzi attuali sono sulla pagina dei prezzi, e la pagina di DeepSeek elenca cosa offre il modello.
| Modello | Input $/1M | Output $/1M | Per richiesta | 1000 richieste | OpenRouter, 1000 richieste |
|---|---|---|---|---|---|
| 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 di input e 400 token di output per richiesta. I prezzi per 1M di token sono attuali e cambiano insieme alle nostre tariffe; la colonna OpenRouter mostra i prezzi di riferimento per lo stesso carico di lavoro.
Se non funziona#
- 401. La chiave manca o è sbagliata. Stampa se la variabile è impostata (il controllo nel codice lo fa) e assicurati che
dotnet runsia avviato nello stesso terminale in cui hai eseguitoexport(o$env:): la variabile vive solo in quella sessione. - 404. Il più delle volte è l'id del modello: un nome breve invece dell'id completo
deepseek-, oppure un endpoint senzaai/ DeepSeek- V4- Flash- 0731 /v1(controlla anche cheOpenAIClientOptionssia davvero passato aChatClient). I dettagli sono in API 401 o 404: chiave, base URL o id del modello sbagliati. - error CS0246: The type or namespace name 'ApiKeyCredential' could not be found. Manca la riga
using System.in cima aClientModel; Program.cs.
La stessa idea in un altro linguaggio: la versione Go con openai-go.



