必要な3つの値
OpenAI互換のクライアントは、すべて同じ3つの値を求めます。このサービスに必要な値は以下の通りです。
| 設定 | 値 |
|---|---|
| ベース URL | https://api.getcodexapi.com/v1 |
| API キー | API キーページからのキー |
| モデル | uncensored |
キーは Authorization: Bearer YOUR_KEY として送信されます。呼び出せるエンドポイントは POST /v1/chat/completions と GET /v1/models の2つです。これは独立したサービスで1つのオープンウェイトモデルを実行しており、OpenAI の Codex ではありません。そのため、同じ設定に OpenAI 固有のエンドポイントや OpenAI キーを貼り付けないでください。
curlで接続を確認する
アプリの設定を編集する前に、ターミナルからAPI キーとURLが機能することを確認してください。モデルの一覧表示は最もコストの低いチェックで、プロンプトが必要ありません:
curl https://api.getcodexapi.com/v1/models \
-H "Authorization: Bearer YOUR_API_KEY"
モデル uncensored を含むJSONリストが取得できるはずです。その後、1つの生成リクエストを送信してください。
curl https://api.getcodexapi.com/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "uncensored",
"messages": [{"role": "user", "content": "Say hello in five words."}]
}'
両方の呼び出しが成功すれば、その後の失敗の原因はサービスではなくクライアント設定にあります。レスポンスヘッダーには、特定の呼び出しを追跡する必要がある場合に有用なX-Request-Idが含まれ、残りのクレジットを示すX-Balance-USDが含まれます。
OpenAI SDKを使用したPython
公式の openai パッケージは、クライアントのコンストラクタでベースURLを受け取ります。コードの他の部分は変更の必要ありません。
from openai import OpenAI
client = OpenAI(
base_url="https://api.getcodexapi.com/v1",
api_key="YOUR_API_KEY",
)
resp = client.chat.completions.create(
model="uncensored",
messages=[
{"role": "system", "content": "You are a concise assistant."},
{"role": "user", "content": "Explain what a base URL is in two sentences."},
],
)
print(resp.choices[0].message.content)
設定をコードから分離したい場合は、SDKは環境変数OPENAI_BASE_URLとOPENAI_API_KEYも読み取ります:
export OPENAI_BASE_URL="https://api.getcodexapi.com/v1"
export OPENAI_API_KEY="YOUR_API_KEY"
これらが設定されていれば、引数なしのOpenAI()がそれらを取得します。これは便利です。SDKをベースにしたサードパーティツールは、コード変更なしに同じ変数を継承するためです。
Node.js
JavaScript SDKは同じオプション名を使用し、baseURLと表記されます。
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.getcodexapi.com/v1",
apiKey: process.env.API_KEY,
});
const stream = await client.chat.completions.create({
model: "uncensored",
messages: [{ role: "user", content: "Write a haiku about version control." }],
stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}
ストリーミングはstream: trueでサーバー送信イベントとして返され、使用量は最後に含まれます。ストリーミングリクエストはストリーミングが完了するまで並行リクエストスロットの1つを占有するため、閉じずに放棄したストリームは制限に対してカウントされ続けます。
設定画面のあるアプリ
デスクトップツールやエディタは、フィールドを次の3つのいずれかでラベル付けすることが多いです。「Base URL」、「API Base」、または「OpenAI互換エンドポイント」。すべて同じ文字列を要求します。時間を節約するためのいくつかのメモ:
- ベンダー固有のものではなく、OpenAIまたは「カスタムOpenAI互換」プロバイダータイプを選択します。
- アプリにフリーテキストボックスがある場合は、モデル名を手動で入力してください。
uncensoredが正確なIDです。 - アプリに「接続テスト」ボタンがある場合、通常はモデル一覧を呼び出します。このAPIはそれをサポートしています。
- 一部のアプリは、以前のプロバイダーからモデル一覧をキャッシュします。ドロップダウンが正しくない場合は、古いエントリを削除して新しいエントリを追加してください。
特定のエディタでの具体的な例については、Cursorへの接続に関するガイド、または全体像を示す コーディングAPIページ を参照してください。パラメータの完全なリファレンスは APIドキュメント に記載されています。
接続が動作したら、URL、モデル名、API キー作成日など、後で見つけられる場所に正確な値を保存してください。チームは、古い値を保持した設定のコピーのために、後で1時間無駄にすることがよくあります。リポジトリに単一の共有例ファイル(実際のAPI キーの代わりにプレースホルダーを使用)を配置すると、これを防げます。
一般的なミスと修正方法
URLが/v1/v1になる
一部のクライアントは自動的に /v1 を付加します。リクエストが失敗し、クライアントログに /v1/v1/chat/completions といったパスが表示される場合は、入力したベースURLから /v1 を削除してください。その逆も同様です:これを付加しないクライアントの場合は、設定にこれを追加する必要があります。リクエストパスのログを確認すれば、すぐに解決します。
Base URLに完全なエンドポイントを入力した
Base URLは/v1で終わります。そこに/chat/completionsを入力しないでください。SDKは各呼び出しにパスを追加します。
末尾のスラッシュまたはホストのタイプミス
ほとんどのSDKは末尾のスラッシュを許容しますが、一部の古いツールはパスを単純な連結で構築し、二重スラッシュになります。奇妙な404レスポンスが表示される場合は、それを削除してください。
間違ったAPI キー、または別のサービスのAPI キー
OpenAIのAPI キーはここでは機能せず、こちらのAPI キーは他では機能しません。API キーエラーはほとんどがコピー&ペーストの問題(文字の欠落や末尾のスペースなど)を意味します。
curlでは動作するがアプリでは動作しない
curlは成功し、同じURLとAPI キーでアプリケーションが失敗する場合、違いは環境にあります。アプリがプロキシの背後で実行されているか、外部アクセスのないコンテナ内にあるか、他のプロジェクトから残った古い環境変数(例えばOPENAI_BASE_URL)を読み取っていないか、設定ファイルがコードで設定した値を上書きしていないかを確認してください。リクエスト直前にクライアントが呼び出す最終URLを出力すると、これらのケースのほとんどが1分以内に解決します。
HTTP 429
これは制限に達したことを意味します。エラーコードrate_limitedは1分あたりのリクエスト数を示し、concurrencyは一度に多すぎるリクエストを示します。完全なキーでは同時8リクエスト、1分あたり300リクエストまで許可され、トライアルキーでは同時2リクエスト、1分あたり60リクエストまでです。一時的な過負荷時には、Retry-After: 5ヘッダー付きの429も返されるため、5秒待ってから再試行してください。
LangChainとURLを一箇所に保持する
OpenAIクライアントをベースにしたフレームワークは同じ値を受け取ります。LangChainのOpenAI統合では、引数は次のように名前が付けられています:
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="uncensored",
base_url="https://api.getcodexapi.com/v1",
api_key="YOUR_API_KEY",
)
print(llm.invoke("Name three uses of a base URL.").content)
フレームワークが何であれ、URLをコード中に散在させないでください。環境変数または設定ファイルの1か所に配置し、そこから読み取ってください。そうすれば、試用版API キーと本番用API キーの間、またはマシン間で移動する際に、変更するのは1行だけで済みます。また、API キーをリポジトリから遠ざけることもできます。API キーは環境変数またはシークレットマネージャーに保存し、コミットされたファイルには保存しないでください。
OpenAI自身のCodex製品のEndpointをお探しの場合は、これがそれではありません。それらのBase URLとAPI キーはOpenAIによって文書化されているため、それらの現在のドキュメントに従ってください。このページのアドレスは独立したサービスのものであり、ここで発行されたAPI キーのみを受け入れます。
接続後に送信できる値
このエンドポイントはストリーミング、ツール呼び出し(tools、tool_choice、結果は role: "tool" メッセージとして返されます)、および response_format: {"type": "json_object"} によるJSONモードをサポートしています。パラメータ temperature、top_p、stop、seed およびペナルティはそのまま渡されます。コンテキストウィンドウはプロンプトと生成を合わせて100,000トークン、最大リクエストボディは8 MBです。
テキストのみです。画像や音声の生成、埋め込み、ファインチューニングはサポートしていないため、それらに依存するクライアント機能はこのベースURLでは動作しません。利用料はトークン単位で課金され、入力は100万トークンあたり$0.15、出力は100万トークンあたり$0.50です。料金ページに計算例があります。
