Pustaka ini menyediakan akses mudah ke OpenAI REST API dari TypeScript atau JavaScript.
Itu dihasilkan dari spesifikasi OpenAPI kami dengan Stainless.
Untuk mempelajari cara menggunakan OpenAI API, lihat Referensi dan Dokumentasi API kami.
npm install openai
deno add jsr:@openai/openai
npx jsr add @openai/openai
Perintah berikut akan membuat modul dapat diimpor dari lingkup @openai/openai
:
Anda juga dapat mengimpor langsung dari JSR tanpa langkah instalasi jika Anda menggunakan runtime Deno JavaScript:
import OpenAI from 'jsr:@openai/openai' ;
API lengkap perpustakaan ini dapat ditemukan di file api.md bersama dengan banyak contoh kode. Kode di bawah ini menunjukkan cara mulai menggunakan API penyelesaian obrolan.
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 ( ) ;
Kami memberikan dukungan untuk respons streaming menggunakan Server Sent Events (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 ( ) ;
Jika Anda perlu membatalkan streaming, Anda dapat break
dari loop atau memanggil stream.controller.abort()
.
Pustaka ini menyertakan definisi TypeScript untuk semua parameter permintaan dan bidang respons. Anda dapat mengimpor dan menggunakannya seperti ini:
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 ( ) ;
Dokumentasi untuk setiap metode, parameter permintaan, dan bidang respons tersedia dalam dokumen dan akan muncul saat diarahkan ke sebagian besar editor modern.
Penting
Versi sebelumnya dari SDK ini menggunakan kelas Configuration
. Lihat panduan migrasi v3 ke v4.
Saat berinteraksi dengan API, beberapa tindakan seperti memulai Jalankan dan menambahkan file ke penyimpanan vektor bersifat asinkron dan memerlukan waktu untuk diselesaikan. SDK menyertakan fungsi pembantu yang akan melakukan polling status hingga mencapai status terminal dan kemudian mengembalikan objek yang dihasilkan. Jika metode API menghasilkan tindakan yang dapat memperoleh manfaat dari polling, maka akan ada versi metode yang sesuai yang diakhiri dengan 'AndPoll'.
Misalnya untuk membuat Run dan polling hingga mencapai status terminal, Anda dapat menjalankan:
const run = await openai . beta . threads . runs . createAndPoll ( thread . id , {
assistant_id : assistantId ,
} ) ;
Informasi selengkapnya tentang siklus hidup Run dapat ditemukan di Dokumentasi Run Lifecycle
Saat membuat dan berinteraksi dengan penyimpanan vektor, Anda dapat menggunakan bantuan polling untuk memantau status operasi. Untuk kenyamanan, kami juga menyediakan bantuan unggahan massal yang memungkinkan Anda mengunggah beberapa file sekaligus.
const fileList = [
createReadStream ( '/home/data/example.pdf' ) ,
...
] ;
const batch = await openai . vectorStores . fileBatches . uploadAndPoll ( vectorStore . id , { files : fileList } ) ;
SDK juga menyertakan pembantu untuk memproses aliran dan menangani peristiwa yang masuk.
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` ) ;
}
} ) ;
}
}
} ) ;
Informasi lebih lanjut tentang streaming helper dapat ditemukan di dokumentasi khusus: helpers.md
Library ini memberikan beberapa kemudahan untuk penyelesaian streaming chat, misalnya:
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 ( ) ;
Streaming dengan openai.beta.chat.completions.stream({…})
menampilkan berbagai pembantu untuk kenyamanan Anda termasuk event handler dan janji.
Alternatifnya, Anda dapat menggunakan openai.chat.completions.create({ stream: true, … })
yang hanya mengembalikan iterable async dari potongan-potongan dalam aliran dan dengan demikian menggunakan lebih sedikit memori (tidak membangun objek penyelesaian obrolan akhir untuk Anda).
Jika Anda perlu membatalkan streaming, Anda dapat break
dari loop for await
atau memanggil stream.abort()
.
Kami menyediakan bantuan praktis openai.beta.chat.completions.runTools({…})
untuk menggunakan panggilan alat fungsi dengan titik akhir /chat/completions
yang secara otomatis memanggil fungsi JavaScript yang Anda sediakan dan mengirimkan hasilnya kembali ke /chat/completions
titik akhir, perulangan selama model meminta alat memanggil.
Jika Anda meneruskan fungsi parse
, maka secara otomatis akan mengurai arguments
untuk Anda dan mengembalikan kesalahan penguraian apa pun ke model untuk mencoba pemulihan otomatis. Jika tidak, argumen akan diteruskan ke fungsi yang Anda berikan sebagai string.
Jika Anda meneruskan tool_choice: {function: {name: …}}
alih-alih auto
, ia akan kembali segera setelah memanggil fungsi tersebut (dan hanya mengulang untuk memulihkan kesalahan penguraian secara otomatis).
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!"
Seperti halnya .stream()
, kami menyediakan berbagai pembantu dan acara.
Perhatikan bahwa runFunctions
sebelumnya juga tersedia, tetapi sudah tidak digunakan lagi dan digantikan dengan runTools
.
Baca lebih lanjut tentang berbagai contoh seperti integrasi dengan zod, next.js, dan proksi aliran ke browser.
Parameter permintaan yang sesuai dengan unggahan file dapat diteruskan dalam berbagai bentuk:
File
(atau objek dengan struktur yang sama)Response
fetch
(atau objek dengan struktur yang sama)fs.ReadStream
toFile
kami 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' ,
} ) ;
Ketika perpustakaan tidak dapat terhubung ke API, atau jika API mengembalikan kode status tidak berhasil (yaitu respons 4xx atau 5xx), subkelas APIError
akan dilempar:
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 ( ) ;
Kode kesalahan adalah sebagai berikut:
Kode Status | Jenis Kesalahan |
---|---|
400 | BadRequestError |
401 | AuthenticationError |
403 | PermissionDeniedError |
404 | NotFoundError |
422 | UnprocessableEntityError |
429 | RateLimitError |
>=500 | InternalServerError |
T/A | APIConnectionError |
Untuk informasi selengkapnya tentang permintaan debug, lihat dokumen ini
Semua respons objek di SDK menyediakan properti _request_id
yang ditambahkan dari header respons x-request-id
sehingga Anda dapat dengan cepat mencatat permintaan yang gagal dan melaporkannya kembali ke 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
Untuk menggunakan perpustakaan ini dengan Azure OpenAI, gunakan kelas AzureOpenAI
bukan kelas OpenAI
.
Penting
Bentuk Azure API sedikit berbeda dari bentuk API inti yang berarti tipe statis untuk respons/param tidak selalu benar.
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 ) ;
Kesalahan tertentu akan otomatis dicoba ulang 2 kali secara default, dengan kemunduran eksponensial singkat. Kesalahan koneksi (misalnya, karena masalah konektivitas jaringan), 408 Batas Waktu Permintaan, 409 Konflik, 429 Batas Kecepatan, dan >=500 Kesalahan internal semuanya akan dicoba ulang secara default.
Anda dapat menggunakan opsi maxRetries
untuk mengonfigurasi atau menonaktifkan ini:
// 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 ,
} ) ;
Meminta waktu tunggu setelah 10 menit secara default. Anda dapat mengonfigurasinya dengan opsi 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 ,
} ) ;
Saat batas waktu habis, APIConnectionTimeoutError
dilempar.
Perhatikan bahwa permintaan yang waktunya habis akan dicoba ulang dua kali secara default.
Metode daftar di OpenAI API diberi nomor halaman. Anda dapat menggunakan sintaks for await … of
untuk mengulangi item di semua halaman:
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 ;
}
Alternatifnya, Anda dapat meminta satu halaman dalam satu waktu: