Microsoft обратилась ко мне о переходе этой библиотеки в новую официальную библиотеку C# Openai, и теперь она готова к работе! Начиная с v2.0.0-beta.3, официальная библиотека теперь имеет полное покрытие и будет оставаться в курсе. Более подробная информация в сообщении в блоге здесь: https://devblogs.microsoft.com/dotnet/openai-dotnet-library
Этот репо github останется здесь, чтобы документировать мою оригинальную версию библиотеки через версию 1.11, которая все еще доступна и в Nuget. ?
Простая библиотека обертки C# .NET для использования с API 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-бета, эта библиотека была принята Microsoft. Новая официальная версия библиотеки будет иметь полное покрытие и останется полностью в курсе. Более подробная информация в сообщении в блоге здесь: https://devblogs.microsoft.com/dotnet/openai-dotnet-library/ Этот репозиторий Github останется здесь, чтобы документировать мою оригинальную версию библиотеки через версию 1.11, которая все еще доступна на Nuget.
Эта библиотека основана на .net Standard 2.0, поэтому она должна работать во всех версиях .NET, от традиционного .NET Framework> = 4.7.2 до .NET (CORE)> = 3.0. Он должен работать через консольные приложения, Winforms, WPF, ASP.NET, Unity, Xamarin и т. Д. Это должно работать через Windows, Linux и Mac, и, возможно, даже мобильный. Существуют минимальные зависимости, и она лицензирована в общественном доступе.
Установите пакет OpenAI v1.11 от Nuget. Вот как через Commandline:
Install-Package OpenAI - Version 1.11 . 0Есть 3 способа обеспечить ваши ключи API, в порядке приоритета:
APIAuthentication(string key).openai и содержащий строку: OPENAI_API_KEY=sk-aaaabbbbbccccddddd Вы используете APIAuthentication при инициализации API, как показано:
// 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 или файл конфигурации), указывающая, какая организация используется для запроса 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:
var chat = api . Chat . CreateConversation ( ) ;
chat . AppendUserInput ( " How to make a hamburger? " ) ;
await foreach ( var res in chat . StreamResponseEnumerableFromChatbotAsync ( ) )
{
Console . Write ( res ) ;
}Или при использовании классического .NET Framework или C# <8.0:
var chat = api . Chat . CreateConversation ( ) ;
chat . AppendUserInput ( " How to make a hamburger? " ) ;
await chat . StreamResponseFromChatbotAsync ( res =>
{
Console . Write ( res ) ;
} ) ; Вы можете отправлять изображения в чат, чтобы использовать новую модель Vision GPT-4. Это работает только с моделью 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 и связанные с ними свойства.
Вы можете получить доступ к полному управлению API Chat, используя 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() чтобы получить текст, если все, что вам нужно, это текст ответа помощника.
Существует также асинхронный API, который работает аналогично результатам потоковой передачи конечной точки завершений.
С новыми моделями Model.GPT4_Turbo или gpt-3.5-turbo-1106 вы можете установить ChatRequest.ResponseFormat на ChatRequest.ResponseFormats.JsonObject для включения режима JSON. Когда режим JSON включен, модель ограничена только для создания строк, которые разрабатывают в действительный объект JSON. См.
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. Доступ к завершению API доступен через 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:
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 ) ;
}Или при использовании классического .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 ( ) ) ;Audio API-это текст в речь, транскрипция (речь в текст) и перевод (неанглийская речь на английский текст).
Доступ к 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
} API аудио транскрипции позволяет генерировать текст из аудио, на любом из поддерживаемых языков. Доступен через 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")
API модерации доступен через 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 ) ; MainContentFlag находятся FlaggedCategories .results[0]
Конечная точка API файлов доступна через 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 ) ;
}Существуют также методы для получения содержания файлов, удаления файла и т. Д.
Сама конечная точка с тонкой настройкой еще не была реализована, но скоро будет добавлена.
Доступ к API генерации изображений DALL-E доступен через 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, поэтому я не могу проверить эту функциональность. Если у вас есть доступ и вы можете проверить, отправьте проблему, описывающую ваши результаты. PR с интеграционными тестами также был бы очень оценен. В частности, мне неясно, что указание моделей работает одинаково с 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 как обычный. Вы также можете указать, что APIAuthentication является любым другим способом, перечисленным в разделе аутентификации выше. В настоящее время эта библиотека поддерживает только Api-Key Flow, а не рекламный переход.
По состоянию на 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, и эта библиотека не одобрена ими, у меня просто есть бета -доступ, и я хотел сделать библиотеку C# для более легкого доступа к ней. Надеемся, что другие также найдут это полезным. Не стесняйтесь открывать PR, если есть что -то, что вы хотите внести вклад.