题记
在 OpenAI SDK 刚发布 v4.0 几天(发布 v4.2 几个小时)后,很巧合地进行了更新,于是成了第一批吃螃蟹的人……
此文原本应在更新、发布上线的当天(OpenAI SDK v4.2 发布后的第二天)进行总结并发布,或许,可以帮到一众同样遇到升级问题的小伙伴;然而,彼时正焦头烂额于权限设计、开发,也就因此拖延至今……
8月24日,在例行更新 npm 依赖时,恍然发现 OpenAI SDK 版本已经升级到 v4.x 了,而在冲动更新后,却发现控制台产生了一大推刺眼的异常日志。回过头去看 release notes,才发现这是一个破坏性的大版本更新,就这样,不得不被迫开始升级之路……
官方的迁移、升级文档参见:https://github.com/openai/openai-node/discussions/217。
对照着文档,却发现上面描述的“Automatic migration”并不能成功,无奈只能按照“Manual migration”的描述手动升级。涉及的改动主要有以下几点:
- 类型变化;
- API 变化(方法名、入参、响应格式等);
- 原生支持 stream 流式格式交互。
实际上,在 v3.x 版本中已经间接支持 stream 流式交互了,并且实际运行的效果也还算 OK,在自己看来,这个“升级”后的实现反倒有些“突兀”,但新版本至少解决了单个 token json 的完整传输问题,不会再像上个版本那样可能会被拆分成2个响应,需要手动进行字符串拼接。
总体上,新版本确实更为优雅,也更为合理。
以下是完整的升级过程:
1、类型引入
在 v3.x 版本中,是通过以下方式引入类型的:
typescriptCopy code- 1
- 2
import { Configuration, OpenAIApi } from 'openai';
import { CreateChatCompletionRequest, CreateChatCompletionResponse, Model } from 'openai/api';
import { Configuration, OpenAIApi } from 'openai';
import { CreateChatCompletionRequest, CreateChatCompletionResponse, Model } from 'openai/api';
在 v4.x 中,直接一行 import 即可:
typescriptCopy code- 1
import OpenAI from 'openai';
import OpenAI from 'openai';
然后,在实际使用时,如下调用:
typescriptCopy code- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
async init() {
...
this.openai = new OpenAI({
apiKey: this.openaiOptions['open_openai_api_key'],
// v3.x 版本中的参数名为 basePath
baseURL: this.openaiOptions['open_openai_api_base_path']
});
}
async sendMessage(param: OpenAI.Chat.ChatCompletionCreateParamsNonStreaming): Promise<OpenAI.Chat.ChatCompletion> {
...
return this.openai.chat.completions.create(param).catch((e) => {
...
});
}
async init() {
...
this.openai = new OpenAI({
apiKey: this.openaiOptions['open_openai_api_key'],
// v3.x 版本中的参数名为 basePath
baseURL: this.openaiOptions['open_openai_api_base_path']
});
}
async sendMessage(param: OpenAI.Chat.ChatCompletionCreateParamsNonStreaming): Promise {
...
return this.openai.chat.completions.create(param).catch((e) => {
...
});
}
2、API 变化
如上述示例,v3.x 版本中是类似如下方式调用:
typescriptCopy code- 1
- 2
- 3
- 4
- 5
- 6
this.openAI
.createChatCompletion(params)
.then((res) => res.data)
.catch((e) => {
...
});
this.openAI
.createChatCompletion(params)
.then((res) => res.data)
.catch((e) => {
...
});
其它所有的 API 都进行了同样的升级,包括listModels
等常用接口。具体的方法名、入参、出参等,请参阅官方文档,不再赘述。