😸

TypeScriptでChatGPT APIを叩いてみる

2023/04/02に公開

やったこと

成果物

苦労したこと

async 関数の外で await の使用

  • async 関数の外で await を使用する場合、SyntaxError が発生するので、参考サイトのコードのままだと実行できない
  • すぐに呼び出される非同期関数(async function)を定義することで回避
;(async () => {
    const res = await chatCompletion(messages);
    console.log(res?.content);
})()

Cannot find name 'fetch'

  • 以下の部分でfetchを利用しているが、参考サイトのコードのままだとCannot find name 'fetch'で怒られる
const res = await fetch("https://api.openai.com/v1/chat/completions", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      Authorization: `Bearer {openai_key}`,
    },
    body,
});
  • node-fetchをインポートしてあげればOK
import fetch from "node-fetch"

Error [ERR_REQUIRE_ESM]: require() of ES Module

  • ↑でOKって書いたけど、node-fetchのバージョンによってはError [ERR_REQUIRE_ESM]: require() of ES Moduleで怒られる
  • CommonJSでビルドされた最後のバージョンであるnode-fetch@2.6.6をインストールして回避
yarn add node-fetch@2.6.6
yarn add -D @types/node-fetch@2.x

ReferenceError: exports is not defined in ES module scope

  • 1番時間かかったのがこれ
  • 根本原因をズバッとは言えないんだけど、package.jsonmoduleの指定と、tsconfig.jsontargetmoduleの指定の組み合わせが悪さしてたみたい
  • 私の設定は以下
package.json
{
  "name": "20230402_typescript_chatgpt",
  "version": "1.0.0",
  "description": "",
  "module": "module",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "npx ts-node ./src/index.ts"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "node-fetch": "2.6.6"
  },
  "devDependencies": {
    "@types/node": "^18.15.11",
    "@types/node-fetch": "2.x"
  }
}
package.json
{
    "ts-node": {
        "esm": true,
        "experimentalSpecifierResolution": "node"
    },
    "compilerOptions": {
      "target": "ESNext",
      "module": "CommonJS",
      "sourceMap": true,
      "outDir": "./dist",
      "rootDir": "./src",
      "strict": true,
      "moduleResolution": "node",
      "baseUrl": "src",
      "esModuleInterop": true,
      "experimentalDecorators": true,
      "emitDecoratorMetadata": true,
      "skipLibCheck": true,
      "forceConsistentCasingInFileNames": true,
      "allowJs": true,
    },
    "include": ["src/**/*"],
    "exclude": ["dist", "node_modules"],
    "compileOnSave": false
  }
  • このへんはもう少しお勉強が必要だなと思った

注意点

  • openAI の key はくれぐれも push しないように…
  • index.tsだけでなく、コンパイルしたindex.jsも注意

Discussion