题记

在 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”的描述手动升级。涉及的改动主要有以下几点:

  1. 类型变化;
  2. API 变化(方法名、入参、响应格式等);
  3. 原生支持 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等常用接口。具体的方法名、入参、出参等,请参阅官方文档,不再赘述。

3、流式响应(Streaming response)