تمت إضافة الدعم لنموذج ChatGPT الرسمي! يمكنك الآن استخدام نموذج gpt-3.5-turbo
مع واجهة برمجة تطبيقات OpenAI الرسمية، باستخدام ChatGPTClient
. هذا هو نفس النموذج الذي يستخدمه ChatGPT، وهو أقوى نموذج متاح الآن. استخدام هذا النموذج ليس مجانيًا ، إلا أنه أرخص بعشر مرات (بسعر 0.002 دولار لكل ألف رمز) من text-davinci-003
.
راجع منشور OpenAI، تقديم ChatGPT وWhisper APIs لمزيد من المعلومات.
لاستخدامه، اضبط النموذج الافتراضي المستخدم في modelOptions.model
على gpt-3.5-turbo
، وسيتولى ChatGPTClient
الباقي.ChatGPTClient
هو الآن gpt-3.5-turbo
. لا يزال بإمكانك تعيين userLabel
و chatGptLabel
و promptPrefix
(تعليمات النظام) كالمعتاد.
قد تكون هناك فرصة أكبر لحظر حسابك إذا واصلت تشغيل chat.openai.com تلقائيًا. استمر في القيام بذلك على مسؤوليتك الخاصة.
لقد أضفت ChatGPTBrowserClient
التجريبي الذي يعتمد على خادم وكيل عكسي يستخدم تجاوز Cloudflare، مما يسمح لك بالتحدث إلى ChatGPT (chat.openai.com) دون الحاجة إلى أتمتة المتصفح. كل ما تحتاجه هو رمز الوصول الخاص بك من https://chat.openai.com/api/auth/session.
كما هو الحال دائمًا، يرجى ملاحظة أنه إذا اخترت اتباع هذا المسار، فإنك تعرض رمز الوصول الخاص بك إلى خادم طرف ثالث مغلق المصدر. إذا كنت قلقًا بشأن هذا، فيمكنك اختيار إما استخدام حساب ChatGPT مجاني لتقليل المخاطر، أو الاستمرار في استخدام ChatGPTClient
بدلاً من ذلك باستخدام نموذج text-davinci-003
.
للأسف، تم تصحيح الطريقة التي كنا نستخدمها للوصول إلى نماذج ChatGPT الأساسية. خياراتك الآن هي إما استخدام واجهة برمجة تطبيقات OpenAI الرسمية مع نموذج text-davinci-003
(الذي يكلف أموالاً)، أو استخدام حل قائم على المتصفح للتفاعل مع الواجهة الخلفية لـ ChatGPT (وهي أقل قوة وأكثر محدودية في المعدل وأقل تكلفة) غير مدعوم من هذه المكتبة في الوقت الحالي).
بمساعدة @PawanOsman، اكتشفنا طريقة لمواصلة استخدام نماذج ChatGPT الأساسية . ومن أجل منع فقدان الوصول مرة أخرى، قررنا توفير خوادم بروكسي عكسية متوافقة مع OpenAI API. لقد قمت بتحديث ChatGPTClient
لدعم استخدام خادم وكيل عكسي بدلاً من خادم OpenAI API. راجع استخدام الوكيل العكسي لمزيد من المعلومات حول خوادم الوكيل المتوفرة وكيفية عملها.
يرجى ملاحظة أنه إذا اخترت اتباع هذا المسار، فإنك تعرض رمز الوصول الخاص بك إلى خادم طرف ثالث مغلق المصدر. إذا كنت قلقًا بشأن هذا، فيمكنك اختيار إما استخدام حساب ChatGPT مجاني لتقليل المخاطر، أو الاستمرار في استخدام واجهة برمجة تطبيقات OpenAI الرسمية بدلاً من ذلك باستخدام نموذج text-davinci-003
.
لقد عثرت على نموذج عمل جديد لـ text-chat-davinci-002
و text-chat-davinci-002-sh-alpha-aoruigiofdj83
. هذا هو النموذج الأساسي الذي يستخدمه إصدار ChatGPT Plus "Turbo". الردود تشتعل بسرعة. لقد قمت بتحديث المكتبة لاستخدام هذا النموذج.
توقيت سيء؛ تمت إزالة text-chat-davinci-002-sh-alpha-aoruigiofdj83
بعد فترة وجيزة، ربما بسبب نموذج جديد في مكان ما هناك؟
استمتع بتجربة قوة إصدار Bing's GPT-4 من ChatGPT مع BingAIClient
(تجريبي). لا يزال خادم واجهة برمجة التطبيقات (API) وواجهة سطر الأوامر (CLI) بحاجة إلى التحديث لدعم ذلك ، ولكن يمكنك استخدام العميل مباشرة الآن. يرجى ملاحظة أنه إذا كان حسابك لا يزال في قائمة الانتظار، فلن تتمكن من استخدام هذا العميل.
على الرغم من عودة text-chat-davinci-002-20221122
مرة أخرى، يبدو أنها محملة بشكل زائد باستمرار وتؤدي إلى ظهور خطأ 429. من المحتمل أن OpenAI خصصت فقط كمية صغيرة من الموارد لهذا النموذج لمنع استخدامه على نطاق واسع من قبل الجمهور. بالإضافة إلى ذلك، سمعت أن الإصدارات الأحدث أصبحت الآن مقيدة الوصول لموظفي OpenAI وشركائها، لذلك من غير المرجح أن نتمكن من العثور على أي حلول بديلة حتى يتم إصدار النموذج رسميًا.
يمكنك استخدام نموذج text-davinci-003
بدلاً من ذلك كبديل مباشر. ضع في اعتبارك أن text-davinci-003
ليس بنفس جودة text-chat-davinci-002
(الذي تم تدريبه عبر RHLF وتم ضبطه ليكون ذكاءً اصطناعيًا للمحادثة)، على الرغم من أن النتائج لا تزال جيدة جدًا في معظم الحالات. يرجى ملاحظة أن استخدام text-davinci-003
سيكلفك أرصدة ($).
سأعيد إضافة الدعم لبرنامج ChatGPT القائم على المتصفح لخادم واجهة برمجة التطبيقات (API) وواجهة سطر الأوامر (CLI). يرجى النجمة ومشاهدة هذا المستودع للحصول على التحديثات.
وصلت السفينة الدوارة إلى المحطة التالية. عادت text-chat-davinci-002-20221122
مرة أخرى.
محاولة استخدام text-chat-davinci-002-20221122
مع OpenAI API تؤدي الآن إلى ظهور خطأ 404. يمكنك استخدام نموذج text-davinci-003
بدلاً من ذلك كبديل مباشر. ضع في اعتبارك أن text-davinci-003
ليس بنفس جودة text-chat-davinci-002
(الذي تم تدريبه عبر RHLF وتم ضبطه ليكون ذكاءً اصطناعيًا للمحادثة)، على الرغم من أن النتائج لا تزال جيدة جدًا. يرجى ملاحظة أن استخدام text-davinci-003
سيكلفك أرصدة ($).
يرجى الانتظار للحصول على مزيد من التحديثات بينما نحقق في المزيد من الحلول.
محاولة استخدام text-chat-davinci-002-20230126
مع OpenAI API تؤدي الآن إلى ظهور خطأ 404. لقد وجد شخص ما اسم النموذج الجديد بالفعل، لكنه غير راغب في مشاركته في الوقت الحالي. سأقوم بتحديث هذا المستودع بمجرد العثور على النموذج الجديد. إذا كان لديك أي عملاء محتملين، يرجى فتح مشكلة أو طلب سحب.
في غضون ذلك، أضفت دعمًا لنماذج مثل text-davinci-003
، والتي يمكنك استخدامها كبديل مباشر. ضع في اعتبارك أن text-davinci-003
ليس بنفس جودة text-chat-davinci-002
(الذي تم تدريبه عبر RHLF وتم ضبطه ليكون ذكاءً اصطناعيًا للمحادثة)، على الرغم من أن النتائج لا تزال جيدة جدًا. يرجى ملاحظة أن استخدام text-davinci-003
سيكلفك أرصدة ($).
عثر مستخدم Discord @pig#8932 على نموذج text-chat-davinci-002
فعال، text-chat-davinci-002-20221122
. لقد قمت بتحديث المكتبة لاستخدام هذا النموذج.
تطبيق عميل لـ ChatGPT وBing AI. متوفر كوحدة Node.js وخادم REST API وتطبيق CLI.
ChatGPTClient
: دعم النموذج الأساسي الرسمي لـ ChatGPT، gpt-3.5-turbo
، عبر واجهة برمجة تطبيقات OpenAI.keyv-file
في هذه الحزمة، ويمكن استخدامه لتخزين المحادثات في ملف JSON إذا كنت تستخدم خادم API أو واجهة سطر الأوامر (راجع settings.example.js
).text-davinci-003
BingAIClient
: دعم إصدار Bing من ChatGPT، المدعوم من GPT-4.ChatGPTBrowserClient
: دعم موقع ChatGPT الرسمي، باستخدام خادم وكيل عكسي لتجاوز Cloudflare.npm i @waylaidwanderer/chatgpt-api
راجع demos/use-bing-client.js
.
راجع demos/use-client.js
.
راجع demos/use-browser-client.js
.
يمكنك تثبيت الحزمة باستخدام
npm i -g @waylaidwanderer/chatgpt-api
ثم قم بتشغيله باستخدام chatgpt-api
. يأخذ هذا معلمة --settings=<path_to_settings.js>
اختيارية، أو يبحث عن settings.js
في الدليل الحالي إذا لم يتم تعيينه، بالمحتويات التالية:
module . exports = {
// Options for the Keyv cache, see https://www.npmjs.com/package/keyv.
// This is used for storing conversations, and supports additional drivers (conversations are stored in memory by default).
// Only necessary when using `ChatGPTClient`, or `BingAIClient` in jailbreak mode.
cacheOptions : { } ,
// If set, `ChatGPTClient` and `BingAIClient` will use `keyv-file` to store conversations to this JSON file instead of in memory.
// However, `cacheOptions.store` will override this if set
storageFilePath : process . env . STORAGE_FILE_PATH || './cache.json' ,
chatGptClient : {
// Your OpenAI API key (for `ChatGPTClient`)
openaiApiKey : process . env . OPENAI_API_KEY || '' ,
// (Optional) Support for a reverse proxy for the completions endpoint (private API server).
// Warning: This will expose your `openaiApiKey` to a third party. Consider the risks before using this.
// reverseProxyUrl: 'https://chatgpt.hato.ai/completions',
// (Optional) Parameters as described in https://platform.openai.com/docs/api-reference/completions
modelOptions : {
// You can override the model name and any other parameters here.
// The default model is `gpt-3.5-turbo`.
model : 'gpt-3.5-turbo' ,
// Set max_tokens here to override the default max_tokens of 1000 for the completion.
// max_tokens: 1000,
} ,
// (Optional) Davinci models have a max context length of 4097 tokens, but you may need to change this for other models.
// maxContextTokens: 4097,
// (Optional) You might want to lower this to save money if using a paid model like `text-davinci-003`.
// Earlier messages will be dropped until the prompt is within the limit.
// maxPromptTokens: 3097,
// (Optional) Set custom instructions instead of "You are ChatGPT...".
// (Optional) Set a custom name for the user
// userLabel: 'User',
// (Optional) Set a custom name for ChatGPT ("ChatGPT" by default)
// chatGptLabel: 'Bob',
// promptPrefix: 'You are Bob, a cowboy in Western times...',
// A proxy string like "http://<ip>:<port>"
proxy : '' ,
// (Optional) Set to true to enable `console.debug()` logging
debug : false ,
} ,
// Options for the Bing client
bingAiClient : {
// Necessary for some people in different countries, e.g. China (https://cn.bing.com)
host : '' ,
// The "_U" cookie value from bing.com
userToken : '' ,
// If the above doesn't work, provide all your cookies as a string instead
cookies : '' ,
// A proxy string like "http://<ip>:<port>"
proxy : '' ,
// (Optional) Set to true to enable `console.debug()` logging
debug : false ,
} ,
chatGptBrowserClient : {
// (Optional) Support for a reverse proxy for the conversation endpoint (private API server).
// Warning: This will expose your access token to a third party. Consider the risks before using this.
reverseProxyUrl : 'https://bypass.churchless.tech/api/conversation' ,
// Access token from https://chat.openai.com/api/auth/session
accessToken : '' ,
// Cookies from chat.openai.com (likely not required if using reverse proxy server).
cookies : '' ,
// A proxy string like "http://<ip>:<port>"
proxy : '' ,
// (Optional) Set to true to enable `console.debug()` logging
debug : false ,
} ,
// Options for the API server
apiOptions : {
port : process . env . API_PORT || 3000 ,
host : process . env . API_HOST || 'localhost' ,
// (Optional) Set to true to enable `console.debug()` logging
debug : false ,
// (Optional) Possible options: "chatgpt", "chatgpt-browser", "bing". (Default: "chatgpt")
clientToUse : 'chatgpt' ,
// (Optional) Generate titles for each conversation for clients that support it (only ChatGPTClient for now).
// This will be returned as a `title` property in the first response of the conversation.
generateTitles : false ,
// (Optional) Set this to allow changing the client or client options in POST /conversation.
// To disable, set to `null`.
perMessageClientOptionsWhitelist : {
// The ability to switch clients using `clientOptions.clientToUse` will be disabled if `validClientsToUse` is not set.
// To allow switching clients per message, you must set `validClientsToUse` to a non-empty array.
validClientsToUse : [ 'bing' , 'chatgpt' , 'chatgpt-browser' ] , // values from possible `clientToUse` options above
// The Object key, e.g. "chatgpt", is a value from `validClientsToUse`.
// If not set, ALL options will be ALLOWED to be changed. For example, `bing` is not defined in `perMessageClientOptionsWhitelist` above,
// so all options for `bingAiClient` will be allowed to be changed.
// If set, ONLY the options listed here will be allowed to be changed.
// In this example, each array element is a string representing a property in `chatGptClient` above.
chatgpt : [
'promptPrefix' ,
'userLabel' ,
'chatGptLabel' ,
// Setting `modelOptions.temperature` here will allow changing ONLY the temperature.
// Other options like `modelOptions.model` will not be allowed to be changed.
// If you want to allow changing all `modelOptions`, define `modelOptions` here instead of `modelOptions.temperature`.
'modelOptions.temperature' ,
] ,
} ,
} ,
// Options for the CLI app
cliOptions : {
// (Optional) Possible options: "chatgpt", "bing".
// clientToUse: 'bing',
} ,
} ;
وبدلاً من ذلك، يمكنك تثبيت الحزمة وتشغيلها مباشرةً.
git clone https://github.com/waylaidwanderer/node-chatgpt-api
npm install
(إذا لم تكن تستخدم Docker)settings.example.js
إلى settings.js
في الدليل الجذر وقم بتغيير الإعدادات عند الحاجة.npm run server
npm start
أو npm run (إذا لم يكن يستخدم Docker)docker-compose up
(يتطلب Docker) ابدأ محادثة أو تابعها. المعلمات الاختيارية ضرورية فقط للمحادثات التي تشمل طلبات متعددة.
مجال | وصف |
---|---|
رسالة | الرسالة التي سيتم عرضها للمستخدم. |
معرف المحادثة | (اختياري) معرف المحادثة التي تريد متابعتها. |
معرف الهروب من السجن | (اختياري، لـ BingAIClient فقط) اضبط على true لبدء محادثة في وضع كسر الحماية. بعد ذلك، يجب أن يكون هذا هو معرف محادثة كسر الحماية (المذكور في الرد كمعلمة تسمى أيضًا jailbreakConversationId ). |
parentMessageId | (اختياري، لـ ChatGPTClient و BingAIClient في وضع كسر الحماية) معرف الرسالة الأصلية (على سبيل المثال، response.messageId ) عند متابعة المحادثة. |
توقيع المحادثة | (اختياري، لـ BingAIClient فقط) توقيع للمحادثة (موجود في الاستجابة كمعلمة تسمى أيضًا conversationSignature ). مطلوب عند متابعة المحادثة إلا في وضع كسر الحماية. |
معرف العميل | (اختياري، لـ BingAIClient فقط) معرف العميل. مطلوب عند متابعة المحادثة إلا في وضع الهروب من السجن. |
معرف_الاحتجاج | (اختياري، لـ BingAIClient فقط) معرف الاستدعاء. مطلوب عند متابعة المحادثة إلا في وضع كسر الحماية. |
خيارات العميل | (اختياري) كائن يحتوي على خيارات للعميل. |
clientOptions.clientToUse | (اختياري) العميل الذي سيتم استخدامه لهذه الرسالة. القيم المحتملة: chatgpt ، chatgpt-browser ، bing . |
خيارات العميل.* | (اختياري) أي خيارات صالحة للعميل. على سبيل المثال، بالنسبة إلى ChatGPTClient ، يمكنك تعيين clientOptions.openaiApiKey لتعيين مفتاح API لهذه الرسالة فقط، أو clientOptions.promptPrefix لإعطاء تعليمات الذكاء الاصطناعي المخصصة لهذه الرسالة فقط، وما إلى ذلك. |
لتكوين الخيارات التي يمكن تغييرها لكل رسالة (الافتراضي: الكل)، راجع التعليقات الخاصة بـ perMessageClientOptionsWhitelist
في settings.example.js
. للسماح بتغيير العملاء، يجب تعيين perMessageClientOptionsWhitelist.validClientsToUse
على مصفوفة غير فارغة كما هو موضح في ملف إعدادات المثال.
لبدء محادثة مع ChatGPT، أرسل طلب POST إلى نقطة نهاية /conversation
الخادم باستخدام نص JSON مع معلمات لكل نقاط النهاية > POST /conversation أعلاه.
{
"message" : " Hello, how are you today? " ,
"conversationId" : " your-conversation-id (optional) " ,
"parentMessageId" : " your-parent-message-id (optional, for `ChatGPTClient` only) " ,
"conversationSignature" : " your-conversation-signature (optional, for `BingAIClient` only) " ,
"clientId" : " your-client-id (optional, for `BingAIClient` only) " ,
"invocationId" : " your-invocation-id (optional, for `BingAIClient` only) " ,
}
سيعيد الخادم كائن JSON يحتوي على استجابة ChatGPT:
// HTTP/1.1 200 OK
{
"response" : "I'm doing well, thank you! How are you?" ,
"conversationId" : "your-conversation-id" ,
"messageId" : "response-message-id (for `ChatGPTClient` only)" ,
"conversationSignature" : "your-conversation-signature (for `BingAIClient` only)" ,
"clientId" : "your-client-id (for `BingAIClient` only)" ,
"invocationId" : "your-invocation-id (for `BingAIClient` only - pass this new value back into subsequent requests as-is)" ,
"details" : "an object containing the raw response from the client"
}
إذا لم ينجح الطلب، فسيقوم الخادم بإرجاع كائن JSON مع رسالة خطأ.
إذا كان كائن الطلب يفتقد خاصية مطلوبة (مثل message
):
// HTTP/1.1 400 Bad Request
{
"error" : "The message parameter is required."
}
إذا حدث خطأ أثناء إرسال الرسالة إلى ChatGPT:
// HTTP/1.1 503 Service Unavailable
{
"error" : "There was an error communicating with ChatGPT."
}
يمكنك تعيين "stream": true
في نص الطلب لتلقي دفق من الرموز المميزة عند إنشائها.
import { fetchEventSource } from '@waylaidwanderer/fetch-event-source' ; // use `@microsoft/fetch-event-source` instead if in a browser environment
const opts = {
method : 'POST' ,
headers : {
'Content-Type' : 'application/json' ,
} ,
body : JSON . stringify ( {
"message" : "Write a poem about cats." ,
"conversationId" : "your-conversation-id (optional)" ,
"parentMessageId" : "your-parent-message-id (optional)" ,
"stream" : true ,
// Any other parameters per `Endpoints > POST /conversation` above
} ) ,
} ;
راجع العروض التوضيحية/use-api-server-streaming.js للحصول على مثال حول كيفية تلقي الاستجابة عند إنشائها. سوف تتلقى رمزًا مميزًا واحدًا في كل مرة، لذا ستحتاج إلى ربطها بنفسك.
الإخراج الناجح:
{ data : '' , event : '' , id : '' , retry : 3000 }
{ data : 'Hello' , event : '' , id : '' , retry : undefined }
{ data : '!' , event : '' , id : '' , retry : undefined }
{ data : ' How' , event : '' , id : '' , retry : undefined }
{ data : ' can' , event : '' , id : '' , retry : undefined }
{ data : ' I' , event : '' , id : '' , retry : undefined }
{ data : ' help' , event : '' , id : '' , retry : undefined }
{ data : ' you' , event : '' , id : '' , retry : undefined }
{ data : ' today' , event : '' , id : '' , retry : undefined }
{ data : '?' , event : '' , id : '' , retry : undefined }
{ data : '<result JSON here, see Method 1>' , event : 'result' , id : '' , retry : undefined }
{ data : '[DONE]' , event : '' , id : '' , retry : undefined }
// Hello! How can I help you today?
إخراج الخطأ:
const message = {
data : '{"code":503,"error":"There was an error communicating with ChatGPT."}' ,
event : 'error' ,
id : '' ,
retry : undefined
} ;
if ( message . event === 'error' ) {
console . error ( JSON . parse ( message . data ) . error ) ; // There was an error communicating with ChatGPT.
}
fetch-event-source
أولاً واستخدام طريقة POST
. اتبع نفس تعليمات الإعداد لخادم API، وقم بإنشاء settings.js
.
إذا تم تثبيته عالميًا:
chatgpt-cli
إذا تم تثبيته محليًا:
npm run cli
يتم نسخ ردود ChatGPT تلقائيًا إلى الحافظة الخاصة بك، حتى تتمكن من لصقها في تطبيقات أخرى.
كما هو موضح في الأمثلة أعلاه، يمكنك تعيين reverseProxyUrl
في خيارات ChatGPTClient
لاستخدام خادم وكيل عكسي بدلاً من واجهة برمجة تطبيقات ChatGPT الرسمية. في الوقت الحالي، هذه هي الطريقة الوحيدة لاستخدام نماذج ChatGPT الأساسية . لقد تم تصحيح هذه الطريقة ولم تعد الإرشادات الواردة أدناه ذات صلة، ولكن قد لا تزال ترغب في استخدام وكيل عكسي لأسباب أخرى. حاليًا، لا تزال خوادم الوكيل العكسي تُستخدم لإجراء تجاوز Cloudflare لـ ChatGPTBrowserClient
.
كيف يعمل؟ إجابة بسيطة: ChatGPTClient
> الوكيل العكسي > خادم OpenAI. يقوم الخادم الوكيل العكسي ببعض السحر للوصول إلى النموذج الأساسي مباشرةً عبر خادم OpenAI ثم يقوم بإرجاع الاستجابة إلى ChatGPTClient
.
يتم توفير التعليمات أدناه.
accessToken
).reverseProxyUrl
على https://chatgpt.hato.ai/completions
في settings.js > chatGptClient
أو ChatGPTClient
.settings.chatGptClient.openaiApiKey
) إلى رمز الوصول ChatGPT الذي حصلت عليه في الخطوة 1.model
على text-davinci-002-render
أو text-davinci-002-render-paid
أو text-davinci-002-render-sha
اعتمادًا على نماذج ChatGPT التي يمكن لحسابك الوصول إليها. يجب أن تكون النماذج اسم نموذج ChatGPT، وليس اسم النموذج الأساسي، ولا يمكنك استخدام نموذج لا يستطيع حسابك الوصول إليه.stream: true
(API) أو onProgress
(العميل) كحل بديل.accessToken
).reverseProxyUrl
على https://chatgpt.pawan.krd/api/completions
في settings.js > chatGptClient
أو ChatGPTClient
.settings.chatGptClient.openaiApiKey
) إلى رمز الوصول ChatGPT الذي حصلت عليه في الخطوة 1.model
على text-davinci-002-render
أو text-davinci-002-render-paid
أو text-davinci-002-render-sha
اعتمادًا على نماذج ChatGPT التي يمكن لحسابك الوصول إليها. يجب أن تكون النماذج اسم نموذج ChatGPT، وليس اسم النموذج الأساسي، ولا يمكنك استخدام نموذج لا يستطيع حسابك الوصول إليه.stream: true
(API) أو onProgress
(العميل) كحل بديل. قائمة بالمشاريع الرائعة باستخدام @waylaidwanderer/chatgpt-api
:
أضف ما لديك إلى القائمة عن طريق تحرير هذا الملف التمهيدي وإنشاء طلب سحب!
يتوفر أيضًا عميل ويب لهذا المشروع على waylaidwanderer/PandoraAI.
ChatGPTClient
نظرًا لأن gpt-3.5-turbo
هو النموذج الأساسي لـ ChatGPT، كان علي أن أبذل قصارى جهدي لتكرار الطريقة التي يستخدمها بها موقع ChatGPT الرسمي. هذا يعني أن تطبيقي أو النموذج الأساسي قد لا يتصرف بنفس الطريقة تمامًا في بعض النواحي:
إذا كنت ترغب في المساهمة في هذا المشروع، يرجى إنشاء طلب سحب مع وصف تفصيلي للتغييرات التي أجريتها.
هذا المشروع مرخص بموجب ترخيص MIT.