DeepSeek API SDK:OpenAI SDK を使用しエンドポイントを切り替え
DeepSeek API SDK のセットアップに特別なクライアントのインストールは不要です。DeepSeek 互換 API は OpenAI 形式に従うため、異なるベース URL で OpenAI SDK が動作します。この事実により、3 つの値を変更するだけで別のエンドポイントに切り替えることができます。

主要ポイント
- OpenAI Python および Node SDK は、OpenAI 互換のエンドポイントで動作します。ベース URL、キー、モデル名を変更することで利用できます。
- これらの 3 つの値を環境変数に保持することで、エンドポイントの切り替えにコード編集が必要なくなります。
- プロバイダーの切り替えは、単純なチャット、ストリーミング、ツール呼び出しでは安全ですが、モデル固有の機能に依存する前にテストしてください。
- このエンドポイントには https://api.deepseekapi.top/v1 とモデル ID uncensored を使用します。
なぜ OpenAI SDK が DeepSeek API SDK なのか
人々がDeepSeek API SDKを検索する場合、ベンダー名が記載されたパッケージを期待します。実際、DeepSeek 自身のドキュメントでは、API が OpenAI のリクエストおよびレスポンス形式に従っているため、異なるベース URL を使用して OpenAI SDK を介して API を呼び出す方法が説明されています。正確なベース URL とモデル名については、最新のドキュメントをご確認ください。それらは自社のサービスに関する権威ある情報源です。
この結果は有用です。OpenAI クライアントライブラリに対して書かれたコードは、同じエンドポイント(ここでは POST /v1/chat/completions、POST /v1/responses、GET /v1/models)を実装する任意のサーバーと通信できます。プロバイダー間の移動は書き換えではなく設定変更になります。この記事の残りの部分では、Python、Node、curl でのパターン、および切り替えを容易にする構造を示します。
Python セットアップ
公式パッケージをインストールし、エンドポイントを指定します:
pip install openai
from openai import OpenAI
client = OpenAI(
base_url="https://api.deepseekapi.top/v1",
api_key="YOUR_KEY",
)
resp = client.chat.completions.create(
model="uncensored",
messages=[
{"role": "system", "content": "You are a concise technical assistant."},
{"role": "user", "content": "Explain idempotency in two sentences."},
],
)
print(resp.choices[0].message.content)
print(resp.usage)
API キーページでキーを取得します。新規ユーザーはカードなしでワンクリックで $0.50 のトライアルクレジットを取得できます。この言語についてさらに詳しく解説する(エラー処理などを含む)内容は、DeepSeek API Python 記事 を参照してください。
Node.js セットアップ
npm install openai
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.deepseekapi.top/v1",
apiKey: process.env.API_KEY,
});
const stream = await client.chat.completions.create({
model: "uncensored",
stream: true,
messages: [{ role: "user", content: "List four uses of a message queue." }],
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}
パターンは同じです:ベース URL、キー、モデル。ストリーミングは Server-Sent Events を返し、ライブラリはそれらを非同期イテレータに変換します。ツール呼び出しは他の OpenAI 互換 API と同じスキーマに従います:tools を渡し、ストリーミングされた tool_calls を読み取り、結果を role: "tool" メッセージとして返します。
エンドポイントを切り替え可能にする
3 つの値をハードコードしないでください。環境から読み取り、クライアントの作成を 1 つの関数でラップします。そうすれば、あるエンドポイントから別のエンドポイントへの移動は、ソースコードではなく .env ファイルを編集するだけで済みます。
import os
from openai import OpenAI
def make_client():
return OpenAI(
base_url=os.environ.get("LLM_BASE_URL", "https://api.deepseekapi.top/v1"),
api_key=os.environ["LLM_API_KEY"],
)
MODEL = os.environ.get("LLM_MODEL", "uncensored")
def ask(prompt: str) -> str:
r = make_client().chat.completions.create(
model=MODEL,
messages=[{"role": "user", "content": prompt}],
temperature=0.7,
)
return r.choices[0].message.content
異なるプロバイダーに切り替える場合、環境変数は3つだけで済みます。公式 SDK の一部のバージョンではOPENAI_API_BASEおよびOPENAI_API_KEYも読み取られますが、明示的な変数の方が明確であり、複数のプロバイダーを同時に実行する際に予期せぬ事態を避けることができます。
TypeScript や他の言語を使用する場合でも、アイデアは同じです:1 つのファクトリ関数、3 つの変数、コードベース全体にプロバイダー名を散らばせないこと。よくあるミスは、ベンダー名が関数名、ログメッセージ、変数名に漏れ出すことです。これは後の切り替えを必要以上に困難にします。プロバイダーではなく、仕事の内容(ask、summarise)で名前を付けてください。
固定されたプロンプトを ask() 経由で送信し、空でない応答が返されることを確認する小さなテストを保持してください。エンドポイント変更のたびに実行し、間違った URL やキーを数秒で見つけましょう。
切り替え時に変わらない点と変わる点
| 項目 | 変わらない点 | 変更される可能性のある点 |
|---|---|---|
| リクエストの構造 | メッセージ、ロール、温度、top_p、stop | プロバイダーがサポートしていないオプションパラメータ |
| ストリーミング | データチャンクを含む SSE | ストリーム内での使用状況の表示場所 |
| ツール呼び出し | tools、tool_choice、tool_calls | モデルがスキーマに従う度合い |
| モデル名 | 必須フィールド | 値そのもの:ここでは uncensored です |
| コンテキスト長 | プロンプトと補完 | サイズ:ここでは 100,000 トークン |
| 動作 | チャット形式 | スタイル、強み、拒否動作 |
最後の行で多くの人がつまずきます。エンドポイントはプロトコルレベルでは互換性がありますが、動作レベルではありません。2 つのプロバイダーは同一のリクエストを受け付け、非常に異なる回答を与えることがあります。ここで提示されているモデルは、独立したプロバイダーによる単一のオープンウェイトモデルであり、合法的な成人向け利用に対してコンテンツ拒否なしで回答するようにチューニングされています。これは DeepSeek や他のラボの公式 API ではありません。他のモデル向けにチューニングしたプロンプトを再テストしてください。
このエンドポイントが持つ機能と持たない機能
- 対応機能:チャット補完、Responses形式、モデル一覧、ストリーミング、ツール呼び出し、JSONモード(
response_formatにjson_objectを指定)、temperature、top_p、stop、seed、ペナルティのパススルー。 - 提供なし: 画像、音声、動画の生成、埋め込み、ファインチューニング。
- 制限: 100,000 トークンのウィンドウ、最大 8 MB のボディ、8 同時リクエスト、フルキーあたり 1 分間に 300 リクエスト(トライアルキーはそれぞれ 2 および 60)。
- エラー: HTTP 429(コード
rate_limitedまたはconcurrency)、一時的な過負荷時にRetry-After: 5ヘッダー。
コードが埋め込みエンドポイントを呼び出す場合、その部分には別のプロバイダーが必要で、チャットはここで維持できます。タスクごとの分割は、上記の環境変数パターンの一般的な理由です。
マイグレーションチェックリスト
既存のプロジェクトで 1 つのエンドポイントを別のエンドポイントに切り替える際は、すべてを一度に変更するのではなく、短いリストに従って進めてください。
- エンドポイントを検証する。 curl で 1 つのリクエストを送信し、テキストが返されることを確認します。
GET /v1/modelsを呼び出し、iduncensoredがリストされていることを確認します。 - 3 つの値を変更する。 ベース URL、キー、モデル名のみ。それ以外は触れないでください。まだプロンプトは変更しないでください。
- 既存のテストを実行する。 プロンプト回帰テストがある場合は実行し、失敗したものを記録してください。失敗は通常、プロトコルエラーではなく、異なる出力形式などの動作面です。
- パラメータを確認する エンドポイントに不要なオプションは削除してください。温度、top_p、stop、seed は使用している場合に限り維持してください。
- ストリーミングとツールを個別にテストする ストリーミングのバグは、特定のチャンクレイアウトを前提とするクライアントコードに潜んでいることがよくあります。ツール呼び出しにはモデルが適切に追従するスキーマが必要なので、実際の関数でテストしてください。
- 実際のトラフィックでコストとレイテンシを測定する 1つのプロンプトではなく、1日分のリクエストを比較してください。
これはブランチまたは機能フラグを使用して、少量のトラフィックを新しいエンドポイントにルーティングする形で実施してください。クライアントコードが共有されているため、ロールバックは環境変数を変更するだけですみます。
リトライと使用状況の処理
SDK はデフォルトで一部の失敗を再試行しますが、本番環境では同時実行数の制限が実際に存在するため、429 は自身で処理する必要があります。レート制限の例外をキャッチし、Retry-Afterに指定された秒数(過負荷時は 5)待ってから、数回再試行してください。失敗したリクエストは課金対象外となるため、再試行は残高に対して安全です。
すべての呼び出しで usage.prompt_tokens と usage.completion_tokens をログに記録してください。料金は入力トークン 100 万トークンあたり $0.15、出力トークン 100 万トークンあたり $0.50 です。したがって、入力 2,000 トークン、出力 600 トークンの呼び出しのコストは、2,000 × $0.15 / 1M + 600 × $0.50 / 1M = $0.0003 + $0.0003 = $0.0006 となります。レスポンスヘッダーには、残高クレジットを示す X-Balance-USD も含まれています。チャージやボーナスについては 料金ページ を、パラメータの全リストについては ドキュメント を参照してください。
エディタやその他のツール
これら3つの値は、OpenAI 互換のプロバイダー設定を持つあらゆるツールに引き継がれます。Cursor で DeepSeek 風 API を使用するに関する記事では、そのようなエディターの設定手順を解説しています。各ツールではフィールドのラベルが若干異なりますが、常に末尾が/v1となるベース URL、キー、モデル名を入力します。
その他のガイド
質問と回答
公式の DeepSeek SDK をインストールする必要がありますか?
ベンダー固有のパッケージは不要です。DeepSeek は OpenAI SDK を異なるベース URL で使用する方法を文書化しています。現在の詳細については、彼らのドキュメントをご確認ください。
このエンドポイントを使用するために変更する必要がある 3 つの値は何ですか?
ベース URL(https://api.deepseekapi.top/v1)、API キー、およびモデル ID uncensored。
既存の OpenAI コードは変更せずにそのまま動作しますか?
チャット、ストリーミング、JSON モード、ツール呼び出しは同じ形式に従うため、基本的に同じです。ただし、埋め込み、画像、音声は提供されておらず、モデルが異なるため回答も異なります。
SDK はキーを正しく送信しますか?
はい、SDK は Authorization: Bearer ヘッダーにキーを自動的に設定して送信します。