ブログに戻る

APIとSDKガイド

openai-dotnet を使った C# での最初のリクエスト: エンドポイント、キー、返信

C# コンソールアプリから最初のチャット補完を送信します: 公式 OpenAI .NET ライブラリで Endpoint を設定し、キーを環境変数から読み取り、返信と終了理由を出力します。

投稿者: CheapTokens Team公開日 読了時間 5 分

カバー: CheapTokens エンドポイントに接続された C# と OpenAI .NET ライブラリ
このページの内容
  1. 必要なもの
  2. コンソールアプリを作る
  3. コードを 1 行ずつ
  4. 表示されるはずのもの
  5. 既存のサービスを切り替える
  6. 1 リクエストのコスト
  7. うまくいかない場合

C# から CheapTokens にリクエストを送るには、公式の OpenAI .NET ライブラリをそのまま使い、OpenAIClientOptions.Endpoint を https://api.cheaptokens.dev/v1 に設定します。完全なモデル id(例えば deepseek-ai/DeepSeek-V4-Flash-0731)を渡し、キーは環境変数から読み取ります。ChatClient と CompleteChat の呼び出しは OpenAI のサンプルとまったく同じままです。

すでに OpenAI と通信する ASP.NET サービスがあり、残りのコードに触れずに別のエンドポイントとモデルを試したいとします。組み込む前に、よくある 3 つの失敗要因(キー、エンドポイント、モデル id)を小さなコンソールアプリで確認しましょう。ここで作るのはそれです。以下の詳細は、GitHub 上のライブラリの README(openai/openai-dotnet、2026 年 11 月 5 日確認)と CheapTokens のドキュメントに基づいています。ドキュメントページ にも同じベース URL が記載されています。

必要なもの#

パッケージは NuGet 上で OpenAI という名前です。2026 年 11 月 5 日時点の最新安定版は 2.15.0 です(変更履歴のエントリは 11 月 4 日付)。.NET 8 と .NET Standard 2.0 をターゲットにしており、README にはすべての .NET Standard 2.0 アプリケーションで動作するとあるので、古いプロジェクトでも問題ありません。

アプリには 3 つの値が必要です:

  • ベース URL: https://api.cheaptokens.dev/v1(OpenAI Chat Completions 互換)。
  • モデル id: deepseek-ai/DeepSeek-V4-Flash-0731。完全な id を使ってください。価格表の短い名前は受け付けられません。DeepSeek-V4-Flash は 380K のコンテキストウィンドウと回答あたり最大 32,768 出力トークンを持ち、時間帯を問わず単一価格です。
  • CheapTokens アカウントの API キー。環境変数に保存します。保存方法が不明な場合は、API キーを安全に保存する方法 をお読みください。

コンソールアプリを作る#

ステップバイステップ

プロジェクトを作成して実行する

コンソールプロジェクトを作成する

bash
dotnet new console -o FirstRequest
cd FirstRequest

パッケージを追加する

bash
dotnet add package OpenAI

キーを環境変数に入れる

bash または zsh の場合:

bash
export CHEAPTOKENS_API_KEY=your-key

Windows PowerShell の場合:

powershell
$env:CHEAPTOKENS_API_KEY = "your-key"

コードを貼り付けて実行する

Program.cs の内容を次のセクションのコードに置き換え、dotnet run を実行します。

コンソールアプリを作成して実行する 5 つのコマンドを表示したターミナル
5 つのコマンド: プロジェクトの作成、フォルダへの移動、パッケージの追加、キーの設定、実行。

コードを 1 行ずつ#

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

README では「プロキシまたはセルフホストの OpenAI 互換 LLM」向けにこのパターンが示されています。エンドポイントは OpenAIClientOptions に、キーは ApiKeyCredential に入れます(これは System.ClientModel に存在するため、最初の using が必要です)。先頭のチェックは独自のもので、変数が設定されていない場合に明確なメッセージを出します。

CompleteChat にプレーンな文字列を渡すと、1 つのユーザーメッセージを送信し、回答全体を待ちます。返信テキストは completion.Content[0].Text にあります。終了理由は completion.FinishReason にあります。

フロー: 環境変数からキー、Endpoint 付き ChatClient、CompleteChat、テキストと FinishReason
キーから出力される返信まで、プログラム内で何が起こるか。

表示されるはずのもの#

トークンについての短い説明と、終了理由を含む行が表示されるはずです。正常終了後は Stop です(README では FinishReason と ChatFinishReason.Stop を比較しています)。返信の文言は実行ごとに変わります。

読む価値があるのは 2 行目です。README では FinishReason を ChatFinishReason.Stop(モデルが自力で終了した)と ChatFinishReason.ToolCalls(モデルがツールを呼び出したい)と比較しています。通常のチャットで Stop 以外が返ってきた場合、回答は別の理由で終了しており、よくある原因は長さ制限です。文の途中で止まる返信が表示された場合は、この記事で finish_reason と max_tokens を説明しています。

既存のサービスを切り替える#

サービスがすでに OpenAI 用の ChatClient を作成している場合、変更するのは 2 つだけです: モデル文字列とオプションです。残りの呼び出しはそのまま動作します。

比較する

同じクライアント、変更は 2 行

変更前

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

変更後

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

短いリクエストには 2 つ目の選択肢があります: zai-org/GLM-5.3-Flash(390K コンテキスト、最大 8,192 出力トークン)。変更するのは model 文字列だけです。キーで使用できる id の一覧は 1 回のリクエストで取得できます。GET /v1/models でモデルを一覧表示する を参照してください。

1 リクエストのコスト#

サービスが 1 日 1,000 リクエストを処理し、各リクエストが約 300 入力トークン、400 出力トークンだとします。そのようなリクエスト 1 回のコストは DeepSeek-V4-Flash で $0.000045 です。以下の表は、同じ 1,000 リクエストを 3 つのモデルすべてで OpenRouter と並べて示しています。入力と出力を合計すると、DeepSeek-V4-Flash は OpenRouter より安くなります。最新の価格は価格ページにあり、DeepSeek ページにはモデルが提供する内容が記載されています。

モデル リクエストあたり 1,000 リクエスト OpenRouter、1,000 リクエスト
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 入力トークンと 400 出力トークン。100万トークンあたりの価格は現行のもので、当社の料金体系に合わせて変動します。OpenRouter 列は同じワークロードの参考価格を示しています。

うまくいかない場合#

  • 401。 キーが欠落しているか間違っています。変数が設定されているかどうかを出力し(コード内のチェックがこれを行います)、dotnet run が export(または $env:)を実行したのと同じターミナルで起動されていることを確認してください。変数はそのセッションにのみ存在します。
  • 404。 最も多いのはモデル id です: 完全な deepseek-ai/DeepSeek-V4-Flash-0731 の代わりに短い名前を使っている、または /v1 のないエンドポイントを使っている(OpenAIClientOptions が実際に ChatClient に渡されていることも確認してください)。詳細は API 401 または 404: キー、ベース URL、モデル id の誤り にあります。
  • error CS0246: 型または名前空間名 'ApiKeyCredential' が見つかりませんでした。 Program.cs の先頭に using System.ClientModel; 行がありません。

別の言語での同じ内容: openai-go を使った Go 版。