该库提供从 TypeScript 或 JavaScript 方便地访问 OpenAI REST API。
它是根据我们的 OpenAPI 规范与不锈钢生成的。
要了解如何使用 OpenAI API,请查看我们的 API 参考和文档。
npm install openai
deno add jsr:@openai/openai
npx jsr add @openai/openai
这些命令将使模块可从@openai/openai
范围导入:
如果您使用 Deno JavaScript 运行时,您还可以直接从 JSR 导入,无需安装步骤:
import OpenAI from 'jsr:@openai/openai' ;
该库的完整 API 以及许多代码示例可以在 api.md 文件中找到。下面的代码展示了如何开始使用聊天完成 API。
import OpenAI from 'openai' ;
const client = new OpenAI ( {
apiKey : process . env [ 'OPENAI_API_KEY' ] , // This is the default and can be omitted
} ) ;
async function main ( ) {
const chatCompletion = await client . chat . completions . create ( {
messages : [ { role : 'user' , content : 'Say this is a test' } ] ,
model : 'gpt-4o' ,
} ) ;
}
main ( ) ;
我们使用服务器发送事件 (SSE) 提供对流式响应的支持。
import OpenAI from 'openai' ;
const client = new OpenAI ( ) ;
async function main ( ) {
const stream = await client . chat . completions . create ( {
model : 'gpt-4o' ,
messages : [ { role : 'user' , content : 'Say this is a test' } ] ,
stream : true ,
} ) ;
for await ( const chunk of stream ) {
process . stdout . write ( chunk . choices [ 0 ] ?. delta ?. content || '' ) ;
}
}
main ( ) ;
如果需要取消流,可以从循环中break
或调用stream.controller.abort()
。
该库包含所有请求参数和响应字段的 TypeScript 定义。您可以像这样导入和使用它们:
import OpenAI from 'openai' ;
const client = new OpenAI ( {
apiKey : process . env [ 'OPENAI_API_KEY' ] , // This is the default and can be omitted
} ) ;
async function main ( ) {
const params : OpenAI . Chat . ChatCompletionCreateParams = {
messages : [ { role : 'user' , content : 'Say this is a test' } ] ,
model : 'gpt-4o' ,
} ;
const chatCompletion : OpenAI . Chat . ChatCompletion = await client . chat . completions . create ( params ) ;
}
main ( ) ;
每个方法、请求参数和响应字段的文档都可以在文档字符串中找到,并将在大多数现代编辑器中悬停时显示。
重要的
此 SDK 的早期版本使用Configuration
类。请参阅 v3 到 v4 迁移指南。
与 API 交互时,某些操作(例如启动运行和将文件添加到矢量存储)是异步的,需要一些时间才能完成。 SDK 包含辅助函数,这些函数将轮询状态,直到达到最终状态,然后返回结果对象。如果 API 方法导致可以从轮询中受益的操作,则该方法将有一个以“AndPoll”结尾的相应版本。
例如,要创建一个运行并轮询,直到达到最终状态,您可以运行:
const run = await openai . beta . threads . runs . createAndPoll ( thread . id , {
assistant_id : assistantId ,
} ) ;
有关运行生命周期的更多信息可以在运行生命周期文档中找到
创建矢量存储并与之交互时,您可以使用轮询助手来监视操作的状态。为了方便起见,我们还提供了批量上传助手,允许您一次同时上传多个文件。
const fileList = [
createReadStream ( '/home/data/example.pdf' ) ,
...
] ;
const batch = await openai . vectorStores . fileBatches . uploadAndPoll ( vectorStore . id , { files : fileList } ) ;
SDK 还包括处理流和处理传入事件的帮助程序。
const run = openai . beta . threads . runs
. stream ( thread . id , {
assistant_id : assistant . id ,
} )
. on ( 'textCreated' , ( text ) => process . stdout . write ( 'nassistant > ' ) )
. on ( 'textDelta' , ( textDelta , snapshot ) => process . stdout . write ( textDelta . value ) )
. on ( 'toolCallCreated' , ( toolCall ) => process . stdout . write ( `nassistant > ${ toolCall . type } nn` ) )
. on ( 'toolCallDelta' , ( toolCallDelta , snapshot ) => {
if ( toolCallDelta . type === 'code_interpreter' ) {
if ( toolCallDelta . code_interpreter . input ) {
process . stdout . write ( toolCallDelta . code_interpreter . input ) ;
}
if ( toolCallDelta . code_interpreter . outputs ) {
process . stdout . write ( 'noutput >n' ) ;
toolCallDelta . code_interpreter . outputs . forEach ( ( output ) => {
if ( output . type === 'logs' ) {
process . stdout . write ( `n ${ output . logs } n` ) ;
}
} ) ;
}
}
} ) ;
有关流式处理助手的更多信息可以在专用文档中找到:helpers.md
该库为流式聊天完成提供了多种便利,例如:
import OpenAI from 'openai' ;
const openai = new OpenAI ( ) ;
async function main ( ) {
const stream = await openai . beta . chat . completions . stream ( {
model : 'gpt-4o' ,
messages : [ { role : 'user' , content : 'Say this is a test' } ] ,
stream : true ,
} ) ;
stream . on ( 'content' , ( delta , snapshot ) => {
process . stdout . write ( delta ) ;
} ) ;
// or, equivalently:
for await ( const chunk of stream ) {
process . stdout . write ( chunk . choices [ 0 ] ?. delta ?. content || '' ) ;
}
const chatCompletion = await stream . finalChatCompletion ( ) ;
console . log ( chatCompletion ) ; // {id: "…", choices: […], …}
}
main ( ) ;
使用openai.beta.chat.completions.stream({…})
进行流式传输会公开各种帮助程序,包括事件处理程序和承诺,以方便您使用。
或者,您可以使用openai.chat.completions.create({ stream: true, … })
,它只返回流中块的异步迭代,因此使用更少的内存(它不会为以下内容构建最终的聊天完成对象)你)。
如果需要取消流,可以从for await
循环中break
或调用stream.abort()
。
我们提供了openai.beta.chat.completions.runTools({…})
便利助手,用于通过/chat/completions
端点使用函数工具调用,该端点会自动调用您提供的 JavaScript 函数并将其结果发送回/chat/completions
端点,只要模型请求工具调用就循环。
如果您传递parse
函数,它将自动为您解析arguments
并将任何解析错误返回到模型以尝试自动恢复。否则,参数将作为字符串传递给您提供的函数。
如果您传递tool_choice: {function: {name: …}}
而不是auto
,它会在调用该函数后立即返回(并且仅循环以自动恢复解析错误)。
import OpenAI from 'openai' ;
const client = new OpenAI ( ) ;
async function main ( ) {
const runner = client . beta . chat . completions
. runTools ( {
model : 'gpt-4o' ,
messages : [ { role : 'user' , content : 'How is the weather this week?' } ] ,
tools : [
{
type : 'function' ,
function : {
function : getCurrentLocation ,
parameters : { type : 'object' , properties : { } } ,
} ,
} ,
{
type : 'function' ,
function : {
function : getWeather ,
parse : JSON . parse , // or use a validation library like zod for typesafe parsing.
parameters : {
type : 'object' ,
properties : {
location : { type : 'string' } ,
} ,
} ,
} ,
} ,
] ,
} )
. on ( 'message' , ( message ) => console . log ( message ) ) ;
const finalContent = await runner . finalContent ( ) ;
console . log ( ) ;
console . log ( 'Final content:' , finalContent ) ;
}
async function getCurrentLocation ( ) {
return 'Boston' ; // Simulate lookup
}
async function getWeather ( args : { location : string } ) {
const { location } = args ;
// … do lookup …
return { temperature , precipitation } ;
}
main ( ) ;
// {role: "user", content: "How's the weather this week?"}
// {role: "assistant", tool_calls: [{type: "function", function: {name: "getCurrentLocation", arguments: "{}"}, id: "123"}
// {role: "tool", name: "getCurrentLocation", content: "Boston", tool_call_id: "123"}
// {role: "assistant", tool_calls: [{type: "function", function: {name: "getWeather", arguments: '{"location": "Boston"}'}, id: "1234"}]}
// {role: "tool", name: "getWeather", content: '{"temperature": "50degF", "preciptation": "high"}', tool_call_id: "1234"}
// {role: "assistant", content: "It's looking cold and rainy - you might want to wear a jacket!"}
//
// Final content: "It's looking cold and rainy - you might want to wear a jacket!"
与.stream()
一样,我们提供了各种帮助程序和事件。
请注意, runFunctions
以前也可用,但已被弃用,取而代之的是runTools
。
阅读有关各种示例的更多信息,例如与 zod、next.js 集成以及将流代理到浏览器。
与文件上传对应的请求参数可以通过多种不同的形式传递:
File
(或具有相同结构的对象)fetch
Response
(或具有相同结构的对象)fs.ReadStream
toFile
助手的返回值 import fs from 'fs' ;
import fetch from 'node-fetch' ;
import OpenAI , { toFile } from 'openai' ;
const client = new OpenAI ( ) ;
// If you have access to Node `fs` we recommend using `fs.createReadStream()`:
await client . files . create ( { file : fs . createReadStream ( 'input.jsonl' ) , purpose : 'fine-tune' } ) ;
// Or if you have the web `File` API you can pass a `File` instance:
await client . files . create ( { file : new File ( [ 'my bytes' ] , 'input.jsonl' ) , purpose : 'fine-tune' } ) ;
// You can also pass a `fetch` `Response`:
await client . files . create ( { file : await fetch ( 'https://somesite/input.jsonl' ) , purpose : 'fine-tune' } ) ;
// Finally, if none of the above are convenient, you can use our `toFile` helper:
await client . files . create ( {
file : await toFile ( Buffer . from ( 'my bytes' ) , 'input.jsonl' ) ,
purpose : 'fine-tune' ,
} ) ;
await client . files . create ( {
file : await toFile ( new Uint8Array ( [ 0 , 1 , 2 ] ) , 'input.jsonl' ) ,
purpose : 'fine-tune' ,
} ) ;
当库无法连接到API,或者API返回非成功状态代码(即4xx或5xx响应)时,将抛出APIError
的子类:
async function main ( ) {
const job = await client . fineTuning . jobs
. create ( { model : 'gpt-4o' , training_file : 'file-abc123' } )
. catch ( async ( 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 |
不适用 | APIConnectionError |
有关调试请求的更多信息,请参阅这些文档
SDK 中的所有对象响应都提供从x-request-id
响应标头添加的_request_id
属性,以便您可以快速记录失败的请求并将其报告回 OpenAI。
const completion = await client . chat . completions . create ( { messages : [ { role : 'user' , content : 'Say this is a test' } ] , model : 'gpt-4o' } ) ;
console . log ( completion . _request_id ) // req_123
要将此库与 Azure OpenAI 一起使用,请使用AzureOpenAI
类而不是OpenAI
类。
重要的
Azure API 形状与核心 API 形状略有不同,这意味着响应/参数的静态类型并不总是正确的。
import { AzureOpenAI } from 'openai' ;
import { getBearerTokenProvider , DefaultAzureCredential } from '@azure/identity' ;
const credential = new DefaultAzureCredential ( ) ;
const scope = 'https://cognitiveservices.azure.com/.default' ;
const azureADTokenProvider = getBearerTokenProvider ( credential , scope ) ;
const openai = new AzureOpenAI ( { azureADTokenProvider } ) ;
const result = await openai . chat . completions . create ( {
model : 'gpt-4o' ,
messages : [ { role : 'user' , content : 'Say hello!' } ] ,
} ) ;
console . log ( result . choices [ 0 ] ! . message ?. content ) ;
默认情况下,某些错误将自动重试 2 次,并具有短暂的指数退避。连接错误(例如,由于网络连接问题)、408 请求超时、409 冲突、429 速率限制和 >=500 内部错误都将默认重试。
您可以使用maxRetries
选项来配置或禁用它:
// Configure the default for all requests:
const client = new OpenAI ( {
maxRetries : 0 , // default is 2
} ) ;
// Or, configure per-request:
await client . chat . completions . create ( { messages : [ { role : 'user' , content : 'How can I get the name of the current day in JavaScript?' } ] , model : 'gpt-4o' } , {
maxRetries : 5 ,
} ) ;
默认情况下,请求在 10 分钟后超时。您可以使用timeout
选项来配置它:
// Configure the default for all requests:
const client = new OpenAI ( {
timeout : 20 * 1000 , // 20 seconds (default is 10 minutes)
} ) ;
// Override per-request:
await client . chat . completions . create ( { messages : [ { role : 'user' , content : 'How can I list all files in a directory using Python?' } ] , model : 'gpt-4o' } , {
timeout : 5 * 1000 ,
} ) ;
超时时,会抛出APIConnectionTimeoutError
。
请注意,默认情况下,超时的请求将重试两次。
OpenAI API 中的列表方法是分页的。您可以使用for await … of
语法来迭代所有页面上的项目:
async function fetchAllFineTuningJobs ( params ) {
const allFineTuningJobs = [ ] ;
// Automatically fetches more pages as needed.
for await ( const fineTuningJob of client . fineTuning . jobs . list ( { limit : 20 } ) ) {
allFineTuningJobs . push ( fineTuningJob ) ;
}
return allFineTuningJobs ;
}
或者,您可以一次请求一个页面: