PHPOpenAI هي مكتبة تم صيانتها في المجتمع تتيح استخدام واجهة برمجة تطبيقات OpenAI في PHP.
يتم كتابة المشروع في PHP ويمكن استخدامه لدمج OpenAI API بسهولة في مشروع PHP الحالي.
يعتمد هذا المشروع على PHP الإصدار 8.1 من أجل استخدام ميزات مثل التعدادات. لا يتطلب هذا المشروع أي تبعيات خارجية. ومع ذلك ، يجب أن يكون لديك امتداد حليقة مثبتة ليعمل بشكل صحيح.
يستخدم المشروع الملحن لإدارة التبعيات. إذا لم تكن قد قمت بالفعل بتثبيت Composer ، فيمكنك القيام بذلك عن طريق اتباع التعليمات على موقع الملحن الرسمي.
لتثبيت المشروع ، يمكنك تثبيت الحزمة من packagist.org باستخدام الأمر التالي:
composer require easygithdev/php-openai لاستخدام OpenAI API ، تحتاج إلى التسجيل على موقعه على الويب والحصول على مفتاح API. بمجرد حصولك على مفتاح API الخاص بك ، يمكنك استخدامه في رمز PHP الخاص بك لإرسال الطلبات إلى Openai API.
لمعرفة كيفية الحصول على مفتاحك ، انتقل إلى العنوان التالي:
https://help.openai.com/en/articles/4936850-where-do-i-find-my-secret-api-key.
إليك رمز مثال يوضح لك كيفية استخدام API Openai في PHP:
<?php
require_once __DIR__ . ' /vendor/autoload.php ' ;
use EasyGithDev PHPOpenAI Helpers ModelEnum ;
use EasyGithDev PHPOpenAI OpenAIClient ;
$ apiKey = getenv ( ' OPENAI_API_KEY ' );
$ response = ( new OpenAIClient ( $ apiKey ))-> Completion ()-> create (
ModelEnum:: TEXT_DAVINCI_003 ,
" Say this is a test " ,
)-> toObject ();
// Response as stClass object
echo ' <pre> ' , print_r ( $ response , true ), ' </pre> ' ; يقوم هذا الكود بتثبيت كائن OpenAIApi جديد مع مفتاح API ، ثم ينشئ كائن Completion جديد لإكمال النص مع نموذج لغة GPT-3 AI المقدم من Openai.
يتم استدعاء طريقة create() على كائن Completion لإنشاء نص جديد. يستغرق معلمتين:
يتم إرجاع نتيجة الانتهاء في متغير $response . يمكن بعد ذلك استخدام النتيجة لمزيد من المعالجة ، مثل عرض النص المكتمل أو تغذيته في جزء آخر من البرنامج لمعالجة إضافية.
يمكنك استخدام متغير البيئة لتخزين المفتاح الخاص بك. يمكنك بعد ذلك استخدام هذا المتغير كما في المثال التالي:
export OPENAI_API_KEY= " sk-xxxxxxxxxxx "يمكنك وضع المتغير في ملف تكوين Apache:
<VirtualHost hostname:80>
...
SetEnv OPENAI_API_KEY sk-xxxxxxxxxxx
...
</VirtualHost>
ثم أعد تشغيل الخدمة.
الآن ، يمكنك استخدام متغير البيئة عن طريق استدعاء وظيفة getenv() من PHP.
<?php
$ response = ( new OpenAIApi ( getenv ( ' OPENAI_API_KEY ' )))-> Completion ()-> create (
ModelEnum:: TEXT_DAVINCI_003 ,
" Say this is a test " ,
);إذا كنت ترغب في تقديم معلومات حول مؤسستك ، فيجب عليك المتابعة على النحو التالي.
<?php
$ apiKey = getenv ( ' OPENAI_API_KEY ' );
$ org = getenv ( ' OPENAI_API_ORG ' );
// Passing the organization to the client
$ response = ( new OpenAIClient ( $ apiKey , $ org ))إذا كنت بحاجة إلى تعديل عنوان URL الخاص بـ API ، فيمكنك المتابعة على النحو التالي:
<?php
$ apiKey = getenv ( ' OPENAI_API_KEY ' );
// Create a new router, with origine url and version
$ route = new OpenAIRoute (
' https://api.openai.com ' ,
' v1 '
);
// Get a specific Url
echo $ route -> completionCreate () , ' <br> ' ;
// Passing the router to the client
$ response = ( new OpenAIClient ( $ apiKey ))
-> setRoute ( $ route ); لإعادة تعريف المسار ، تحتاج إلى تمديد فئة OpenAIRoute أو تنفيذ واجهة Route .
API يعيد الردود بتنسيق JSON. لتسهيل الوصول إلى المعلومات المختلفة ، يمكنك استدعاء طرق toObject() أو toArray() لكائن المعالج للوصول إلى البيانات.
<?php
$ response = ( new OpenAIClient ( $ apiKey ))-> Completion ()-> create (
ModelEnum:: TEXT_DAVINCI_003 ,
" Say this is a test " ,
)-> toObject ();
// Response as a stClass object
echo ' <pre> ' , print_r ( $ response , true ), ' </pre> ' ;
$ response = ( new OpenAIClient ( $ apiKey ))-> Completion ()-> create (
ModelEnum:: TEXT_DAVINCI_003 ,
" Say this is a test " ,
)-> toArray ();
// Response as an associative array
echo ' <pre> ' , print_r ( $ response , true ), ' </pre> ' ;في بعض الأحيان ، يعيد API الأخطاء. لذلك ، من الضروري أن تكون قادرًا على تحديد سبب المشكلة. للتعامل مع هذه الصعوبة ، لديك العديد من الخيارات.
إذا كنت تستخدم كائن معالج مع طرق toObject() أو toArray() ، فما عليك سوى استخدام بنية try-catch .
try {
$ response = ( new OpenAIClient ( ' BAD KEY ' ))
-> Completion ()
-> create (
ModelEnum:: TEXT_DAVINCI_003 ,
" Say this is a test " ,
)
-> toObject ();
} catch ( Throwable $ t ) {
echo nl2br ( $ t -> getMessage ());
die;
} إذا كنت تستخدم كائن CurlResponse ، فيمكنك التحقق من حدوث خطأ باستخدام المدققين.
$ handler = ( new OpenAIClient ( ' BAD KEY ' ))-> Completion ()-> create (
ModelEnum:: TEXT_DAVINCI_003 ,
" Say this is a test " ,
);
$ response = $ handler -> getResponse ();
$ contentTypeValidator = $ handler -> getContentTypeValidator ();
if (!( new StatusValidator ( $ response ))-> validate () or
!( new $ contentTypeValidator ( $ response ))-> validate ()) {
echo $ response -> getBody ();
}تعرف على المزيد حول الأخطاء.
فيما يلي مقطع فيديو يعرض تطبيقًا يسمح لك بإنشاء صور بأسلوب طلاء يحدده المستخدم. يتم إنشاء هذا التطبيق باستخدام مشروع phpopenai.
يمكنك العثور على الرمز هنا:
https://github.com/easygithdev/phpopenai-playground.git.
أصبح دمج Openai في التطبيق الخاص بك أمرًا بسيطًا مثل بضعة أسطر من التعليمات البرمجية.
يمكنك العثور على جميع الرموز هنا:
https://github.com/easygithdev/phpopenai-examples.
$ response = ( new OpenAIClient ( $ apiKey ))-> Chat ()-> create (
ModelEnum:: GPT_3_5_TURBO ,
[
new ChatMessage (ChatMessage:: ROLE_SYSTEM , " You are a helpful assistant. " ),
new ChatMessage (ChatMessage:: ROLE_USER , " Who won the world series in 2020? " ),
new ChatMessage (ChatMessage:: ROLE_ASSISTANT , " The Los Angeles Dodgers won the World Series in 2020. " ),
new ChatMessage (ChatMessage:: ROLE_USER , " Where was it played? " ),
]
)-> toObject ();تعرف على المزيد حول الانتهاء من الدردشة.
$ response = ( new OpenAIClient ( $ apiKey ))-> Completion ()-> create (
ModelEnum:: TEXT_DAVINCI_003 ,
" Say this is a test " ,
)-> toObject ();تعرف على المزيد حول إكمال النص.
سمة الدفق في API Openai هي معلمة اختيارية يمكنك استخدامها للتحكم في تدفق البيانات الذي تم إرجاعه بواسطة API. إذا قمت بتعيين هذا الخيار على True ، فسيقوم API بإرجاع الاستجابة كبيانات تدفق بدلاً من استجابة واحدة.
هذا يعني أنه يمكنك استرداد نتائج API عند توفرها ، بدلاً من انتظار الاستجابة الكاملة قبل معالجتها. يمكن أن يكون هذا الخيار مفيدًا للتطبيقات التي تتطلب معالجة كميات كبيرة من البيانات في الوقت الفعلي.
<?php
header ( ' Content-Type: text/event-stream ' );
header ( ' Cache-Control: no-cache ' );
. . .
( new OpenAIClient ( $ apiKey ))-> Completion ()-> create (
model: " text-davinci-003 " ,
prompt: " Translate this into 1. French, 2. Spanish and 3. Japanese: nn What rooms do you have available? nn 1. " ,
temperature: 0.3 ,
max_tokens: 100 ,
top_p: 1.0 ,
frequency_penalty: 0.0 ,
presence_penalty: 0.0 ,
stream: true
)-> getResponse (); < html >
< body >
< div id =" result " > </ div >
< script >
function nl2br ( str , replaceMode , isXhtml ) {
var breakTag = ( isXhtml ) ? '<br />' : '<br>' ;
var replaceStr = ( replaceMode ) ? '$1' + breakTag : '$1' + breakTag + '$2' ;
return ( str + '' ) . replace ( / ([^>rn]?)(rn|nr|r|n) / g , replaceStr ) ;
}
if ( typeof ( EventSource ) !== 'undefined' ) {
console . info ( 'Starting connection...' ) ;
var source = new EventSource ( 'stream.php' ) ;
source . addEventListener ( 'open' , function ( e ) {
console . info ( 'Connection was opened.' ) ;
} , false ) ;
source . addEventListener ( 'error' , function ( e ) {
var txt ;
switch ( event . target . readyState ) {
// if reconnecting
case EventSource . CONNECTING :
txt = 'Reconnecting...' ;
break ;
// if error was fatal
case EventSource . CLOSED :
txt = 'Connection failed. Will not retry.' ;
break ;
}
console . error ( 'Connection error: ' + txt ) ;
} , false ) ;
source . addEventListener ( 'message' , function ( e ) {
if ( e . data == "[DONE]" ) {
source . close ( ) ;
return ;
}
document . getElementById ( 'result' ) . innerHTML += nl2br ( JSON . parse ( e . data ) . choices [ 0 ] . text ) ;
} , false ) ;
} else {
alert ( 'Your browser does not support Server-sent events! Please upgrade it!' ) ;
console . error ( 'Connection aborted' ) ;
}
</ script >
</ body >
</ html > $ response = ( new OpenAIClient ( $ apiKey ))-> Edit ()-> create (
" What day of the wek is it? " ,
ModelEnum:: TEXT_DAVINCI_EDIT_001 ,
" Fix the spelling mistakes " ,
)-> toObject ();تعرف على المزيد حول تحرير النص.
function displayUrl ( $ url )
{
return ' <img src=" ' . $ url . ' " /> ' ;
}
$ response = ( new OpenAIClient ( $ apiKey ))-> Image ()-> create (
" a rabbit inside a beautiful garden, 32 bit isometric " ,
n: 2 ,
size: ImageSizeEnum::is256,
)-> toObject (); < ?php foreach ($response- > data as $image) : ? >
< div > < ?= displayUrl($image- > url) ? > </ div >
< ?php endforeach; ? > 
تعرف على المزيد حول توليد الصور.
$ response = ( new OpenAIClient ( $ apiKey ))-> Image ()-> createVariation (
__DIR__ . ' /../../assets/image_variation_original.png ' ,
n: 2 ,
size: ImageSizeEnum::is256
)-> toObject ();
تعرف على المزيد حول تباين الصورة.
$ response = ( new OpenAIClient ( $ apiKey ))-> Image ()-> createEdit (
image: __DIR__ . ' /../../assets/image_edit_original.png ' ,
mask: __DIR__ . ' /../../assets/image_edit_mask2.png ' ,
prompt: ' a sunlit indoor lounge area with a pool containing a flamingo ' ,
size: ImageSizeEnum::is512,
)-> toObject ();
تعرف على المزيد حول EDIT Image.
$ response = ( new OpenAIClient ( $ apiKey ))-> Embedding ()-> create (
ModelEnum:: TEXT_EMBEDDING_ADA_002 ,
" The food was delicious and the waiter... " ,
)-> toObject ();تعرف على المزيد حول التضمين.
$ response = ( new OpenAIClient ( $ apiKey ))-> Audio ()
-> addCurlParam ( ' timeout ' , 30 )
-> transcription (
__DIR__ . ' /../../assets/openai.mp3 ' ,
ModelEnum:: WHISPER_1 ,
response_format: AudioResponseEnum:: SRT
)-> toObject ();تعرف على المزيد حول نسخ الصوت.
$ response = ( new OpenAIClient ( $ apiKey ))-> Audio ()
-> addCurlParam ( ' timeout ' , 30 )
-> translation (
__DIR__ . ' /../../assets/openai_fr.mp3 ' ,
' whisper-1 ' ,
response_format: AudioResponseEnum:: TEXT
)-> toObject ();تعرف على المزيد حول ترجمة الصوت.
$ response = ( new OpenAIClient ( $ apiKey ))
-> Model ()
-> list ()
-> toObject ();تعرف على المزيد حول النموذج.
$ response = ( new OpenAIClient ( $ apiKey ))
-> Model ()
-> retrieve ( ' text-davinci-001 ' )
-> toObject ();تعرف على المزيد حول النموذج.
$ response = ( new OpenAIClient ( $ apiKey ))
-> Model ()
-> delete (
$ _POST [ ' model ' ]
)-> toObject ();تعرف على المزيد حول النموذج.
$ response = ( new OpenAIApi ( $ apiKey ))
-> File ()
-> list ()
-> toObject ();تعرف على المزيد حول الملف.
$ response = ( new OpenAIApi ( $ apiKey ))
-> File ()
-> create (
__DIR__ . ' /../../assets/mydata.jsonl ' ,
' fine-tune ' ,
)
-> toObject ();تعرف على المزيد حول الملف.
$ response = ( new OpenAIApi ( $ apiKey ))
-> File ()
-> delete ( ' file-xxxx ' )
-> toObject ();تعرف على المزيد حول الملف.
$ response = ( new OpenAIApi ( $ apiKey ))
-> File ()
-> retrieve ( ' file-xxxx ' )
-> toObject ();تعرف على المزيد حول النموذج.
$ response = ( new OpenAIApi ( $ apiKey ))
-> File ()
-> download ( ' file-xxxx ' )
-> toObject ();تعرف على المزيد حول النموذج.
$ response = ( new OpenAIApi ( $ apiKey ))
-> FineTune ()
-> list ()
-> toObject ();تعرف على المزيد حول النصوص.
$ response = ( new OpenAIApi ( $ apiKey ))
-> FineTune ()
-> create (
' file-xxxx '
)
-> toObject ();تعرف على المزيد حول النصوص.
$ response = ( new OpenAIApi ( $ apiKey ))
-> FineTune ()
-> retrieve ( ' ft-xxx ' )
-> toObject ();تعرف على المزيد حول النصوص.
$ response = ( new OpenAIApi ( $ apiKey ))
-> FineTune ()
-> listEvents ( ' ft-xxx ' )
-> toObject ();تعرف على المزيد حول النصوص.
$ response = ( new OpenAIApi ( $ apiKey ))
-> FineTune ()
-> Cancel ( ' ft-xxx ' )
-> toObject ();تعرف على المزيد حول النصوص.
$ response = ( new OpenAIClient ( $ apiKey ))
-> Moderation ()
-> create ( ' I want to kill them. ' )
-> toObject ();تعرف على المزيد حول الاعتدال.
لتشغيل جميع الاختبارات:
composer test testsلإجراء اختبار واحد فقط:
composer test tests/[NAME]Test.phpيعد Phpopenai مشروعًا مفيدًا لمطوري PHP الذين يرغبون في دمج API Openai بسهولة في مشاريعهم. مع التثبيت البسيط واستخدام الملحن وتصنيف النص وتوليد الصور والتعرف على الكيان المسماة في تطبيق PHP الخاص بك.