@@ -6,7 +6,7 @@ services: azure-ai-agent-service
66manager : nitinme
77ms.service : azure-ai-agent-service
88ms.topic : how-to
9- ms.date : 07/11 /2025
9+ ms.date : 08/07 /2025
1010author : aahill
1111ms.author : aahi
1212ms.custom : azure-ai-agents
@@ -555,3 +555,166 @@ client.Administration.DeleteAgent(agent.Id);
555555```
556556
557557::: zone-end
558+
559+ :::zone pivot="java"
560+
561+ ## Code example
562+
563+ ```java
564+ package com.example.agents;
565+
566+ import com.azure.ai.agents.persistent.MessagesClient;
567+ import com.azure.ai.agents.persistent.PersistentAgentsAdministrationClient;
568+ import com.azure.ai.agents.persistent.PersistentAgentsClient;
569+ import com.azure.ai.agents.persistent.PersistentAgentsClientBuilder;
570+ import com.azure.ai.agents.persistent.RunsClient;
571+ import com.azure.ai.agents.persistent.ThreadsClient;
572+ import com.azure.ai.agents.persistent.implementation.models.CreateAgentRequest;
573+ import com.azure.ai.agents.persistent.models.AzureFunctionBinding;
574+ import com.azure.ai.agents.persistent.models.AzureFunctionDefinition;
575+ import com.azure.ai.agents.persistent.models.AzureFunctionStorageQueue;
576+ import com.azure.ai.agents.persistent.models.AzureFunctionToolDefinition;
577+ import com.azure.ai.agents.persistent.models.CreateRunOptions;
578+ import com.azure.ai.agents.persistent.models.FunctionDefinition;
579+ import com.azure.ai.agents.persistent.models.MessageImageFileContent;
580+ import com.azure.ai.agents.persistent.models.MessageRole;
581+ import com.azure.ai.agents.persistent.models.MessageTextContent;
582+ import com.azure.ai.agents.persistent.models.PersistentAgent;
583+ import com.azure.ai.agents.persistent.models.PersistentAgentThread;
584+ import com.azure.ai.agents.persistent.models.RunStatus;
585+ import com.azure.ai.agents.persistent.models.ThreadMessage;
586+ import com.azure.ai.agents.persistent.models.ThreadRun;
587+ import com.azure.ai.agents.persistent.models.MessageContent;
588+ import com.azure.core.http.HttpHeaderName;
589+ import com.azure.core.http.rest.PagedIterable;
590+ import com.azure.core.http.rest.RequestOptions;
591+ import com.azure.core.util.BinaryData;
592+ import com.azure.identity.DefaultAzureCredentialBuilder;
593+ import java.util.Arrays;
594+ import java.util.HashMap;
595+ import java.util.Map;
596+
597+ public class AgentExample {
598+
599+ public static void main(String[] args) {
600+
601+ // variables for authenticating requests to the agent service
602+ String projectEndpoint = System.getenv("PROJECT_ENDPOINT");
603+ String modelName = System.getenv("MODEL_DEPLOYMENT_NAME");
604+ String storageQueueUri = System.getenv("STORAGE_QUEUE_URI");
605+ String azureFunctionName = System.getenv("AZURE_FUNCTION_NAME");
606+
607+ PersistentAgentsClientBuilder clientBuilder = new PersistentAgentsClientBuilder().endpoint(projectEndpoint)
608+ .credential(new DefaultAzureCredentialBuilder().build());
609+ PersistentAgentsClient agentsClient = clientBuilder.buildClient();
610+ PersistentAgentsAdministrationClient administrationClient = agentsClient.getPersistentAgentsAdministrationClient();
611+ ThreadsClient threadsClient = agentsClient.getThreadsClient();
612+ MessagesClient messagesClient = agentsClient.getMessagesClient();
613+ RunsClient runsClient = agentsClient.getRunsClient();
614+
615+ FunctionDefinition fnDef = new FunctionDefinition(
616+ azureFunctionName,
617+ BinaryData.fromObject(
618+ mapOf(
619+ "type", "object",
620+ "properties", mapOf(
621+ "location",
622+ mapOf("type", "string", "description", "The location to look up")
623+ ),
624+ "required", new String[]{"location"}
625+ )
626+ )
627+ );
628+ AzureFunctionDefinition azureFnDef = new AzureFunctionDefinition(
629+ fnDef,
630+ new AzureFunctionBinding(new AzureFunctionStorageQueue(storageQueueUri, "agent-input")),
631+ new AzureFunctionBinding(new AzureFunctionStorageQueue(storageQueueUri, "agent-output"))
632+ );
633+ AzureFunctionToolDefinition azureFnTool = new AzureFunctionToolDefinition(azureFnDef);
634+
635+ String agentName = "azure_function_example";
636+ RequestOptions requestOptions = new RequestOptions()
637+ .setHeader(HttpHeaderName.fromString("x-ms-enable-preview"), "true");
638+ CreateAgentRequest createAgentRequestObj = new CreateAgentRequest(modelName)
639+ .setName(agentName)
640+ .setInstructions("You are a helpful agent. Use the provided function any time "
641+ + "you are asked with the weather of any location")
642+ .setTools(Arrays.asList(azureFnTool));
643+ BinaryData createAgentRequest = BinaryData.fromObject(createAgentRequestObj);
644+ PersistentAgent agent = administrationClient.createAgentWithResponse(createAgentRequest, requestOptions)
645+ .getValue().toObject(PersistentAgent.class);
646+
647+ PersistentAgentThread thread = threadsClient.createThread();
648+ ThreadMessage createdMessage = messagesClient.createMessage(
649+ thread.getId(),
650+ MessageRole.USER,
651+ "What is the weather in Seattle, WA?");
652+
653+ try {
654+ //run agent
655+ CreateRunOptions createRunOptions = new CreateRunOptions(thread.getId(), agent.getId())
656+ .setAdditionalInstructions("");
657+ ThreadRun threadRun = runsClient.createRun(createRunOptions);
658+
659+ waitForRunCompletion(thread.getId(), threadRun, runsClient);
660+ printRunMessages(messagesClient, thread.getId());
661+ } catch (InterruptedException e) {
662+ throw new RuntimeException(e);
663+ } finally {
664+ //cleanup
665+ threadsClient.deleteThread(thread.getId());
666+ administrationClient.deleteAgent(agent.getId());
667+ }
668+ }
669+
670+ // Use "Map.of" if available
671+ @SuppressWarnings("unchecked")
672+ private static <T> Map<String, T> mapOf(Object... inputs) {
673+ Map<String, T> map = new HashMap<>();
674+ for (int i = 0; i < inputs.length; i += 2) {
675+ String key = (String) inputs[i];
676+ T value = (T) inputs[i + 1];
677+ map.put(key, value);
678+ }
679+ return map;
680+ }
681+
682+ // A helper function to print messages from the agent
683+ public static void printRunMessages(MessagesClient messagesClient, String threadId) {
684+
685+ PagedIterable<ThreadMessage> runMessages = messagesClient.listMessages(threadId);
686+ for (ThreadMessage message : runMessages) {
687+ System.out.print(String.format("%1$s - %2$s : ", message.getCreatedAt(), message.getRole()));
688+ for (MessageContent contentItem : message.getContent()) {
689+ if (contentItem instanceof MessageTextContent) {
690+ System.out.print((((MessageTextContent) contentItem).getText().getValue()));
691+ } else if (contentItem instanceof MessageImageFileContent) {
692+ String imageFileId = (((MessageImageFileContent) contentItem).getImageFile().getFileId());
693+ System.out.print("Image from ID: " + imageFileId);
694+ }
695+ System.out.println();
696+ }
697+ }
698+ }
699+
700+ // a helper function to wait until a run has completed running
701+ public static void waitForRunCompletion(String threadId, ThreadRun threadRun, RunsClient runsClient)
702+ throws InterruptedException {
703+
704+ do {
705+ Thread.sleep(500);
706+ threadRun = runsClient.getRun(threadId, threadRun.getId());
707+ }
708+ while (
709+ threadRun.getStatus() == RunStatus.QUEUED
710+ || threadRun.getStatus() == RunStatus.IN_PROGRESS
711+ || threadRun.getStatus() == RunStatus.REQUIRES_ACTION);
712+
713+ if (threadRun.getStatus() == RunStatus.FAILED) {
714+ System.out.println(threadRun.getLastError().getMessage());
715+ }
716+ }
717+ }
718+ ```
719+
720+ :::zone-end
0 commit comments