using System.ClientModel.Primitives;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Text.Json;
namespace OpenAI.Assistants;
///
/// Represents a streaming update to content as part of the Assistants API.
///
///
/// Distinct instances will be generated for each part
/// and each content subcomponent, such as instances, even if this information
/// arrived in the same response chunk.
///
[Experimental("OPENAI001")]
public partial class MessageContentUpdate : StreamingUpdate
{
///
public string MessageId => _delta.Id;
///
public int MessageIndex => _textContent?.Index
?? _imageFileContent?.Index
?? _imageUrlContent?.Index
?? _refusalContent?.Index
?? TextAnnotation?.ContentIndex
?? 0;
///
public MessageRole? Role => _delta.Delta?.Role;
///
public string ImageFileId => _imageFileContent?.ImageFile?.FileId;
///
public MessageImageDetail? ImageDetail => _imageFileContent?.ImageFile?.Detail?.ToMessageImageDetail()
?? _imageUrlContent?.ImageUrl?.Detail?.ToMessageImageDetail();
///
public string Text => _textContent?.Text?.Value;
///
/// An update to an annotation associated with a specific content item in the message's content items collection.
///
public TextAnnotationUpdate TextAnnotation { get; }
public string RefusalUpdate => _refusalContent?.Refusal;
private readonly InternalMessageDeltaContentImageFileObject _imageFileContent;
private readonly InternalMessageDeltaContentTextObject _textContent;
private readonly InternalMessageDeltaContentImageUrlObject _imageUrlContent;
private readonly InternalMessageDeltaContentRefusalObject _refusalContent;
private readonly InternalMessageDeltaObject _delta;
internal MessageContentUpdate(InternalMessageDeltaObject delta, InternalMessageDeltaContent content)
: base(StreamingUpdateReason.MessageUpdated)
{
_delta = delta;
_textContent = content as InternalMessageDeltaContentTextObject;
_imageFileContent = content as InternalMessageDeltaContentImageFileObject;
_imageUrlContent = content as InternalMessageDeltaContentImageUrlObject;
_refusalContent = content as InternalMessageDeltaContentRefusalObject;
}
internal MessageContentUpdate(InternalMessageDeltaObject delta, TextAnnotationUpdate annotation)
: base(StreamingUpdateReason.MessageUpdated)
{
_delta = delta;
TextAnnotation = annotation;
}
internal static IEnumerable DeserializeMessageContentUpdates(
JsonElement element,
StreamingUpdateReason _,
ModelReaderWriterOptions options = null)
{
InternalMessageDeltaObject deltaObject = InternalMessageDeltaObject.DeserializeInternalMessageDeltaObject(element, options);
List updates = [];
foreach (InternalMessageDeltaContent deltaContent in deltaObject.Delta.Content ?? [])
{
updates.Add(new(deltaObject, deltaContent));
if (deltaContent is InternalMessageDeltaContentTextObject textContent)
{
foreach (InternalMessageDeltaTextContentAnnotation internalAnnotation in textContent.Text.Annotations)
{
TextAnnotationUpdate annotation = new(internalAnnotation);
updates.Add(new(deltaObject, annotation));
}
}
}
return updates;
}
}