Send images and other binary/file content to an AG-UI agent with the AG-UI .NET SDK — attach pictures (or audio, PDFs, etc.) to a user message so a multimodal model can see them. USE FOR: building a user ChatMessage with mixed content parts (TextContent plus DataContent for inline bytes, or UriContent for a hosted URL); choosing inline bytes vs a URL reference; setting the correct media type; sending the message through AGUIChatClient so the content parts cross the AG-UI wire to a vision/multimodal model. DO NOT USE FOR: plain text chat (use agui-dotnet-streaming-chat); tool calls (use agui-dotnet-server-tools / agui-dotnet-client-tools); structured shared state (use agui-dotnet-shared-state); reasoning traces, interrupts, generative UI, or protobuf.
80
100%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Goal: include an image (or other binary content) in a turn so a multimodal model can describe or reason about it.
A multimodal message is an ordinary Microsoft.Extensions.AI ChatMessage whose Contents mixes a TextContent with one or more binary parts. AGUIChatClient carries those parts across the AG-UI wire; the server streams the model's reply as usual.
dotnet add package AGUI.ClientMicrosoft.Extensions.AI supplies ChatMessage, TextContent, DataContent, and UriContent.
Use DataContent(bytes, mediaType) to embed the data directly in the message:
using AGUI.Client;
using Microsoft.Extensions.AI;
byte[] imageBytes = await File.ReadAllBytesAsync("photo.png");
var messages = new List<ChatMessage>
{
new(ChatRole.User,
[
new TextContent("Describe this image"),
new DataContent(imageBytes, "image/png"),
]),
};
await foreach (var update in client.GetStreamingResponseAsync(messages))
{
Console.Write(update.Text);
}The media type must match the bytes (image/png, image/jpeg, audio/wav, application/pdf, …) so the model decodes them correctly.
When the asset already lives at a URL, use UriContent(uri, mediaType) instead — the bytes never pass through your process:
new ChatMessage(ChatRole.User,
[
new TextContent("What's in this picture?"),
new UriContent("https://example.com/cat.jpg", "image/jpeg"),
]);Prefer UriContent to reference an asset already hosted at a URL; use DataContent for local bytes the model host can't reach by URL.
DataContent. Inline binary is base64-encoded into the request, inflating it ~33% and forcing the whole payload through memory on both ends. For anything sizable that is reachable by URL, send UriContent and let the model host fetch it.IChatClient at a vision-capable model/deployment.34c3e0c
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.