开放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日

相关推荐

  • 从零开始:王大神教你如何用Python和Tkinter转换SQL和VBA

    某日,小张对我说:“大神,我每天都要手动处理SQL和VBA的转换,这真是让我疲惫不堪。” 我想了想,笑道:“既然如此,为何不写个小工具来自动化完成呢?” 小张疑惑地看着我:“真的可以吗?” 我回答:“当然可以,跟着…

    2023年10月9日
    00
  • OpenAI执行长遭解雇引发转折:投资者施压、董事会反悔

    在科技界掀起轰动的一幕,OpenAI公司的执行长阿特曼(Sam Altman)于17日遭到无预警解雇,这一消息震惊了整个科技业界。然而,随后不久,又传出OpenAI遭到包括微软在内的投资人施压,希望阿特曼复职,双方已展开谈…

    2023年11月20日
    00
  • ChatGPT新功能上线:朗读功能助力交互体验

    你是否曾因为ChatGPT的文字回复显得有些单调而感到不便?或许你希望ChatGPT能够以更加生动的方式与你交流,让人机对话更加自然、有趣。那么,今天的好消息一定会让你欣喜不已——OpenAI为ChatGPT推出了全新的朗读功能…

    2024年3月12日
    00
  • 微软与OpenAI的人工智能合作:探索未来技术

    在一个充满变革和未知的时代,微软与OpenAI的合作无疑是科技界的一大焦点。从他们的联盟到山姆·阿尔特曼的意外解雇,这一系列事件不仅影响着两家公司的命运,更揭示了人工智能行业的复杂性与挑战。 微软与OpenAI的…

    2023年12月3日
    00
  • 如何结合OpenAI等大语言模型,使用Python开发虚拟货币交易机器人

    在虚拟货币市场中,随着交易的日益复杂和数据量的增加,传统的交易方法可能不再足够。为了更好地理解市场趋势、制定有效的交易策略,以及实现自动化交易,结合强大的大语言模型如OpenAI,以及Python编程,已经成为…

    2023年12月28日
    00
  • 如何使用ChatGPT模型创建自然语言生成应用

    在数字时代,自然语言生成(Natural Language Generation,NLG)应用变得越来越流行,这些应用能够自动生成文本内容,从虚拟助手到智能客服再到自动化报告。OpenAI的ChatGPT模型是一种强大的工具,可以用于构建这类…

    2023年11月4日
    00
  • 为什么我将微软奖励积分捐献给OpenAI?- 一份关于人工智能和公益的贡献

    人工智能,作为当今世界最具潜力和活力的领域之一,已经深刻地改变了我们的生活。从智能手机上的语音助手到自动驾驶汽车,从医疗诊断到自然语言处理,人工智能的应用无处不在。然而,随着其快速发展,也引发了一系…

    2023年6月6日
    00
  • ChatGPT:人工智能的文字巧匠

    在人工智能的波浪中,有一个名字频频出现——ChatGPT。作为OpenAI推出的自然语言处理模型,ChatGPT不仅在技术界引起了轰动,也在普通用户中掀起了学习和探索的热潮。 什么是ChatGPT? ChatGPT是一个基于GPT(Generati…

    2023年11月7日
    00
  • 使用Chat Completions API的JSON模式:创建可解析的智能助手

    在现代科技的时代,人工智能正日益成为我们生活中的重要一部分。OpenAI的Chat Completions API是一个强大的工具,可以用于创建智能助手,以执行各种任务,从回答问题到生成文本。本教程将向您介绍如何使用JSON模式…

    2023年11月25日
    00
  • ChatGPT字数限制的深入分析

    人工智能技术的迅猛发展将聊天机器人带入了我们的生活和工作中,其中ChatGPT凭借其强大的文本生成能力备受欢迎。然而,ChatGPT在字数输出上存在一定的限制,本文将深入分析这一现象的原因以及解决方案。 ChatGPT的…

    2023年8月19日
    00