Эта библиотека обеспечивает удобный доступ к API REST OpenAI из TypeScript или JavaScript.
Он создается на основе нашей спецификации OpenAPI с использованием нержавеющей стали.
Чтобы узнать, как использовать API OpenAI, ознакомьтесь с нашим справочником и документацией по API.
npm install openai
deno add jsr:@openai/openai
npx jsr add @openai/openai
Эти команды сделают модуль импортируемым из области @openai/openai
:
Вы также можете импортировать непосредственно из JSR без этапа установки, если вы используете среду выполнения Deno JavaScript:
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 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
. См. руководство по переходу с версии 3 на версию 4.
При взаимодействии с 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, … })
, который возвращает только асинхронную итерацию фрагментов в потоке и, таким образом, использует меньше памяти (он не создает окончательный объект завершения чата для ты).
Если вам нужно отменить поток, вы можете break
из цикла for await
или вызватьstream.abort 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
(или объект с той же структурой)Response
fetch
(или объект с той же структурой)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 предоставляют свойство _request_id
, которое добавляется из заголовка ответа x-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
.
Важный
Форма API Azure немного отличается от основной формы 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 ;
}
Альтернативно, вы можете запросить одну страницу за раз: