API e SDKGuia
Primeira requisição em C# com openai-dotnet: endpoint, chave, resposta
Envie sua primeira chat completion a partir de um app de console C#: defina o Endpoint na biblioteca oficial OpenAI .NET, leia a chave do env, imprima a resposta e o motivo de término.

Nesta página
Para enviar uma requisição de C# para a CheapTokens, mantenha a biblioteca oficial OpenAI para .NET e defina OpenAIClientOptions. como https:/. Passe o id completo do modelo, por exemplo deepseek-, e leia a chave de uma variável de ambiente. As chamadas ChatClient e CompleteChat permanecem exatamente como estão nos exemplos da OpenAI.
Digamos que você já tenha um serviço ASP.NET que conversa com a OpenAI e queira testar outro endpoint e modelo sem mexer no restante do código. Antes de conectar qualquer coisa nele, verifique as três coisas que costumam dar errado (chave, endpoint, id do modelo) em um pequeno app de console. É isso que construímos aqui. Os detalhes abaixo vêm do README da biblioteca no GitHub (openai/openai-dotnet, verificado em 5 de novembro de 2026) e da documentação da CheapTokens: a página de docs tem a mesma base URL.
O que você precisa#
O pacote se chama OpenAI no NuGet. A versão estável mais recente em 5 de novembro de 2026 é 2.15.0 (a entrada do changelog é de 4 de novembro). Ele tem como alvo .NET 8 e .NET Standard 2.0, e o README diz que funciona com todas as aplicações .NET Standard 2.0, então um projeto mais antigo também serve.
Três valores entram no app:
- base URL:
https:/(compatível com OpenAI Chat Completions);/ api. cheaptokens. dev/ v1 - id do modelo:
deepseek-. Use o id completo, o nome curto de uma tabela de preços não é aceito. O DeepSeek-V4-Flash tem janela de contexto de 380K e até 32.768 tokens de saída por resposta, um preço a qualquer hora do dia;ai/ DeepSeek- V4- Flash- 0731 - uma chave de API da sua conta CheapTokens, guardada em uma variável de ambiente. Se você não tem certeza de como armazená-la, leia como armazenar uma chave de API com segurança.
Construa o app de console#
Passo a passo
Crie o projeto e execute-o
Crie um projeto de console
dotnet new console -o FirstRequest
cd FirstRequestAdicione o pacote
dotnet add package OpenAIColoque a chave em uma variável de ambiente
No bash ou zsh:
export CHEAPTOKENS_API_KEY=your-keyNo Windows PowerShell:
$env:CHEAPTOKENS_API_KEY = "your-key"Cole o código e execute
Substitua o conteúdo de Program.cs pelo código da próxima seção e execute dotnet run.

O código, linha por linha#
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}");O README mostra este padrão para "um proxy ou um LLM auto-hospedado compatível com OpenAI": o endpoint vai em OpenAIClientOptions, a chave em um ApiKeyCredential (ela fica em System., daí o primeiro using). A verificação no topo é nossa: ela dá uma mensagem clara se a variável não estiver definida.
CompleteChat com uma string simples envia uma mensagem de usuário e espera a resposta inteira. O texto da resposta está em completion.. O motivo de término está em completion..

O que você deve ver#
Você deve receber uma breve explicação sobre tokens e uma linha com o motivo de término; após um fim normal, é Stop (o README compara FinishReason com ChatFinishReason.). O texto da resposta muda de execução para execução.
A segunda linha é a que vale a pena ler. O README compara FinishReason com ChatFinishReason. (o modelo terminou por conta própria) e ChatFinishReason. (o modelo quer chamar uma ferramenta). Qualquer coisa diferente de Stop em um chat simples significa que a resposta terminou por outro motivo, e o suspeito de sempre é um limite de comprimento. Se você vir uma resposta que para no meio da frase, este artigo explica finish_reason e max_tokens.
Trocando um serviço existente#
Se o seu serviço já cria um ChatClient para a OpenAI, você muda duas coisas: a string do modelo e as opções. O restante das chamadas continua funcionando.
Comparar
Mesmo cliente, duas linhas alteradas
Antes
ChatClient client = new(
model: "your-current-model",
credential: new ApiKeyCredential(apiKey));Depois
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")
});Para requisições curtas há uma segunda opção: zai- (contexto de 390K, até 8.192 tokens de saída). Você só muda a string model. Uma lista de ids que sua chave pode usar está a uma requisição de distância, veja Liste modelos com GET /v1/models.
Quanto custa uma requisição#
Digamos que um serviço processe 1.000 requisições por dia, cada uma com cerca de 300 tokens de entrada e 400 tokens de saída. Uma dessas requisições custa $0.000045 no DeepSeek-V4-Flash. A tabela abaixo mostra as mesmas 1.000 requisições nos três modelos ao lado do OpenRouter. No total, com entrada e saída contadas juntas, o DeepSeek-V4-Flash é mais barato que o OpenRouter. Os preços atuais estão na página de preços, e a página do DeepSeek lista o que o modelo oferece.
| Modelo | Entrada $/1M | Saída $/1M | Por solicitação | 1.000 solicitações | OpenRouter, 1.000 solicitações |
|---|---|---|---|---|---|
| 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 tokens de entrada e 400 tokens de saída por solicitação. Os preços por 1M de tokens são atuais e mudam junto com nossas tarifas; a coluna OpenRouter mostra preços de referência para a mesma carga de trabalho.
Se não funcionar#
- 401. A chave está ausente ou errada. Imprima se a variável está definida (a verificação no código faz isso) e certifique-se de que
dotnet runfoi iniciado no mesmo terminal onde você executouexport(ou$env:): a variável existe apenas naquela sessão. - 404. Na maioria das vezes é o id do modelo: um nome curto em vez do
deepseek-completo, ou um endpoint semai/ DeepSeek- V4- Flash- 0731 /v1(verifique também seOpenAIClientOptionsé realmente passado paraChatClient). Os detalhes estão em API 401 ou 404: chave, base URL ou id de modelo errados. - error CS0246: The type or namespace name 'ApiKeyCredential' could not be found. A linha
using System.está faltando no topo deClientModel; Program.cs.
A mesma ideia em outra linguagem: a versão em Go com openai-go.



