Microsoftは、このライブラリを新しい公式C#Openaiライブラリに移行することについて私に連絡しましたが、今では準備ができています! V2.0.0-Beta.3から始めて、公式ライブラリには完全なカバレッジがあり、最新の状態に保たれます。詳細については、https://devblogs.microsoft.com/dotnet/openai-dotnet-libraryのブログ投稿の詳細
このGitHubリポジトリは、バージョン1.11を介して私の元のバージョンのライブラリを文書化するためにここに残ります。これはNugetでも利用できます。 ?
OpenAIのAPIで使用するシンプルなC#.NETラッパーライブラリ。私のブログのより多くのコンテキスト。これは、Openai API周辺の私の元の非公式のラッパーライブラリです。
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 Repoのブログ投稿の詳細は、Nugetでも入手できるバージョン1.11を通じてライブラリの私の元のバージョンを文書化するためにここに残ります。
このライブラリは.NET Standard 2.0に基づいているため、従来の.NETフレームワークから.NETのすべてのバージョンにわたって動作するはずです> = 4.7.2から.NET(CORE)> = 3.0。コンソールアプリ、Winforms、WPF、ASP.NET、Unity、Xamarinなどで動作するはずです。Windows、Linux、Mac、さらにはモバイルで動作するはずです。依存関係は最小限であり、パブリックドメインでライセンスされています。
NugetからPackage OpenAI v1.11をインストールします。コマンドライン経由の方法は次のとおりです。
Install-Package OpenAI - Version 1.11 . 0APIキーを提供するには、優先順位の順に3つの方法があります。
APIAuthentication(string key)コンストラクターに渡します.openaiという名前のユーザーディレクトリに構成ファイルを含め、行を含みます。 OPENAI_API_KEY=sk-aaaabbbbbccccddddd図のようにAPIを初期化するときに、 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オプションで、APIリクエストに使用される組織を指定するOpenaiorGanization(envまたはconfigファイルのopenai_organization)を含めることができます。これらのAPI要求からの使用は、指定された組織のサブスクリプションクォータに対してカウントされます。組織IDは、組織設定ページにあります。
// for example
OpenAIAPI api = new OpenAIAPI ( new APIAuthentication ( " YOUR_API_KEY " , " org-yourOrgHere " ) ) ;チャットAPIは、 OpenAIAPI.Chatを介してアクセスされます。 Chat Endpointを使用するには、簡素化された会話を介して、または完全なリクエスト/応答方法を使用するには、2つの方法があります。
会話のクラスでは、チャットにメッセージを追加し、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 Iteratorsの使用:
var chat = api . Chat . CreateConversation ( ) ;
chat . AppendUserInput ( " How to make a hamburger? " ) ;
await foreach ( var res in chat . StreamResponseEnumerableFromChatbotAsync ( ) )
{
Console . Write ( res ) ;
}または、クラシック.NETフレームワークまたは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()および関連する方法を使用して、チャットAPIの完全な制御にアクセスできます。
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オブジェクトに解析する文字列のみを生成するように制約されます。詳細については、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によるレガシーと見なされます。完了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を事前に作成するか、便利なためにヘルパーの過負荷の1つを使用できます。主にメタデータであるCompletionResultを返すため、必要なのが完了だけである場合は、その.ToString()メソッドを使用してテキストを取得します。
ストリーミングを使用すると、結果が生成されます。これにより、特にDavinciのようなスローモデルでアプリケーションがより応答していると感じることができます。
新しいC#8.0 Async Iteratorsの使用:
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フレームワークまたは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 APIは、 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は、Filename拡張機能を使用して、オーディオストリームの形式を決定します。
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 ) ;結果は.results[0]であり、 FlaggedCategoriesやMainContentFlagなどの優れたヘルパーメソッドがあります。
ファイル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 ) ;
}また、ファイルの内容を取得したり、ファイルを削除したりする方法もあります。
微調整エンドポイント自体はまだ実装されていませんが、まもなく追加されます。
Dall-E画像生成APIは、 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 ) ;画像結果には、ImageGenerationRequest.responseFormat(URLがデフォルト)に応じて、オンライン画像またはBase64エンコード画像の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リソースの名前とモデル展開IDを指定する必要があります。
Microsoft Azure Openaiサービスにはアクセスできないため、この機能をテストすることはできません。アクセスしてテストできる場合は、結果を説明する問題を提出してください。統合テストを備えたPRも大歓迎です。具体的には、モデルを指定することはAzureで同じように機能することは不明です。
詳細については、Azure Openaiドキュメントと#64の詳細なスクリーンショットを参照してください。
Azure Serviceの構成は次のようになります。
OpenAIAPI api = OpenAIAPI . ForAzure ( " YourResourceName " , " deploymentId " , " api-key " ) ;
api . ApiVersion = " 2023-03-15-preview " ; // needed to access chat endpoint on Azure次に、通常のようなapiオブジェクトを使用できます。また、上記の認証セクションにリストされている他の方法のいずれかであるAPIAuthenticationは、指定することもできます。現在、このライブラリは、広告フローではなく、アピキーフローのみをサポートしています。
2023年4月2日現在、Azureのチャットエンドポイントにアクセスするために、上記のようにAPIバージョン2023-03-15-previewを手動で選択する必要があります。これがプレビューから外れたら、デフォルトを更新します。
HTTPリクエストに使用するIHttpClientFactory指定することができます。これにより、HTTPリクエストプロパティ、接続プーリング、およびモッキングを調整できます。 #103の詳細。
OpenAIAPI api = new OpenAIAPI ( ) ;
api . HttpClientFactory = myIHttpClientFactoryObject ; すべてのクラス、方法、およびプロパティには広範なXMLドキュメントがあるため、IntelliSenseで自動的に表示されるはずです。それは公式のOpenaiのドキュメントと組み合わせるだけで、開始するのに十分なはずです。ご質問がある場合は、ここで問題を開いてください。より良いドキュメントは後で来るかもしれません。
CC-0パブリックドメイン
このライブラリは、パブリックドメインにあるCC-0のライセンスを取得しています。許可やライセンスなどを心配することなく、公開または個人的に、どんなものにも使用できます。 Openai APIの周りのラッパーであるため、Openaiから直接アクセスする必要があります。私はOpenaiと提携していません。このライブラリは彼らによって承認されていません。ベータアクセスがあり、C#ライブラリを作成してより簡単にアクセスしたいと考えていました。うまくいけば、他の人もこれが便利だと思うでしょう。貢献したいものがあれば、PRを自由に開くことができます。