該程式庫提供從 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 ;
}
或者,您可以一次請求一個頁面: