Torna al blog

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.

Di CheapTokens TeamPubblicato il 4 min di lettura

Copertina: C# e la libreria OpenAI .NET collegate all'endpoint CheapTokens
In questa pagina
  1. Cosa ti serve
  2. Crea l'app console
  3. Il codice, riga per riga
  4. Cosa dovresti vedere
  5. Passare un servizio esistente
  6. Quanto costa una richiesta
  7. Se non funziona

Per inviare una richiesta da C# a CheapTokens, mantieni la libreria ufficiale OpenAI per .NET e imposta OpenAIClientOptions.Endpoint su https://api.cheaptokens.dev/v1. Passa l'id completo del modello, ad esempio deepseek-ai/DeepSeek-V4-Flash-0731, 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://api.cheaptokens.dev/v1 (compatibile con OpenAI Chat Completions);
  • id del modello: deepseek-ai/DeepSeek-V4-Flash-0731. 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;
  • 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

bash
dotnet new console -o FirstRequest
cd FirstRequest

Aggiungi il pacchetto

bash
dotnet add package OpenAI

Metti la chiave in una variabile d'ambiente

In bash o zsh:

bash
export CHEAPTOKENS_API_KEY=your-key

In Windows PowerShell:

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.

Terminale con i cinque comandi che creano ed eseguono l'app console
I cinque comandi: crea il progetto, entra nella cartella, aggiungi il pacchetto, imposta la chiave, esegui.

Il codice, riga per riga#

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}");

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.ClientModel, 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.Content[0].Text. Il motivo di completamento è in completion.FinishReason.

Flusso: chiave dall'env, ChatClient con Endpoint, CompleteChat, testo e FinishReason
Cosa succede nel programma dalla chiave alla risposta stampata.

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.Stop). 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.Stop (il modello ha terminato da solo) e ChatFinishReason.ToolCalls (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

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

Dopo

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")
    });

Per richieste brevi c'è una seconda opzione: zai-org/GLM-5.3-Flash (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 Per richiesta 1000 richieste OpenRouter, 1000 richieste
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 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 run sia avviato nello stesso terminale in cui hai eseguito export (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-ai/DeepSeek-V4-Flash-0731, oppure un endpoint senza /v1 (controlla anche che OpenAIClientOptions sia davvero passato a ChatClient). 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.ClientModel; in cima a Program.cs.

La stessa idea in un altro linguaggio: la versione Go con openai-go.