このライブラリは、TypeScript または JavaScript から OpenAI REST API への便利なアクセスを提供します。
これは、Stainless を使用した 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 ( ) ;
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 ( ) ;
ストリームをキャンセルする必要がある場合は、ループを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 ( ) ;
各メソッド、リクエスト パラメータ、およびレスポンス フィールドのドキュメントは docstring で入手でき、最新のエディタではカーソルを置くと表示されます。
重要
この SDK の以前のバージョンでは、 Configuration
クラスが使用されていました。 v3 から v4 への移行ガイドを参照してください。
API と対話する場合、Run の開始やベクター ストアへのファイルの追加などの一部のアクションは非同期であり、完了までに時間がかかります。 SDK には、ターミナル状態に達するまでステータスをポーリングし、結果のオブジェクトを返すヘルパー関数が含まれています。 API メソッドの結果としてポーリングのメリットが得られるアクションが発生する場合、「AndPoll」で終わるメソッドの対応するバージョンが存在します。
たとえば、Run を作成し、最終状態に達するまでポーリングするには、次を実行します。
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({…})
を使用したストリーミングでは、イベント ハンドラーや Promise など、便利なさまざまなヘルパーが公開されます。
あるいは、 openai.chat.completions.create({ stream: true, … })
を使用することもできます。これは、ストリーム内のチャンクの非同期反復可能のみを返すため、メモリの使用量が少なくなります (最終的なチャット完了オブジェクトは構築されません)。あなた)。
ストリームをキャンセルする必要がある場合は、 for await
ループからbreak
か、 stream.abort()
を呼び出します。
/chat/completions
エンドポイントで関数ツール呼び出しを使用するためのopenai.beta.chat.completions.runTools({…})
便利なヘルパーを提供します。これは、提供した JavaScript 関数を自動的に呼び出し、その結果を/chat/completions
に送り返します。エンドポイント。モデルがツール呼び出しを要求している限りループします。
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
がスローされます。
タイムアウトになったリクエストはデフォルトで 2 回再試行されることに注意してください。
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 ;
}
あるいは、一度に 1 ページをリクエストすることもできます。