이 라이브러리는 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(Server Sent Events)를 사용하여 스트리밍 응답을 지원합니다.
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()
호출하면 됩니다.
우리는 사용자가 제공한 JavaScript 함수를 자동으로 호출하고 해당 결과를 /chat/completions
로 다시 보내는 /chat/completions
엔드포인트와 함께 함수 도구 호출을 사용하기 위한 openai.beta.chat.completions.runTools({…})
편의 도우미를 제공합니다. 모델이 도구 호출을 요청하는 동안 반복됩니다.
parse
함수를 전달하면 자동으로 arguments
를 구문 분석하고 구문 분석 오류를 모델에 반환하여 자동 복구를 시도합니다. 그렇지 않으면 인수가 문자열로 제공하는 함수에 전달됩니다.
auto
대신 tool_choice: {function: {name: …}}
전달하면 해당 함수를 호출한 후 즉시 반환됩니다(그리고 구문 분석 오류를 자동 복구하기 위한 루프만 실행됩니다).
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와 함께 이 라이브러리를 사용하려면 OpenAI
클래스 대신 AzureOpenAI
클래스를 사용하세요.
중요한
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 ;
}
또는 한 번에 단일 페이지를 요청할 수 있습니다.