Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion api/OpenAI.net8.0.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1605,6 +1605,7 @@ public class ChatCompletionMessageCollectionOptions : IJsonModel<ChatCompletionM
public class ChatCompletionMessageListDatum : IJsonModel<ChatCompletionMessageListDatum>, IPersistableModel<ChatCompletionMessageListDatum> {
public IReadOnlyList<ChatMessageAnnotation> Annotations { get; }
public string Content { get; }
public IList<ChatMessageContentPart> ContentParts { get; }
public string Id { get; }
public ChatOutputAudio OutputAudio { get; }
public string Refusal { get; }
Expand Down Expand Up @@ -2132,7 +2133,7 @@ public class FunctionChatMessage : ChatMessage, IJsonModel<FunctionChatMessage>,
}
public static class OpenAIChatModelFactory {
[Experimental("OPENAI001")]
public static ChatCompletion ChatCompletion(string id = null, ChatFinishReason finishReason = ChatFinishReason.Stop, ChatMessageContent content = null, string refusal = null, IEnumerable<ChatToolCall> toolCalls = null, ChatMessageRole role = ChatMessageRole.System, ChatFunctionCall functionCall = null, IEnumerable<ChatTokenLogProbabilityDetails> contentTokenLogProbabilities = null, IEnumerable<ChatTokenLogProbabilityDetails> refusalTokenLogProbabilities = null, DateTimeOffset createdAt = default, string model = null, ChatServiceTier? serviceTier = null, string systemFingerprint = null, ChatTokenUsage usage = null, ChatOutputAudio outputAudio = null, IEnumerable<ChatMessageAnnotation> messageAnnotations = null);
public static ChatCompletion ChatCompletion(string id = null, ChatFinishReason finishReason = ChatFinishReason.Stop, ChatMessageContent content = null, string refusal = null, IEnumerable<ChatToolCall> toolCalls = null, ChatMessageRole role = ChatMessageRole.System, ChatFunctionCall functionCall = null, IEnumerable<ChatTokenLogProbabilityDetails> contentTokenLogProbabilities = null, IEnumerable<ChatTokenLogProbabilityDetails> refusalTokenLogProbabilities = null, DateTimeOffset createdAt = default, string model = null, ChatServiceTier? serviceTier = null, string systemFingerprint = null, ChatTokenUsage usage = null, ChatOutputAudio outputAudio = null, IEnumerable<ChatMessageAnnotation> messageAnnotations = null, IEnumerable<ChatMessageContentPart> contentParts = null);
[EditorBrowsable(EditorBrowsableState.Never)]
public static ChatCompletion ChatCompletion(string id, ChatFinishReason finishReason, ChatMessageContent content, string refusal, IEnumerable<ChatToolCall> toolCalls, ChatMessageRole role, ChatFunctionCall functionCall, IEnumerable<ChatTokenLogProbabilityDetails> contentTokenLogProbabilities, IEnumerable<ChatTokenLogProbabilityDetails> refusalTokenLogProbabilities, DateTimeOffset createdAt, string model, string systemFingerprint, ChatTokenUsage usage);
public static ChatInputTokenUsageDetails ChatInputTokenUsageDetails(int audioTokenCount = 0, int cachedTokenCount = 0);
Expand Down
3 changes: 2 additions & 1 deletion api/OpenAI.netstandard2.0.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1422,6 +1422,7 @@ public class ChatCompletionMessageCollectionOptions : IJsonModel<ChatCompletionM
public class ChatCompletionMessageListDatum : IJsonModel<ChatCompletionMessageListDatum>, IPersistableModel<ChatCompletionMessageListDatum> {
public IReadOnlyList<ChatMessageAnnotation> Annotations { get; }
public string Content { get; }
public IList<ChatMessageContentPart> ContentParts { get; }
public string Id { get; }
public ChatOutputAudio OutputAudio { get; }
public string Refusal { get; }
Expand Down Expand Up @@ -1850,7 +1851,7 @@ public class FunctionChatMessage : ChatMessage, IJsonModel<FunctionChatMessage>,
protected override BinaryData PersistableModelWriteCore(ModelReaderWriterOptions options);
}
public static class OpenAIChatModelFactory {
public static ChatCompletion ChatCompletion(string id = null, ChatFinishReason finishReason = ChatFinishReason.Stop, ChatMessageContent content = null, string refusal = null, IEnumerable<ChatToolCall> toolCalls = null, ChatMessageRole role = ChatMessageRole.System, ChatFunctionCall functionCall = null, IEnumerable<ChatTokenLogProbabilityDetails> contentTokenLogProbabilities = null, IEnumerable<ChatTokenLogProbabilityDetails> refusalTokenLogProbabilities = null, DateTimeOffset createdAt = default, string model = null, ChatServiceTier? serviceTier = null, string systemFingerprint = null, ChatTokenUsage usage = null, ChatOutputAudio outputAudio = null, IEnumerable<ChatMessageAnnotation> messageAnnotations = null);
public static ChatCompletion ChatCompletion(string id = null, ChatFinishReason finishReason = ChatFinishReason.Stop, ChatMessageContent content = null, string refusal = null, IEnumerable<ChatToolCall> toolCalls = null, ChatMessageRole role = ChatMessageRole.System, ChatFunctionCall functionCall = null, IEnumerable<ChatTokenLogProbabilityDetails> contentTokenLogProbabilities = null, IEnumerable<ChatTokenLogProbabilityDetails> refusalTokenLogProbabilities = null, DateTimeOffset createdAt = default, string model = null, ChatServiceTier? serviceTier = null, string systemFingerprint = null, ChatTokenUsage usage = null, ChatOutputAudio outputAudio = null, IEnumerable<ChatMessageAnnotation> messageAnnotations = null, IEnumerable<ChatMessageContentPart> contentParts = null);
[EditorBrowsable(EditorBrowsableState.Never)]
public static ChatCompletion ChatCompletion(string id, ChatFinishReason finishReason, ChatMessageContent content, string refusal, IEnumerable<ChatToolCall> toolCalls, ChatMessageRole role, ChatFunctionCall functionCall, IEnumerable<ChatTokenLogProbabilityDetails> contentTokenLogProbabilities, IEnumerable<ChatTokenLogProbabilityDetails> refusalTokenLogProbabilities, DateTimeOffset createdAt, string model, string systemFingerprint, ChatTokenUsage usage);
public static ChatInputTokenUsageDetails ChatInputTokenUsageDetails(int audioTokenCount = 0, int cachedTokenCount = 0);
Expand Down
2 changes: 2 additions & 0 deletions specification/base/typespec/chat/models.tsp
Original file line number Diff line number Diff line change
Expand Up @@ -719,6 +719,8 @@ model ChatCompletionResponseMessage {
/** The contents of the message. */
content: string | null;

content_parts?: ChatCompletionRequestMessageContentPart[] | null;

/** The refusal message generated by the model. */
refusal: string | null;

Expand Down
9 changes: 6 additions & 3 deletions src/Custom/Chat/OpenAIChatModelFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -61,22 +61,25 @@ public static ChatCompletion ChatCompletion(
string systemFingerprint = null,
ChatTokenUsage usage = default,
ChatOutputAudio outputAudio = default,
IEnumerable<ChatMessageAnnotation> messageAnnotations = default)
IEnumerable<ChatMessageAnnotation> messageAnnotations = default,
IEnumerable<ChatMessageContentPart> contentParts = default)
{
content ??= new ChatMessageContent();
toolCalls ??= new List<ChatToolCall>();
contentTokenLogProbabilities ??= new List<ChatTokenLogProbabilityDetails>();
refusalTokenLogProbabilities ??= new List<ChatTokenLogProbabilityDetails>();
messageAnnotations ??= new List<ChatMessageAnnotation>();
contentParts ??= new List<ChatMessageContentPart>();

InternalChatCompletionResponseMessage message = new(
content: content,
contentParts: contentParts.ToList(),
refusal: refusal,
toolCalls: toolCalls.ToList(),
annotations: messageAnnotations.ToList(),
audio: outputAudio,
role: role,
content: content,
functionCall: functionCall,
audio: outputAudio,
additionalBinaryDataProperties: null);

InternalCreateChatCompletionResponseChoiceLogprobs logprobs = new InternalCreateChatCompletionResponseChoiceLogprobs(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ namespace OpenAI.Chat
{
public partial class ChatCompletionMessageListDatum : IJsonModel<ChatCompletionMessageListDatum>
{
internal ChatCompletionMessageListDatum() : this(null, null, null, null, default, null, null, null, null)
internal ChatCompletionMessageListDatum() : this(null, null, null, null, null, default, null, null, null, null)
{
}

Expand Down Expand Up @@ -42,6 +42,16 @@ protected virtual void JsonModelWriteCore(Utf8JsonWriter writer, ModelReaderWrit
writer.WriteNull("content"u8);
}
}
if (Optional.IsCollectionDefined(ContentParts) && _additionalBinaryDataProperties?.ContainsKey("content_parts") != true)
{
writer.WritePropertyName("content_parts"u8);
writer.WriteStartArray();
foreach (ChatMessageContentPart item in ContentParts)
{
writer.WriteObjectValue(item, options);
}
writer.WriteEndArray();
}
if (_additionalBinaryDataProperties?.ContainsKey("refusal") != true)
{
if (Optional.IsDefined(Refusal))
Expand Down Expand Up @@ -138,6 +148,7 @@ internal static ChatCompletionMessageListDatum DeserializeChatCompletionMessageL
return null;
}
string content = default;
IList<ChatMessageContentPart> contentParts = default;
string refusal = default;
IReadOnlyList<ChatToolCall> toolCalls = default;
IReadOnlyList<ChatMessageAnnotation> annotations = default;
Expand All @@ -158,6 +169,20 @@ internal static ChatCompletionMessageListDatum DeserializeChatCompletionMessageL
content = prop.Value.GetString();
continue;
}
if (prop.NameEquals("content_parts"u8))
{
if (prop.Value.ValueKind == JsonValueKind.Null)
{
continue;
}
List<ChatMessageContentPart> array = new List<ChatMessageContentPart>();
foreach (var item in prop.Value.EnumerateArray())
{
array.Add(ChatMessageContentPart.DeserializeChatMessageContentPart(item, options));
}
contentParts = array;
continue;
}
if (prop.NameEquals("refusal"u8))
{
if (prop.Value.ValueKind == JsonValueKind.Null)
Expand Down Expand Up @@ -230,6 +255,7 @@ internal static ChatCompletionMessageListDatum DeserializeChatCompletionMessageL
}
return new ChatCompletionMessageListDatum(
content,
contentParts ?? new ChangeTrackingList<ChatMessageContentPart>(),
refusal,
toolCalls ?? new ChangeTrackingList<ChatToolCall>(),
annotations ?? new ChangeTrackingList<ChatMessageAnnotation>(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,19 @@ public partial class ChatCompletionMessageListDatum
internal ChatCompletionMessageListDatum(string content, string refusal, ChatMessageRole role, string id)
{
Content = content;
ContentParts = new ChangeTrackingList<ChatMessageContentPart>();
Refusal = refusal;
ToolCalls = new ChangeTrackingList<ChatToolCall>();
Annotations = new ChangeTrackingList<ChatMessageAnnotation>();
Role = role;
Id = id;
}

internal ChatCompletionMessageListDatum(string content, string refusal, IReadOnlyList<ChatToolCall> toolCalls, IReadOnlyList<ChatMessageAnnotation> annotations, ChatMessageRole role, InternalChatCompletionResponseMessageFunctionCall functionCall, ChatOutputAudio outputAudio, string id, IDictionary<string, BinaryData> additionalBinaryDataProperties)
internal ChatCompletionMessageListDatum(string content, IList<ChatMessageContentPart> contentParts, string refusal, IReadOnlyList<ChatToolCall> toolCalls, IReadOnlyList<ChatMessageAnnotation> annotations, ChatMessageRole role, InternalChatCompletionResponseMessageFunctionCall functionCall, ChatOutputAudio outputAudio, string id, IDictionary<string, BinaryData> additionalBinaryDataProperties)
{
// Plugin customization: ensure initialization of collections
Content = content;
ContentParts = contentParts ?? new ChangeTrackingList<ChatMessageContentPart>();
Refusal = refusal;
ToolCalls = toolCalls ?? new ChangeTrackingList<ChatToolCall>();
Annotations = annotations ?? new ChangeTrackingList<ChatMessageAnnotation>();
Expand All @@ -40,6 +42,8 @@ internal ChatCompletionMessageListDatum(string content, string refusal, IReadOnl

public string Content { get; }

public IList<ChatMessageContentPart> ContentParts { get; }

public string Refusal { get; }

public IReadOnlyList<ChatToolCall> ToolCalls { get; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,6 @@ internal InternalChatCompletionRequestMessageContentPartAudio(IDictionary<string
InputAudio = inputAudio;
}

internal InternalChatCompletionRequestMessageContentPartAudioInputAudio InputAudio { get; }
internal InternalChatCompletionRequestMessageContentPartAudioInputAudio InputAudio { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,9 @@ internal InternalChatCompletionRequestMessageContentPartAudioInputAudio(BinaryDa
_additionalBinaryDataProperties = additionalBinaryDataProperties;
}

public BinaryData Data { get; }
public BinaryData Data { get; set; }

public ChatInputAudioFormat Format { get; }
public ChatInputAudioFormat Format { get; set; }

internal IDictionary<string, BinaryData> SerializedAdditionalRawData
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,6 @@ internal InternalChatCompletionRequestMessageContentPartFile(IDictionary<string,
File = @file;
}

internal InternalChatCompletionRequestMessageContentPartFileFile File { get; }
internal InternalChatCompletionRequestMessageContentPartFileFile File { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,6 @@ internal InternalChatCompletionRequestMessageContentPartImage(IDictionary<string
ImageUrl = imageUrl;
}

internal InternalChatCompletionRequestMessageContentPartImageImageUrl ImageUrl { get; }
internal InternalChatCompletionRequestMessageContentPartImageImageUrl ImageUrl { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ namespace OpenAI.Chat
{
internal partial class InternalChatCompletionResponseMessage : IJsonModel<InternalChatCompletionResponseMessage>
{
internal InternalChatCompletionResponseMessage() : this(null, null, null, null, default, null, null, null)
internal InternalChatCompletionResponseMessage() : this(null, null, null, null, null, default, null, null, null)
{
}

Expand Down Expand Up @@ -42,6 +42,16 @@ protected virtual void JsonModelWriteCore(Utf8JsonWriter writer, ModelReaderWrit
writer.WriteNull("content"u8);
}
}
if (Optional.IsCollectionDefined(ContentParts) && _additionalBinaryDataProperties?.ContainsKey("content_parts") != true)
{
writer.WritePropertyName("content_parts"u8);
writer.WriteStartArray();
foreach (ChatMessageContentPart item in ContentParts)
{
writer.WriteObjectValue(item, options);
}
writer.WriteEndArray();
}
if (_additionalBinaryDataProperties?.ContainsKey("refusal") != true)
{
if (Optional.IsDefined(Refusal))
Expand Down Expand Up @@ -133,6 +143,7 @@ internal static InternalChatCompletionResponseMessage DeserializeInternalChatCom
return null;
}
ChatMessageContent content = default;
IList<ChatMessageContentPart> contentParts = default;
string refusal = default;
IReadOnlyList<ChatToolCall> toolCalls = default;
IReadOnlyList<ChatMessageAnnotation> annotations = default;
Expand All @@ -147,6 +158,20 @@ internal static InternalChatCompletionResponseMessage DeserializeInternalChatCom
DeserializeContentValue(prop, ref content);
continue;
}
if (prop.NameEquals("content_parts"u8))
{
if (prop.Value.ValueKind == JsonValueKind.Null)
{
continue;
}
List<ChatMessageContentPart> array = new List<ChatMessageContentPart>();
foreach (var item in prop.Value.EnumerateArray())
{
array.Add(ChatMessageContentPart.DeserializeChatMessageContentPart(item, options));
}
contentParts = array;
continue;
}
if (prop.NameEquals("refusal"u8))
{
if (prop.Value.ValueKind == JsonValueKind.Null)
Expand Down Expand Up @@ -214,6 +239,7 @@ internal static InternalChatCompletionResponseMessage DeserializeInternalChatCom
}
return new InternalChatCompletionResponseMessage(
content,
contentParts ?? new ChangeTrackingList<ChatMessageContentPart>(),
refusal,
toolCalls ?? new ChangeTrackingList<ChatToolCall>(),
annotations ?? new ChangeTrackingList<ChatMessageAnnotation>(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,18 @@ internal InternalChatCompletionResponseMessage(ChatMessageContent content, strin
{
// Plugin customization: ensure initialization of collections
Content = content ?? new ChatMessageContent();
ContentParts = new ChangeTrackingList<ChatMessageContentPart>();
Refusal = refusal;
ToolCalls = new ChangeTrackingList<ChatToolCall>();
Annotations = new ChangeTrackingList<ChatMessageAnnotation>();
Role = role;
}

internal InternalChatCompletionResponseMessage(ChatMessageContent content, string refusal, IReadOnlyList<ChatToolCall> toolCalls, IReadOnlyList<ChatMessageAnnotation> annotations, ChatMessageRole role, ChatFunctionCall functionCall, ChatOutputAudio audio, IDictionary<string, BinaryData> additionalBinaryDataProperties)
internal InternalChatCompletionResponseMessage(ChatMessageContent content, IList<ChatMessageContentPart> contentParts, string refusal, IReadOnlyList<ChatToolCall> toolCalls, IReadOnlyList<ChatMessageAnnotation> annotations, ChatMessageRole role, ChatFunctionCall functionCall, ChatOutputAudio audio, IDictionary<string, BinaryData> additionalBinaryDataProperties)
{
// Plugin customization: ensure initialization of collections
Content = content ?? new ChatMessageContent();
ContentParts = contentParts ?? new ChangeTrackingList<ChatMessageContentPart>();
Refusal = refusal;
ToolCalls = toolCalls ?? new ChangeTrackingList<ChatToolCall>();
Annotations = annotations ?? new ChangeTrackingList<ChatMessageAnnotation>();
Expand All @@ -35,6 +37,8 @@ internal InternalChatCompletionResponseMessage(ChatMessageContent content, strin
_additionalBinaryDataProperties = additionalBinaryDataProperties;
}

public IList<ChatMessageContentPart> ContentParts { get; }

public string Refusal { get; }

public IReadOnlyList<ChatToolCall> ToolCalls { get; }
Expand Down
Loading