Skip to content

Commit b26772a

Browse files
Ensure Ollama streaming updates specify a CompletionId. (#5795)
1 parent 5b76196 commit b26772a

File tree

4 files changed

+7
-2
lines changed

4 files changed

+7
-2
lines changed

src/Libraries/Microsoft.Extensions.AI.Ollama/OllamaChatClient.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ public async IAsyncEnumerable<StreamingChatCompletionUpdate> CompleteStreamingAs
142142

143143
StreamingChatCompletionUpdate update = new()
144144
{
145+
CompletionId = chunk.CreatedAt,
145146
Role = chunk.Message?.Role is not null ? new ChatRole(chunk.Message.Role) : null,
146147
CreatedAt = DateTimeOffset.TryParse(chunk.CreatedAt, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTimeOffset createdAt) ? createdAt : null,
147148
FinishReason = ToFinishReason(chunk),

src/Libraries/Microsoft.Extensions.AI.OpenAI/OpenAIModelMapper.ChatCompletion.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System;
55
using System.Collections.Generic;
66
using System.Diagnostics.CodeAnalysis;
7+
using System.Globalization;
78
using System.Text;
89
using System.Text.Json;
910
using System.Text.Json.Serialization;
@@ -54,7 +55,7 @@ public static OpenAI.Chat.ChatCompletion ToOpenAIChatCompletion(ChatCompletion c
5455
}
5556

5657
return OpenAIChatModelFactory.ChatCompletion(
57-
id: chatCompletion.CompletionId,
58+
id: chatCompletion.CompletionId ?? CreateCompletionId(),
5859
model: chatCompletion.ModelId,
5960
createdAt: chatCompletion.CreatedAt ?? default,
6061
role: ToOpenAIChatRole(chatCompletion.Message.Role).Value,
@@ -584,6 +585,8 @@ private static FunctionCallContent ParseCallContentFromBinaryData(BinaryData ut8
584585
private static T? GetValueOrDefault<T>(this AdditionalPropertiesDictionary? dict, string key) =>
585586
dict?.TryGetValue(key, out T? value) is true ? value : default;
586587

588+
private static string CreateCompletionId() => $"chatcmpl-{Guid.NewGuid().ToString("N", CultureInfo.InvariantCulture)}";
589+
587590
/// <summary>Used to create the JSON payload for an OpenAI chat tool description.</summary>
588591
public sealed class OpenAIChatToolJson
589592
{

src/Libraries/Microsoft.Extensions.AI.OpenAI/OpenAIModelMappers.StreamingChatCompletion.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ internal static partial class OpenAIModelMappers
4646
}
4747

4848
yield return OpenAIChatModelFactory.StreamingChatCompletionUpdate(
49-
completionId: chatCompletionUpdate.CompletionId,
49+
completionId: chatCompletionUpdate.CompletionId ?? CreateCompletionId(),
5050
model: chatCompletionUpdate.ModelId,
5151
createdAt: chatCompletionUpdate.CreatedAt ?? default,
5252
role: ToOpenAIChatRole(chatCompletionUpdate.Role),

test/Libraries/Microsoft.Extensions.AI.Ollama.Tests/OllamaChatClientTests.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ public async Task BasicRequestResponse_Streaming()
185185

186186
for (int i = 0; i < updates.Count; i++)
187187
{
188+
Assert.NotNull(updates[i].CompletionId);
188189
Assert.Equal(i < updates.Count - 1 ? 1 : 2, updates[i].Contents.Count);
189190
Assert.Equal(ChatRole.Assistant, updates[i].Role);
190191
Assert.Equal("llama3.1", updates[i].ModelId);

0 commit comments

Comments
 (0)