类型错误:OpenAIApi不是一个构造函数

3
我遇到了错误。
const openai = new OpenAIApi({ key: apiKey });
               ^

TypeError: OpenAIApi is not a constructor

当我尝试使用Node.js(v16.7.0)创建OpenAI API时,我遵循了文档中的代码并安装了OpenAI API(v4.3.1)。
我使用的代码:
const { OpenAIApi } = require('openai');

const openai = new OpenAIApi({ key: apiKey });

我该如何解决这个问题?


也许再试一次npm install openai,并在执行完npm show openai version后检查版本是否兼容。 - undefined
4个回答

2

2
根据文档,您不必在导入的对象上使用解构运算符。
如果您忽略它,一切应该正常运行。
const OpenAIApi = require('openai');

const openai = new OpenAIApi({ key: apiKey });

UPD. 实际上所需的对象包含所需的类,它是 OpenAI。 因此,您必须指定正确的名称:
const { OpenAI } = require('openai');

const openai = new OpenAI({ key: apiKey });

UPD2. 正如评论中Polywhirl先生所提到的,还有第三种方法。那就是使用导入库对象内部的类。
const OpenAIApi = require('openai');

const openai = new OpenAIApi.OpenAI({ key: apiKey });

1
通过“spread”,我认为你的意思是“解构”。这是因为openai库有一个默认导出。 - undefined
@Mr.Polywhirl 嗯,把这个当作一个打字错误吧 :D - undefined
1
或者,你仍然可以导入整个库(不建议),并调用new OpenAIApi.OpenAI({ key: process.env.API_KEY })。假设你还应该使用dotenv来处理环境变量。更新:你仍然不需要解构。在导入时,你可以给默认导出命名任何你想要的名称。 - undefined
我已经将它应用到代码中,但出现了错误。错误:OPENAI_API_KEY环境变量缺失或为空;请提供该变量,或使用apikey选项实例化OpenAI客户端,例如new OpenAI({ apiKey: '我的apikey' }) - undefined
@JustineGwapo 这只是使用 dotenv 的一个示例。 - undefined
显示剩余2条评论

1
所有需要做的就是删除花括号(解构)。
const OpenAIApi = require('openai');

const openai = new OpenAIApi({ key: apiKey });

请注意,官方文档建议您按照示例用法将导入命名为OpenAI,但您可以根据自己的喜好随意命名。
如果您打开node_modules/openai/src/index.js,您会看到底部有exports.default = OpenAI;。这将class OpenAI extends Core.APIClient作为默认导出进行了导出。这意味着在导入库时,您可以随意命名它。
const FooBar = require('openai');

const openai = new FooBar({ key: apiKey });

可能会让人感到困惑的是,index.ts文件具有以下导出项。类和命名空间具有相同的名称。
export class OpenAI extends Core.APIClient {
  // ...
}

export namespace OpenAI {
  // Helper functions
  export import toFile = Uploads.toFile;
  // ...
}

export default OpenAI; // Add namespace functions as static methods to the class

这将编译为以下JS代码,因为在openai-node库的tsconfig.json中将esModuleInterop设置为true
exports.OpenAI = OpenAI;
exports.toFile = Uploads.toFile;
(function (OpenAI) {
  // Helper functions
  OpenAI.toFile = Uploads.toFile;
  // ...
})((OpenAI = exports.OpenAI || (exports.OpenAI = {})));
exports = module.exports = OpenAI;
exports.default = OpenAI;

更好的方法

适当地存储您的 API 密钥

  1. 安装 dotenv 作为依赖项
npm install dotenv

将以下文本翻译为中文:
  1. 在项目根目录下的.env文件中添加一个API_KEY
echo "API_KEY=" >> .env

更新服务器脚本
const dotenv = require('dotenv');
const OpenAI = require('openai');

dotenv.config() // Load the environment

const openai = new OpenAI({ key: process.env.API_KEY });

或者

您可以使用首选环境变量

echo "OPENAI_API_KEY=" >> .env

const dotenv = require('dotenv');
const OpenAI = require('openai');

dotenv.config() // Load the environment

const openai = new OpenAI(); // The key is picked-up automagically

const apiKey = process.env['apiKey']; 这段代码在我的程序中,而且值是正确的。 - undefined
1
@JustineGwapo 那么你目前有什么问题呢? - undefined

0
你必须更新你的package.json文件来指定v4版本。
 "openai": "^4.0.0"

运行 "npm install"。
之后,你可以使用:
const OpenAI = require("openai");
const openai = new OpenAI({
    apiKey: process.env.OPENAI_API_KEY,
});

更多信息:https://github.com/openai/openai-node/discussions/217

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接