OpenAI 1.2.0

.NET Standard 2.0
NuGet\Install-Package OpenAI -Version 1.2.0
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
dotnet add package OpenAI --version 1.2.0
<PackageReference Include="OpenAI" Version="1.2.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add OpenAI --version 1.2.0
#r "nuget: OpenAI, 1.2.0"
#r directive can be used in F# Interactive, C# scripting and .NET Interactive. Copy this into the interactive tool or source code of the script to reference the package.
// Install OpenAI as a Cake Addin
#addin nuget:?package=OpenAI&version=1.2.0

// Install OpenAI as a Cake Tool
#tool nuget:?package=OpenAI&version=1.2.0

C#/.NET SDK for accessing the OpenAI GPT-3 API

A simple C# .NET wrapper library to use with OpenAI's GPT-3 API. More context on my blog.


var api = new OpenAI_API.OpenAIAPI(engine: Engine.Davinci);

var result = await api.Completions.CreateCompletionAsync("One Two Three One Two", temperature: 0.1);
// should print something starting with "Three"
var api = new OpenAI_API.OpenAIAPI("sk-mysecretkeyhere"););

var result = await api.Search.GetBestMatchAsync("Washington DC", "Canada", "China", "USA", "Spain");
// should print "USA"


This library is based on .NET Standard 2.0, so it should work across .NET Framework >=4.7.2 and .NET Core >= 3.0. It should work across console apps, winforms, wpf,, etc (although I have not yet tested with It should work across Windows, Linux, and Mac, although I have only tested on Windows so far.

Getting started

Install from NuGet

Install package OpenAI from Nuget. Here's how via commandline:

Install-Package OpenAI


There are 3 ways to provide your API keys, in order of precedence:

  1. Pass keys directly to APIAuthentication(string key) constructor
  2. Set environment var for OPENAI_KEY
  3. Include a config file in the local directory or in your user directory named .openai and containing one or both lines:

You use the APIAuthentication when you initialize the API as shown:

// for example
OpenAIAPI api = new OpenAIAPI("sk-mykeyhere"); // shorthand
// or
OpenAIAPI api = new OpenAIAPI(new APIAuthentication("sk-secretkey")); // 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


The Completion API is accessed via OpenAIAPI.Completions:

CreateCompletionAsync(CompletionRequest request)

// for example
var result = await api.Completions.CreateCompletionAsync(new CompletionRequest("One Two Three One Two", temperature: 0.1));
// or
var result = await api.Completions.CreateCompletionAsync("One Two Three One Two", temperature: 0.1);
// or other convenience overloads

You can create your CompletionRequest ahead of time or use one of the helper overloads for convenience. It returns a CompletionResult which is mostly metadata, so use its .ToString() method to get the text if all you want is the completion.


Streaming allows you to get results are they are generated, which can help your application feel more responsive, especially on slow models like Davinci.

Using the new 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:", 200, 0.5, presencePenalty: 0.1, frequencyPenalty: 0.1)))

Or if using .NET framework or C# <8.0:

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:", 200, 0.5, presencePenalty: 0.1, frequencyPenalty: 0.1),
	res => ResumeTextbox.Text += res.ToString());

The Search API is accessed via OpenAIAPI.Search:

You can get all results as a dictionary using

GetSearchResultsAsync(SearchRequest request)

// for example
var request = new SearchRequest()
	Query = "Washington DC",
	Documents = new List<string> { "Canada", "China", "USA", "Spain" }
var result = await api.Search.GetSearchResultsAsync(request);
// result["USA"] == 294.22
// result["Spain"] == 73.81

The returned dictionary maps documents to scores. You can create your SearchRequest ahead of time or use one of the helper overloads for convenience, such as

GetSearchResultsAsync(string query, params string[] documents)

// for example
var result = await api.Search.GetSearchResultsAsync("Washington DC", "Canada", "China", "USA", "Spain");

You can get only the best match using


And if you only want the best match but still want to know the score, use


Each of those methods has similar convenience overloads to specify the request inline.


I don't yet have access to finetuning, but once I do I will add it to this SDK. Subscribe to this repo if you want to be alerted.


Every single class, method, and property has extensive XML documentation, so it should show up automatically in IntelliSense. That combined with the official OpenAI documentation should be enough to get started. Feel free to ping me on Twitter @OkGoDoIt if you have any questions. Better documentation may come later.


CC-0 Public Domain

This library is licensed CC-0, in the public domain. You can use it for whatever you want, publicly or privately, without worrying about permission or licensing or whatever. It's just a wrapper around the OpenAI API, so you still need to get access to OpenAI from them directly. I am not affiliated with OpenAI and this library is not endorsed by them, I just have beta access and wanted to make a C# library to access it more easily. Hopefully others find this useful as well. Feel free to open a PR if there's anything you want to contribute.

Product Versions
.NET net5.0 net5.0-windows net6.0 net6.0-android net6.0-ios net6.0-maccatalyst net6.0-macos net6.0-tvos net6.0-windows
.NET Core netcoreapp2.0 netcoreapp2.1 netcoreapp2.2 netcoreapp3.0 netcoreapp3.1
.NET Standard netstandard2.0 netstandard2.1
.NET Framework net461 net462 net463 net47 net471 net472 net48
MonoAndroid monoandroid
MonoMac monomac
MonoTouch monotouch
Tizen tizen40 tizen60
Xamarin.iOS xamarinios
Xamarin.Mac xamarinmac
Xamarin.TVOS xamarintvos
Xamarin.WatchOS xamarinwatchos
Compatible target framework(s)
Additional computed target framework(s)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on OpenAI:

Package Downloads

talk to the OpenAI API

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.2.0 15,833 12/22/2020
1.1.0 656 7/28/2020
1.0.0 320 7/23/2020

Added support for "echo" parameter, which echos back the prompt in responses (thanks to @GotMike!)  Removed support for publishable API keys (and renamed secret keys to simply API keys) since OpenAI no longer supports publishable keys.  Also fixed various typos in the documentation.