Skip to content

Commit

Permalink
Use new extension methods (#1310)
Browse files Browse the repository at this point in the history
### Description
Updating readme, notebooks and samples to use kernel builder new .With*
extension methods for AI services registration.
  • Loading branch information
SergeyMenshykh committed Jun 2, 2023
1 parent 8ea63f4 commit 17e821a
Show file tree
Hide file tree
Showing 16 changed files with 128 additions and 126 deletions.
21 changes: 10 additions & 11 deletions dotnet/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,20 +23,19 @@ Copy and paste the following code into your project, with your Azure OpenAI key
```csharp
using Microsoft.SemanticKernel;

var kernel = Kernel.Builder.Build();
var builder = new KernelBuilder();

// Azure OpenAI
kernel.Config.AddAzureTextCompletionService(
"text-davinci-003", // Azure OpenAI Deployment Name
"https://contoso.openai.azure.com/", // Azure OpenAI Endpoint
"...your Azure OpenAI Key...", // Azure OpenAI Key
);
builder.WithAzureTextCompletionService(
"text-davinci-003", // Azure OpenAI Deployment Name
"https://contoso.openai.azure.com/", // Azure OpenAI Endpoint
"...your Azure OpenAI Key..."); // Azure OpenAI Key
// Alternative using OpenAI
// kernel.Config.AddOpenAITextCompletionService(
// "text-davinci-003", // OpenAI Model name
// "...your OpenAI API Key..." // OpenAI API Key
// );
//builder.WithOpenAITextCompletionService(
// "text-davinci-003", // OpenAI Model name
// "...your OpenAI API Key..."); // OpenAI API Key
var kernel = builder.Build();

var prompt = @"{{$input}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -142,13 +142,13 @@ await planner.Kernel.ImportOpenApiSkillFromFileAsync(
{
this._logger.LogInformation("Registering Jira Skill");
var authenticationProvider = new BasicAuthenticationProvider(() => { return Task.FromResult(openApiSkillsAuthHeaders.JiraAuthentication); });
var hasServerUrlOverride = variables.Get("jira-server-url", out string serverUrlOverride);
var hasServerUrlOverride = variables.TryGetValue("jira-server-url", out string? serverUrlOverride);

await planner.Kernel.ImportOpenApiSkillFromFileAsync(
skillName: "JiraSkill",
filePath: Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)!, "CopilotChat", "Skills", "OpenApiSkills/JiraSkill/openapi.json"),
authCallback: authenticationProvider.AuthenticateRequestAsync,
serverUrlOverride: hasServerUrlOverride ? new Uri(serverUrlOverride) : null);
serverUrlOverride: hasServerUrlOverride ? new Uri(serverUrlOverride!) : null);
}

// Microsoft Graph
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,7 @@ public static IServiceCollection AddCopilotChatPlannerServices(this IServiceColl
{
services.AddScoped<CopilotChatPlanner>(sp => new CopilotChatPlanner(Kernel.Builder
.WithLogger(sp.GetRequiredService<ILogger<IKernel>>())
.WithConfiguration(
new KernelConfig().AddPlannerBackend(
sp.GetRequiredService<IOptions<AIServiceOptions>>().Value)
) // TODO verify planner has AI service configured
.WithPlannerBackend(sp.GetRequiredService<IOptions<AIServiceOptions>>().Value)// TODO verify planner has AI service configured
.Build()));

// Register Planner skills (AI plugins) here.
Expand Down Expand Up @@ -58,12 +55,12 @@ public static IKernel RegisterCopilotChatSkills(this IKernel kernel, IServicePro
/// <summary>
/// Add the completion backend to the kernel config for the planner.
/// </summary>
private static KernelConfig AddPlannerBackend(this KernelConfig kernelConfig, AIServiceOptions options)
private static KernelBuilder WithPlannerBackend(this KernelBuilder kernelBuilder, AIServiceOptions options)
{
return options.Type switch
{
AIServiceOptions.AIServiceType.AzureOpenAI => kernelConfig.AddAzureChatCompletionService(options.Models.Planner, options.Endpoint, options.Key),
AIServiceOptions.AIServiceType.OpenAI => kernelConfig.AddOpenAIChatCompletionService(options.Models.Planner, options.Key),
AIServiceOptions.AIServiceType.AzureOpenAI => kernelBuilder.WithAzureChatCompletionService(options.Models.Planner, options.Endpoint, options.Key),
AIServiceOptions.AIServiceType.OpenAI => kernelBuilder.WithOpenAIChatCompletionService(options.Models.Planner, options.Key),
_ => throw new ArgumentException($"Invalid {nameof(options.Type)} value in '{AIServiceOptions.PropertyName}' settings."),
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -352,7 +352,7 @@ private async Task<string> GetChatResponseAsync(SKContext chatContext)
/// </summary>
private async Task<string> GetUserIntentAsync(SKContext context)
{
if (!context.Variables.Get("planUserIntent", out string? userIntent))
if (!context.Variables.TryGetValue("planUserIntent", out string? userIntent))
{
var contextVariables = new ContextVariables();
contextVariables.Set("chatId", context["chatId"]);
Expand Down Expand Up @@ -471,7 +471,7 @@ private Task<string> AcquireExternalInformationAsync(SKContext context, string u
{
var contextVariables = context.Variables.Clone();
contextVariables.Set("tokenLimit", tokenLimit.ToString(new NumberFormatInfo()));
if (context.Variables.Get("proposedPlan", out string? proposedPlan))
if (context.Variables.TryGetValue("proposedPlan", out string? proposedPlan))
{
contextVariables.Set("proposedPlan", proposedPlan);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ public async Task<string> AcquireExternalInformationAsync(string userIntent, SKC

// Check if plan exists in ask's context variables.
// If plan was returned at this point, that means it was approved and should be run
var planApproved = context.Variables.Get("proposedPlan", out var planJson);
var planApproved = context.Variables.TryGetValue("proposedPlan", out string? planJson);

if (planApproved && !string.IsNullOrWhiteSpace(planJson))
{
Expand Down Expand Up @@ -133,7 +133,7 @@ public async Task<string> AcquireExternalInformationAsync(string userIntent, SKC
continue;
}

if (variables.Get(param.Key, out var value))
if (variables.TryGetValue(param.Key, out string? value))
{
plan.State.Set(param.Key, value);
}
Expand Down
14 changes: 7 additions & 7 deletions samples/apps/copilot-chat-app/webapi/CopilotChatWebApi.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,13 @@

<ItemGroup>
<PackageReference Include="Microsoft.Azure.Cosmos" Version="3.34.0" />
<PackageReference Include="Microsoft.SemanticKernel" Version="0.14.547.1-preview" />
<PackageReference Include="Microsoft.SemanticKernel.Connectors.AI.OpenAI" Version="0.14.547.1-preview" />
<PackageReference Include="Microsoft.SemanticKernel.Connectors.Memory.AzureCognitiveSearch" Version="0.14.547.1-preview" />
<PackageReference Include="Microsoft.SemanticKernel.Connectors.Memory.Qdrant" Version="0.14.547.1-preview" />
<PackageReference Include="Microsoft.SemanticKernel.Skills.MsGraph" Version="0.14.547.1-preview" />
<PackageReference Include="Microsoft.SemanticKernel.Skills.OpenAPI" Version="0.14.547.1-preview" />
<PackageReference Include="Microsoft.SemanticKernel.Skills.Web" Version="0.14.547.1-preview" />
<PackageReference Include="Microsoft.SemanticKernel" Version="0.15.230531.5-preview" />
<PackageReference Include="Microsoft.SemanticKernel.Connectors.AI.OpenAI" Version="0.15.230531.5-preview" />
<PackageReference Include="Microsoft.SemanticKernel.Connectors.Memory.AzureCognitiveSearch" Version="0.15.230531.5-preview" />
<PackageReference Include="Microsoft.SemanticKernel.Connectors.Memory.Qdrant" Version="0.15.230531.5-preview" />
<PackageReference Include="Microsoft.SemanticKernel.Skills.MsGraph" Version="0.15.230531.5-preview" />
<PackageReference Include="Microsoft.SemanticKernel.Skills.OpenAPI" Version="0.15.230531.5-preview" />
<PackageReference Include="Microsoft.SemanticKernel.Skills.Web" Version="0.15.230531.5-preview" />
<PackageReference Include="Azure.Extensions.AspNetCore.Configuration.Secrets" Version="1.2.2" />
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.21.0" />
<PackageReference Include="Microsoft.Identity.Web" Version="2.11.0" />
Expand Down
22 changes: 9 additions & 13 deletions samples/apps/copilot-chat-app/webapi/SemanticKernelExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,8 @@ internal static IServiceCollection AddSemanticKernelServices(this IServiceCollec
IKernel kernel = Kernel.Builder
.WithLogger(sp.GetRequiredService<ILogger<IKernel>>())
.WithMemory(sp.GetRequiredService<ISemanticTextMemory>())
.WithConfiguration(sp.GetRequiredService<KernelConfig>())
.WithCompletionBackend(sp.GetRequiredService<IOptions<AIServiceOptions>>().Value)
.WithEmbeddingBackend(sp.GetRequiredService<IOptions<AIServiceOptions>>().Value)
.Build();
sp.GetRequiredService<RegisterSkillsWithKernel>()(sp, kernel);
Expand All @@ -52,11 +53,6 @@ internal static IServiceCollection AddSemanticKernelServices(this IServiceCollec
// Semantic memory
services.AddSemanticTextMemory();

// AI backends
services.AddScoped<KernelConfig>(serviceProvider => new KernelConfig()
.AddCompletionBackend(serviceProvider.GetRequiredService<IOptions<AIServiceOptions>>().Value)
.AddEmbeddingBackend(serviceProvider.GetRequiredService<IOptions<AIServiceOptions>>().Value));

// Register skills
services.AddScoped<RegisterSkillsWithKernel>(sp => RegisterSkillsAsync);

Expand Down Expand Up @@ -156,14 +152,14 @@ private static void AddSemanticTextMemory(this IServiceCollection services)
/// <summary>
/// Add the completion backend to the kernel config
/// </summary>
private static KernelConfig AddCompletionBackend(this KernelConfig kernelConfig, AIServiceOptions options)
private static KernelBuilder WithCompletionBackend(this KernelBuilder kernelBuilder, AIServiceOptions options)
{
return options.Type switch
{
AIServiceOptions.AIServiceType.AzureOpenAI
=> kernelConfig.AddAzureChatCompletionService(options.Models.Completion, options.Endpoint, options.Key),
=> kernelBuilder.WithAzureChatCompletionService(options.Models.Completion, options.Endpoint, options.Key),
AIServiceOptions.AIServiceType.OpenAI
=> kernelConfig.AddOpenAIChatCompletionService(options.Models.Completion, options.Key),
=> kernelBuilder.WithOpenAIChatCompletionService(options.Models.Completion, options.Key),
_
=> throw new ArgumentException($"Invalid {nameof(options.Type)} value in '{AIServiceOptions.PropertyName}' settings."),
};
Expand All @@ -172,14 +168,14 @@ private static KernelConfig AddCompletionBackend(this KernelConfig kernelConfig,
/// <summary>
/// Add the embedding backend to the kernel config
/// </summary>
private static KernelConfig AddEmbeddingBackend(this KernelConfig kernelConfig, AIServiceOptions options)
private static KernelBuilder WithEmbeddingBackend(this KernelBuilder kernelBuilder, AIServiceOptions options)
{
return options.Type switch
{
AIServiceOptions.AIServiceType.AzureOpenAI
=> kernelConfig.AddAzureTextEmbeddingGenerationService(options.Models.Embedding, options.Endpoint, options.Key),
=> kernelBuilder.WithAzureTextEmbeddingGenerationService(options.Models.Embedding, options.Endpoint, options.Key),
AIServiceOptions.AIServiceType.OpenAI
=> kernelConfig.AddOpenAITextEmbeddingGenerationService(options.Models.Embedding, options.Key),
=> kernelBuilder.WithOpenAITextEmbeddingGenerationService(options.Models.Embedding, options.Key),
_
=> throw new ArgumentException($"Invalid {nameof(options.Type)} value in '{AIServiceOptions.PropertyName}' settings."),
};
Expand All @@ -191,7 +187,7 @@ private static KernelConfig AddEmbeddingBackend(this KernelConfig kernelConfig,
/// <param name="options">The service configuration</param>
/// <param name="httpClient">Custom <see cref="HttpClient"/> for HTTP requests.</param>
/// <param name="logger">Application logger</param>
private static IEmbeddingGeneration<string, float> ToTextEmbeddingsService(this AIServiceOptions options,
private static ITextEmbeddingGeneration ToTextEmbeddingsService(this AIServiceOptions options,
HttpClient? httpClient = null,
ILogger? logger = null)
{
Expand Down
14 changes: 8 additions & 6 deletions samples/notebooks/dotnet/00-getting-started.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
"outputs": [],
"source": [
"// Load some helper functions, e.g. to load values from settings.json\n",
"#!import config/Settings.cs"
"#!import config/Settings.cs "
]
},
{
Expand All @@ -61,7 +61,7 @@
"outputs": [],
"source": [
"// Import Semantic Kernel\n",
"#r \"nuget: Microsoft.SemanticKernel, 0.14.547.1-preview\""
"#r \"nuget: Microsoft.SemanticKernel, 0.15.230531.5-preview\""
]
},
{
Expand All @@ -87,8 +87,8 @@
"source": [
"using Microsoft.SemanticKernel;\n",
"\n",
"// Set Simple kernel instance\n",
"IKernel kernel = KernelBuilder.Create();"
"//Create Kernel builder\n",
"var builder = new KernelBuilder();"
]
},
{
Expand All @@ -108,9 +108,11 @@
"var (useAzureOpenAI, model, azureEndpoint, apiKey, orgId) = Settings.LoadFromFile();\n",
"\n",
"if (useAzureOpenAI)\n",
" kernel.Config.AddAzureTextCompletionService(model, azureEndpoint, apiKey);\n",
" builder.WithAzureTextCompletionService(model, azureEndpoint, apiKey);\n",
"else\n",
" kernel.Config.AddOpenAITextCompletionService(model, apiKey, orgId);"
" builder.WithOpenAITextCompletionService(model, apiKey, orgId);\n",
"\n",
"IKernel kernel = builder.Build();"
]
},
{
Expand Down
23 changes: 14 additions & 9 deletions samples/notebooks/dotnet/01-basic-loading-the-kernel.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
},
"outputs": [],
"source": [
"#r \"nuget: Microsoft.SemanticKernel, 0.14.547.1-preview\""
"#r \"nuget: Microsoft.SemanticKernel, 0.15.230531.5-preview\""
]
},
{
Expand Down Expand Up @@ -143,16 +143,14 @@
},
"outputs": [],
"source": [
"IKernel kernel = KernelBuilder.Create();\n",
"\n",
"kernel.Config.AddAzureTextCompletionService(\n",
"Kernel.Builder\n",
".WithAzureTextCompletionService(\n",
" \"my-finetuned-Curie\", // Azure OpenAI *Deployment Name*\n",
" \"https://contoso.openai.azure.com/\", // Azure OpenAI *Endpoint*\n",
" \"...your Azure OpenAI Key...\", // Azure OpenAI *Key*\n",
" \"Azure_curie\" // alias used in the prompt templates' config.json\n",
");\n",
"\n",
"kernel.Config.AddOpenAITextCompletionService(\n",
")\n",
".WithOpenAITextCompletionService(\n",
" \"text-davinci-003\", // OpenAI Model Name\n",
" \"...your OpenAI API Key...\", // OpenAI API key\n",
" \"...your OpenAI Org ID...\", // *optional* OpenAI Organization ID\n",
Expand All @@ -171,7 +169,7 @@
"* a prompt configuration doesn't specify which AI backend to use\n",
"* a prompt configuration requires a backend unknown to the kernel\n",
"\n",
"The default can be set and changed programmatically:"
"The default can be set programmatically:"
]
},
{
Expand All @@ -190,7 +188,14 @@
},
"outputs": [],
"source": [
"kernel.Config.SetDefaultTextCompletionService(\"Azure_curie\");"
"Kernel.Builder\n",
".WithOpenAITextCompletionService(\n",
" \"text-davinci-003\", // OpenAI Model Name\n",
" \"...your OpenAI API Key...\", // OpenAI API key\n",
" \"...your OpenAI Org ID...\", // *optional* OpenAI Organization ID\n",
" \"OpenAI_davinci\", // alias used in the prompt templates' config.json\n",
" true // This flag specifies that this service is the default one.\n",
");"
]
},
{
Expand Down
12 changes: 7 additions & 5 deletions samples/notebooks/dotnet/02-running-prompts-from-file.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@
"source": [
"Given a semantic function defined by these files, this is how to load and use a file based semantic function.\n",
"\n",
"Load and configure the kernel, as usual, loading also the AI backend settings defined in the [Setup notebook](0-AI-settings.ipynb):"
"Configure and create the kernel, as usual, loading also the AI backend settings defined in the [Setup notebook](0-AI-settings.ipynb):"
]
},
{
Expand All @@ -90,20 +90,22 @@
},
"outputs": [],
"source": [
"#r \"nuget: Microsoft.SemanticKernel, 0.14.547.1-preview\"\n",
"#r \"nuget: Microsoft.SemanticKernel, 0.15.230531.5-preview\"\n",
"\n",
"#!import config/Settings.cs\n",
"\n",
"using Microsoft.SemanticKernel;\n",
"\n",
"var kernel = KernelBuilder.Create();\n",
"var builder = new KernelBuilder();\n",
"\n",
"// Configure AI backend used by the kernel\n",
"var (useAzureOpenAI, model, azureEndpoint, apiKey, orgId) = Settings.LoadFromFile();\n",
"if (useAzureOpenAI)\n",
" kernel.Config.AddAzureTextCompletionService(model, azureEndpoint, apiKey);\n",
" builder.WithAzureTextCompletionService(model, azureEndpoint, apiKey);\n",
"else\n",
" kernel.Config.AddOpenAITextCompletionService(model, apiKey, orgId);"
" builder.WithOpenAITextCompletionService(model, apiKey, orgId);\n",
"\n",
"IKernel kernel = builder.Build();"
]
},
{
Expand Down
17 changes: 10 additions & 7 deletions samples/notebooks/dotnet/03-semantic-function-inline.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -49,21 +49,23 @@
},
"outputs": [],
"source": [
"#r \"nuget: Microsoft.SemanticKernel, 0.14.547.1-preview\"\n",
"#r \"nuget: Microsoft.SemanticKernel, 0.15.230531.5-preview\"\n",
"\n",
"#!import config/Settings.cs\n",
"\n",
"using Microsoft.SemanticKernel;\n",
"using Microsoft.SemanticKernel.SemanticFunctions;\n",
"\n",
"IKernel kernel = KernelBuilder.Create();\n",
"var builder = new KernelBuilder();\n",
"\n",
"// Configure AI backend used by the kernel\n",
"var (useAzureOpenAI, model, azureEndpoint, apiKey, orgId) = Settings.LoadFromFile();\n",
"if (useAzureOpenAI)\n",
" kernel.Config.AddAzureTextCompletionService(model, azureEndpoint, apiKey);\n",
" builder.WithAzureTextCompletionService(model, azureEndpoint, apiKey);\n",
"else\n",
" kernel.Config.AddOpenAITextCompletionService(model, apiKey, orgId);"
" builder.WithOpenAITextCompletionService(model, apiKey, orgId);\n",
"\n",
"IKernel kernel = builder.Build();"
]
},
{
Expand Down Expand Up @@ -293,15 +295,16 @@
},
"outputs": [],
"source": [
"var kernel = Microsoft.SemanticKernel.Kernel.Builder.Build();\n",
"var builder = new KernelBuilder();\n",
"\n",
"var (useAzureOpenAI, model, azureEndpoint, apiKey, orgId) = Settings.LoadFromFile();\n",
"\n",
"if (useAzureOpenAI)\n",
" kernel.Config.AddAzureTextCompletionService(model, azureEndpoint, apiKey);\n",
" builder.WithAzureTextCompletionService(model, azureEndpoint, apiKey);\n",
"else\n",
" kernel.Config.AddOpenAITextCompletionService(model, apiKey, orgId);\n",
" builder.WithOpenAITextCompletionService(model, apiKey, orgId);\n",
"\n",
"var kernel = builder.Build();\n",
"\n",
"string skPrompt = @\"\n",
"{{$input}}\n",
Expand Down
Loading

0 comments on commit 17e821a

Please sign in to comment.