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; } }