Skip to content

Commit acc985a

Browse files
Remove ImageContent and AudioContent (#5814)
1 parent 142f094 commit acc985a

File tree

23 files changed

+376
-487
lines changed

23 files changed

+376
-487
lines changed

eng/MSBuild/Shared.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
<ItemGroup Condition="'$(InjectSharedRentedSpan)' == 'true'">
1515
<Compile Include="$(MSBuildThisFileDirectory)\..\..\src\Shared\RentedSpan\*.cs" LinkBase="Shared\RentedSpan" />
1616
</ItemGroup>
17-
17+
1818
<ItemGroup Condition="'$(InjectSharedServerSentEvents)' == 'true'">
1919
<Compile Include="$(MSBuildThisFileDirectory)\..\..\src\Shared\ServerSentEvents\*.cs" LinkBase="Shared\ServerSentEvents" />
2020
</ItemGroup>

src/Libraries/Microsoft.Extensions.AI.Abstractions/Contents/AIContent.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,9 @@ namespace Microsoft.Extensions.AI;
77

88
/// <summary>Provides a base class for all content used with AI services.</summary>
99
[JsonPolymorphic(TypeDiscriminatorPropertyName = "$type")]
10-
[JsonDerivedType(typeof(AudioContent), typeDiscriminator: "audio")]
1110
[JsonDerivedType(typeof(DataContent), typeDiscriminator: "data")]
1211
[JsonDerivedType(typeof(FunctionCallContent), typeDiscriminator: "functionCall")]
1312
[JsonDerivedType(typeof(FunctionResultContent), typeDiscriminator: "functionResult")]
14-
[JsonDerivedType(typeof(ImageContent), typeDiscriminator: "image")]
1513
[JsonDerivedType(typeof(TextContent), typeDiscriminator: "text")]
1614
[JsonDerivedType(typeof(UsageContent), typeDiscriminator: "usage")]
1715
public class AIContent

src/Libraries/Microsoft.Extensions.AI.Abstractions/Contents/AudioContent.cs

Lines changed: 0 additions & 45 deletions
This file was deleted.

src/Libraries/Microsoft.Extensions.AI.Abstractions/Contents/DataContent.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,14 @@ public DataContent(ReadOnlyMemory<byte> data, string? mediaType = null)
105105
_data = data;
106106
}
107107

108+
/// <summary>
109+
/// Determines whether the <see cref="MediaType"/> has the specified prefix.
110+
/// </summary>
111+
/// <param name="prefix">The media type prefix.</param>
112+
/// <returns><see langword="true"/> if the <see cref="MediaType"/> has the specified prefix, otherwise <see langword="false"/>.</returns>
113+
public bool MediaTypeStartsWith(string prefix)
114+
=> MediaType?.StartsWith(prefix, StringComparison.OrdinalIgnoreCase) is true;
115+
108116
/// <summary>Sets <paramref name="mediaType"/> to null if it's empty or composed entirely of whitespace.</summary>
109117
private static void ValidateMediaType(ref string? mediaType)
110118
{
@@ -172,6 +180,7 @@ public string Uri
172180
/// as the instance actually contains all of the data it represents. If, however, the instance was constructed from another form of URI, one
173181
/// that simply references where the data can be found but doesn't actually contain the data, this property returns <see langword="false"/>.
174182
/// </remarks>
183+
[MemberNotNullWhen(true, nameof(Data))]
175184
[JsonIgnore]
176185
public bool ContainsData => _dataUri is not null || _data is not null;
177186

@@ -180,7 +189,6 @@ public string Uri
180189
/// If <see cref="ContainsData"/> is <see langword="true" />, this property returns the represented data.
181190
/// If <see cref="ContainsData"/> is <see langword="false" />, this property returns <see langword="null" />.
182191
/// </remarks>
183-
[MemberNotNullWhen(true, nameof(ContainsData))]
184192
[JsonIgnore]
185193
public ReadOnlyMemory<byte>? Data
186194
{

src/Libraries/Microsoft.Extensions.AI.Abstractions/Contents/ImageContent.cs

Lines changed: 0 additions & 45 deletions
This file was deleted.

src/Libraries/Microsoft.Extensions.AI.AzureAIInference/AzureAIInferenceChatClient.cs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -484,12 +484,16 @@ private static List<ChatMessageContentItem> GetContentParts(IList<AIContent> con
484484
parts.Add(new ChatMessageTextContentItem(textContent.Text));
485485
break;
486486

487-
case ImageContent imageContent when imageContent.Data is { IsEmpty: false } data:
488-
parts.Add(new ChatMessageImageContentItem(BinaryData.FromBytes(data), imageContent.MediaType));
489-
break;
487+
case DataContent dataContent when dataContent.MediaTypeStartsWith("image/"):
488+
if (dataContent.ContainsData)
489+
{
490+
parts.Add(new ChatMessageImageContentItem(BinaryData.FromBytes(dataContent.Data.Value), dataContent.MediaType));
491+
}
492+
else if (dataContent.Uri is string uri)
493+
{
494+
parts.Add(new ChatMessageImageContentItem(new Uri(uri)));
495+
}
490496

491-
case ImageContent imageContent when imageContent.Uri is string uri:
492-
parts.Add(new ChatMessageImageContentItem(new Uri(uri)));
493497
break;
494498
}
495499
}

src/Libraries/Microsoft.Extensions.AI.AzureAIInference/Microsoft.Extensions.AI.AzureAIInference.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
<InjectSharedEmptyCollections>true</InjectSharedEmptyCollections>
2727
<InjectStringHashOnLegacy>true</InjectStringHashOnLegacy>
2828
</PropertyGroup>
29-
29+
3030
<ItemGroup>
3131
<PackageReference Include="Azure.AI.Inference" />
3232
<PackageReference Include="Microsoft.Bcl.AsyncInterfaces" />
@@ -37,5 +37,5 @@
3737
<ItemGroup>
3838
<ProjectReference Include="../Microsoft.Extensions.AI.Abstractions/Microsoft.Extensions.AI.Abstractions.csproj" />
3939
</ItemGroup>
40-
40+
4141
</Project>

src/Libraries/Microsoft.Extensions.AI.Ollama/Microsoft.Extensions.AI.Ollama.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,5 +40,5 @@
4040
<ItemGroup>
4141
<ProjectReference Include="../Microsoft.Extensions.AI.Abstractions/Microsoft.Extensions.AI.Abstractions.csproj" />
4242
</ItemGroup>
43-
43+
4444
</Project>

src/Libraries/Microsoft.Extensions.AI.Ollama/OllamaChatClient.cs

Lines changed: 55 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -386,74 +386,76 @@ private IEnumerable<OllamaChatRequestMessage> ToOllamaChatRequestMessages(ChatMe
386386
OllamaChatRequestMessage? currentTextMessage = null;
387387
foreach (var item in content.Contents)
388388
{
389-
if (currentTextMessage is not null && item is not ImageContent)
389+
if (item is DataContent { ContainsData: true } dataContent && dataContent.MediaTypeStartsWith("image/"))
390390
{
391-
yield return currentTextMessage;
392-
currentTextMessage = null;
393-
}
394-
395-
switch (item)
396-
{
397-
case TextContent textContent:
398-
currentTextMessage = new OllamaChatRequestMessage
399-
{
400-
Role = content.Role.Value,
401-
Content = textContent.Text ?? string.Empty,
402-
};
403-
break;
404-
405-
case ImageContent imageContent when imageContent.Data is not null:
406-
IList<string> images = currentTextMessage?.Images ?? [];
407-
images.Add(Convert.ToBase64String(imageContent.Data.Value
391+
IList<string> images = currentTextMessage?.Images ?? [];
392+
images.Add(Convert.ToBase64String(dataContent.Data.Value
408393
#if NET
409-
.Span));
394+
.Span));
410395
#else
411-
.ToArray()));
396+
.ToArray()));
412397
#endif
413398

414-
if (currentTextMessage is not null)
415-
{
416-
currentTextMessage.Images = images;
417-
}
418-
else
399+
if (currentTextMessage is not null)
400+
{
401+
currentTextMessage.Images = images;
402+
}
403+
else
404+
{
405+
yield return new OllamaChatRequestMessage
419406
{
420-
yield return new OllamaChatRequestMessage
407+
Role = content.Role.Value,
408+
Images = images,
409+
};
410+
}
411+
}
412+
else
413+
{
414+
if (currentTextMessage is not null)
415+
{
416+
yield return currentTextMessage;
417+
currentTextMessage = null;
418+
}
419+
420+
switch (item)
421+
{
422+
case TextContent textContent:
423+
currentTextMessage = new OllamaChatRequestMessage
421424
{
422425
Role = content.Role.Value,
423-
Images = images,
426+
Content = textContent.Text ?? string.Empty,
424427
};
425-
}
428+
break;
426429

427-
break;
428-
429-
case FunctionCallContent fcc:
430-
{
431-
yield return new OllamaChatRequestMessage
430+
case FunctionCallContent fcc:
432431
{
433-
Role = "assistant",
434-
Content = JsonSerializer.Serialize(new OllamaFunctionCallContent
432+
yield return new OllamaChatRequestMessage
435433
{
436-
CallId = fcc.CallId,
437-
Name = fcc.Name,
438-
Arguments = JsonSerializer.SerializeToElement(fcc.Arguments, ToolCallJsonSerializerOptions.GetTypeInfo(typeof(IDictionary<string, object?>))),
439-
}, JsonContext.Default.OllamaFunctionCallContent)
440-
};
441-
break;
442-
}
434+
Role = "assistant",
435+
Content = JsonSerializer.Serialize(new OllamaFunctionCallContent
436+
{
437+
CallId = fcc.CallId,
438+
Name = fcc.Name,
439+
Arguments = JsonSerializer.SerializeToElement(fcc.Arguments, ToolCallJsonSerializerOptions.GetTypeInfo(typeof(IDictionary<string, object?>))),
440+
}, JsonContext.Default.OllamaFunctionCallContent)
441+
};
442+
break;
443+
}
443444

444-
case FunctionResultContent frc:
445-
{
446-
JsonElement jsonResult = JsonSerializer.SerializeToElement(frc.Result, ToolCallJsonSerializerOptions.GetTypeInfo(typeof(object)));
447-
yield return new OllamaChatRequestMessage
445+
case FunctionResultContent frc:
448446
{
449-
Role = "tool",
450-
Content = JsonSerializer.Serialize(new OllamaFunctionResultContent
447+
JsonElement jsonResult = JsonSerializer.SerializeToElement(frc.Result, ToolCallJsonSerializerOptions.GetTypeInfo(typeof(object)));
448+
yield return new OllamaChatRequestMessage
451449
{
452-
CallId = frc.CallId,
453-
Result = jsonResult,
454-
}, JsonContext.Default.OllamaFunctionResultContent)
455-
};
456-
break;
450+
Role = "tool",
451+
Content = JsonSerializer.Serialize(new OllamaFunctionResultContent
452+
{
453+
CallId = frc.CallId,
454+
Result = jsonResult,
455+
}, JsonContext.Default.OllamaFunctionResultContent)
456+
};
457+
break;
458+
}
457459
}
458460
}
459461
}

src/Libraries/Microsoft.Extensions.AI.OpenAI/Microsoft.Extensions.AI.OpenAI.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,5 @@
3838
<ItemGroup>
3939
<ProjectReference Include="../Microsoft.Extensions.AI.Abstractions/Microsoft.Extensions.AI.Abstractions.csproj" />
4040
</ItemGroup>
41-
41+
4242
</Project>

0 commit comments

Comments
 (0)