تواصلت Microsoft إلي حول نقل هذه المكتبة إلى مكتبة رسمية جديدة C# Openai والآن أصبحت جاهزة للذهاب! بدءًا من v2.0.0-beta.3 ، فإن المكتبة الرسمية لديها الآن تغطية كاملة وستظل على اطلاع دائم. مزيد من التفاصيل في منشور المدونة هنا: https://devblogs.microsoft.com/dotnet/openai-dotnet-library
سيبقى هذا Github Repo هنا لتوثيق الإصدار الأصلي من المكتبة من خلال الإصدار 1.11 ، والذي لا يزال متاحًا على Nuget أيضًا. ؟
مكتبة غلاف C# .NET بسيطة لاستخدامها مع واجهة برمجة تطبيقات Openai. المزيد من السياق على مدونتي. هذه هي مكتبة الغلاف الأصلية غير الرسمية حول API Openai.
var api = new OpenAI_API . OpenAIAPI ( " YOUR_API_KEY " ) ;
var result = await api . Chat . CreateChatCompletionAsync ( " Hello! " ) ;
Console . WriteLine ( result ) ;
// should print something like "Hi! How can I help you?" بدءًا من V2.0.0-beta ، تم تبني هذه المكتبة بواسطة Microsoft. سيكون للنسخة الرسمية الجديدة من المكتبة تغطية كاملة وستظل محدثة بالكامل. مزيد من التفاصيل في منشور المدونة هنا: https://devblogs.microsoft.com/dotnet/openai-dotnet-library/ سيبقى هذا الريبو GitHub هنا لتوثيق الإصدار الأصلي من المكتبة من خلال الإصدار 1.11 ، والذي لا يزال متاحًا على Nuget أيضًا.
تعتمد هذه المكتبة على .NET Standard 2.0 ، لذلك يجب أن تعمل في جميع إصدارات .NET ، من إطار .NET التقليدي> = 4.7.2 إلى .NET (CORE)> = 3.0. يجب أن تعمل عبر تطبيقات وحدة التحكم ، و WinForms ، و WPF ، و ASP.NET ، و Unity ، و Xamarin ، وما إلى ذلك ، يجب أن تعمل عبر Windows و Linux و Mac ، وربما حتى الهاتف المحمول. هناك الحد الأدنى من التبعيات ، وهي مرخصة في المجال العام.
قم بتثبيت Package OpenAI v1.11 من Nuget. إليك كيف عبر سطر الأوامر:
Install-Package OpenAI - Version 1.11 . 0هناك 3 طرق لتوفير مفاتيح واجهة برمجة التطبيقات الخاصة بك ، حسب الأسبقية:
APIAuthentication(string key).openai ويحتوي على السطر: OPENAI_API_KEY=sk-aaaabbbbbccccddddd يمكنك استخدام APIAuthentication عند تهيئة واجهة برمجة التطبيقات كما هو موضح:
// for example
OpenAIAPI api = new OpenAIAPI ( " YOUR_API_KEY " ) ; // shorthand
// or
OpenAIAPI api = new OpenAIAPI ( new APIAuthentication ( " YOUR_API_KEY " ) ) ; // create object manually
// or
OpenAIAPI api = new OpenAIAPI ( APIAuthentication LoadFromEnv ( ) ) ; // use env vars
// or
OpenAIAPI api = new OpenAIAPI ( APIAuthentication LoadFromPath ( ) ) ; // use config file (can optionally specify where to look)
// or
OpenAIAPI api = new OpenAIAPI ( ) ; // uses default, env, or config fileيمكنك اختياريًا تضمين تنظيم OpenAiorganization (Openai_organization في ملف env أو config) لتحديد المؤسسة المستخدمة لطلب API. سيتم احتساب استخدام طلبات API هذه مقابل حصة الاشتراك في المنظمة المحددة. يمكن العثور على معرفات المؤسسة في صفحة إعدادات مؤسستك.
// for example
OpenAIAPI api = new OpenAIAPI ( new APIAuthentication ( " YOUR_API_KEY " , " org-yourOrgHere " ) ) ; يتم الوصول إلى واجهة برمجة تطبيقات الدردشة عبر OpenAIAPI.Chat . هناك طريقتان لاستخدام نقطة نهاية الدردشة ، إما عبر محادثات مبسطة أو مع طرق الطلب/الاستجابة الكاملة.
يتيح لك فئة المحادثة التفاعل بسهولة مع ChatGPT عن طريق إضافة رسائل إلى دردشة وطلب من ChatGPT الرد.
var chat = api . Chat . CreateConversation ( ) ;
chat . Model = Model . GPT4_Turbo ;
chat . RequestParameters . Temperature = 0 ;
/// give instruction as System
chat . AppendSystemMessage ( " You are a teacher who helps children understand if things are animals or not. If the user tells you an animal, you say " yes " . If the user tells you something that is not an animal, you say " no " . You only ever respond with " yes " or " no " . You do not say anything else. " ) ;
// give a few examples as user and assistant
chat . AppendUserInput ( " Is this an animal? Cat " ) ;
chat . AppendExampleChatbotOutput ( " Yes " ) ;
chat . AppendUserInput ( " Is this an animal? House " ) ;
chat . AppendExampleChatbotOutput ( " No " ) ;
// now let's ask it a question
chat . AppendUserInput ( " Is this an animal? Dog " ) ;
// and get the response
string response = await chat . GetResponseFromChatbotAsync ( ) ;
Console . WriteLine ( response ) ; // "Yes"
// and continue the conversation by asking another
chat . AppendUserInput ( " Is this an animal? Chair " ) ;
// and get another response
response = await chat . GetResponseFromChatbotAsync ( ) ;
Console . WriteLine ( response ) ; // "No"
// the entire chat history is available in chat.Messages
foreach ( ChatMessage msg in chat . Messages )
{
Console . WriteLine ( $" { msg . Role } : { msg . Content } " ) ;
} يتيح لك البث أن يحصل على نتائج هي أن يتم إنشاؤها ، والتي يمكن أن تساعد التطبيق الخاص بك على الشعور بمزيد من الاستجابة.
باستخدام متكررات C# 8.0 Async الجديدة:
var chat = api . Chat . CreateConversation ( ) ;
chat . AppendUserInput ( " How to make a hamburger? " ) ;
await foreach ( var res in chat . StreamResponseEnumerableFromChatbotAsync ( ) )
{
Console . Write ( res ) ;
}أو إذا كنت تستخدم Classic .NET Framework أو C# <8.0:
var chat = api . Chat . CreateConversation ( ) ;
chat . AppendUserInput ( " How to make a hamburger? " ) ;
await chat . StreamResponseFromChatbotAsync ( res =>
{
Console . Write ( res ) ;
} ) ; يمكنك إرسال صور إلى الدردشة لاستخدام نموذج GPT-4 Vision الجديد. هذا يعمل فقط مع نموذج Model.GPT4_Vision . يرجى الاطلاع على https://platform.openai.com/docs/guides/vision لمزيد من المعلومات والقيود.
// the simplest form
var result = await api . Chat . CreateChatCompletionAsync ( " What is the primary non-white color in this logo? " , ImageInput . FromFile ( " path/to/logo.png " ) ) ;
// or in a conversation
var chat = api . Chat . CreateConversation ( ) ;
chat . Model = Model . GPT4_Vision ;
chat . AppendSystemMessage ( " You are a graphic design assistant who helps identify colors. " ) ;
chat . AppendUserInput ( " What are the primary non-white colors in this logo? " , ImageInput . FromFile ( " path/to/logo.png " ) ) ;
string response = await chat . GetResponseFromChatbotAsync ( ) ;
Console . WriteLine ( response ) ; // "Blue and purple"
chat . AppendUserInput ( " What are the primary non-white colors in this logo? " , ImageInput . FromImageUrl ( " https://rogerpincombe.com/templates/rp/center-aligned-no-shadow-small.png " ) ) ;
response = await chat . GetResponseFromChatbotAsync ( ) ;
Console . WriteLine ( response ) ; // "Blue, red, and yellow"
// or when manually creating the ChatMessage
messageWithImage = new ChatMessage ( ChatMessageRole . User , " What colors do these logos have in common? " ) ;
messageWithImage . images . Add ( ImageInput . FromFile ( " path/to/logo.png " ) ) ;
messageWithImage . images . Add ( ImageInput . FromImageUrl ( " https://rogerpincombe.com/templates/rp/center-aligned-no-shadow-small.png " ) ) ;
// you can specify multiple images at once
chat . AppendUserInput ( " What colors do these logos have in common? " , ImageInput . FromFile ( " path/to/logo.png " ) , ImageInput . FromImageUrl ( " https://rogerpincombe.com/templates/rp/center-aligned-no-shadow-small.png " ) ) ; إذا كان تاريخ محادثة الدردشة قد حان للغاية ، فقد لا يتناسب مع طول سياق النموذج. بشكل افتراضي ، ستتم إزالة أقدم رسائل (رسائل) غير نظامية من تاريخ الدردشة وسيتم إعادة محاكمة استدعاء API. يمكنك تعطيل ذلك عن طريق تعيين chat.AutoTruncateOnContextLengthExceeded = false ، أو يمكنك تجاوز خوارزمية الاقتطاع مثل هذا:
chat . OnTruncationNeeded += ( sender , args ) =>
{
// args is a List<ChatMessage> with the current chat history. Remove or edit as nessisary.
// replace this with more sophisticated logic for your use-case, such as summarizing the chat history
for ( int i = 0 ; i < args . Count ; i ++ )
{
if ( args [ i ] . Role != ChatMessageRole . System )
{
args . RemoveAt ( i ) ;
return ;
}
}
} ; قد ترغب أيضًا في استخدام نموذج جديد بطول سياق أكبر. يمكنك القيام بذلك عن طريق تعيين chat.Model = Model.GPT4_Turbo أو chat.Model = Model.ChatGPTTurbo_16k ، إلخ.
يمكنك رؤية استخدام الرمز المميز عبر chat.MostRecentApiResult.Usage.PromptTokens والخصائص ذات الصلة.
يمكنك الوصول إلى التحكم الكامل في واجهة برمجة تطبيقات الدردشة باستخدام OpenAIAPI.Chat.CreateChatCompletionAsync() والأساليب ذات الصلة.
async Task < ChatResult > CreateChatCompletionAsync ( ChatRequest request ) ;
// for example
var result = await api . Chat . CreateChatCompletionAsync ( new ChatRequest ( )
{
Model = Model . ChatGPTTurbo ,
Temperature = 0.1 ,
MaxTokens = 50 ,
Messages = new ChatMessage [ ] {
new ChatMessage ( ChatMessageRole . User , " Hello! " )
}
} )
// or
var result = api . Chat . CreateChatCompletionAsync ( " Hello! " ) ;
var reply = results . Choices [ 0 ] . Message ;
Console . WriteLine ( $" { reply . Role } : { reply . Content . Trim ( ) } " ) ;
// or
Console . WriteLine ( results ) ; إنه يرجع إلى ChatResult في الغالب بيانات تعريف ، لذا استخدم طريقة .ToString() للحصول على النص إذا كان كل ما تريده هو نص رد المساعد.
هناك أيضًا واجهة برمجة تطبيقات تدفق غير متزامنة تعمل بشكل مشابه لنتائج دفق نقطة النهاية.
مع طرز Model.GPT4_Turbo أو gpt-3.5-turbo-1106 ، يمكنك تعيين ChatRequest.ResponseFormat على ChatRequest.ResponseFormats.JsonObject لتمكين وضع JSON. عند تمكين وضع JSON ، يكون النموذج مقيدًا لإنشاء سلاسل فقط في كائن JSON صالح. راجع https://platform.openai.com/docs/guides/text-generation/json-mode لمزيد من التفاصيل.
ChatRequest chatRequest = new ChatRequest ( )
{
Model = model ,
Temperature = 0.0 ,
MaxTokens = 500 ,
ResponseFormat = ChatRequest . ResponseFormats . JsonObject ,
Messages = new ChatMessage [ ] {
new ChatMessage ( ChatMessageRole . System , " You are a helpful assistant designed to output JSON. " ) ,
new ChatMessage ( ChatMessageRole . User , " Who won the world series in 2020? Return JSON of a 'wins' dictionary with the year as the numeric key and the winning team as the string value. " )
}
} ;
var results = await api . Chat . CreateChatCompletionAsync ( chatRequest ) ;
Console . WriteLine ( results ) ;
/* prints:
{
"wins": {
2020: "Los Angeles Dodgers"
}
}
*/ تعتبر الإكمال إرثًا بواسطة Openai. يتم الوصول إلى واجهة برمجة تطبيقات الانتهاء عبر OpenAIAPI.Completions :
async Task < CompletionResult > CreateCompletionAsync ( CompletionRequest request ) ;
// for example
var result = await api . Completions . CreateCompletionAsync ( new CompletionRequest ( " One Two Three One Two " , model : Model . CurieText , temperature : 0.1 ) ) ;
// or
var result = await api . Completions . CreateCompletionAsync ( " One Two Three One Two " , temperature : 0.1 ) ;
// or other convenience overloads يمكنك إنشاء CompletionRequest في وقت مبكر أو استخدام أحد الأحمال الزائدة للمساعد للراحة. إنها تُرجع CompletionResult والتي هي في الغالب البيانات الوصفية ، لذا استخدم طريقة .ToString() للحصول على النص إذا كان كل ما تريد هو الانتهاء.
يتيح لك التدفق الحصول على نتائج هي أن يتم إنشاؤها ، والتي يمكن أن تساعد تطبيقك على الشعور بمزيد من الاستجابة ، وخاصة في النماذج البطيئة مثل Davinci.
باستخدام متكررات C# 8.0 Async الجديدة:
IAsyncEnumerable < CompletionResult > StreamCompletionEnumerableAsync ( CompletionRequest request ) ;
// for example
await foreach ( var token in api . Completions . StreamCompletionEnumerableAsync ( new CompletionRequest ( " My name is Roger and I am a principal software engineer at Salesforce. This is my resume: " , Model . DavinciText , 200 , 0.5 , presencePenalty : 0.1 , frequencyPenalty : 0.1 ) ) )
{
Console . Write ( token ) ;
}أو إذا كنت تستخدم Classic .NET Framework أو C# <8.0:
async Task StreamCompletionAsync ( CompletionRequest request , Action < CompletionResult > resultHandler ) ;
// for example
await api . Completions . StreamCompletionAsync (
new CompletionRequest ( " My name is Roger and I am a principal software engineer at Salesforce. This is my resume: " , Model . DavinciText , 200 , 0.5 , presencePenalty : 0.1 , frequencyPenalty : 0.1 ) ,
res => ResumeTextbox . Text += res . ToString ( ) ) ;واجهة برمجة تطبيقات الصوت هي نص إلى الكلام ، والنسخ (الكلام إلى النص) ، والترجمة (خطاب غير إنجليزي للنص الإنجليزي).
يتم الوصول إلى API TTS عبر OpenAIAPI.TextToSpeech :
await api . TextToSpeech . SaveSpeechToFileAsync ( " Hello, brave new world! This is a test. " , outputPath ) ;
// You can open it in the defaul audio player like this:
Process . Start ( outputPath ) ; يمكنك أيضًا تحديد جميع معلمات الطلب باستخدام كائن TextToSpeechRequest :
var request = new TextToSpeechRequest ( )
{
Input = " Hello, brave new world! This is a test. " ,
ResponseFormat = ResponseFormats . AAC ,
Model = Model . TTS_HD ,
Voice = Voices . Nova ,
Speed = 0.9
} ;
await api . TextToSpeech . SaveSpeechToFileAsync ( request , " test.aac " ) ; بدلاً من حفظ ملف ، يمكنك الحصول على دفق بايت صوتي مع api.TextToSpeech.GetSpeechAsStreamAsync(request) :
using ( Stream result = await api . TextToSpeech . GetSpeechAsStreamAsync ( " Hello, brave new world! " , Voices . Fable ) )
using ( StreamReader reader = new StreamReader ( result ) )
{
// do something with the audio stream here
} تتيح لك واجهة برمجة تطبيقات النسخ الصوتي إنشاء نص من الصوت ، في أي من اللغات المدعومة. يتم الوصول إليه عبر OpenAIAPI.Transcriptions :
string resultText = await api . Transcriptions . GetTextAsync ( " path/to/file.mp3 " ) ;يمكنك طلب نتائج مطوّلة ، والتي ستمنحك معلومات القطاع والرمز المميز ، بالإضافة إلى بيانات تعريف Openai القياسية مثل وقت المعالجة:
AudioResultVerbose result = await api . Transcriptions . GetWithDetailsAsync ( " path/to/file.m4a " ) ;
Console . WriteLine ( result . ProcessingTime . TotalMilliseconds ) ; // 496ms
Console . WriteLine ( result . text ) ; // "Hello, this is a test of the transcription function."
Console . WriteLine ( result . language ) ; // "english"
Console . WriteLine ( result . segments [ 0 ] . no_speech_prob ) ; // 0.03712
// etcيمكنك أيضًا طلب النتائج في تنسيق SRT أو VTT ، وهو أمر مفيد لإنشاء ترجمات لمقاطع الفيديو:
string result = await api . Transcriptions . GetAsFormatAsync ( " path/to/file.m4a " , AudioRequest . ResponseFormats . SRT ) ;يمكن تحديد معلمات إضافية مثل درجة الحرارة ، والمطالبة ، واللغة ، وما إلى ذلك ، إما لكل طلب أو كإعداد افتراضي:
// inline
result = await api . Transcriptions . GetTextAsync ( " conversation.mp3 " , " en " , " This is a transcript of a conversation between a medical doctor and her patient: " , 0.3 ) ;
// set defaults
api . Transcriptions . DefaultTranscriptionRequestArgs . Language = " en " ;بدلاً من توفير ملف محلي على القرص ، يمكنك توفير دفق من بايت الصوت. يمكن أن يكون هذا مفيدًا لتدفق الصوت من الميكروفون أو مصدر آخر دون الحاجة إلى الكتابة أولاً إلى القرص. من فضلك لا يجب عليك تحديد اسم ملف ، والذي لا يجب أن يكون موجودًا ، ولكن يجب أن يحتوي على امتداد دقيق لنوع الصوت الذي ترسله. يستخدم Openai امتداد اسم الملف لتحديد تنسيق دفق الصوت الخاص بك.
using ( var audioStream = File . OpenRead ( " path-here.mp3 " ) )
{
return await api . Transcriptions . GetTextAsync ( audioStream , " file.mp3 " ) ;
} تتيح لك الترجمات نسخ النص من أي من اللغات المدعومة إلى اللغة الإنجليزية. Openai لا يدعم الترجمة إلى أي لغة أخرى ، فقط اللغة الإنجليزية. يتم الوصول إليه عبر OpenAIAPI.Translations . وهو يدعم جميع وظائف نفس النسخ.
string result = await api . Translations . GetTextAsync ( " chinese-example.m4a " ) ; يتم الوصول إلى API التضمين عبر OpenAIAPI.Embeddings :
async Task < EmbeddingResult > CreateEmbeddingAsync ( EmbeddingRequest request ) ;
// for example
var result = await api . Embeddings . CreateEmbeddingAsync ( new EmbeddingRequest ( " A test text for embedding " , model : Model . AdaTextEmbedding ) ) ;
// or
var result = await api . Embeddings . CreateEmbeddingAsync ( " A test text for embedding " ) ;تحتوي نتيجة التضمين على الكثير من البيانات الوصفية ، فإن المتجه الفعلي للعوامات في النتيجة. data []. التضمين.
من أجل البساطة ، يمكنك أن تسأل مباشرة عن متجه العوامات وترسخ البيانات الوصفية الإضافية باستخدام api.Embeddings.GetEmbeddingsAsync("test text here")
يتم الوصول إلى واجهة برمجة تطبيقات الاعتدال عبر OpenAIAPI.Moderation :
async Task < ModerationResult > CreateEmbeddingAsync ( ModerationRequest request ) ;
// for example
var result = await api . Moderation . CallModerationAsync ( new ModerationRequest ( " A test text for moderating " , Model . TextModerationLatest ) ) ;
// or
var result = await api . Moderation . CallModerationAsync ( " A test text for moderating " ) ;
Console . WriteLine ( result . results [ 0 ] . MainContentFlag ) ; النتائج في .results[0] ولها أساليب مساعد لطيفة مثل FlaggedCategories و MainContentFlag .
يتم الوصول إلى نقطة نهاية API Files عبر OpenAIAPI.Files :
// uploading
async Task < File > UploadFileAsync ( string filePath , string purpose = " fine-tune " ) ;
// for example
var response = await api . Files . UploadFileAsync ( " fine-tuning-data.jsonl " ) ;
Console . Write ( response . Id ) ; //the id of the uploaded file
// listing
async Task < List < File > > GetFilesAsync ( ) ;
// for example
var response = await api . Files . GetFilesAsync ( ) ;
foreach ( var file in response )
{
Console . WriteLine ( file . Name ) ;
}هناك أيضًا طرق للحصول على محتويات الملفات ، وحذف ملف ، إلخ.
لم يتم تنفيذ نقطة النهاية التي تم ضبطها بحد ذاتها ، ولكن سيتم إضافتها قريبًا.
يتم الوصول إلى واجهة برمجة تطبيقات Dall-E Image Generation عبر OpenAIAPI.ImageGenerations :
async Task < ImageResult > CreateImageAsync ( ImageGenerationRequest request ) ;
// for example
var result = await api . ImageGenerations . CreateImageAsync ( new ImageGenerationRequest ( " A drawing of a computer writing a test " , 1 , ImageSize . _512 ) ) ;
// or
var result = await api . ImageGenerations . CreateImageAsync ( " A drawing of a computer writing a test " ) ;
Console . WriteLine ( result . Data [ 0 ] . Url ) ;تحتوي نتيجة الصورة على عنوان URL لصورة عبر الإنترنت أو صورة مشفرة BASE64 ، اعتمادًا على ImageGenerationRequest.responseformat (عنوان URL هو الافتراضي).
استخدم Dall-E 3 مثل هذا:
async Task < ImageResult > CreateImageAsync ( ImageGenerationRequest request ) ;
// for example
var result = await api . ImageGenerations . CreateImageAsync ( new ImageGenerationRequest ( " A drawing of a computer writing a test " , OpenAI_API . Models . Model . DALLE3 , ImageSize . _1024x1792 , " hd " ) ) ;
// or
var result = await api . ImageGenerations . CreateImageAsync ( " A drawing of a computer writing a test " , OpenAI_API . Models . Model . DALLE3 ) ;
Console . WriteLine ( result . Data [ 0 ] . Url ) ; لاستخدام خدمة Azure Openai ، تحتاج إلى تحديد اسم مورد Azure Openai بالإضافة إلى معرف نشر النموذج الخاص بك.
ليس لدي إمكانية الوصول إلى خدمة Microsoft Azure Openai ، لذلك لا أستطيع اختبار هذه الوظيفة. إذا كان لديك وصول ويمكنك الاختبار ، فيرجى إرسال مشكلة تصف نتائجك. كما سيكون موضع تقدير كبير في اختبارات التكامل. على وجه التحديد ، من غير الواضح بالنسبة لي أن تحديد النماذج يعمل بنفس الطريقة مع Azure.
راجع وثائق Azure Openai ولقطات مفصلة في #64 لمزيد من المعلومات.
يجب أن يبدو التكوين شيئًا كهذا لخدمة Azure:
OpenAIAPI api = OpenAIAPI . ForAzure ( " YourResourceName " , " deploymentId " , " api-key " ) ;
api . ApiVersion = " 2023-03-15-preview " ; // needed to access chat endpoint on Azure يمكنك بعد ذلك استخدام كائن api مثل Normal. يمكنك أيضًا تحديد APIAuthentication هو أي من الطرق الأخرى المدرجة في قسم المصادقة أعلاه. حاليًا تدعم هذه المكتبة تدفق مفتاح API فقط ، وليس التدفق الإعلاني.
اعتبارًا من 2 أبريل 2023 ، تحتاج إلى تحديد API الإصدار 2023-03-15-preview كما هو موضح أعلاه للوصول إلى نقطة نهاية الدردشة على Azure. بمجرد خروج هذا من المعاينة ، سأقوم بتحديث الافتراضي.
يمكنك تحديد IHttpClientFactory لاستخدامها في طلبات HTTP ، والتي تتيح تعديل خصائص طلب HTTP وتجميع الاتصال والسخرية. التفاصيل في #103.
OpenAIAPI api = new OpenAIAPI ( ) ;
api . HttpClientFactory = myIHttpClientFactoryObject ; كل فصل واحد وطريقة وممتلكات لديه وثائق XML واسعة النطاق ، لذلك يجب أن تظهر تلقائيًا في Intellisense. يجب أن يكون ذلك مع وثائق Openai الرسمية كافية للبدء. لا تتردد في فتح مشكلة هنا إذا كان لديك أي أسئلة. قد تأتي وثائق أفضل لاحقًا.
CC-0 المجال العام
هذه المكتبة مرخصة CC-0 ، في المجال العام. يمكنك استخدامه لكل ما تريد ، علنًا أو خاصًا ، دون القلق بشأن إذن أو ترخيص أو أي شيء آخر. إنه مجرد غلاف حول API Openai ، لذلك لا تزال بحاجة إلى الوصول إلى Openai منها مباشرة. أنا لست مرتبطًا بـ Openai ولم يتم اعتماد هذه المكتبة من قبلهم ، بل لديّ فقط الوصول إلى Beta وأردت جعل مكتبة C# للوصول إليها بسهولة أكبر. نأمل أن يجد الآخرون هذا مفيدًا أيضًا. لا تتردد في فتح العلاقات العامة إذا كان هناك أي شيء تريد المساهمة.