😸
TypeScriptでChatGPT APIを叩いてみる
やったこと
成果物
苦労したこと
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.json
のmodule
の指定と、tsconfig.json
のtarget
やmodule
の指定の組み合わせが悪さしてたみたい - 私の設定は以下
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