Files
agent-framework/dotnet/src/Microsoft.Agents.AI.Hosting.OpenAI/Responses/Streaming/FileContentEventGenerator.cs
T
Reuben Bond 33f84f9ed2 .NET: Improve fidelity of OpenAI Responses server and add Conversations (#1907)
* Improve fidelity of OpenAI Responses server and add Conversations

* Merge

* nit

* Undo prior change

* Undo prior change

* Review feedback

* Review feedback

* Fix test

* Use simpler JsonDocument approach for polymorphic deserialization

* More review feedback

* dotnet format
2025-11-05 18:46:19 +00:00

81 lines
2.6 KiB
C#

// Copyright (c) Microsoft. All rights reserved.
using System;
using System.Collections.Generic;
using Microsoft.Agents.AI.Hosting.OpenAI.Responses.Converters;
using Microsoft.Agents.AI.Hosting.OpenAI.Responses.Models;
using Microsoft.Extensions.AI;
namespace Microsoft.Agents.AI.Hosting.OpenAI.Responses.Streaming;
/// <summary>
/// A generator for streaming events from file content (non-image, non-audio DataContent).
/// </summary>
internal sealed class FileContentEventGenerator(
IdGenerator idGenerator,
SequenceNumber seq,
int outputIndex) : StreamingEventGenerator
{
public override bool IsSupported(AIContent content) =>
content is DataContent dataContent &&
!dataContent.HasTopLevelMediaType("image") &&
!dataContent.HasTopLevelMediaType("audio");
public override IEnumerable<StreamingResponseEvent> ProcessContent(AIContent content)
{
if (content is not DataContent fileData ||
fileData.HasTopLevelMediaType("image") ||
fileData.HasTopLevelMediaType("audio"))
{
throw new InvalidOperationException("FileContentEventGenerator only supports non-image, non-audio DataContent.");
}
var itemId = idGenerator.GenerateMessageId();
if (ItemContentConverter.ToItemContent(content) is not ItemContentInputFile itemContent)
{
throw new InvalidOperationException("Failed to convert file content to ItemContentInputFile.");
}
var item = new ResponsesAssistantMessageItemResource
{
Id = itemId,
Status = ResponsesMessageItemResourceStatus.Completed,
Content = [itemContent]
};
yield return new StreamingOutputItemAdded
{
SequenceNumber = seq.Increment(),
OutputIndex = outputIndex,
Item = item
};
yield return new StreamingContentPartAdded
{
SequenceNumber = seq.Increment(),
ItemId = itemId,
OutputIndex = outputIndex,
ContentIndex = 0,
Part = itemContent
};
yield return new StreamingContentPartDone
{
SequenceNumber = seq.Increment(),
ItemId = itemId,
OutputIndex = outputIndex,
ContentIndex = 0,
Part = itemContent
};
yield return new StreamingOutputItemDone
{
SequenceNumber = seq.Increment(),
OutputIndex = outputIndex,
Item = item
};
}
public override IEnumerable<StreamingResponseEvent> Complete() => [];
}