Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
fix: add missing usage metadata
  • Loading branch information
cnblogs-dudu committed Feb 21, 2024
commit cabc78092000f1551c200aabeb7c253d904a79f5
12 changes: 9 additions & 3 deletions src/SemanticKernel.DashScope/DashScopeChatCompletionService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,11 @@ public async Task<IReadOnlyList<ChatMessageContent>> GetChatMessageContentsAsync
var chatMessages = chatHistory.ToChatMessages();
var chatParameters = executionSettings?.ToChatParameters();
var response = await _dashScopeClient.TextGeneration.Chat(_modelId, chatMessages, chatParameters, cancellationToken);
return [new ChatMessageContent(new AuthorRole(chatMessages[0].Role), response.Output.Text)];
var chatMessageContent = new ChatMessageContent(
new AuthorRole(chatMessages[0].Role),
response.Output.Text,
metadata: response.Usage.ToMetadata());
return [chatMessageContent];
}

public async IAsyncEnumerable<StreamingChatMessageContent> GetStreamingChatMessageContentsAsync(
Expand All @@ -44,10 +48,12 @@ public async IAsyncEnumerable<StreamingChatMessageContent> GetStreamingChatMessa
chatParameters.IncrementalOutput = true;

var responses = _dashScopeClient.TextGeneration.ChatStreamed(_modelId, chatMessages, chatParameters, cancellationToken);

await foreach (var response in responses)
{
yield return new StreamingChatMessageContent(new AuthorRole(chatMessages[0].Role), response.Output.Text);
yield return new StreamingChatMessageContent(
new AuthorRole(chatMessages[0].Role),
response.Output.Text,
metadata: response.Usage.ToMetadata());
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using Sdcb.DashScope.TextGeneration;

namespace Cnblogs.SemanticKernel.Connectors.DashScope;

public static class ChatTokenUsageExtensions
{
public static IReadOnlyDictionary<string, object?>? ToMetadata(this ChatTokenUsage? usage)
{
return usage is null
? null :
new Dictionary<string, object?>()
{
{ "Usage", usage }
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="Microsoft.SemanticKernel.Core" Version="1.3.0" />
<PackageReference Include="Microsoft.SemanticKernel.Core" Version="1.4.0" />
<PackageReference Include="Sdcb.DashScope" Version="1.0.1" />
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System.Diagnostics;
using System.Text;
using Microsoft.SemanticKernel;
using Sdcb.DashScope.TextGeneration;

namespace SemanticKernel.DashScope.IntegrationTest;

Expand Down Expand Up @@ -29,6 +30,7 @@ public async Task ChatCompletion_InvokePromptAsync_WorksCorrectly()

// Assert
Assert.Contains("博客园", result.ToString());
Assert.Equal(4, GetUsage(result.Metadata)?.InputTokens);
Trace.WriteLine(result.ToString());
}

Expand All @@ -46,11 +48,21 @@ public async Task ChatCompletion_InvokePromptStreamingAsync_WorksCorrectly()

// Assert
var sb = new StringBuilder();
await foreach (var message in result)
await foreach (var content in result)
{
Trace.Write(message);
sb.Append(message);
Trace.Write(content);
sb.Append(content);
Assert.Equal(4, GetUsage(content.Metadata)?.InputTokens);
}
Assert.Contains("博客园", sb.ToString());

}

private static ChatTokenUsage? GetUsage(IReadOnlyDictionary<string, object?>? metadata)
{
return metadata?.TryGetValue("Usage", out var value) == true &&
value is ChatTokenUsage usage
? usage
: null;
}
}