توفر هذه المكتبة وصولاً سهلاً إلى OpenAI REST API من TypeScript أو JavaScript.
يتم إنشاؤه من مواصفات OpenAPI الخاصة بنا مع الفولاذ المقاوم للصدأ.
لمعرفة كيفية استخدام OpenAI API، راجع مرجع 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.md بالإضافة إلى العديد من أمثلة التعليمات البرمجية. يوضح الكود أدناه كيفية البدء باستخدام واجهة برمجة تطبيقات إكمال الدردشة.
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
. راجع دليل الترحيل من الإصدار 3 إلى الإصدار 4.
عند التفاعل مع واجهة برمجة التطبيقات، تكون بعض الإجراءات مثل بدء التشغيل وإضافة الملفات إلى مخازن المتجهات غير متزامنة وتستغرق وقتًا حتى تكتمل. يتضمن 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()
.
نحن نقدم مساعد الراحة 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
.
مهم
يختلف شكل 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 ) ;
ستتم إعادة محاولة بعض الأخطاء تلقائيًا مرتين بشكل افتراضي، مع تراجع أسي قصير. ستتم إعادة محاولة أخطاء الاتصال (على سبيل المثال، بسبب مشكلة في الاتصال بالشبكة)، و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 ;
}
وبدلاً من ذلك، يمكنك طلب صفحة واحدة في كل مرة: