【完走賞ゲット-24】OpenAI の ChatGPT の API を公式ライブラリの JavaScript版 を試す（使い方を ChatGPT に聞いてみたりも）

## はじめに
こちらは、[完走賞ゲットのため小ネタを毎日投稿しようとチャレンジする Advent Calendar 2022](https://qiita.com/advent-calendar/2022/youtoy) の 24日目の記事です。

今月のアドベントカレンダー用記事で、以下の 3記事で扱った OpenAI の ChatGPT の話です。

- [【KDDI Engineer&Designer】AI にブラウザ用の JavaScript のプログラムをいくつか作ってもらった話 ⇒ OpenAI の ChatGPT で生成されたプログラムの解析も少々 - Qiita](https://qiita.com/youtoy/items/8eacb1af28ac18301b74)
- [【完走賞ゲット-4】続・OpenAI の ChatGPT のネタ：JavaScript の特定の技術仕様を教えてもらう - Qiita](https://qiita.com/youtoy/items/a4d9f3b0736475d0770a)
- [【enebular 2022】ChatGPT用ノード「node-red-contrib-simple-chatgpt」を enebular・Node-REDで試したり API を Python から利用してみた話 - Qiita](https://qiita.com/youtoy/items/0afc3b97a1e1e057cf40)

基本的に、GUIベースで扱ってきたのですが、上記の enebular の記事に書いた内容では API を利用する方法も軽く試しました。

<blockquote class="twitter-tweet" data-conversation="none"><p lang="ja" dir="ltr">Python版で試す<br><br>●Libraries - OpenAI API<br>　<a href="https://t.co/IevGmxmWLj">https://t.co/IevGmxmWLj</a> <a href="https://t.co/fCdv1kEAzC">pic.twitter.com/fCdv1kEAzC</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1602444734865485824?ref_src=twsrc%5Etfw">December 12, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

その API を利用したやり方について、Node.js を使ったものを試して過程をメモとして残す、というのが今回の記事の内容です。

## ChatGPT を API 経由で利用する
### OpenAI の API を利用するためのシークレットキー
OpenAI の API を利用するためにはシークレットキーが必要です。

OpenAI のアカウントのメニュー（※ 画面左上のメニュー）の「View API keys」を選んで、その後のページでキーを生成してください。既にキーを生成済みの方は、ここにキーのリストが表示されます。
![右上メニュー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/64345365-05d9-b09f-16ca-9f83c410425f.png)
![シークレットキーの確認画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/c0f7a014-dd10-e086-e448-2dacd3cd41ea.png)

### 公式ライブラリの情報を確認する
公式ライブラリの情報を確認します。
こちら⇒ https://beta.openai.com/docs/libraries/libraries にアクセスすると、[Python関連の内容](https://beta.openai.com/docs/libraries/python-bindings)と、[Node.js関連の内容](https://beta.openai.com/docs/libraries/node-js-library)を確認することができます。

![Python用](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/b29ef5b8-2e50-dcbf-fe1a-dd607b43743f.png)
![Node.js用](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/7e89dc42-c228-0d9e-e366-467a8c8ff83e.png)

それでは、Node.js のほうを実際に試してみます。

### ChatGPT に聞いてみる（Node.js版）
ここで、ふと、API の使い方を ChatGPT に聞いてみることもできるな、と思って試してみました。
※ こちらにて⇒ https://chat.openai.com/chat

以下が「Chat GPT の API を Node.js で使うためのプログラムを教えて」という内容に対して返ってきた答えです。
![聞いてみた結果1：Node.js](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/971737d0-2ba0-8c2e-8683-7b344e3bff54.png)
![聞いてみた結果2：Node.js](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/2253a609-1034-179e-f33d-2f4d745788f6.png)

読み込むパッケージが違っているような感じがします。それと、プログラムがひとまとめになってないので、プログラムの部分の出力はまとめてもらうような書き方にしてみました。
具体的には、「Chat GPT の API を Node.js で使うためのプログラムを教えて。プログラムはひとまとめにして書いてください。」という内容で、それに対する返答は以下となりました。

![再度聞いてみた結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/79dcf3c3-67ff-a49a-9ae7-efd16964db1f.png)

今度は、openai 関連のパッケージを使わない方向の話になっている...

上記が意図しない内容のため、「[openai - npm](https://www.npmjs.com/package/openai) を利用する」というのを明示してみることにしました。
以下は「Chat GPT の openai - npm を Node.js で使うためのプログラムを教えて。プログラムはひとまとめにして書いてください。」という内容に対する返答です。

![openai - npmを使うことを明示した際の返答1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/0ebce2c7-d8e3-fd4a-4f13-4f3b06df01e5.png)
![openai - npmを使うことを明示した際の返答2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/d9ea6107-540a-b918-de91-3dd32d599e34.png)

プログラムがひとまとめになってないですが、構文的には使えそうなものが返ってきた気がします。

```javascript
const openai = require('openai');

openai.apiKey = 'your_api_key';

const prompt = 'Hello, how are you today?';
const model = 'text-davinci-002';
const maxTokens = 128;

openai.completion.create({
  prompt,
  model,
  max_tokens: maxTokens
}, function(error, response) {
  if (error) {
    console.error(error);
  } else {
    console.log(response.text);
  }
});
```

ただし、以下の[公式ドキュメント](https://beta.openai.com/docs/libraries/node-js-library)の例とは差異があるようです...
（単純に古い情報が元になっていたり等なのか、そもそも、コードの内容が正しいものっぽく見えるだけのものなのかは不明ですが、今回は深追いしないことにします）

```javascript
const { Configuration, OpenAIApi } = require("openai");
const configuration = new Configuration({
  apiKey: process.env.OPENAI_API_KEY,
});
const openai = new OpenAIApi(configuration);
const response = await openai.createCompletion({
  model: "text-davinci-003",
  prompt: "Say this is a test",
  temperature: 0,
  max_tokens: 7,
});
```

### 公式情報をもとに  Node.js で API を使う
それでは、公式ドキュメントの例を使って API を試してみます。

以下が今回試す処理の内容です（※ サンプルに少し手を加えています）。

```javascript
const { Configuration, OpenAIApi } = require("openai");
const configuration = new Configuration({
  apiKey: process.env.OPENAI_API_KEY,
});
const openai = new OpenAIApi(configuration);

(async () => {
  const response = await openai.createCompletion({
    model: "text-davinci-003",
    prompt: "Chat GPTについて教えて。",
    temperature: 0,
    max_tokens: 100,
  });
  console.log(response.data.choices[0].text);
})();
```

上記を実行する前に `npm i openai` を実行して、パッケージをインストールしておいてください（※ 既に、Node.js が利用できる環境になっている想定です）。
また、とりあえずのお試しということで、一時的に環境変数にシークレットキーを設定する形で試します。 `export OPENAI_API_KEY=【OpenAI のシークレットキー】` も実行してから、上記のプログラムを nodeコマンドで実行しましょう。

実行してみた結果は以下のとおりです。

```zsh
% node app.js
GPT（Generative Pre-trained Transformer）は、自然言語処理（NLP）タスクを実行するためのオープンソースの自然言語処理モデルです。GPTは、大規模なテキストコーパ
```

`max_tokens: 100` というパラメータ指定があり、出力は途中で途切れていますが、うまく結果を取得できているようです。

### API経由で試した内容も GUI上で試してみる
最後に、API経由で行った内容を、ChatGPT のページ上（ https://chat.openai.com/chat ）でも試しておくことにします。

↓このような結果になりました。
![GUI上で試す（API経由で行ったことと同じ内容）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/78e89771-36b5-ebdb-07c5-cf5c84995959.png)