openai/openai-dotnet

Public

mirrored from https://github.com/openai/openai-dotnetAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
OpenAI_2.2.0-beta.2

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

src/Custom/Assistants/Streaming/MessageContentUpdate.cs

95lines · modecode

1using System.ClientModel.Primitives;
2using System.Collections.Generic;
3using System.Diagnostics.CodeAnalysis;
4using System.Text.Json;
5
6namespace OpenAI.Assistants;
7
8/// <summary>
9/// Represents a streaming update to <see cref="ThreadMessage"/> content as part of the Assistants API.
10/// </summary>
11/// <remarks>
12/// Distinct <see cref="MessageContentUpdate"/> instances will be generated for each <see cref="MessageContent"/> part
13/// and each content subcomponent, such as <see cref="TextAnnotationUpdate"/> instances, even if this information
14/// arrived in the same response chunk.
15/// </remarks>
16[Experimental("OPENAI001")]
17public partial class MessageContentUpdate : StreamingUpdate
18{
19 /// <inheritdoc cref="MessageDeltaObject.Id"/>
20 public string MessageId => _delta.Id;
21
22 /// <inheritdoc cref="InternalMessageDeltaContentImageFileObject.Index"/>
23 public int MessageIndex => _textContent?.Index
24 ?? _imageFileContent?.Index
25 ?? _imageUrlContent?.Index
26 ?? _refusalContent?.Index
27 ?? TextAnnotation?.ContentIndex
28 ?? 0;
29
30 /// <inheritdoc cref="InternalMessageDeltaObjectDelta.Role"/>
31 public MessageRole? Role => _delta.Delta?.Role;
32
33 /// <inheritdoc cref="InternalMessageDeltaContentImageFileObjectImageFile.FileId"/>
34 public string ImageFileId => _imageFileContent?.ImageFile?.FileId;
35
36 /// <inheritdoc cref="MessageImageDetail"/>
37 public MessageImageDetail? ImageDetail => _imageFileContent?.ImageFile?.Detail?.ToMessageImageDetail()
38 ?? _imageUrlContent?.ImageUrl?.Detail?.ToMessageImageDetail();
39
40 /// <inheritdoc cref="InternalMessageDeltaContentTextObjectText.Value"/>
41 public string Text => _textContent?.Text?.Value;
42
43 /// <summary>
44 /// An update to an annotation associated with a specific content item in the message's content items collection.
45 /// </summary>
46 public TextAnnotationUpdate TextAnnotation { get; }
47
48 public string RefusalUpdate => _refusalContent?.Refusal;
49
50 private readonly InternalMessageDeltaContentImageFileObject _imageFileContent;
51 private readonly InternalMessageDeltaContentTextObject _textContent;
52 private readonly InternalMessageDeltaContentImageUrlObject _imageUrlContent;
53 private readonly InternalMessageDeltaContentRefusalObject _refusalContent;
54 private readonly InternalMessageDeltaObject _delta;
55
56 internal MessageContentUpdate(InternalMessageDeltaObject delta, InternalMessageDeltaContent content)
57 : base(StreamingUpdateReason.MessageUpdated)
58 {
59 _delta = delta;
60 _textContent = content as InternalMessageDeltaContentTextObject;
61 _imageFileContent = content as InternalMessageDeltaContentImageFileObject;
62 _imageUrlContent = content as InternalMessageDeltaContentImageUrlObject;
63 _refusalContent = content as InternalMessageDeltaContentRefusalObject;
64 }
65
66 internal MessageContentUpdate(InternalMessageDeltaObject delta, TextAnnotationUpdate annotation)
67 : base(StreamingUpdateReason.MessageUpdated)
68 {
69 _delta = delta;
70 TextAnnotation = annotation;
71 }
72
73 internal static IEnumerable<MessageContentUpdate> DeserializeMessageContentUpdates(
74 JsonElement element,
75 StreamingUpdateReason _,
76 ModelReaderWriterOptions options = null)
77 {
78 InternalMessageDeltaObject deltaObject = InternalMessageDeltaObject.DeserializeInternalMessageDeltaObject(element, options);
79 List<MessageContentUpdate> updates = [];
80 foreach (InternalMessageDeltaContent deltaContent in deltaObject.Delta.Content ?? [])
81 {
82 updates.Add(new(deltaObject, deltaContent));
83 if (deltaContent is InternalMessageDeltaContentTextObject textContent)
84 {
85 foreach (InternalMessageDeltaTextContentAnnotation internalAnnotation in textContent.Text.Annotations)
86 {
87 TextAnnotationUpdate annotation = new(internalAnnotation);
88 updates.Add(new(deltaObject, annotation));
89 }
90 }
91 }
92 return updates;
93 }
94}