Microsoft.Extensions.AI.OpenAI
9.0.0-preview.9.24525.1
Prefix Reserved
See the version list below for details.
dotnet add package Microsoft.Extensions.AI.OpenAI --version 9.0.0-preview.9.24525.1
NuGet\Install-Package Microsoft.Extensions.AI.OpenAI -Version 9.0.0-preview.9.24525.1
<PackageReference Include="Microsoft.Extensions.AI.OpenAI" Version="9.0.0-preview.9.24525.1" />
paket add Microsoft.Extensions.AI.OpenAI --version 9.0.0-preview.9.24525.1
#r "nuget: Microsoft.Extensions.AI.OpenAI, 9.0.0-preview.9.24525.1"
// Install Microsoft.Extensions.AI.OpenAI as a Cake Addin #addin nuget:?package=Microsoft.Extensions.AI.OpenAI&version=9.0.0-preview.9.24525.1&prerelease // Install Microsoft.Extensions.AI.OpenAI as a Cake Tool #tool nuget:?package=Microsoft.Extensions.AI.OpenAI&version=9.0.0-preview.9.24525.1&prerelease
Microsoft.Extensions.AI.OpenAI
Provides an implementation of the IChatClient
interface for the OpenAI
package and OpenAI-compatible endpoints.
Install the package
From the command-line:
dotnet add package Microsoft.Extensions.AI.OpenAI
Or directly in the C# project file:
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.AI.OpenAI" Version="[CURRENTVERSION]" />
</ItemGroup>
Usage Examples
Chat
using Microsoft.Extensions.AI;
using OpenAI;
IChatClient client =
new OpenAIClient(Environment.GetEnvironmentVariable("OPENAI_API_KEY"))
.AsChatClient("gpt-4o-mini");
Console.WriteLine(await client.CompleteAsync("What is AI?"));
Chat + Conversation History
using Microsoft.Extensions.AI;
using OpenAI;
IChatClient client =
new OpenAIClient(Environment.GetEnvironmentVariable("OPENAI_API_KEY"))
.AsChatClient("gpt-4o-mini");
Console.WriteLine(await client.CompleteAsync(
[
new ChatMessage(ChatRole.System, "You are a helpful AI assistant"),
new ChatMessage(ChatRole.User, "What is AI?"),
]));
Chat streaming
using Microsoft.Extensions.AI;
using OpenAI;
IChatClient client =
new OpenAIClient(Environment.GetEnvironmentVariable("OPENAI_API_KEY"))
.AsChatClient("gpt-4o-mini");
await foreach (var update in client.CompleteStreamingAsync("What is AI?"))
{
Console.Write(update);
}
Tool calling
using System.ComponentModel;
using Microsoft.Extensions.AI;
using OpenAI;
IChatClient openaiClient =
new OpenAIClient(Environment.GetEnvironmentVariable("OPENAI_API_KEY"))
.AsChatClient("gpt-4o-mini");
IChatClient client = new ChatClientBuilder()
.UseFunctionInvocation()
.Use(openaiClient);
ChatOptions chatOptions = new()
{
Tools = [AIFunctionFactory.Create(GetWeather)]
};
await foreach (var message in client.CompleteStreamingAsync("Do I need an umbrella?", chatOptions))
{
Console.Write(message);
}
[Description("Gets the weather")]
static string GetWeather() => Random.Shared.NextDouble() > 0.5 ? "It's sunny" : "It's raining";
Caching
using Microsoft.Extensions.AI;
using Microsoft.Extensions.Caching.Distributed;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Options;
using OpenAI;
IDistributedCache cache = new MemoryDistributedCache(Options.Create(new MemoryDistributedCacheOptions()));
IChatClient openaiClient =
new OpenAIClient(Environment.GetEnvironmentVariable("OPENAI_API_KEY"))
.AsChatClient("gpt-4o-mini");
IChatClient client = new ChatClientBuilder()
.UseDistributedCache(cache)
.Use(openaiClient);
for (int i = 0; i < 3; i++)
{
await foreach (var message in client.CompleteStreamingAsync("In less than 100 words, what is AI?"))
{
Console.Write(message);
}
Console.WriteLine();
Console.WriteLine();
}
Telemetry
using Microsoft.Extensions.AI;
using OpenAI;
using OpenTelemetry.Trace;
// Configure OpenTelemetry exporter
var sourceName = Guid.NewGuid().ToString();
var tracerProvider = OpenTelemetry.Sdk.CreateTracerProviderBuilder()
.AddSource(sourceName)
.AddConsoleExporter()
.Build();
IChatClient openaiClient =
new OpenAIClient(Environment.GetEnvironmentVariable("OPENAI_API_KEY"))
.AsChatClient("gpt-4o-mini");
IChatClient client = new ChatClientBuilder()
.UseOpenTelemetry(sourceName, c => c.EnableSensitiveData = true)
.Use(openaiClient);
Console.WriteLine(await client.CompleteAsync("What is AI?"));
Telemetry, Caching, and Tool Calling
using System.ComponentModel;
using Microsoft.Extensions.AI;
using Microsoft.Extensions.Caching.Distributed;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Options;
using OpenAI;
using OpenTelemetry.Trace;
// Configure telemetry
var sourceName = Guid.NewGuid().ToString();
var tracerProvider = OpenTelemetry.Sdk.CreateTracerProviderBuilder()
.AddSource(sourceName)
.AddConsoleExporter()
.Build();
// Configure caching
IDistributedCache cache = new MemoryDistributedCache(Options.Create(new MemoryDistributedCacheOptions()));
// Configure tool calling
var chatOptions = new ChatOptions
{
Tools = [AIFunctionFactory.Create(GetPersonAge)]
};
IChatClient openaiClient =
new OpenAIClient(Environment.GetEnvironmentVariable("OPENAI_API_KEY"))
.AsChatClient("gpt-4o-mini");
IChatClient client = new ChatClientBuilder()
.UseDistributedCache(cache)
.UseFunctionInvocation()
.UseOpenTelemetry(sourceName, c => c.EnableSensitiveData = true)
.Use(openaiClient);
for (int i = 0; i < 3; i++)
{
Console.WriteLine(await client.CompleteAsync("How much older is Alice than Bob?", chatOptions));
}
[Description("Gets the age of a person specified by name.")]
static int GetPersonAge(string personName) =>
personName switch
{
"Alice" => 42,
"Bob" => 35,
_ => 26,
};
Text embedding generation
using Microsoft.Extensions.AI;
using OpenAI;
IEmbeddingGenerator<string, Embedding<float>> generator =
new OpenAIClient(Environment.GetEnvironmentVariable("OPENAI_API_KEY"))
.AsEmbeddingGenerator("text-embedding-3-small");
var embeddings = await generator.GenerateAsync("What is AI?");
Console.WriteLine(string.Join(", ", embeddings[0].Vector.ToArray()));
Text embedding generation with caching
using Microsoft.Extensions.AI;
using Microsoft.Extensions.Caching.Distributed;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Options;
using OpenAI;
IDistributedCache cache = new MemoryDistributedCache(Options.Create(new MemoryDistributedCacheOptions()));
IEmbeddingGenerator<string, Embedding<float>> openAIGenerator =
new OpenAIClient(Environment.GetEnvironmentVariable("OPENAI_API_KEY"))
.AsEmbeddingGenerator("text-embedding-3-small");
IEmbeddingGenerator<string, Embedding<float>> generator = new EmbeddingGeneratorBuilder<string, Embedding<float>>()
.UseDistributedCache(cache)
.Use(openAIGenerator);
foreach (var prompt in new[] { "What is AI?", "What is .NET?", "What is AI?" })
{
var embeddings = await generator.GenerateAsync(prompt);
Console.WriteLine(string.Join(", ", embeddings[0].Vector.ToArray()));
}
Dependency Injection
using Microsoft.Extensions.AI;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using OpenAI;
// App Setup
var builder = Host.CreateApplicationBuilder();
builder.Services.AddSingleton(new OpenAIClient(Environment.GetEnvironmentVariable("OPENAI_API_KEY")));
builder.Services.AddDistributedMemoryCache();
builder.Services.AddLogging(b => b.AddConsole().SetMinimumLevel(LogLevel.Trace));
builder.Services.AddChatClient(b => b
.UseDistributedCache()
.UseLogging()
.Use(b.Services.GetRequiredService<OpenAIClient>().AsChatClient("gpt-4o-mini")));
var app = builder.Build();
// Elsewhere in the app
var chatClient = app.Services.GetRequiredService<IChatClient>();
Console.WriteLine(await chatClient.CompleteAsync("What is AI?"));
Minimal Web API
using Microsoft.Extensions.AI;
using OpenAI;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSingleton(new OpenAIClient(builder.Configuration["OPENAI_API_KEY"]));
builder.Services.AddChatClient(b =>
b.Use(b.Services.GetRequiredService<OpenAIClient>().AsChatClient("gpt-4o-mini")));
builder.Services.AddEmbeddingGenerator<string, Embedding<float>>(g =>
g.Use(g.Services.GetRequiredService<OpenAIClient>().AsEmbeddingGenerator("text-embedding-3-small")));
var app = builder.Build();
app.MapPost("/chat", async (IChatClient client, string message) =>
{
var response = await client.CompleteAsync(message);
return response.Message;
});
app.MapPost("/embedding", async (IEmbeddingGenerator<string, Embedding<float>> client, string message) =>
{
var response = await client.GenerateAsync(message);
return response[0].Vector;
});
app.Run();
Feedback & Contributing
We welcome feedback and contributions in our GitHub repo.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. net462 is compatible. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETFramework 4.6.2
- Microsoft.Extensions.AI.Abstractions (>= 9.0.0-preview.9.24525.1)
- OpenAI (>= 2.0.0)
- System.Text.Json (>= 8.0.5)
-
.NETStandard 2.0
- Microsoft.Extensions.AI.Abstractions (>= 9.0.0-preview.9.24525.1)
- OpenAI (>= 2.0.0)
- System.Text.Json (>= 8.0.5)
-
net8.0
- Microsoft.Extensions.AI.Abstractions (>= 9.0.0-preview.9.24525.1)
- OpenAI (>= 2.0.0)
- System.Text.Json (>= 8.0.5)
-
net9.0
- Microsoft.Extensions.AI.Abstractions (>= 9.0.0-preview.9.24525.1)
- OpenAI (>= 2.0.0)
- System.Text.Json (>= 9.0.0-rc.2.24473.5)
NuGet packages (4)
Showing the top 4 NuGet packages that depend on Microsoft.Extensions.AI.OpenAI:
Package | Downloads |
---|---|
SemanticValidation
A library to validate strings semantically using OpenAI |
|
Syncfusion.Blazor.SmartComponents
This package provides the functionality to utilize the features of Syncfusion® Blazor Smart component and more. |
|
DaLi.Utils.AI
基于 Microsoft.Extensions.AI 的公共库 |
|
DaLi.Utils.App.Plugin.AI
.Net 常用基础公共库 |
GitHub repositories (7)
Showing the top 5 popular GitHub repositories that depend on Microsoft.Extensions.AI.OpenAI:
Repository | Stars |
---|---|
dotnet/eShop
A reference .NET application implementing an eCommerce site
|
|
dotnet/aspire
Tools, templates, and packages to accelerate building observable, production-ready apps
|
|
VladislavAntonyuk/MauiSamples
.NET MAUI Samples
|
|
dotnet/ai-samples
|
|
DevExpress/Blazor
DevExpress UI for Blazor
|
Version | Downloads | Last updated |
---|---|---|
9.0.1-preview.1.24570.5 | 12,262 | 11/21/2024 |
9.0.0-preview.9.24556.5 | 12,455 | 11/12/2024 |
9.0.0-preview.9.24525.1 | 11,382 | 10/26/2024 |
9.0.0-preview.9.24507.7 | 8,477 | 10/8/2024 |