diff --git a/src/KernelMemory.DashScope/DashScopeTextGenerator.cs b/src/KernelMemory.DashScope/DashScopeTextGenerator.cs index 96dfb5c..b3e609b 100644 --- a/src/KernelMemory.DashScope/DashScopeTextGenerator.cs +++ b/src/KernelMemory.DashScope/DashScopeTextGenerator.cs @@ -1,6 +1,7 @@ using System.Runtime.CompilerServices; using Cnblogs.DashScope.Core; using Microsoft.Extensions.Logging; +using Microsoft.KernelMemory; using Microsoft.KernelMemory.AI; using Microsoft.KernelMemory.Diagnostics; @@ -38,7 +39,7 @@ public IReadOnlyList GetTokens(string text) } /// - public async IAsyncEnumerable GenerateTextAsync( + public async IAsyncEnumerable GenerateTextAsync( string prompt, TextGenerationOptions options, [EnumeratorCancellation] CancellationToken cancellationToken = new()) @@ -71,7 +72,9 @@ public async IAsyncEnumerable GenerateTextAsync( var tokens = dashScopeClient.GetTextCompletionStreamAsync(request, cancellationToken); await foreach (var token in tokens) { - yield return token.Output.Text!; + yield return new GeneratedTextContent( + token.Output.Text ?? string.Empty, + token.Usage.ToKernelMemoryTokenUsage(modelId)); } } diff --git a/src/KernelMemory.DashScope/KernelMemory.DashScope.csproj b/src/KernelMemory.DashScope/KernelMemory.DashScope.csproj index 290d0af..b3b827d 100644 --- a/src/KernelMemory.DashScope/KernelMemory.DashScope.csproj +++ b/src/KernelMemory.DashScope/KernelMemory.DashScope.csproj @@ -18,8 +18,8 @@ - - + + diff --git a/src/KernelMemory.DashScope/TokenUsageMapper.cs b/src/KernelMemory.DashScope/TokenUsageMapper.cs new file mode 100644 index 0000000..64a1346 --- /dev/null +++ b/src/KernelMemory.DashScope/TokenUsageMapper.cs @@ -0,0 +1,22 @@ +using Cnblogs.DashScope.Core; +using Microsoft.KernelMemory; + +namespace Cnblogs.KernelMemory.AI.DashScope; + +internal static class TokenUsageMapper +{ + public static TokenUsage? ToKernelMemoryTokenUsage(this TextGenerationTokenUsage? usage, string? modelId) + { + if (usage == null) + { + return null; + } + + return new TokenUsage() + { + ServiceTokensIn = usage.InputTokens, + ServiceTokensOut = usage.OutputTokens, + ModelName = modelId + }; + } +} diff --git a/src/SemanticKernel.DashScope/DashScopePromptExecutionSettings.cs b/src/SemanticKernel.DashScope/DashScopePromptExecutionSettings.cs index 4b2a6e9..c90c447 100644 --- a/src/SemanticKernel.DashScope/DashScopePromptExecutionSettings.cs +++ b/src/SemanticKernel.DashScope/DashScopePromptExecutionSettings.cs @@ -50,6 +50,9 @@ public class DashScopePromptExecutionSettings : PromptExecutionSettings, ITextGe /// public ToolChoice? ToolChoice { get; } + /// + public bool? ParallelToolCalls { get; set; } + /// public IEnumerable? Tools { get; set; } diff --git a/src/SemanticKernel.DashScope/SemanticKernel.DashScope.csproj b/src/SemanticKernel.DashScope/SemanticKernel.DashScope.csproj index 0ad5386..1b772ad 100644 --- a/src/SemanticKernel.DashScope/SemanticKernel.DashScope.csproj +++ b/src/SemanticKernel.DashScope/SemanticKernel.DashScope.csproj @@ -19,9 +19,9 @@ - - - + + + diff --git a/test/KernelMemory.DashScope.UnitTests/DashScopeTextGeneratorTests.cs b/test/KernelMemory.DashScope.UnitTests/DashScopeTextGeneratorTests.cs index fcc9dc1..95b9782 100644 --- a/test/KernelMemory.DashScope.UnitTests/DashScopeTextGeneratorTests.cs +++ b/test/KernelMemory.DashScope.UnitTests/DashScopeTextGeneratorTests.cs @@ -26,7 +26,7 @@ public async Task TextGenerator_GenerateText_IncrementalGenerateAsync() var response = await generator.GenerateTextAsync(Cases.Text, Cases.TextGenerationOptions).ToListAsync(); // Assert - response[0].Should().BeSameAs( + response[0].Text.Should().BeSameAs( Cases.TextGenerationResponse.Output.Text, "generated text should mapped from output.text"); captured.Should().BeEquivalentTo( @@ -51,7 +51,7 @@ public async Task TextGenerator_DefaultsToZero_MapZeroToNullAsync() var response = await generator.GenerateTextAsync(Cases.Text, Cases.TextGenerationOptions).ToListAsync(); // Assert - response[0].Should().BeSameAs( + response[0].Text.Should().BeSameAs( Cases.TextGenerationResponse.Output.Text, "generated text should mapped from output.text"); captured.Should().BeEquivalentTo( diff --git a/test/KernelMemory.DashScope.UnitTests/KernelMemory.DashScope.UnitTests.csproj b/test/KernelMemory.DashScope.UnitTests/KernelMemory.DashScope.UnitTests.csproj index 85dd895..3cfce45 100644 --- a/test/KernelMemory.DashScope.UnitTests/KernelMemory.DashScope.UnitTests.csproj +++ b/test/KernelMemory.DashScope.UnitTests/KernelMemory.DashScope.UnitTests.csproj @@ -10,18 +10,18 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/test/SemanticKernel.DashScope.UnitTest/SemanticKernel.DashScope.UnitTest.csproj b/test/SemanticKernel.DashScope.UnitTest/SemanticKernel.DashScope.UnitTest.csproj index 5348e5d..74dbcbe 100644 --- a/test/SemanticKernel.DashScope.UnitTest/SemanticKernel.DashScope.UnitTest.csproj +++ b/test/SemanticKernel.DashScope.UnitTest/SemanticKernel.DashScope.UnitTest.csproj @@ -1,16 +1,16 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - +