JA ▾
API キーを取得

PythonでのCodex API:コーディング用LLMの呼び出し

最も簡単なCodex API Pythonのセットアップは、異なるベースURLを指す公式のOpenAIパッケージです。以下の例は、このOpenAI互換エンドポイントに対するコード生成、JSONモード、ツール呼び出し、ストリーミングをカバーしています。

更新日:

コードブロックからサーバーキューブに配線された光るケーブルで、コーディング用LLM APIへのPython呼び出しを示しています
クライアントをAPI Base URLに接続する様子を示す、ラップトップとサーバーキューブを結ぶ光るケーブル

主要ポイント

  • openaiパッケージをインストールし、base_urlをhttps://api.getcodexapi.com/v1に設定し、モデルをuncensoredに設定します。
  • コードとJSONには低い温度(0〜0.3)を、ブレインストーミングには高い温度を使用してください。
  • ツール呼び出し、JSONモード、ストリーミングはサポートされていますが、埋め込みはサポートされていません。
  • フルキーでは同時実行数を8に制限し、429レスポンスは短時間待機後にリトライしてください。

セットアップと最初の呼び出し

これは独立したOpenAI互換サービスであり、OpenAI自身のCodex APIではありません。単一のモデルはオープンウェイトでテキストのみ対応、コード生成・解説・リファクタリングのタスクには十分対応しますが、まだ確認が必要です。まず背景を知りたい場合は、OpenAI Codex APIのページで両者の関係について説明しています。

SDKをpip install openaiでインストールし、APIキーページでキーを作成して、実行します:

# pip install openai
from openai import OpenAI

client = OpenAI(base_url="https://api.getcodexapi.com/v1", api_key="YOUR_KEY")

resp = client.chat.completions.create(
    model="uncensored",
    messages=[
        {"role": "system", "content": "You are a senior Python developer. Reply with code only, no commentary."},
        {"role": "user", "content": "Write a function that parses an ISO 8601 date string and returns a datetime."},
    ],
    temperature=0.2,
)
print(resp.choices[0].message.content)

新規ユーザーの試用クレジット$0.50は、このような小さな呼び出しを数千回カバーできます。コードはランダム性が少ない方が有利なため、温度は0.2です。回答にマークダウンフェンスが含まれている場合は、コードで除去するか、システムメッセージで生テキストをリクエストしてください。base URLページ、Codex API base URLに正確なアドレスが再度記載されています。

実行可能なコードのプロンプト

いくつかの習慣は、どのパラメータよりも出力を改善します。

  • 言語とバージョンを明記する。「Python 3.11、標準ライブラリのみ」により推測を大幅に減らせます。
  • シグネチャを提供する。関数のヘッダーとドキュメント文字列を貼り付け、モデルに本文を埋め込ませてください。
  • 1つの入力と出力の例を示す。それは文章よりも境界ケースを明確にします。
  • 1つのことをリクエストする。関数を生成し、2回目の呼び出しでテストをリクエストしてください。
  • 編集にはdiffをリクエストする。ファイル全体の書き換えは出力トークンを消費し、それは入力よりも高コストです。

コンテキストウィンドウは100,000トークンで、max_tokensはオプションです。コードタスクでは、返信の余地を残して複数のモジュールを貼り付けることができます。max_tokensを設定するのは、出力が暴走する際の安全策としてのみ有用です。

構造化結果のためのJSONモード

コードが回答を消費する場合は、JSONモードを使用してください。これは出力を有効なJSONにしますが、スキーマを強制するわけではないため、プロンプトでキーを指定し、それらをチェックしてください。

import json
from openai import OpenAI

client = OpenAI(base_url="https://api.getcodexapi.com/v1", api_key="YOUR_KEY")

resp = client.chat.completions.create(
    model="uncensored",
    response_format={"type": "json_object"},
    messages=[
        {"role": "system", "content": "Return JSON with keys: name, args (list of strings), returns."},
        {"role": "user", "content": "Describe the signature of: def clamp(x, lo, hi)."},
    ],
    temperature=0,
)
data = json.loads(resp.choices[0].message.content)
print(data["name"], data["args"])

これをtry/exceptとjson.loadsの組み合わせ、および解析エラーを送り返す単一のリトライとペアにしてください。実際には、まれな不正なレスポンスを処理できます。温度を0にして、繰り返し実行が一致するようにしてください。

ツール呼び出し

ツールを使用すると、関数を記述し、モデルがいつ呼び出すかを判断します。関数を実行し、出力をtool roleで送り返します。これはすべてのコーディングエージェントの基盤です。

import json
from openai import OpenAI

client = OpenAI(base_url="https://api.getcodexapi.com/v1", api_key="YOUR_KEY")

tools = [{
    "type": "function",
    "function": {
        "name": "run_tests",
        "description": "Run the project's test suite and return the output.",
        "parameters": {
            "type": "object",
            "properties": {"path": {"type": "string"}},
            "required": ["path"],
        },
    },
}]

messages = [{"role": "user", "content": "Run the tests in tests/unit and tell me what failed."}]
first = client.chat.completions.create(model="uncensored", messages=messages, tools=tools, tool_choice="auto")
msg = first.choices[0].message

if msg.tool_calls:
    call = msg.tool_calls[0]
    args = json.loads(call.function.arguments)
    output = "2 passed, 1 failed: test_parse_empty"          # replace with a real runner
    messages.append(msg)
    messages.append({"role": "tool", "tool_call_id": call.id, "content": output})
    final = client.chat.completions.create(model="uncensored", messages=messages, tools=tools)
    print(final.choices[0].message.content)

生成されたコードは他の貢献と同様にテストしてください:実行し、リンティングし、プロンプトの変更が結果を悪化させることに気づけるよう、既知の良好な出力を持つ小さなプロンプトスイートを持ってください。バージョンを比較する間はseedと温度を固定してください。

注:ツール説明は短く、文字通り(リテラル)に保ち、何かを実行する前に引数を検証し、モデルの出力をシェルに直接渡さないでください。ループでは、tool_callsが存在する間に呼び出しを繰り返し、最大ステップ数で停止します。各ステップで履歴を再送信するため、10ステップの実行は約10倍のコンテキストに対して課金されます。

ストリーミングと429時のリトライ

インタラクティブツールでは、トークンが到着するたびにストリーミングします。使用量はストリームの最後にあり、コストロギングが容易になります。

import time
from openai import OpenAI, RateLimitError

client = OpenAI(base_url="https://api.getcodexapi.com/v1", api_key="YOUR_KEY", max_retries=0)

def ask(prompt, tries=4):
    for attempt in range(tries):
        try:
            stream = client.chat.completions.create(
                model="uncensored",
                messages=[{"role": "user", "content": prompt}],
                stream=True,
                stream_options={"include_usage": True},
            )
            text = []
            for chunk in stream:
                if chunk.choices and chunk.choices[0].delta.content:
                    piece = chunk.choices[0].delta.content
                    text.append(piece)
                    print(piece, end="", flush=True)
                if chunk.usage:
                    print("\ntokens:", chunk.usage.prompt_tokens, chunk.usage.completion_tokens)
            return "".join(text)
        except RateLimitError:
            time.sleep(5 * (attempt + 1))
    raise RuntimeError("still rate limited")

ask("Explain Python generators in four sentences.")

そのリトライループの背後の制限:フルキーは8つの同時リクエストと1分あたり300、トライアルキーは2と60を許可します。制限を超えると、コードrate_limitedまたはconcurrency付きのHTTP 429が返されます。一時的な過負荷もRetry-After: 5ヘッダー付きで429を返します。例では、クライアントにmax_retries=0を設定し、ループで待機を制御します。ストリーミングされたリクエストはストリームが終了するまで同時実行的スロットを保持するため、常にストリームを消費または閉じてください。

大量の同時リクエストの実行

100の関数のテスト生成などのバッチジョブには同時実行数の制限が必要です。フルキーでは最大8ワーカーのスレッドプールを使用してください。

簡単なパターンは、ThreadPoolExecutor(max_workers=6)をaskを呼び出す関数にラップし、他の作業のために2つのスロットを空けておくことです。トライアルキーでは2ワーカーを使用してください。より大きな数を渡すと、APIは追加のリクエストにconcurrencyエラーで応答し、リトライループは作業ではなく待機に時間を費やします。非同期コードの場合、AsyncOpenAIを各呼び出しにasyncio.Semaphore(6)でラップしてください。これはスレッドなしで同じ制限を提供します。X-RateLimit-Limit-RequestsおよびX-RateLimit-Limit-Concurrencyレスポンスヘッダーは、キーの制限を示します。

コーディングワークロードのコスト

価格は1M入力トークンあたり$0.15、1M出力トークンあたり$0.50です。200の関数のユニットテストを生成すると仮定します。各呼び出しは1,500入力トークンを送り、700トークンを返します。入力:200 x 1,500 = 300,000トークン、または$0.045。出力:200 x 700 = 140,000トークン、または$0.07。合計:$0.115。

大規模ファイルのリファクタリングでは30,000トークンを入力し8,000トークンを出力します:1回あたり$0.0045 + $0.004 = $0.0085です。失敗または拒否されたリクエストは課金されず、クレジットは期限切れになりません。チャージは$20から、カードまたは暗号資産で支払い可能、$50以上で5%、$100以上で10%、$200以上で15%のボーナスがあります。詳細は価格表、パラメータ一覧はドキュメントをご覧ください。

質問と回答

標準的なopenai Pythonパッケージを使用できますか?

はい。base_urlをhttps://api.getcodexapi.com/v1に設定し、キーを渡してモデルID uncensoredを使用してください。

Pythonからツール呼び出しをサポートしていますか?

はい。tools と tool_choice を渡し、tool role で結果を返します。ストリーミングされた tool_calls も機能します。

構造化された出力を取得するには?

response_formatにtype json_objectを指定し、プロンプトでキーを指定し、コードで結果を検証してください。

非同期クライアントはありますか?

openaiパッケージにはAsyncOpenAIがあり、このbase URLで同じように動作します。フルキーでは同時実行数を8以下にしてください。

キーはフォーム 1 つで手に入ります

アカウントを作成し、キーをコピーし、ベースURLを変更します。これでセットアップは完了です。

API キーを取得