Voltar ao blog

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.

Por CheapTokens TeamPublicado em 5 min de leitura

Capa: C# e a biblioteca OpenAI .NET conectados ao endpoint da CheapTokens
Nesta página
  1. O que você precisa
  2. Construa o app de console
  3. O código, linha por linha
  4. O que você deve ver
  5. Trocando um serviço existente
  6. Quanto custa uma requisição
  7. Se não funcionar

Para enviar uma requisição de C# para a CheapTokens, mantenha a biblioteca oficial OpenAI para .NET e defina OpenAIClientOptions.Endpoint como https://api.cheaptokens.dev/v1. Passe o id completo do modelo, por exemplo deepseek-ai/DeepSeek-V4-Flash-0731, 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://api.cheaptokens.dev/v1 (compatível com OpenAI Chat Completions);
  • id do modelo: deepseek-ai/DeepSeek-V4-Flash-0731. 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;
  • 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

bash
dotnet new console -o FirstRequest
cd FirstRequest

Adicione o pacote

bash
dotnet add package OpenAI

Coloque a chave em uma variável de ambiente

No bash ou zsh:

bash
export CHEAPTOKENS_API_KEY=your-key

No Windows PowerShell:

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.

Terminal com os cinco comandos que criam e executam o app de console
Os cinco comandos: criar o projeto, entrar na pasta, adicionar o pacote, definir a chave, executar.

O código, linha por linha#

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

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.ClientModel, 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.Content[0].Text. O motivo de término está em completion.FinishReason.

Fluxo: chave do env, ChatClient com Endpoint, CompleteChat, texto e FinishReason
O que acontece no programa, da chave à resposta impressa.

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.Stop). 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.Stop (o modelo terminou por conta própria) e ChatFinishReason.ToolCalls (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

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

Depois

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

Para requisições curtas há uma segunda opção: zai-org/GLM-5.3-Flash (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 Por solicitação 1.000 solicitações OpenRouter, 1.000 solicitações
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 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 run foi iniciado no mesmo terminal onde você executou export (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-ai/DeepSeek-V4-Flash-0731 completo, ou um endpoint sem /v1 (verifique também se OpenAIClientOptions é realmente passado para ChatClient). 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.ClientModel; está faltando no topo de Program.cs.

A mesma ideia em outra linguagem: a versão em Go com openai-go.