Skip to content

Commit e18a055

Browse files
authored
Add ImageContent integration test (#5586)
1 parent bf0e0a4 commit e18a055

4 files changed

Lines changed: 37 additions & 0 deletions

File tree

test/Libraries/Microsoft.Extensions.AI.Integration.Tests/ChatClientIntegrationTests.cs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System.ComponentModel;
77
using System.Diagnostics;
88
using System.Diagnostics.CodeAnalysis;
9+
using System.IO;
910
using System.Linq;
1011
using System.Runtime.InteropServices;
1112
using System.Text;
@@ -132,6 +133,27 @@ public virtual async Task CompleteStreamingAsync_UsageDataAvailable()
132133
Assert.Equal(usage.Details.InputTokenCount + usage.Details.OutputTokenCount, usage.Details.TotalTokenCount);
133134
}
134135

136+
protected virtual string? GetModel_MultiModal_DescribeImage() => null;
137+
138+
[ConditionalFact]
139+
public virtual async Task MultiModal_DescribeImage()
140+
{
141+
SkipIfNotEnabled();
142+
143+
var response = await _chatClient.CompleteAsync(
144+
[
145+
new(ChatRole.User,
146+
[
147+
new TextContent("What does this logo say?"),
148+
new ImageContent(GetImageDataUri()),
149+
])
150+
],
151+
new() { ModelId = GetModel_MultiModal_DescribeImage() });
152+
153+
Assert.Single(response.Choices);
154+
Assert.True(response.Message.Text?.IndexOf("net", StringComparison.OrdinalIgnoreCase) >= 0, response.Message.Text);
155+
}
156+
135157
[ConditionalFact]
136158
public virtual async Task FunctionInvocation_AutomaticallyInvokeFunction_Parameterless()
137159
{
@@ -714,6 +736,15 @@ private enum JobType
714736
Unknown,
715737
}
716738

739+
private static Uri GetImageDataUri()
740+
{
741+
using Stream? s = typeof(ChatClientIntegrationTests).Assembly.GetManifestResourceStream("Microsoft.Extensions.AI.dotnet.png");
742+
Assert.NotNull(s);
743+
MemoryStream ms = new();
744+
s.CopyTo(ms);
745+
return new Uri($"data:image/png;base64,{Convert.ToBase64String(ms.ToArray())}");
746+
}
747+
717748
[MemberNotNull(nameof(_chatClient))]
718749
protected void SkipIfNotEnabled()
719750
{

test/Libraries/Microsoft.Extensions.AI.Integration.Tests/Microsoft.Extensions.AI.Integration.Tests.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@
1515
<InjectSharedThrow>true</InjectSharedThrow>
1616
</PropertyGroup>
1717

18+
<ItemGroup>
19+
<EmbeddedResource Include="dotnet.png" />
20+
</ItemGroup>
21+
1822
<ItemGroup>
1923
<Compile Include="..\Microsoft.Extensions.AI.Abstractions.Tests\CapturingLogger.cs" />
2024
<Compile Include="..\Microsoft.Extensions.AI.Abstractions.Tests\TestChatClient.cs" />
2.09 KB
Loading

test/Libraries/Microsoft.Extensions.AI.Ollama.Tests/OllamaChatClientIntegrationTests.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ public override Task FunctionInvocation_RequireAny() =>
3030
public override Task FunctionInvocation_RequireSpecific() =>
3131
throw new SkipTestException("Ollama does not currently support requiring function invocation.");
3232

33+
protected override string? GetModel_MultiModal_DescribeImage() => "llava";
34+
3335
[ConditionalFact]
3436
public async Task PromptBasedFunctionCalling_NoArgs()
3537
{

0 commit comments

Comments
 (0)