Skip to content

Commit f257768

Browse files
authored
Create ImageUrlInput.md
Original: Sample17_PersistentAgents_ImageUrlInputs.md. Made sure it works with uri and made it consistent with other samples.
1 parent f7281a3 commit f257768

File tree

1 file changed

+194
-0
lines changed

1 file changed

+194
-0
lines changed
Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
# Sample using agents with Image URL as an input in Azure.AI.Agents
2+
3+
This sample demonstrates examples of sending an image URL (along with optional text) as a structured content block in a single message. The examples shows how to create an agent, open a thread, post content blocks combining text and image inputs, and then run the agent to see how it interprets the multimedia input.
4+
5+
1. First get `ProjectEndpoint` and `ModelDeploymentName` from config and create a `PersistentAgentsClient`.
6+
7+
```C# Snippet:AgentImageUrlInMessageCreateClient
8+
var projectEndpoint = configuration["ProjectEndpoint"];
9+
var modelDeploymentName = configuration["ModelDeploymentName"];
10+
PersistentAgentsClient client = new(new Uri(projectEndpoint), new DefaultAzureCredential());
11+
```
12+
13+
2. Create an agent.
14+
15+
Synchronous sample:
16+
```C# Snippet:AgentImageUrlInMessageCreateAgent_Sync
17+
PersistentAgent agent = client.CreateAgent(
18+
model: modelDeploymentName,
19+
name: "Image Understanding Agent",
20+
instructions: "You are an image-understanding agent. Analyze images and provide textual descriptions."
21+
);
22+
```
23+
24+
Asynchronous sample:
25+
```C# Snippet:AgentImageUrlInMessageCreateAgent
26+
PersistentAgent agent = await client.CreateAgentAsync(
27+
model: modelDeploymentName,
28+
name: "Image Understanding Agent",
29+
instructions: "You are an image-understanding agent. Analyze images and provide textual descriptions."
30+
);
31+
```
32+
33+
3. Create a thread
34+
35+
Synchronous sample:
36+
```C# Snippet:AgentImageUrlInMessageCreateThread_Sync
37+
PersistentAgentThread thread = client.CreateThread();
38+
```
39+
40+
Asynchronous sample:
41+
```C# Snippet:AgentImageUrlInMessageCreateThread
42+
PersistentAgentThread thread = await client.CreateThreadAsync();
43+
```
44+
45+
4. Create a message using multiple content blocks. Here we combine a short text and an image URL in a single user message.
46+
47+
Synchronous sample:
48+
```C# Snippet:AgentImageUrlInMessageCreateMessage_Sync
49+
MessageImageUrlParam imageUrlParam = new MessageImageUrlParam(
50+
url: "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg"
51+
);
52+
imageUrlParam.Detail = ImageDetailLevel.High;
53+
54+
var contentBlocks = new List<MessageInputContentBlock>
55+
{
56+
new MessageInputTextBlock("Could you describe this image?"),
57+
new MessageInputImageUrlBlock(imageUrlParam)
58+
};
59+
60+
client.CreateMessage(
61+
threadId: thread.Id,
62+
role: MessageRole.User,
63+
contentBlocks: contentBlocks
64+
);
65+
```
66+
67+
Asynchronous sample:
68+
```C# Snippet:AgentImageUrlInMessageCreateMessage
69+
MessageImageUrlParam imageUrlParam = new MessageImageUrlParam(
70+
url: "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg"
71+
);
72+
imageUrlParam.Detail = ImageDetailLevel.High;
73+
var contentBlocks = new List<MessageInputContentBlock>
74+
{
75+
new MessageInputTextBlock("Could you describe this image?"),
76+
new MessageInputImageUrlBlock(imageUrlParam)
77+
};
78+
79+
await client.CreateMessageAsync(
80+
threadId: thread.Id,
81+
role: MessageRole.User,
82+
contentBlocks: contentBlocks
83+
);
84+
```
85+
86+
5. Run the agent against the thread that now has an image to analyze.
87+
88+
Synchronous sample:
89+
```C# Snippet:AgentImageUrlInMessageCreateRun_Sync
90+
ThreadRun run = client.CreateRun(
91+
threadId: thread.Id,
92+
assistantId: agent.Id
93+
);
94+
```
95+
96+
Asynchronous sample:
97+
```C# Snippet:AgentImageUrlInMessageCreateRun
98+
ThreadRun run = await client.CreateRunAsync(
99+
threadId: thread.Id,
100+
assistantId: agent.Id
101+
);
102+
```
103+
104+
6. Wait for the run to complete.
105+
106+
Synchronous sample:
107+
```C# Snippet:AgentImageUrlInMessageWaitForRun_Sync
108+
do
109+
{
110+
Thread.Sleep(TimeSpan.FromMilliseconds(500));
111+
run = client.GetRun(thread.Id, run.Id);
112+
}
113+
while (run.Status == RunStatus.Queued
114+
|| run.Status == RunStatus.InProgress);
115+
```
116+
117+
Asynchronous sample:
118+
```C# Snippet:AgentImageUrlInMessageWaitForRun
119+
do
120+
{
121+
await Task.Delay(TimeSpan.FromMilliseconds(500));
122+
run = await client.GetRunAsync(thread.Id, run.Id);
123+
}
124+
while (run.Status == RunStatus.Queued
125+
|| run.Status == RunStatus.InProgress);
126+
```
127+
128+
7. Retrieve messages (including how the agent responds) and print their contents.
129+
130+
Synchronous sample:
131+
```C# Snippet:AgentImageUrlInMessageReview_Sync
132+
PageableList<ThreadMessage> messages = client.GetMessages(
133+
thread.Id,
134+
order: ListSortOrder.Ascending);
135+
136+
foreach (ThreadMessage threadMessage in messages)
137+
{
138+
foreach (MessageContent content in threadMessage.ContentItems)
139+
{
140+
switch (content)
141+
{
142+
case MessageTextContent textItem:
143+
Console.Write($"{threadMessage.Role}: {textItem.Text}");
144+
Console.WriteLine();
145+
break;
146+
147+
case MessageImageFileContent fileItem:
148+
Console.WriteLine($"{threadMessage.Role}: Image File (internal ID): {fileItem.FileId}");
149+
Console.WriteLine();
150+
break;
151+
}
152+
}
153+
}
154+
```
155+
156+
Asynchronous sample:
157+
```C# Snippet:AgentImageUrlInMessageReview
158+
PageableList<ThreadMessage> messages = await client.GetMessagesAsync(
159+
thread.Id,
160+
order: ListSortOrder.Ascending);
161+
162+
foreach (ThreadMessage threadMessage in messages)
163+
{
164+
foreach (MessageContent content in threadMessage.ContentItems)
165+
{
166+
switch (content)
167+
{
168+
case MessageTextContent textItem:
169+
Console.Write($"{threadMessage.Role}: {textItem.Text}");
170+
Console.WriteLine();
171+
break;
172+
173+
case MessageImageFileContent fileItem:
174+
Console.WriteLine($"{threadMessage.Role}: Image File (internal ID): {fileItem.FileId}");
175+
Console.WriteLine();
176+
break;
177+
}
178+
}
179+
}
180+
```
181+
182+
8. Finally, we delete all the resources, we have created in this sample.
183+
184+
Synchronous sample:
185+
```C# Snippet:AgentImageUrlInMessageCleanup_Sync
186+
client.DeleteThread(thread.Id);
187+
client.DeleteAgent(agent.Id);
188+
```
189+
190+
Asynchronous sample:
191+
```C# Snippet:AgentImageUrlInMessageCleanup
192+
await client.DeleteThreadAsync(thread.Id);
193+
await client.DeleteAgentAsync(agent.Id);
194+
```

0 commit comments

Comments
 (0)