openai/openai-dotnet

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
OpenAI_2.0.0-beta.1

Branches

Tags

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

Clone

HTTPS

Download ZIP

src/Custom/Assistants/Streaming/MessageContentUpdate.cs

88lines · modecode

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