如果你希望在TypeScript或JavaScript中方便地访问OpenAI的REST API,那么这个库为你提供了便捷的解决方案。它是基于我们的OpenAPI规范使用Stainless生成的。
要学习如何使用OpenAI API,请查看我们的API参考文档和文档。
安装
npm install --save openai
# 或者
yarn add openai
使用
你可以在api.md文件中找到这个库的完整API。下面的代码演示了如何使用聊天完成API开始工作。
import OpenAI from 'openai';
const openai = new OpenAI({
apiKey: '你的API密钥', // 默认为process.env["OPENAI_API_KEY"]
});
async function main() {
const completion = await openai.chat.completions.create({
messages: [{ role: 'user', content: '说这是一个测试' }],
model: 'gpt-3.5-turbo',
});
console.log(completion.choices);
}
main();
流式响应
我们支持使用Server Sent Events (SSE) 进行流式响应。
import OpenAI from 'openai';
const openai = new OpenAI();
async function main() {
const stream = await openai.chat.completions.create({
model: 'gpt-4',
messages: [{ role: 'user', content: 'Say this is a test' }],
stream: true,
});
for await (const part of stream) {
process.stdout.write(part.choices[0]?.delta?.content || '');
}
}
main();
如果你需要取消流,你可以从循环中break
,或者调用stream.controller.abort()
。
请求和响应类型
这个库包含了所有请求参数和响应字段的TypeScript定义。你可以像下面这样导入并使用它们:
import OpenAI from 'openai';
const openai = new OpenAI({
apiKey: '你的API密钥', // 默认为process.env["OPENAI_API_KEY"]
});
async function main() {
const params: OpenAI.Chat.ChatCompletionCreateParams = {
messages: [{ role: 'user', content: 'Say this is a test' }],
model: 'gpt-3.5-turbo',
};
const completion: OpenAI.Chat.ChatCompletion = await openai.chat.completions.create(params);
}
main();
每个方法、请求参数和响应字段的文档都可在文档字符串中找到,并将在大多数现代编辑器中悬停时显示。
[!IMPORTANT]
此SDK的先前版本使用了Configuration
类。请参阅v3到v4的迁移指南。
文件上传
与文件上传对应的请求参数可以以多种不同的形式传递:
File
(或具有相同结构的对象)fetch
Response
(或具有相同结构的对象)fs.ReadStream
- 我们的
toFile
助手的返回值
import fs from 'fs';
import fetch from 'node-fetch';
import OpenAI, { toFile } from 'openai';
const openai = new OpenAI();
// 如果你有Node `fs`,我们建议使用`fs.createReadStream()`:
await openai.files.create({ file: fs.createReadStream('input.jsonl'), purpose: 'fine-tune' });
// 或者,如果你有Web `File` API,你可以传递一个`File`实例:
await openai.files.create({ file: new File(['my bytes'], 'input.jsonl'), purpose: 'fine-tune' });
// 你也可以传递一个`fetch` `Response`:
await openai.files.create({ file: await fetch('https://somesite/input.jsonl'), purpose: 'fine-tune' });
// 最后,如果上述方法都不方便,你可以使用我们的`toFile`助手:
await openai.files.create({
file: await toFile(Buffer.from('my bytes'), 'input.jsonl'),
purpose: 'fine-tune',
});
await openai.files.create({
file: await toFile(new Uint8Array([0, 1, 2]), 'input.jsonl'),
purpose: 'fine-tune',
});
处理错误
当库无法连接到API,或者API返回非成功状态码(即4xx或5xx响应)时,将抛出APIError
的子类:
async function main() {
const fineTune = await openai.fineTunes
.create({ training_file: 'file-XGinujblHPwGLSztz8cPS8XY' })
.catch((err) => {
if (err instanceof OpenAI.APIError) {
console.log(err.status); // 400
console.log(err.name); // BadRequestError
console.log
(err.headers); // {server: 'nginx', ...}
} else {
throw err;
}
});
}
main();
错误代码如下:
状态码 | 错误类型 |
---|---|
400 | BadRequestError |
401 | AuthenticationError |
403 | PermissionDeniedError |
404 | NotFoundError |
422 | UnprocessableEntityError |
429 | RateLimitError |
大于等于500 | InternalServerError |
N/A | APIConnectionError |
Azure OpenAI
关于如何在Azure OpenAI中使用这个库的示例可以在这里找到。
请注意,在Azure OpenAI API和OpenAI API之间存在API形状和行为的细微差异,因此在Azure OpenAI中使用这个库可能会导致不正确的类型,可能会导致错误。
请查看@azure/openai
,这是Microsoft提供的一个Azure特定的SDK。
重试
默认情况下,某些错误将被自动重试2次,使用短暂的指数退避。默认情况下,将重试连接错误(例如,由于网络连接问题),409冲突,429速率限制以及>=500内部错误。
你可以使用maxRetries
选项来配置或禁用这个功能:
// 配置所有请求的默认值:
const openai = new OpenAI({
maxRetries: 0, // 默认为2
});
// 或者,按请求配置:
await openai.chat.completions.create({ messages: [{ role: 'user', content: 'How can I get the name of the current day in Node.js?' }], model: 'gpt-3.5-turbo' }, {
maxRetries: 5,
});
超时
默认情况下,请求会在10分钟后超时。你可以使用timeout
选项来配置它:
// 配置所有请求的默认值:
const openai = new OpenAI({
timeout: 20 * 1000, // 20秒(默认为10分钟)
});
// 重写每个请求:
await openai.chat.completions.create({ messages: [{ role: 'user', content: 'How can I list all files in a directory using Python?' }], model: 'gpt-3.5-turbo' }, {
timeout: 5 * 1000,
});
在超时时,会抛出APIConnectionTimeoutError
。
请注意,超时的请求将默认重试两次。
自动分页
OpenAI API中的列表方法是分页的。你可以使用for await … of
语法来遍历所有页面中的项目:
async function fetchAllFineTuningJobs(params) {
const allFineTuningJobs = [];
// 自动获取更多页面。
for await (const job of openai.fineTuning.jobs.list({ limit: 20 })) {
allFineTuningJobs.push(job);
}
return allFineTuningJobs;
}
或者,你可以一次只请求一页:
let page = await openai.fineTuning.jobs.list({ limit: 20 });
for (const job of page.data) {
console.log(job);
}
// 提供用于手动分页的便捷方法:
while (page.hasNextPage()) {
page = page.getNextPage();
// ...
}
高级用法
访问原始响应数据(例如,标头)
通过APIPromise
类型上的.asResponse()
方法,你可以访问由fetch()
返回的“原始”Response
。
你也可以使用.withResponse()
方法获取原始的Response
以及解析后的数据。
const openai = new OpenAI();
const response = await openai.chat.completions
.create({ messages: [{ role: 'user', content: 'Say this is a test' }], model: 'gpt-3.5-turbo' })
.asResponse();
console.log(response.headers.get('X-My-Header'));
console.log(response.statusText); // 访问底层的Response对象
const { data: completions, response: raw } = await openai.chat.completions
.create({ messages: [{ role: 'user', content: 'Say this is a test' }], model: 'gpt-3.5-turbo' })
.withResponse();
console.log(raw.headers.get('X-My-Header'));
console.log(completions.choices);
配置HTTP(S)代理(例如,用于代理)
默认情况下,这个库使用一个稳定的代理来处理所有http/https请求,以重用TCP连接,消除许多TCP和TLS握手,并从大多数请求中刮去大约100ms。
如果你想禁用或自定义此行为,例如使用代理访问API,你可以传递一个用于所有请求的httpAgent
,例如:
import http from 'http';
import HttpsProxyAgent from 'https-proxy-agent';
// 配置所有请求的默认值:
const openai = new OpenAI({
httpAgent: new HttpsProxyAgent(process.env.PROXY_URL),
});
// 或者,按请求配置:
await openai.models.list({
baseURL: 'http://localhost:8080/test-api',
httpAgent: new http.Agent({ keepAlive: false }),
})
语义版本
这个包通常试图遵循SemVer约定,尽管某些不向后兼容的更改可能作为次要版本发布:
- 只影响静态类型的更改,不影响运行时行为。
- 影响库内部的更改,技术上是公共的,但不是为外部使用或记录的。 (如果你依赖这些内部变更,请在GitHub上提出问题告诉我们)。
- 我们不希望在实际上影响绝大多数用户的情况下进行的更改。
我们认真对待向后兼容
性,并努力确保你可以放心升级。
我们渴望听到你的反馈,请在GitHub上打开一个问题,提出问题、错误或建议。
要求
支持TypeScript >= 4.5。
以下运行时环境受支持:
- Node.js 16 LTS或更高版本(非EOL版本)。
- Deno v1.28.0或更高版本,使用
import OpenAI from "npm:openai"
。
暂时不支持Deno Deploy。 - Cloudflare Workers。
- Vercel Edge Runtime。
如果你对其他运行时环境感兴趣,请在GitHub上打开或投票提出问题。