Skip to content

Commit 57a0142

Browse files
authored
Merge pull request #9 from cnblogs/add-missing-usage-metadata
fix: add missing usage metadata
2 parents 28ae362 + cabc780 commit 57a0142

File tree

4 files changed

+41
-7
lines changed

4 files changed

+41
-7
lines changed

src/SemanticKernel.DashScope/DashScopeChatCompletionService.cs

+9-3
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,11 @@ public async Task<IReadOnlyList<ChatMessageContent>> GetChatMessageContentsAsync
3030
var chatMessages = chatHistory.ToChatMessages();
3131
var chatParameters = executionSettings?.ToChatParameters();
3232
var response = await _dashScopeClient.TextGeneration.Chat(_modelId, chatMessages, chatParameters, cancellationToken);
33-
return [new ChatMessageContent(new AuthorRole(chatMessages[0].Role), response.Output.Text)];
33+
var chatMessageContent = new ChatMessageContent(
34+
new AuthorRole(chatMessages[0].Role),
35+
response.Output.Text,
36+
metadata: response.Usage.ToMetadata());
37+
return [chatMessageContent];
3438
}
3539

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

4650
var responses = _dashScopeClient.TextGeneration.ChatStreamed(_modelId, chatMessages, chatParameters, cancellationToken);
47-
4851
await foreach (var response in responses)
4952
{
50-
yield return new StreamingChatMessageContent(new AuthorRole(chatMessages[0].Role), response.Output.Text);
53+
yield return new StreamingChatMessageContent(
54+
new AuthorRole(chatMessages[0].Role),
55+
response.Output.Text,
56+
metadata: response.Usage.ToMetadata());
5157
}
5258
}
5359
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using Sdcb.DashScope.TextGeneration;
2+
3+
namespace Cnblogs.SemanticKernel.Connectors.DashScope;
4+
5+
public static class ChatTokenUsageExtensions
6+
{
7+
public static IReadOnlyDictionary<string, object?>? ToMetadata(this ChatTokenUsage? usage)
8+
{
9+
return usage is null
10+
? null :
11+
new Dictionary<string, object?>()
12+
{
13+
{ "Usage", usage }
14+
};
15+
}
16+
}

src/SemanticKernel.DashScope/SemanticKernel.DashScope.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
</ItemGroup>
2121

2222
<ItemGroup>
23-
<PackageReference Include="Microsoft.SemanticKernel.Core" Version="1.3.0" />
23+
<PackageReference Include="Microsoft.SemanticKernel.Core" Version="1.4.0" />
2424
<PackageReference Include="Sdcb.DashScope" Version="1.0.1" />
2525
</ItemGroup>
2626

test/SemanticKernel.DashScope.IntegrationTest/ChatCompletionTests.cs

+15-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System.Diagnostics;
22
using System.Text;
33
using Microsoft.SemanticKernel;
4+
using Sdcb.DashScope.TextGeneration;
45

56
namespace SemanticKernel.DashScope.IntegrationTest;
67

@@ -29,6 +30,7 @@ public async Task ChatCompletion_InvokePromptAsync_WorksCorrectly()
2930

3031
// Assert
3132
Assert.Contains("博客园", result.ToString());
33+
Assert.Equal(4, GetUsage(result.Metadata)?.InputTokens);
3234
Trace.WriteLine(result.ToString());
3335
}
3436

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

4749
// Assert
4850
var sb = new StringBuilder();
49-
await foreach (var message in result)
51+
await foreach (var content in result)
5052
{
51-
Trace.Write(message);
52-
sb.Append(message);
53+
Trace.Write(content);
54+
sb.Append(content);
55+
Assert.Equal(4, GetUsage(content.Metadata)?.InputTokens);
5356
}
5457
Assert.Contains("博客园", sb.ToString());
58+
59+
}
60+
61+
private static ChatTokenUsage? GetUsage(IReadOnlyDictionary<string, object?>? metadata)
62+
{
63+
return metadata?.TryGetValue("Usage", out var value) == true &&
64+
value is ChatTokenUsage usage
65+
? usage
66+
: null;
5567
}
5668
}

0 commit comments

Comments
 (0)