OpenAI o1-miniのAPIをNode.jsから触りつつ注意点の話

o1-previewとo1-miniのAPIが微課金（ソシャゲ感）でも利用できるようになった模様なので試してみます。

https://qiita.com/youtoy/items/676da2b32f7dc30e522f

**コピペして試してもそんなにお金かからないと思いますがお金は注意して試してください。**

## o1-previewやo1-miniのAPI

前はティアの影響で触れたなかったですが最近はVIP以外でも触れるようになったみたいなので触ってみたいと思います。

確認すると確かにTier1でも利用可能になっています。

> Free Tierの人は使えないみたいなので無課金オヂサンはダメっぽいです
> ![](https://i.gyazo.com/588042393f41c78007466b17f0e8fa8c.png)

### o1（preview）やo1-miniは推論が走るのでコスト注意

推論の仕組み上、`推論途中のReasoningトークン`と`結果の出力のCompletionトークン`を両方組み合わせた`max_completion_tokens`となる模様です。

https://note.com/npaka/n/n7c5709b99ddc?utm_source=chatgpt.com#769f828b-4432-49df-8ef6-aab695bf92c5

推論して推論して... って感じでトークン切れで結果出ないなー　ってなることもありそうですし、制限かけずに試して思わぬコストかかっちゃうこともありえそうです。

### コピペで試してみる

注意をしたところで試してみます。

```js
const { OpenAI } = require("openai");

const openai = new OpenAI({apiKey: `APIキー`});

(async () => {
    const prompt = `3*3は?`;
    const response = await openai.chat.completions.create({
        model: "o1-mini",
        max_completion_tokens: 1024,
        messages: [
          {
            role: "user",
            content: prompt
          },
        ],
    });
    
    console.log(response.choices[0].message);
})();
```

```bash
$ node o1.js
{ role: 'assistant', content: '3×3は9です。', refusal: null }
```

こんな感じで触れました。

## SDKのアップデートで今まで違うところ

o1のAPIを叩くときはmax_tokensだと上手く叩けなく、`Unsupported parameter: 'max_tokens' is not supported with this model. Use 'max_completion_tokens' instead.`とエラーがでました。

> ![スクリーンショット 2024-12-23 3.43.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/a8c3cbff-eaba-ca2b-a6bd-ca7b3033e5b2.png)

**max_tokensじゃなくてmax_completion_tokensを使いなさいと怒られます**

### 従来の書き方

```js
const { OpenAI } = require("openai");
const openai = new OpenAI({apiKey: `APIキー`});

(async () => {
    const prompt = `3*3は?`;
    const response = await openai.chat.completions.create({
        model: "gpt-4o", //他の箇所をこのままでo1-mini指定だとエラー
        max_tokens: 1024, //ここ
        messages: [
          {
            role: "user",
            content: [{ type: "text", text: prompt }], //ここ
          },
        ],
    });

    console.log(response.choices[0].message);
})();
```

また、少し前までcontentの指定も配列とオブジェクト指定でしたが、contentに直接文字列指定となった模様です。

OpenAIのSDKですがアップデートが激しくていつから更新されてたのかパッと分からなかったですがo1とo1-miniのAPIに対応するように変わったように思えます。

https://github.com/openai/openai-node/releases

### gpt-4oなどもmax_completion_tokensな書き方で良いぽい

- o1系: max_completion_tokens
- gpt-4oなど: max_tokens

って書き方めんどいからSDK側で吸収してくれって思って試したらすでに吸収してくれていました。

```js
const { OpenAI } = require("openai");
const openai = new OpenAI({apiKey: `APIキー`});

(async () => {
    const prompt = `3*3は?`;
    const response = await openai.chat.completions.create({
        model: "gpt-4o", //o1系の書き方にアップデートしておくとgpt-4o指定でも動作
        max_completion_tokens: 1024, //ここ
        messages: [
          {
            role: "user",
            content: prompt, //ここ
          },
        ],
    });

    console.log(response.choices[0].message);
})();
```

## max_completion_tokensが少ないとプロンプトによっては出力が空になってしまう現象

max_completion_tokensを1024にして試してましたが結果が空になってしまう現象がありました。

> contentが空...
> ![スクリーンショット 2024-12-23 4.10.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/854455ff-f976-4c82-1b7b-5d9e5610ce89.png)

コードの間違いかと思いましたが仕組みを考えるとそういうことです。

最初は"からあげととり天の違いを考察して"とプロンプトに入れてましたが、おそらく推論中のReasoningトークンのほうで1024トークンを使い切ってしまって出力が何もないという状態ですね。

`3*3は？`とシンプルで推論の余地もないプロンプトにして試したら結果まで出力されました。

## まとめ

試すときは計画的にしましょう。

少ないトークンで低コストで試すをしたい場合はシンプルな質問にするのが良いと思います。

SDKの指定の仕方は新しい書き方で揃えておくと良さそうですが更新が激しいのでまたしばらくしたら仕様が変わるもありそうですね。OpenAIのAPIやSDKは呼び出し方が結構がっつり変わることもあるので注意が必要ですね。

推論途中の様子はストリーミングAPIとかを使うと取れるのかな（？）