开放AI Node API库:无缝接入OpenAI的利器

如果你希望在TypeScriptJavaScript中方便地访问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约定,尽管某些不向后兼容的更改可能作为次要版本发布:

  1. 只影响静态类型的更改,不影响运行时行为。
  2. 影响库内部的更改,技术上是公共的,但不是为外部使用或记录的。 (如果你依赖这些内部变更,请在GitHub上提出问题告诉我们)
  3. 我们不希望在实际上影响绝大多数用户的情况下进行的更改。

我们认真对待向后兼容

性,并努力确保你可以放心升级。

我们渴望听到你的反馈,请在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上打开或投票提出问题。

本文由作者 王大神 原创发布于 大神网的AI博客。

转载请注明作者:王大神

原文出处:开放AI Node API库:无缝接入OpenAI的利器

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 2023年9月9日
下一篇 2023年9月9日

相关推荐