mirror of
https://github.com/microsoft/agent-framework.git
synced 2026-06-16 21:04:09 +08:00
33f84f9ed2
* 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
81 lines
2.6 KiB
C#
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() => [];
|
|
}
|