o3・o4-mini の API を Node.js（OpenAI 公式の TypeScript・JavaScript ライブラリ）で試す

:::note warn
2025/4/17時点での o3 の API利用について、Tier によりますが、認証プロセスを必要とする場合があるようです（↓こちらで書いた Tier が 1〜3 の場合）

●OpenAI の o3 の API の利用条件【公式情報より】： Tier が 1〜3 の場合は「API Organization Verification」が必要 - Qiita
　https://qiita.com/youtoy/items/7e7807d7af704154eb67
:::


## はじめに
直近では以下をやっていた、OpenAI の新モデルを API経由で試す話です。

●GPT-4.1 を Node.js（OpenAI 公式の TypeScript・JavaScript ライブラリ）で試してみる - Qiita
　https://qiita.com/youtoy/items/8b233a29fd6c711b22ec

### 今回試すモデル

今回試すのは、登場したばかりの「o3」「o4-mini」です。

●Introducing OpenAI o3 and o4-mini | OpenAI
　https://openai.com/index/introducing-o3-and-o4-mini/

#### 公式のプレイグラウンド

今朝方、[OpenAI API の Prompts Playground]() で、新しいモデルが選べそうなことは確認していました。

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


## 実際に試す

実際に Node.js を使って試していきます。

手っ取り早く試したかったので、公式が出している以下の「Get started with reasoning」の部分の「Responses API」を使ったサンプルコードを、ほぼそのまま使いました。

●Reasoning models - OpenAI API
　https://platform.openai.com/docs/guides/reasoning?api-mode=responses#get-started-with-reasoning

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/cfb1ab44-8479-4c4f-a81c-1d7b28b670c5.png)

いちおう、[API Reference の Responses API の部分](https://platform.openai.com/docs/api-reference/responses/create)も見たりもしました。


### コード

コードは以下のとおりです。

```javascript
import OpenAI from "openai";

const openai = new OpenAI();

const prompt = `
'[1,2],[3,4],[5,6]' という形式で表された行列を受け取り、
同じ形式で転置行列を出力する Bash スクリプトを書いてください。ß
`;

const response = await openai.responses.create({
  model: "o4-mini",
  reasoning: { effort: "medium" },
  input: [
    {
      role: "user",
      content: prompt,
    },
  ],
});

console.log(response.output_text);
```

o3 のお試しは、上記の `model: "o4-mini"` を `model: "o3"` に変えただけのものを使いました。


### 出力

以下、それぞれのモデルに関して API経由で得られたレスポンスです。


#### o3

o3 のほうの結果を、以下に画像で掲載してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/825b0e42-2983-43c7-829c-9dcfcefc5e20.png)

再度、試してみたものを以下にテキストで掲載してみます。

```txt
以下のスクリプトは、  
'[1,2],[3,4],[5,6]' のような文字列を受け取り、  
'[1,3,5],[2,4,6]' のように転置した行列を同じ書式で出力します。

```bash
#!/usr/bin/env bash
# transpose.sh
# 使い方:
#   echo '[1,2],[3,4],[5,6]' | ./transpose.sh
#   ./transpose.sh '[1,2],[3,4],[5,6]'

# 1. 引数があればそれを、無ければ標準入力を読む
if [[ -n $1 ]]; then
    input=$1
else
    read -r input
fi

# 2. 空白を除去
input=${input//[[:space:]]/}

# 3. 行ごとに分割し、角カッコを外す
#    例) '[1,2],[3,4]' → 1,2\n3,4
rows=$(sed 's/\],\[/\n/g; s/\[//g; s/\]//g' <<<"$input")

# 4. awk で転置
echo "$rows" |
awk -F',' '
{
    for (c = 1; c <= NF; c++) {
        data[c, NR] = $c      # data[列,行] ← 値
    }
    max_col = (NF > max_col) ? NF : max_col
    max_row = NR
}
END {
    for (c = 1; c <= max_col; c++) {
        printf "["
        for (r = 1; r <= max_row; r++) {
            printf "%s", data[c, r]
            if (r < max_row) printf ","
        }
        printf "]"
        if (c < max_col) printf ","
    }
    printf "\n"
}'
｀｀｀

動作例
｀｀｀
$ echo '[1,2],[3,4],[5,6]' | ./transpose.sh
[1,3,5],[2,4,6]
｀｀｀

ポイント
1. sed で  
   ・行ベクトル間の `],[` を改行に置換  
   ・全ての `[` と `]` を削除  
2. awk で (列,行) の順に 2 次元配列へ格納し、  
   最後に列優先で取り出すことで転置を実現。
```

※ 上記の出力中の「```」を全角（｀｀｀）に変えています



#### o4-mini

o4-mini のほうの結果も、以下にテキストで掲載してみます。

```txt
以下の Bash スクリプトは、引数（あるいは標準入力）で渡された

  '[1,2],[3,4],[5,6]'

といった形式の文字列をパースし、転置して同じ形式で出力します。

```bash
#!/usr/bin/env bash
set -euo pipefail

# 引数があればそこから、なければ標準入力から読む
if [ $# -gt 0 ]; then
  input="$1"
else
  read -r input
fi

# 先頭・末尾のシングル／ダブルクォートを剥がす
input="${input#[\"']}"
input="${input%[\"']}"

# "],[" をセミコロンに置き換え、先頭の [ と末尾の ] を削除
matrix="${input//],[/;}"
matrix="${matrix#\[}"
matrix="${matrix%\]}"

# セミコロンで行に分解
IFS=';' read -r -a rows <<< "$matrix"
R=${#rows[@]}

# １行目をカンマで分解して列数を得る
IFS=',' read -r -a tmp <<< "${rows[0]}"
C=${#tmp[@]}

# 配列 a[i,j] に格納
declare -A a
for ((i=0;i<R;i++)); do
  IFS=',' read -r -a cols <<< "${rows[i]}"
  for ((j=0;j<C;j++)); do
    a[$i,$j]="${cols[j]}"
  done
done

# 転置して組み立て
out=""
for ((j=0;j<C;j++)); do
  row=""
  for ((i=0;i<R;i++)); do
    row+="${a[$i,$j]}"
    if [ $i -lt $((R-1)) ]; then
      row+=","
    fi
  done
  out+="[${row}]"
  if [ $j -lt $((C-1)) ]; then
    out+=","
  fi
done

echo "$out"
｀｀｀

使い方例:

$ chmod +x transpose.sh  
$ ./transpose.sh '[1,2],[3,4],[5,6]'  
[1,3,5],[2,4,6]  

── もしくは標準入力経由でも:

$ echo '[1,2],[3,4],[5,6]' | ./transpose.sh  
[1,3,5],[2,4,6]
```

※ 上記の出力中の「```」を全角（｀｀｀）に変えています



### ダッシュボードで API の利用履歴を見てみる

確認のため、OpenAI のダッシュボードで API の利用履歴を見てみました。

「Usage の Chat Completions（ https://platform.openai.com/usage/chat-completions ）」を開いたところ、以下のように「o4-mini-2025-04-16」「o3-2025-04-16」の利用履歴が確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/358bb115-27e6-48d3-a59d-2b139183ab19.png)

## モデルに関する公式情報

### 各モデルのページ

モデルに関する公式情報のページのリンクも掲載しておきます。


#### o3

●【o3】Model - OpenAI API
　https://platform.openai.com/docs/models/o3


#### o4-mini

●【o4-mini】Model - OpenAI API
　https://platform.openai.com/docs/models/o4-mini


### モデルの違いについて

以下は「o3、o3-mini、o4-mini、o1 pro」の機能の違いに関する表です。


●Using OpenAI o-series models and GPT-4o models on ChatGPT | OpenAI Help Center
　https://help.openai.com/en/articles/9824965-using-openai-o-series-models-and-gpt-4o-models-on-chatgpt

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/554d5b57-e3d1-4bc2-9378-6b30db4d2677.png)