OpenAI Streams 项目介绍
项目概述
OpenAI Streams 是一个旨在通过流方式返回 OpenAI API 响应的库。与传统的 API 调用不同,这个项目将数据以流的形式展示,使得在信息到达时即可即时显示结果。这种方式特别适用于希望实时更新的应用场景,比如文本生成等。此外,该库已经为 ChatGPT API 提供了支持,Whisper 支持也即将推出。
项目特性
- 优先化流处理:项目侧重于通过流来处理数据,因此在数据完成前即可以动态显示生成结果。
- 自动加载 API 密钥:默认情况下,自
process.env
加载OPENAI_API_KEY
,用户也可以通过选项传递 API 密钥。 - 简化的功能调用:提供单一函数,以匹配用户指定的 API 端点自动推断参数类型。
项目针对浏览器、Edge Runtime 和 Node 18+ 环境默认使用 ReadableStream
,而针对 NodeJS 的 Readable
版本则通过 openai-streams/node
提供。
安装方法
使用以下命令可以快速安装该库:
yarn add openai-streams
# 或者使用
npm i --save openai-streams
使用方法
使用该库调用 OpenAI 接口只需一行代码:
await OpenAI(
/** 'completions', 'chat' 等 API 端点 */
ENDPOINT,
/** 参数比如 max_tokens, temperature, messages 等 */
PARAMS,
/** 其他选项比如 apiBase, apiKey, mode 等 */
OPTIONS
);
首先,用户需要设置 OPENAI_API_KEY
环境变量,或者通过 { apiKey }
选项传递 API 密钥。如果无法找到该密钥,程序将会抛出错误。建议在process.env
中安全地保存此变量。
调用接口方面,通过指定端点endpoint
可以自动推断参数类型,例如,针对 "edits"
端点,会强制执行 import('openai').CreateEditRequest
。
边缘浏览器与 Node 的实现
在边缘环境,比如 Next.js Edge 函数中,该库同样兼容。用户可以在浏览器中手动输入 OpenAI 密钥,并通过 { apiKey }
选项传递使用。
import { OpenAI } from "openai-streams";
export default async function handler() {
const stream = await OpenAI("completions", {
model: "text-davinci-003",
prompt: "Write a happy sentence.\n\n",
max_tokens: 100,
});
return new Response(stream);
}
export const config = {
runtime: "edge",
};
对于无法使用 Edge 运行时的应用,或者出于其他需求想使用 Node.js 流的,可以使用 openai-streams/node
。
import type { NextApiRequest, NextApiResponse } from "next";
import { OpenAI } from "openai-streams/node";
export default async function test(_: NextApiRequest, res: NextApiResponse) {
const stream = await OpenAI("completions", {
model: "text-davinci-003",
prompt: "Write a happy sentence.\n\n",
max_tokens: 25,
});
stream.pipe(res);
}
ChatGPT API 的使用
默认情况下,在 mode = "tokens"
时,仅会收到消息的增量变化。若需完整事件,可以设置 mode = "raw"
。在一些应用场景中,这样的实时流式信息处理将显得尤为重要。
const stream = await OpenAI("chat", {
model: "gpt-3.5-turbo",
messages: [
{
role: "system",
content: "You are a helpful assistant that translates English to French.",
},
{
role: "user",
content: 'Translate the following English text to French: "Hello world!"',
},
],
});
重要提示
在流内部,通常通过生成器进行处理,例如使用 for await (const chunk of yieldStream(stream)) { ... }
。这种模式对于流程序设计是直观且高效的,推荐用户遵循此方式进行开发。
综上所述,OpenAI Streams 项目为开发者提供了一种流式处理的优雅方案,使得通过 OpenAI API 进行生成式任务时更加灵活和高效。