-
Notifications
You must be signed in to change notification settings - Fork 834
Description
Description
Hello thanks for the great work on the M.E.AI library.
I am getting the following error when using OpenAIResponseClient
.
Message: An item with the same key has already been added. Key: Id System.ArgumentException: at System.ThrowHelper.ThrowAddingDuplicateWithKeyArgumentException (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Collections.Generic.Dictionary
2.TryInsert (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e)
at System.Collections.Generic.Dictionary2.Add (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at Microsoft.Extensions.AI.AdditionalPropertiesDictionary
1.Add (Microsoft.Extensions.AI.Abstractions, Version=9.7.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
at Microsoft.Extensions.AI.OpenAIResponseChatClient+d__4.MoveNext (Microsoft.Extensions.AI.OpenAI, Version=9.7.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e)
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e)
at System.Runtime.CompilerServices.TaskAwaiter1.GetResult (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at Microsoft.Extensions.AI.OpenTelemetryChatClient+<GetResponseAsync>d__21.MoveNext (Microsoft.Extensions.AI, Version=9.7.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
Reproduction Steps
Can reproduce the error by creating a new test scenario on \extensions\test\Libraries\Microsoft.Extensions.AI.OpenAI.Tests\OpenAIResponseClientTests.cs
The test covers the scenario of the ResponseAPI returning multiple messages on the output.
[Fact]
public async Task MultipleOutputItems_NonStreaming()
{
const string Input = """
{
"temperature":0.5,
"model":"gpt-4o-mini",
"input": [{
"type":"message",
"role":"user",
"content":[{"type":"input_text","text":"hello"}]
}],
"max_output_tokens":20
}
""";
const string Output = """
{
"id": "resp_67d327649b288191aeb46a824e49dc40058a5e08c46a181d",
"object": "response",
"created_at": 1741891428,
"status": "completed",
"error": null,
"incomplete_details": null,
"instructions": null,
"max_output_tokens": 20,
"model": "gpt-4o-mini-2024-07-18",
"output": [
{
"type": "message",
"id": "msg_67d32764fcdc8191bcf2e444d4088804058a5e08c46a181d",
"status": "completed",
"role": "assistant",
"content": [
{
"type": "output_text",
"text": "Hello!",
"annotations": []
}
]
},
{
"type": "message",
"id": "msg_67d32764fcdc8191bcf2e444d4088804058a5e08c46a182e",
"status": "completed",
"role": "assistant",
"content": [
{
"type": "output_text",
"text": " How can I assist you today?",
"annotations": []
}
]
}
],
"parallel_tool_calls": true,
"previous_response_id": null,
"reasoning": {
"effort": null,
"generate_summary": null
},
"store": true,
"temperature": 0.5,
"text": {
"format": {
"type": "text"
}
},
"tool_choice": "auto",
"tools": [],
"top_p": 1.0,
"usage": {
"input_tokens": 26,
"input_tokens_details": {
"cached_tokens": 0
},
"output_tokens": 10,
"output_tokens_details": {
"reasoning_tokens": 0
},
"total_tokens": 36
},
"user": null,
"metadata": {}
}
""";
using VerbatimHttpHandler handler = new(Input, Output);
using HttpClient httpClient = new(handler);
using IChatClient client = CreateResponseClient(httpClient, "gpt-4o-mini");
var response = await client.GetResponseAsync("hello", new()
{
MaxOutputTokens = 20,
Temperature = 0.5f,
});
Assert.NotNull(response);
Assert.Equal("resp_67d327649b288191aeb46a824e49dc40058a5e08c46a181d", response.ResponseId);
Assert.Equal("resp_67d327649b288191aeb46a824e49dc40058a5e08c46a181d", response.ConversationId);
Assert.Equal("Hello! How can I assist you today?", response.Text);
Assert.Equal(2, response.Messages.Single().Contents.Count);
Assert.Equal(ChatRole.Assistant, response.Messages.Single().Role);
Assert.Equal("gpt-4o-mini-2024-07-18", response.ModelId);
Assert.Equal(DateTimeOffset.FromUnixTimeSeconds(1_741_891_428), response.CreatedAt);
Assert.Null(response.FinishReason);
Assert.NotNull(response.Usage);
Assert.Equal(26, response.Usage.InputTokenCount);
Assert.Equal(10, response.Usage.OutputTokenCount);
Assert.Equal(36, response.Usage.TotalTokenCount);
}
Expected behavior
Expected responses with multiple output messages to not throw exception.
Actual behavior
Error Message: System.ArgumentException : An item with the same key has already been added. Key: Id
Regression?
No response
Known Workarounds
No response
Configuration
No response
Other information
Possible solution:
In the [GetResponseAsync])
method of [OpenAIResponseChatClient]()
on line 113.
Changed the .Add()
method call to use indexer assignment:
(message.AdditionalProperties ??= [])[nameof(messageItem.Id)] = messageItem.Id;