OpenAI の o3-mini の API を Node.js でシンプルに試す

:::note info 
【2025/3/13 に追記】
[2025/3/6 以降は、Tier 1 以上であれば o3-mini の API は使える状態](https://x.com/OpenAIDevs/status/1897414494286176333)です
:::

:::note warn 
【※ 記事執筆時点の記載です】
OpenAI の o3-mini の API の利用に関して、記事執筆時点では、リリース直後と同様に「tier 3 から tier 5 のユーザーのみ利用可能」となっています。

↓こちらは、公式のヘルプセンターからの抜粋です。
●API access to o1 and o3-mini | OpenAI Help Center
https://help.openai.com/en/articles/10362446-api-access-to-o1-and-o3-mini

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/9c7740ee-3d14-57de-5f23-d1cfe26da8f7.png)
:::

## はじめに
以下の記事の中でも話題に出していた、OpenAI の「o3-mini の API」に関する話です。

●OpenAI o3-mini を API で利用しようとした話（利用できていない原因も記載）と tier 1 を tier 3 にした課金の話 - Qiita
 https://qiita.com/youtoy/items/f0c3ce457c52fe18733e

o3-mini が発表された後、tier 3 にしていた自分のアカウントで、ようやく o3-mini の API を使えるようになったのでサクッと試してみたのですが、その時の流れのメモという感じの記事です。

### API を使えたことの確認
今回のお試しをやってみた際、[OpenAI のアカウントのダッシュボードのページ（Usage の activity）](https://platform.openai.com/usage/activity)で、履歴から o3-mini の API が使われているかを念のため確認しています。

その時のポストは以下です。

https://x.com/youtoy/status/1887144977911951619

API の利用履歴の中で、「o3-mini-2025-01-31」を使った履歴が出ているのが分かります。

## 試してみる
### 参照元
今回のお試しで参照する情報は、以下の公式のページです。

●Reasoning models - OpenAI API
 https://platform.openai.com/docs/guides/reasoning

![2025-02-05_23-16-06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/8a81e269-d4c0-af29-21b5-04c5e0803e61.jpeg)

[このページ冒頭のクイックスタート](https://platform.openai.com/docs/guides/reasoning#quickstart)で、curl・Python・JavaScript のサンプルを見ることができます。

それらのサンプルの中の「JavaScript のサンプル」を元にして、今回のお試しをやってみます。

![2025-02-05_23-16-51.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/e69d5de8-1cb3-736a-2250-ba6343f6f7cb.jpeg)

またモデル名・それついて書かれた公式ページに関する情報は、[上で掲載していた記事の「o3-mini を API で試そうとして調べた情報」という部分](https://qiita.com/youtoy/items/f0c3ce457c52fe18733e#o3-mini-%E3%82%92-api-%E3%81%A7%E8%A9%A6%E3%81%9D%E3%81%86%E3%81%A8%E3%81%97%E3%81%A6%E8%AA%BF%E3%81%B9%E3%81%9F%E6%83%85%E5%A0%B1)で書いているため、ここでは省略します。

## お試し用のコード
今回、公式の JavaScript のサンプルを使いますが、そこで利用されている以下のパッケージを用います（npmコマンドでインストールしておきます）。

●openai - npm
　https://www.npmjs.com/package/openai

また、上記を使う場合に APIキーを「OPENAI_API_KEY」という名称の環境変数に保存しておけば、それを勝手に参照してくれるようになっています。

今回は、その環境変数を使う部分で、以下の記事で書いていた Node.js標準の機能を使ってみています。

●【小ネタ】Node.js v21.7.0 の新機能で環境変数用のファイル読みこみを軽く試す： process.loadEnvFile() - Qiita
　https://qiita.com/youtoy/items/ae838cacd43b3c3e61e1

（[以前も OpanAI の API を試す際に、試しに使ったことがあるものです](https://qiita.com/youtoy/items/3844c6904b6a39fdad64)）

### 実装した内容
まず、実装した内容は以下のとおりです。

今回の実装では、環境変数の読み込み・利用の処理順の関係で、 `process.loadEnvFile("./development.env");` は `const openai = new OpenAI();` よりも前に書いてある必要があるので、ご注意ください。

```javascript
import OpenAI from "openai";

process.loadEnvFile("./development.env");
const openai = new OpenAI();

const prompt = `
【プロンプト】
`;

const completion = await openai.chat.completions.create({
  model: "o3-mini",
  reasoning_effort: "medium",
  messages: [
    {
      role: "user",
      content: prompt,
    },
  ],
  store: true,
});

console.log(completion.choices[0].message.content);
```

#### ファイルを使った環境変数の設定
今回のやり方における環境変数は、「development.env」という名前のファイルの中に書く形になります。具体的には、以下のようにしています。

```zsh:development.env
OPENAI_API_KEY="【自身の APIキー】"
```

このファイルがある場所で、nodeコマンドを使ってプログラムを実行すると、APIキーを使った o3-mini の API経由での利用が行えます。

#### 環境変数の設定
APIキーの環境変数への設定については、もちろんコマンドなどによる一時的な設定なども利用可能です。

例えば、[OpenAI 公式のクイックスタート内の「Create and export an API key」という部分](https://platform.openai.com/docs/quickstart#create-and-export-an-api-key)では、Mac等や Windows での設定方法について書かれていたりします。

Mac の例は `export` を使った方法が示されており、「そのターミナルセッション内でのみ有効」となるような、一時的な設定を行う形です。

```zsh:【 macOS / Linux】
export OPENAI_API_KEY="【自身の APIキー】"
```

Windows の例は `setx` を使った永続化をする方法になっていますが、上記の Mac の例と同様に一時的な設定とする場合は `set` を使った以下のような形になるかと思います。

```powershell:【Windows】
set OPENAI_API_KEY "【自身の APIキー】"
```

### 実装内容に関する補足

#### Reasoning effort の説明
実装した内容の中で「Reasoning effort」を指定している部分があります。

この「Reasoning effort」が意味する内容について、[公式の説明](https://platform.openai.com/docs/guides/reasoning#reasoning-effort)で確認しておきます。公式の説明を以下に抜粋します。

![2025-02-05_23-27-06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/1d0d7734-3d4a-cd36-b463-0ed5b62254d1.jpeg)

意味するところをざっくりと日本語で書くと、以下のような感じになるかと思います。

- 「プロンプトへの応答を作成する前にどれだけの推論トークンを生成すべきかを、モデルに対して指示するためのもので、このパラメータには「low」「medium」「high」のいずれかを指定可能
   - low： 処理速度が速く、トークンの使用量が少ない
   - high： より詳細な推論を行うが、その分トークンの消費が増えて、また応答速度は遅くなる
   - medium（デフォルト）： 速度と推論の正確さのバランスを取った設定

medium がデフォルト値となるようなので、 `reasoning_effort: "medium"` とするのであれば、この部分を省略してしまっても medium が指定された状態になるようです。

#### Controlling costs
今回は指定してないですが、コストをコントロールできるパラメータもあります。

[公式ページの「Reasoning models ＞ Controlling costs」の部分](https://platform.openai.com/docs/guides/reasoning#controlling-costs)を見ると、以下の記載があります。

![2025-02-05_23-43-21.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/943780d7-ecd6-b4ce-3c71-23fc1b4c076b.jpeg)

ざっくり内容を見てみると、「モデルが生成するトークンの総数（推論用のトークンと応答のトークンの両方を含むもの）を制限するためのパラメータが max_completion_tokens」と書いています。

以前のモデルでは、max_tokens パラメータが「生成されるトークン数とユーザーに表示されるトークン数の両方を制御するパラメータ」だったものの、推論を行うモデルでは内部で使用される推論トークンも加わるために、別パラメータを指定する形になるようです。
※ 一部のアプリケーションで、max_tokens の値と API から受け取るトークン数が一致する前提で処理を行うものがある状況のため、そこで不整合が生じないよう、推論用のトークンを含む総量を扱うパラメータは別で作ったようです