save stage

This commit is contained in:
xbotter 2023-11-19 21:34:13 +08:00
parent 114fa98616
commit eb1b77904b
No known key found for this signature in database
GPG key ID: D299220A7FE5CF1E
8 changed files with 48 additions and 37 deletions

View file

@ -10,9 +10,10 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.SemanticKernel.Abstractions" Version="1.0.0-beta7" />
<PackageReference Include="Microsoft.SemanticKernel.Plugins.Memory" Version="1.0.0-beta7" />
<PackageReference Include="Microsoft.VisualStudio.Validation" Version="17.6.11" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
<PackageReference Include="Microsoft.SemanticKernel.Abstractions" Version="1.0.0-beta8" />
<PackageReference Include="Microsoft.SemanticKernel.Plugins.Memory" Version="1.0.0-beta8" />
<PackageReference Include="Microsoft.VisualStudio.Validation" Version="17.8.8" />
</ItemGroup>
<ItemGroup>

View file

@ -18,7 +18,7 @@ namespace BotSharp.Plugin.SemanticKernel
/// </summary>
public class SemanticKernelChatCompletionProvider : IChatCompletion
{
private IKernel _kernel;
private Microsoft.SemanticKernel.AI.ChatCompletion.IChatCompletion _kernelChatCompletion;
private IServiceProvider _services;
private ITokenStatistics _tokenStatistics;
private string? _model = null;
@ -29,14 +29,14 @@ namespace BotSharp.Plugin.SemanticKernel
/// <summary>
/// Create a new instance of <see cref="SemanticKernelChatCompletionProvider"/>
/// </summary>
/// <param name="kernel"></param>
/// <param name="chatCompletion"></param>
/// <param name="services"></param>
/// <param name="tokenStatistics"></param>
public SemanticKernelChatCompletionProvider(IKernel kernel,
public SemanticKernelChatCompletionProvider(Microsoft.SemanticKernel.AI.ChatCompletion.IChatCompletion chatCompletion,
IServiceProvider services,
ITokenStatistics tokenStatistics)
{
this._kernel = kernel;
this._kernelChatCompletion = chatCompletion;
this._services = services;
this._tokenStatistics = tokenStatistics;
}
@ -49,7 +49,7 @@ namespace BotSharp.Plugin.SemanticKernel
Task.WaitAll(hooks.Select(hook =>
hook.BeforeGenerating(agent, conversations)).ToArray());
var completion = _kernel.GetService<Microsoft.SemanticKernel.AI.ChatCompletion.IChatCompletion>(_model);
var completion = this._kernelChatCompletion;
var agentService = _services.GetRequiredService<IAgentService>();
var instruction = agentService.RenderedInstruction(agent);

View file

@ -6,20 +6,41 @@ using Microsoft.Extensions.DependencyInjection;
namespace BotSharp.Plugin.SemanticKernel
{
/// <summary>
/// Use Semantic Kernel as BotSharp plugin
/// </summary>
public class SemanticKernelPlugin : IBotSharpPlugin
{
/// <inheritdoc/>
public string Name => "Semantic Kernel";
/// <inheritdoc/>
public string Description => "Semantic Kernel Service";
/// <inheritdoc/>
public void RegisterDI(IServiceCollection services, IConfiguration config)
{
var settings = new SemanticKernelSettings();
config.Bind("SemanticKernel", settings);
var provider = services.BuildServiceProvider().CreateScope().ServiceProvider;
services.AddScoped<ITextCompletion, SemanticKernelTextCompletionProvider>();
services.AddScoped<IChatCompletion, SemanticKernelChatCompletionProvider>();
services.AddScoped<IVectorDb, SemanticKernelMemoryStoreProvider>();
services.AddScoped<ITextEmbedding, SemanticKernelTextEmbeddingProvider>();
if (provider.GetService<Microsoft.SemanticKernel.AI.TextCompletion.ITextCompletion>() != null)
{
services.AddScoped<ITextCompletion, SemanticKernelTextCompletionProvider>();
}
if (provider.GetService<Microsoft.SemanticKernel.AI.ChatCompletion.IChatCompletion>() != null)
{
services.AddScoped<IChatCompletion, SemanticKernelChatCompletionProvider>();
}
if (provider.GetService<Microsoft.SemanticKernel.Memory.IMemoryStore>() != null)
{
services.AddScoped<IVectorDb, SemanticKernelMemoryStoreProvider>();
}
if (provider.GetService<Microsoft.SemanticKernel.AI.Embeddings.ITextEmbeddingGeneration>() != null)
{
services.AddScoped<ITextEmbedding, SemanticKernelTextEmbeddingProvider>();
}
}
}
}

View file

@ -1,11 +0,0 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace BotSharp.Plugin.SemanticKernel
{
internal class SemanticKernelSettings
{
}
}

View file

@ -19,7 +19,7 @@ namespace BotSharp.Plugin.SemanticKernel
/// </summary>
public class SemanticKernelTextCompletionProvider : Abstraction.MLTasks.ITextCompletion
{
private readonly IKernel _kernel;
private readonly Microsoft.SemanticKernel.AI.TextCompletion.ITextCompletion _kernelTextCompletion;
private readonly IServiceProvider _services;
private readonly ITokenStatistics _tokenStatistics;
private string? _model = null;
@ -30,16 +30,14 @@ namespace BotSharp.Plugin.SemanticKernel
/// <summary>
/// Create a new instance of <see cref="SemanticKernelTextCompletionProvider"/>
/// </summary>
/// <param name="kernel"></param>
/// <param name="textCompletion"></param>
/// <param name="services"></param>
/// <param name="tokenStatistics"></param>
public SemanticKernelTextCompletionProvider(IKernel kernel,
public SemanticKernelTextCompletionProvider(Microsoft.SemanticKernel.AI.TextCompletion.ITextCompletion textCompletion,
IServiceProvider services,
ITokenStatistics tokenStatistics)
{
Requires.NotNull(kernel, nameof(IKernel));
this._kernel = kernel;
this._kernelTextCompletion = textCompletion;
this._services = services;
this._tokenStatistics = tokenStatistics;
}
@ -61,7 +59,7 @@ namespace BotSharp.Plugin.SemanticKernel
Task.WaitAll(hooks.Select(hook =>
hook.BeforeGenerating(agent, new List<RoleDialogModel> { userMessage })).ToArray());
var completion = _kernel.GetService<Microsoft.SemanticKernel.AI.TextCompletion.ITextCompletion>(_model);
var completion = this._kernelTextCompletion;
_tokenStatistics.StartTimer();
var result = await completion.CompleteAsync(text);
_tokenStatistics.StopTimer();

View file

@ -0,0 +1,2 @@
# Semantic Kernel For BotSharp

View file

@ -15,7 +15,7 @@ namespace BotSharp.Plugin.SemanticKernel.UnitTests.Helpers
_response = response;
}
public async Task<ChatMessageBase> GetChatMessageAsync(CancellationToken cancellationToken = default)
public async Task<ChatMessage> GetChatMessageAsync(CancellationToken cancellationToken = default)
{
return await Task.FromResult(new MockModelResult(_response));
}
@ -25,7 +25,7 @@ namespace BotSharp.Plugin.SemanticKernel.UnitTests.Helpers
return Task.FromResult(_response);
}
public class MockModelResult : ChatMessageBase
public class MockModelResult : ChatMessage
{
public MockModelResult(string content) : base(AuthorRole.Assistant, content, null)
{

View file

@ -24,17 +24,17 @@ namespace BotSharp.Plugin.SemanticKernel.Tests
{
public class SemanticKernelChatCompletionProviderTests
{
private readonly Mock<IKernel> _kernelMock;
private readonly Mock<Microsoft.SemanticKernel.AI.ChatCompletion.IChatCompletion> _chatCompletionMock;
private readonly Mock<IServiceProvider> _servicesMock;
private readonly Mock<ITokenStatistics> _tokenStatisticsMock;
private readonly SemanticKernelChatCompletionProvider _provider;
public SemanticKernelChatCompletionProviderTests()
{
_kernelMock = new Mock<IKernel>();
_chatCompletionMock = new Mock<Microsoft.SemanticKernel.AI.ChatCompletion.IChatCompletion>();
_servicesMock = new Mock<IServiceProvider>();
_tokenStatisticsMock = new Mock<ITokenStatistics>();
_provider = new SemanticKernelChatCompletionProvider(_kernelMock.Object, _servicesMock.Object, _tokenStatisticsMock.Object);
_provider = new SemanticKernelChatCompletionProvider(_chatCompletionMock, _servicesMock.Object, _tokenStatisticsMock.Object);
}
[Fact]