OpenAI Streams
现在支持 ChatGPT API!请参见与 ChatGPT API 一起使用。(Whisper 即将推出!)
此库仅返回 OpenAI API 响应流。像 edits
等非流端点仅是带有一个块更新的流。
- 优先考虑流,因此您可以在完成时显示。
- 从
process.env
自动加载OPENAI_API_KEY
。 - 单一函数,基于您提供的端点推断参数类型。
默认情况下为浏览器、Edge 运行时和 Node 18+ 使用 ReadableStream
,在 openai-streams/node
处提供 NodeJS.Readable
版本。
安装
yarn add openai-streams
# -或者-
npm i --save openai-streams
使用方法
await OpenAI(
/** 'completions', 'chat' 等 */
ENDPOINT,
/** max_tokens, temperature, messages 等 */
PARAMS,
/** apiBase, apiKey, mode, controller 等 */
OPTIONS
);
-
设置
OPENAI_API_KEY
环境变量(或传递{ apiKey }
选项)。如果找不到 API 密钥,库将抛出错误。默认情况下,您的程序将在运行时从
process.env.OPENAI_API_KEY
加载它,但您可以通过{ apiKey }
选项覆盖此设置。重要: 出于安全考虑,您应仅从
process.env
变量加载。await OpenAI( "completions", { /* 端点参数 */ }, { apiKey: process.env.MY_SECRET_API_KEY } );
-
通过
await OpenAI(endpoint, params, options?)
调用 API。params
类型将基于您提供的endpoint
推断,即对于"edits"
端点,将强制使用import('openai').CreateEditRequest
。使用
raw
流模式的示例:await OpenAI( "chat", { messages: [ /* ... */ ], }, { mode: "raw" } );
Edge/浏览器:在 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: "写一个快乐的句子。\n\n",
max_tokens: 100,
});
return new Response(stream);
}
export const config = {
runtime: "edge",
};
Node:在 Next.js API 路由(Node)中使用流
如果您无法使用 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: "写一个快乐的句子。\n\n",
max_tokens: 25,
});
stream.pipe(res);
}
参见
example/src/pages/api/hello.ts
中的示例。
与 ChatGPT API 一起使用
默认情况下,使用 mode = "tokens"
,您将仅收到消息增量。要获取完整事件,请使用 mode = "raw"
。
参见:https://platform.openai.com/docs/guides/chat/introduction
const stream = await OpenAI("chat", {
model: "gpt-3.5-turbo",
messages: [
{
role: "system",
content: "你是一个帮助用户将英语翻译成法语的助手。",
},
{
role: "user",
content: '将以下英文文本翻译成法语:"Hello world!"',
},
],
});
在 tokens
模式下,您将仅收到响应块,看起来像这样(为说明分行显示):
Hello
!
How
can
I
assist
you
today
?
使用 mode = "raw"
以访问原始事件。
注意事项
- 在内部,流通常使用生成器进行操作,通过
for await (const chunk of yieldStream(stream)) { ... }
。我们建议如果您觉得这种模式直观,请遵循这种模式。