CUBE SUGAR CONTAINER

技術系のこと書きます。

OpenAI の Web API を使い始める

最近は OpenAI 互換の Web API が、LLM の機能を提供する上でデファクトに近い方法となっているように思う。 そこで、今回は本家の OpenAI の Web API を使い始めるまでの内容を自分用のメモを兼ねて残しておく。

使った環境は次のとおり。

$ sw_vers         
ProductName:        macOS
ProductVersion:     15.5
BuildVersion:       24F74
$ uname -srm
Darwin 24.5.0 arm64
$ curl --version
curl 8.7.1 (x86_64-apple-darwin24.0) libcurl/8.7.1 (SecureTransport) LibreSSL/3.3.6 zlib/1.2.12 nghttp2/1.64.0
Release-Date: 2024-03-27
Protocols: dict file ftp ftps gopher gophers http https imap imaps ipfs ipns ldap ldaps mqtt pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: alt-svc AsynchDNS GSS-API HSTS HTTP2 HTTPS-proxy IPv6 Kerberos Largefile libz MultiSSL NTLM SPNEGO SSL threadsafe UnixSockets
$ python -V
Python 3.12.11
$ pip list | grep -i openai               
openai            1.90.0

もくじ

OpenAI Platform について

OpenAI の Web API を利用する際の料金体系は、ChatGPT のサブスクリプションとは分離されている。 また、Web API に関する管理は OpenAI Platform というサービスを使うことになる。

platform.openai.com

Web API を利用するには、上記のサービスにあらかじめ前払いでクレジットを登録しておく必要がある。 Web API を利用することで生じた料金は、前払いしたクレジットの中から支払われる。

Organization を作る

OpenAI Platform を利用するには、まず Organization を作成する必要があるようだ。 現時点 (2025-06-21) の UI であれば、右上にある「Start Bulding」のボタンを押下する。 特に何も入力しないでウィザードを進めると Organization name が「Personal」になる。 個人による利用であれば、それで特に問題ないはず。 また、Organization の配下にデフォルトのプロジェクトとして「Default」も同時に作られるようだ。

クレジットを追加する

前述した通り Web API はクレジットが無いと使えない。 そこで、まずは「Settings > Billing」の画面でクレジットを追加する。

platform.openai.com

「Add payment details」ボタンを押下するとクレジットカードの登録画面が出てくる。 自身のカードの情報を入力したら、追加するクレジットをドルで指定する。 クレジットが少なくなったときに自動でチャージする設定は不要であればオフにする。

API トークンを作る

Web API を呼び出す際には OpenAI Platform のアカウントとの紐づけが必要になる。 そのために、API トークンを作成する。

platform.openai.com

現時点の UI であれば右上の「Create new secret key」を押下して作成する。 API トークンは作成したタイミングで一度しか表示されない。 忘れずにパスワードマネージャなどに記録しておこう。

curl(1) から Web API を呼び出す

まずは curl(1) を使って呼び出してみる。

先ほど発行したトークンを、シェルのセッション変数に取り込む。 パスワードなどのセンシティブな情報を扱うときは read コマンドと -s オプションを用いると良い。 こうすれば入力した内容がコマンドの履歴に残らない。

$ read -s OPENAI_API_KEY

上記を実行したら、先ほど記録したトークンをターミナルにペーストする。

現時点で最もベーシックな Web API として Chat Completions を試してみよう。 Chat Completions API のリファレンスは以下にある。

platform.openai.com

なお、今だと状態 (ステート) を API 側で管理してもらえる Chat Completions with Responses という API もあるようだ。 従来の API は状態を持たないステートレスだったので、クライアント側ですべて管理する必要があった。 Responses の API では、その点が改善されているようだ。 ただし、今回は使わない。

リファレンスの内容を元に curl(1) で HTTP リクエストを作る。 先ほどセッション変数に入れたトークンは Authorization ヘッダの Bearer 以降に指定する。 model キーにはモデルの名称を入力する。 messages にはロール毎の指示を入力する。 たとえば "role": "developer" の指示は、"role": "user" の入力に関係なく従うべき内容と解釈される。

$ curl -X POST https://api.openai.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "model": "gpt-4.1",
    "messages": [
      {
        "role": "developer",
        "content": "あなたは親切なアシスタントです"
      },
      {
        "role": "user",
        "content": "こんにちは!"
      }
    ]
  }'

結果は次のような JSON として得られる。

{
  "id": "chatcmpl-XXX...",
  "object": "chat.completion",
  "created": 1750480953,
  "model": "gpt-4.1-2025-04-14",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "こんにちは!😊  \nどうぞ、なんでもお気軽にご相談ください。",
        "refusal": null,
        "annotations": []
      },
      "logprobs": null,
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 23,
    "completion_tokens": 16,
    "total_tokens": 39,
    "prompt_tokens_details": {
      "cached_tokens": 0,
      "audio_tokens": 0
    },
    "completion_tokens_details": {
      "reasoning_tokens": 0,
      "audio_tokens": 0,
      "accepted_prediction_tokens": 0,
      "rejected_prediction_tokens": 0
    }
  },
  "service_tier": "default",
  "system_fingerprint": "fp_51e1070cf2"
}

なお、クレジットが無い状態で呼び出すと次のようなエラーになる。

{
    "error": {
        "message": "You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.",
        "type": "insufficient_quota",
        "param": null,
        "code": "insufficient_quota"
    }
}

Python から Web API を呼び出す

次は公式の Python パッケージを使って Web API を呼んでみよう。

まずは openai パッケージをインストールする。

$ pip install openai

また、先ほどトークンをセッション変数 OPENAI_API_KEY に格納してあった。 これを、プロセスが fork した後の Python プロセスからも使えるように環境変数にする。

$ export OPENAI_API_KEY

openai パッケージは環境変数 OPENAI_API_KEY が定義されていると自動的に読んでくれる。

そして、Python インタプリタを起動する。

$ python

openai.OpenAI クラスをインスタンス化する。

>>> from openai import OpenAI
>>> client = OpenAI()

openai.OpenAI#chat.completions.create() メソッドを使って Chat Completions API を呼び出す。

>>> completion = client.chat.completions.create(
...   model="gpt-4.1",
...   messages=[
...     {"role": "developer", "content": "あなたは親切なアシスタントです"},
...     {"role": "user", "content": "こんにちは!"}
...   ]
... )

レスポンスを確認すると、ちゃんと結果が得られていることが確認できる。

>>> completion
ChatCompletion(id='chatcmpl-XXX...', choices=[Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content='こんにちは!😊  \n何かお手伝いできることはありますか?', refusal=None, role='assistant', annotations=[], audio=None, function_call=None, tool_calls=None))], created=1750477841, model='gpt-4.1-2025-04-14', object='chat.completion', service_tier='default', system_fingerprint='fp_51e1070cf2', usage=CompletionUsage(completion_tokens=17, prompt_tokens=23, total_tokens=40, completion_tokens_details=CompletionTokensDetails(accepted_prediction_tokens=0, audio_tokens=0, reasoning_tokens=0, rejected_prediction_tokens=0), prompt_tokens_details=PromptTokensDetails(audio_tokens=0, cached_tokens=0)))

いじょう。


[asin:B085BG8CH5:detai