GitHub Copilot ChatGPT Claude Codex CLI Cursor opencode Skill Text

azure-ai-agents-persistent-java

Azure AI Agents Persistent SDK for Java. Low-level SDK for creating and managing AI agents with threads, messages, runs, and tools. Triggers: "PersistentAgentsClient", "persistent agents java", "agent threads java", "agent runs java", "streaming agents java".

Ciza · 0 points · 16 views 1 listing impressions 0 install-command copies
Virus-scanned Reviewed automatically before listing.

Full trust report

Download microsoft-skills-.github_plugins_azure-sdk-java_skills_azure-ai-agents-persistent-java-e58528d.zip · 7 KB
Part of microsoft/skills — 195 skills

Install

skills CLI npx skills add https://github.com/microsoft/skills/tree/main/.github/plugins/azure-sdk-java/skills/azure-ai-agents-persistent-java
Claude Code claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install microsoft-skills@llmmart
Git git clone https://github.com/microsoft/skills.git

The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole microsoft/skills collection as a plugin from our marketplace. Git is the plain clone.

Skill manifest

Azure AI Agents Persistent SDK for Java

Low-level SDK for creating and managing persistent AI agents with threads, messages, runs, and tools.

Installation

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-ai-agents-persistent</artifactId>
    <version>1.0.0-beta.1</version>
</dependency>

Environment Variables

PROJECT_ENDPOINT=https://<resource>.services.ai.azure.com/api/projects/<project> # Required for project configuration
MODEL_DEPLOYMENT_NAME=gpt-4o-mini # Required for agent model selection
AZURE_TOKEN_CREDENTIALS=prod  # Required only if DefaultAzureCredential is used in production

Authentication

import com.azure.ai.agents.persistent.PersistentAgentsClient;
import com.azure.ai.agents.persistent.PersistentAgentsClientBuilder;
import com.azure.core.credential.TokenCredential;
import com.azure.identity.AzureIdentityEnvVars;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.azure.identity.ManagedIdentityCredentialBuilder;

String endpoint = System.getenv("PROJECT_ENDPOINT");
TokenCredential credential = new DefaultAzureCredentialBuilder()
    .requireEnvVars(AzureIdentityEnvVars.AZURE_TOKEN_CREDENTIALS)
    .build();
// Or use a specific credential directly in production:
// See https://learn.microsoft.com/java/api/overview/azure/identity-readme?view=azure-java-stable#credential-classes
// TokenCredential credential = new ManagedIdentityCredentialBuilder().build();

PersistentAgentsClient client = new PersistentAgentsClientBuilder()
    .endpoint(endpoint)
    .credential(credential)
    .buildClient();

Key Concepts

The Azure AI Agents Persistent SDK provides a low-level API for managing persistent agents that can be reused across sessions.

Client Hierarchy

Client Purpose
PersistentAgentsClient Sync client for agent operations
PersistentAgentsAsyncClient Async client for agent operations

Core Workflow

1. Create Agent

// Create agent with tools
PersistentAgent agent = client.createAgent(
    modelDeploymentName,
    "Math Tutor",
    "You are a personal math tutor."
);

2. Create Thread

PersistentAgentThread thread = client.createThread();

3. Add Message

client.createMessage(
    thread.getId(),
    MessageRole.USER,
    "I need help with equations."
);

4. Run Agent

ThreadRun run = client.createRun(thread.getId(), agent.getId());

// Poll for completion
while (run.getStatus() == RunStatus.QUEUED || run.getStatus() == RunStatus.IN_PROGRESS) {
    Thread.sleep(500);
    run = client.getRun(thread.getId(), run.getId());
}

5. Get Response

PagedIterable<PersistentThreadMessage> messages = client.listMessages(thread.getId());
for (PersistentThreadMessage message : messages) {
    System.out.println(message.getRole() + ": " + message.getContent());
}

6. Cleanup

client.deleteThread(thread.getId());
client.deleteAgent(agent.getId());

Best Practices

  1. Use DefaultAzureCredential for production authentication
  2. Poll with appropriate delays — 500ms recommended between status checks
  3. Clean up resources — Delete threads and agents when done
  4. Handle all run statuses — Check for RequiresAction, Failed, Cancelled
  5. Use async client for better throughput in high-concurrency scenarios

Error Handling

import com.azure.core.exception.HttpResponseException;

try {
    PersistentAgent agent = client.createAgent(modelName, name, instructions);
} catch (HttpResponseException e) {
    System.err.println("Error: " + e.getResponse().getStatusCode() + " - " + e.getMessage());
}

Reference Links

Resource URL
Maven Package https://central.sonatype.com/artifact/com.azure/azure-ai-agents-persistent
GitHub Source https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/ai/azure-ai-agents-persistent
Files (skills)
  • references
    • examples.md 22.2 KB
      # Azure AI Agents Persistent Java SDK - Examples
      
      Comprehensive code examples for the Azure AI Agents Persistent SDK for Java.
      
      ## Table of Contents
      
      - [Maven Dependency](#maven-dependency)
      - [Client Creation](#client-creation)
      - [Agent Operations](#agent-operations)
      - [Thread Operations](#thread-operations)
      - [Message Operations](#message-operations)
      - [Run Operations](#run-operations)
      - [Streaming Responses](#streaming-responses)
      - [Tools Integration](#tools-integration)
      - [File Operations](#file-operations)
      - [Error Handling](#error-handling)
      - [Complete Application Example](#complete-application-example)
      
      ## Maven Dependency
      
      ```xml
      <dependency>
          <groupId>com.azure</groupId>
          <artifactId>azure-ai-agents-persistent</artifactId>
          <version>1.0.0-beta.1</version>
      </dependency>
      
      <!-- For DefaultAzureCredential -->
      <dependency>
          <groupId>com.azure</groupId>
          <artifactId>azure-identity</artifactId>
          <version>1.14.2</version>
      </dependency>
      ```
      
      ## Client Creation
      
      ### With DefaultAzureCredential (Recommended)
      
      ```java
      import com.azure.ai.agents.persistent.PersistentAgentsClient;
      import com.azure.ai.agents.persistent.PersistentAgentsClientBuilder;
      import com.azure.identity.DefaultAzureCredentialBuilder;
      
      String endpoint = System.getenv("PROJECT_ENDPOINT");
      
      PersistentAgentsClient client = new PersistentAgentsClientBuilder()
          .endpoint(endpoint)
          .credential(new DefaultAzureCredentialBuilder().build())
          .buildClient();
      ```
      
      ### Async Client
      
      ```java
      import com.azure.ai.agents.persistent.PersistentAgentsAsyncClient;
      
      PersistentAgentsAsyncClient asyncClient = new PersistentAgentsClientBuilder()
          .endpoint(endpoint)
          .credential(new DefaultAzureCredentialBuilder().build())
          .buildAsyncClient();
      ```
      
      ## Agent Operations
      
      ### Create Agent
      
      ```java
      import com.azure.ai.agents.persistent.models.*;
      
      String modelDeploymentName = System.getenv("MODEL_DEPLOYMENT_NAME");
      
      PersistentAgent agent = client.createAgent(
          modelDeploymentName,
          "Math Tutor",                                    // Name
          "You are a personal math tutor. Help students understand mathematical concepts." // Instructions
      );
      
      System.out.println("Agent created:");
      System.out.println("  ID: " + agent.getId());
      System.out.println("  Name: " + agent.getName());
      System.out.println("  Model: " + agent.getModel());
      ```
      
      ### Create Agent with Configuration
      
      ```java
      CreateAgentOptions options = new CreateAgentOptions(modelDeploymentName)
          .setName("Customer Support Agent")
          .setInstructions("You are a customer support agent. Help users with their questions politely.")
          .setDescription("Handles customer inquiries")
          .setTemperature(0.7)
          .setTopP(0.9);
      
      PersistentAgent agent = client.createAgent(options);
      ```
      
      ### Create Agent with Tools
      
      ```java
      import java.util.Arrays;
      import java.util.Map;
      
      // Code Interpreter tool
      ToolDefinition codeInterpreter = new CodeInterpreterToolDefinition();
      
      // Function tool
      FunctionDefinition functionDef = new FunctionDefinition("get_weather")
          .setDescription("Get current weather for a location")
          .setParameters(BinaryData.fromObject(Map.of(
              "type", "object",
              "properties", Map.of(
                  "location", Map.of(
                      "type", "string",
                      "description", "City name"
                  )
              ),
              "required", new String[]{"location"}
          )));
      
      ToolDefinition functionTool = new FunctionToolDefinition(functionDef);
      
      CreateAgentOptions options = new CreateAgentOptions(modelDeploymentName)
          .setName("Assistant with Tools")
          .setInstructions("You can run code and check weather.")
          .setTools(Arrays.asList(codeInterpreter, functionTool));
      
      PersistentAgent agent = client.createAgent(options);
      ```
      
      ### Get Agent
      
      ```java
      PersistentAgent agent = client.getAgent(agentId);
      
      System.out.println("Agent: " + agent.getName());
      System.out.println("Instructions: " + agent.getInstructions());
      System.out.println("Tools: " + agent.getTools().size());
      ```
      
      ### List Agents
      
      ```java
      import com.azure.core.http.rest.PagedIterable;
      
      PagedIterable<PersistentAgent> agents = client.listAgents();
      
      System.out.println("=== Available Agents ===");
      for (PersistentAgent a : agents) {
          System.out.printf("%s: %s%n", a.getId(), a.getName());
      }
      ```
      
      ### Update Agent
      
      ```java
      UpdateAgentOptions updateOptions = new UpdateAgentOptions()
          .setName("Updated Agent Name")
          .setInstructions("Updated instructions for the agent.");
      
      PersistentAgent updated = client.updateAgent(agentId, updateOptions);
      System.out.println("Agent updated: " + updated.getName());
      ```
      
      ### Delete Agent
      
      ```java
      client.deleteAgent(agentId);
      System.out.println("Agent deleted: " + agentId);
      ```
      
      ## Thread Operations
      
      ### Create Thread
      
      ```java
      PersistentAgentThread thread = client.createThread();
      
      System.out.println("Thread created: " + thread.getId());
      ```
      
      ### Create Thread with Initial Messages
      
      ```java
      import java.util.Arrays;
      
      ThreadMessageOptions initialMessage = new ThreadMessageOptions(
          MessageRole.USER,
          "Hello, I need help with calculus."
      );
      
      CreateThreadOptions threadOptions = new CreateThreadOptions()
          .setMessages(Arrays.asList(initialMessage));
      
      PersistentAgentThread thread = client.createThread(threadOptions);
      ```
      
      ### Create Thread with Metadata
      
      ```java
      import java.util.Map;
      
      CreateThreadOptions options = new CreateThreadOptions()
          .setMetadata(Map.of(
              "user_id", "user123",
              "session_type", "support"
          ));
      
      PersistentAgentThread thread = client.createThread(options);
      ```
      
      ### Get Thread
      
      ```java
      PersistentAgentThread thread = client.getThread(threadId);
      
      System.out.println("Thread: " + thread.getId());
      System.out.println("Created: " + thread.getCreatedAt());
      System.out.println("Metadata: " + thread.getMetadata());
      ```
      
      ### Update Thread
      
      ```java
      UpdateThreadOptions updateOptions = new UpdateThreadOptions()
          .setMetadata(Map.of("status", "resolved"));
      
      PersistentAgentThread updated = client.updateThread(threadId, updateOptions);
      ```
      
      ### Delete Thread
      
      ```java
      client.deleteThread(threadId);
      System.out.println("Thread deleted: " + threadId);
      ```
      
      ## Message Operations
      
      ### Create Message
      
      ```java
      PersistentThreadMessage message = client.createMessage(
          threadId,
          MessageRole.USER,
          "What is the derivative of x squared?"
      );
      
      System.out.println("Message created: " + message.getId());
      ```
      
      ### Create Message with Attachments
      
      ```java
      // First upload a file
      AgentFile file = client.uploadFile(
          BinaryData.fromFile(new File("data.csv").toPath()),
          AgentFilePurpose.AGENTS
      );
      
      MessageAttachment attachment = new MessageAttachment(file.getId())
          .setTools(Arrays.asList(new CodeInterpreterToolDefinition()));
      
      CreateMessageOptions options = new CreateMessageOptions(MessageRole.USER, "Analyze this data")
          .setAttachments(Arrays.asList(attachment));
      
      PersistentThreadMessage message = client.createMessage(threadId, options);
      ```
      
      ### List Messages
      
      ```java
      PagedIterable<PersistentThreadMessage> messages = client.listMessages(threadId);
      
      System.out.println("=== Conversation ===");
      for (PersistentThreadMessage msg : messages) {
          String role = msg.getRole().toString();
          String content = extractTextContent(msg);
          System.out.printf("[%s]: %s%n", role, content);
      }
      
      private String extractTextContent(PersistentThreadMessage message) {
          StringBuilder text = new StringBuilder();
          for (MessageContent content : message.getContent()) {
              if (content instanceof MessageTextContent) {
                  text.append(((MessageTextContent) content).getText().getValue());
              }
          }
          return text.toString();
      }
      ```
      
      ### Get Message
      
      ```java
      PersistentThreadMessage message = client.getMessage(threadId, messageId);
      
      System.out.println("Message role: " + message.getRole());
      System.out.println("Created: " + message.getCreatedAt());
      ```
      
      ## Run Operations
      
      ### Create Run
      
      ```java
      ThreadRun run = client.createRun(threadId, agentId);
      
      System.out.println("Run created: " + run.getId());
      System.out.println("Status: " + run.getStatus());
      ```
      
      ### Create Run with Additional Instructions
      
      ```java
      CreateRunOptions options = new CreateRunOptions(agentId)
          .setAdditionalInstructions("Please be very detailed in your response.")
          .setTemperature(0.5);
      
      ThreadRun run = client.createRun(threadId, options);
      ```
      
      ### Poll for Run Completion
      
      ```java
      ThreadRun run = client.createRun(threadId, agentId);
      
      // Poll until completion
      while (run.getStatus() == RunStatus.QUEUED || run.getStatus() == RunStatus.IN_PROGRESS) {
          Thread.sleep(500);  // Wait 500ms between polls
          run = client.getRun(threadId, run.getId());
          System.out.println("Status: " + run.getStatus());
      }
      
      // Check final status
      switch (run.getStatus()) {
          case COMPLETED:
              System.out.println("Run completed successfully!");
              break;
          case FAILED:
              System.err.println("Run failed: " + run.getLastError().getMessage());
              break;
          case CANCELLED:
              System.out.println("Run was cancelled");
              break;
          case EXPIRED:
              System.out.println("Run expired");
              break;
          case REQUIRES_ACTION:
              System.out.println("Run requires action (tool calls)");
              handleRequiredActions(run);
              break;
      }
      ```
      
      ### Handle Tool Calls
      
      ```java
      private void handleRequiredActions(ThreadRun run) {
          RequiredAction requiredAction = run.getRequiredAction();
          
          if (requiredAction instanceof SubmitToolOutputsAction) {
              SubmitToolOutputsAction submitAction = (SubmitToolOutputsAction) requiredAction;
              List<RequiredToolCall> toolCalls = submitAction.getSubmitToolOutputs().getToolCalls();
              
              List<ToolOutput> outputs = new ArrayList<>();
              
              for (RequiredToolCall toolCall : toolCalls) {
                  if (toolCall instanceof RequiredFunctionToolCall) {
                      RequiredFunctionToolCall funcCall = (RequiredFunctionToolCall) toolCall;
                      
                      String functionName = funcCall.getFunction().getName();
                      String arguments = funcCall.getFunction().getArguments();
                      
                      // Execute function
                      String result = executeFunction(functionName, arguments);
                      
                      outputs.add(new ToolOutput(toolCall.getId(), result));
                  }
              }
              
              // Submit tool outputs
              run = client.submitToolOutputsToRun(threadId, run.getId(), outputs);
          }
      }
      
      private String executeFunction(String name, String arguments) {
          if ("get_weather".equals(name)) {
              // Parse arguments and call weather API
              return "{\"temperature\": 72, \"condition\": \"sunny\"}";
          }
          return "{\"error\": \"Unknown function\"}";
      }
      ```
      
      ### Cancel Run
      
      ```java
      ThreadRun cancelled = client.cancelRun(threadId, runId);
      System.out.println("Run cancelled: " + cancelled.getStatus());
      ```
      
      ### List Runs
      
      ```java
      PagedIterable<ThreadRun> runs = client.listRuns(threadId);
      
      for (ThreadRun r : runs) {
          System.out.printf("Run %s: %s%n", r.getId(), r.getStatus());
      }
      ```
      
      ### List Run Steps
      
      ```java
      PagedIterable<RunStep> steps = client.listRunSteps(threadId, runId);
      
      System.out.println("=== Run Steps ===");
      for (RunStep step : steps) {
          System.out.printf("Step %s: %s - %s%n",
              step.getId(),
              step.getType(),
              step.getStatus());
      }
      ```
      
      ## Streaming Responses
      
      ### Stream Run with Event Handler
      
      ```java
      import com.azure.ai.agents.persistent.models.streaming.*;
      
      client.createRunStream(threadId, agentId)
          .forEach(event -> {
              if (event instanceof ThreadRunCreatedEvent) {
                  System.out.println("Run started");
              } else if (event instanceof ThreadMessageDeltaEvent) {
                  ThreadMessageDeltaEvent delta = (ThreadMessageDeltaEvent) event;
                  for (MessageDeltaContent content : delta.getDelta().getContent()) {
                      if (content instanceof MessageDeltaTextContent) {
                          String text = ((MessageDeltaTextContent) content).getText().getValue();
                          System.out.print(text);
                      }
                  }
              } else if (event instanceof ThreadRunCompletedEvent) {
                  System.out.println("\nRun completed");
              }
          });
      ```
      
      ### Stream with Async Client
      
      ```java
      asyncClient.createRunStream(threadId, agentId)
          .subscribe(
              event -> handleStreamEvent(event),
              error -> System.err.println("Error: " + error.getMessage()),
              () -> System.out.println("Stream completed")
          );
      ```
      
      ## Tools Integration
      
      ### Code Interpreter
      
      ```java
      // Create agent with code interpreter
      CreateAgentOptions options = new CreateAgentOptions(modelDeploymentName)
          .setName("Code Assistant")
          .setInstructions("You can write and run Python code to help users.")
          .setTools(Arrays.asList(new CodeInterpreterToolDefinition()));
      
      PersistentAgent agent = client.createAgent(options);
      
      // Create thread and message
      PersistentAgentThread thread = client.createThread();
      client.createMessage(thread.getId(), MessageRole.USER, 
          "Calculate the first 10 Fibonacci numbers");
      
      // Run and wait
      ThreadRun run = client.createRun(thread.getId(), agent.getId());
      while (run.getStatus() == RunStatus.QUEUED || run.getStatus() == RunStatus.IN_PROGRESS) {
          Thread.sleep(500);
          run = client.getRun(thread.getId(), run.getId());
      }
      
      // Get response with code output
      PagedIterable<PersistentThreadMessage> messages = client.listMessages(thread.getId());
      for (PersistentThreadMessage msg : messages) {
          if (msg.getRole() == MessageRole.ASSISTANT) {
              for (MessageContent content : msg.getContent()) {
                  if (content instanceof MessageTextContent) {
                      System.out.println(((MessageTextContent) content).getText().getValue());
                  }
              }
          }
      }
      ```
      
      ### File Search
      
      ```java
      // Create vector store
      VectorStore vectorStore = client.createVectorStore(
          new CreateVectorStoreOptions().setName("Knowledge Base")
      );
      
      // Upload files to vector store
      client.uploadFileToVectorStore(vectorStore.getId(), 
          BinaryData.fromFile(new File("document.pdf").toPath()));
      
      // Create agent with file search
      CreateAgentOptions options = new CreateAgentOptions(modelDeploymentName)
          .setName("Research Assistant")
          .setInstructions("Search the uploaded documents to answer questions.")
          .setTools(Arrays.asList(new FileSearchToolDefinition()))
          .setToolResources(new ToolResources()
              .setFileSearch(new FileSearchToolResource()
                  .setVectorStoreIds(Arrays.asList(vectorStore.getId()))));
      
      PersistentAgent agent = client.createAgent(options);
      ```
      
      ## File Operations
      
      ### Upload File
      
      ```java
      import java.io.File;
      
      File file = new File("data.csv");
      AgentFile uploadedFile = client.uploadFile(
          BinaryData.fromFile(file.toPath()),
          AgentFilePurpose.AGENTS
      );
      
      System.out.println("File uploaded: " + uploadedFile.getId());
      System.out.println("Filename: " + uploadedFile.getFilename());
      System.out.println("Size: " + uploadedFile.getBytes() + " bytes");
      ```
      
      ### List Files
      
      ```java
      PagedIterable<AgentFile> files = client.listFiles();
      
      for (AgentFile file : files) {
          System.out.printf("%s: %s (%d bytes)%n",
              file.getId(),
              file.getFilename(),
              file.getBytes());
      }
      ```
      
      ### Delete File
      
      ```java
      client.deleteFile(fileId);
      System.out.println("File deleted: " + fileId);
      ```
      
      ## Error Handling
      
      ```java
      import com.azure.core.exception.HttpResponseException;
      
      try {
          PersistentAgent agent = client.createAgent(
              modelDeploymentName,
              "Test Agent",
              "Test instructions"
          );
      } catch (HttpResponseException e) {
          int statusCode = e.getResponse().getStatusCode();
          
          System.err.println("HTTP Status: " + statusCode);
          System.err.println("Error: " + e.getMessage());
          
          switch (statusCode) {
              case 400:
                  System.err.println("Bad request - check parameters");
                  break;
              case 401:
                  System.err.println("Unauthorized - check credentials");
                  break;
              case 404:
                  System.err.println("Resource not found");
                  break;
              case 429:
                  System.err.println("Rate limited - retry with backoff");
                  break;
              default:
                  System.err.println("Unexpected error");
          }
      } catch (Exception e) {
          System.err.println("Unexpected error: " + e.getMessage());
      }
      ```
      
      ## Complete Application Example
      
      ```java
      import com.azure.ai.agents.persistent.PersistentAgentsClient;
      import com.azure.ai.agents.persistent.PersistentAgentsClientBuilder;
      import com.azure.ai.agents.persistent.models.*;
      import com.azure.core.http.rest.PagedIterable;
      import com.azure.identity.DefaultAzureCredentialBuilder;
      
      import java.util.*;
      
      public class MathTutorBot {
          
          private final PersistentAgentsClient client;
          private final String modelDeploymentName;
          private PersistentAgent agent;
          
          public MathTutorBot() {
              this.client = new PersistentAgentsClientBuilder()
                  .endpoint(System.getenv("PROJECT_ENDPOINT"))
                  .credential(new DefaultAzureCredentialBuilder().build())
                  .buildClient();
              this.modelDeploymentName = System.getenv("MODEL_DEPLOYMENT_NAME");
          }
          
          public void initialize() {
              // Create agent with code interpreter for math calculations
              CreateAgentOptions options = new CreateAgentOptions(modelDeploymentName)
                  .setName("Math Tutor")
                  .setInstructions("""
                      You are a friendly math tutor. Help students understand mathematical concepts.
                      - Explain concepts clearly step by step
                      - Use Python code to demonstrate calculations
                      - Encourage students and be patient
                      - Ask clarifying questions if needed
                      """)
                  .setTools(Arrays.asList(new CodeInterpreterToolDefinition()))
                  .setTemperature(0.7);
              
              this.agent = client.createAgent(options);
              System.out.println("Math Tutor initialized: " + agent.getId());
          }
          
          public String chat(String threadId, String userMessage) {
              // Create message
              client.createMessage(threadId, MessageRole.USER, userMessage);
              
              // Create and wait for run
              ThreadRun run = client.createRun(threadId, agent.getId());
              run = waitForCompletion(threadId, run.getId());
              
              if (run.getStatus() != RunStatus.COMPLETED) {
                  return "I encountered an error. Please try again.";
              }
              
              // Get assistant response
              return getLatestAssistantMessage(threadId);
          }
          
          private ThreadRun waitForCompletion(String threadId, String runId) {
              ThreadRun run;
              do {
                  try {
                      Thread.sleep(500);
                  } catch (InterruptedException e) {
                      Thread.currentThread().interrupt();
                  }
                  run = client.getRun(threadId, runId);
              } while (run.getStatus() == RunStatus.QUEUED || run.getStatus() == RunStatus.IN_PROGRESS);
              
              return run;
          }
          
          private String getLatestAssistantMessage(String threadId) {
              PagedIterable<PersistentThreadMessage> messages = client.listMessages(threadId);
              
              for (PersistentThreadMessage msg : messages) {
                  if (msg.getRole() == MessageRole.ASSISTANT) {
                      StringBuilder response = new StringBuilder();
                      for (MessageContent content : msg.getContent()) {
                          if (content instanceof MessageTextContent) {
                              response.append(((MessageTextContent) content).getText().getValue());
                          }
                      }
                      return response.toString();
                  }
              }
              
              return "No response available.";
          }
          
          public String createConversation() {
              PersistentAgentThread thread = client.createThread();
              return thread.getId();
          }
          
          public void cleanup(String threadId) {
              try {
                  client.deleteThread(threadId);
              } catch (Exception e) {
                  System.err.println("Failed to delete thread: " + e.getMessage());
              }
          }
          
          public void shutdown() {
              if (agent != null) {
                  try {
                      client.deleteAgent(agent.getId());
                      System.out.println("Agent cleaned up");
                  } catch (Exception e) {
                      System.err.println("Failed to delete agent: " + e.getMessage());
                  }
              }
          }
          
          public static void main(String[] args) {
              MathTutorBot bot = new MathTutorBot();
              
              try {
                  // Initialize
                  bot.initialize();
                  
                  // Create conversation
                  String threadId = bot.createConversation();
                  System.out.println("Conversation started: " + threadId);
                  
                  // Chat
                  Scanner scanner = new Scanner(System.in);
                  System.out.println("\nMath Tutor ready! Type 'quit' to exit.\n");
                  
                  while (true) {
                      System.out.print("You: ");
                      String input = scanner.nextLine().trim();
                      
                      if ("quit".equalsIgnoreCase(input)) {
                          break;
                      }
                      
                      if (input.isEmpty()) {
                          continue;
                      }
                      
                      String response = bot.chat(threadId, input);
                      System.out.println("\nTutor: " + response + "\n");
                  }
                  
                  // Cleanup
                  bot.cleanup(threadId);
                  
              } finally {
                  bot.shutdown();
              }
          }
      }
      ```
      
      ## Environment Variables
      
      ```bash
      PROJECT_ENDPOINT=https://<resource>.services.ai.azure.com/api/projects/<project>
      MODEL_DEPLOYMENT_NAME=gpt-4o-mini
      
      # For DefaultAzureCredential
      AZURE_CLIENT_ID=<service-principal-client-id>
      AZURE_CLIENT_SECRET=<service-principal-secret>
      AZURE_TENANT_ID=<tenant-id>
      ```
      
      ## Best Practices
      
      1. **Use DefaultAzureCredential** — Prefer managed identity over API keys in production
      2. **Poll with appropriate delays** — 500ms between status checks is recommended
      3. **Clean up resources** — Delete threads and agents when no longer needed
      4. **Handle all run statuses** — Check for `REQUIRES_ACTION`, `FAILED`, `CANCELLED`, `EXPIRED`
      5. **Use async client** — For better throughput in high-concurrency scenarios
      6. **Implement retry logic** — Handle transient errors with exponential backoff
      7. **Stream for long responses** — Use streaming for better user experience
      8. **Store agent IDs** — Reuse agents across sessions instead of recreating
      
  • SKILL.md 4.3 KB
    ---
    name: azure-ai-agents-persistent-java
    description: |
      Azure AI Agents Persistent SDK for Java. Low-level SDK for creating and managing AI agents with threads, messages, runs, and tools.
      Triggers: "PersistentAgentsClient", "persistent agents java", "agent threads java", "agent runs java", "streaming agents java".
    license: MIT
    metadata:
      author: Microsoft
      version: "1.0.0"
      package: com.azure:azure-ai-agents-persistent
    ---
    
    # Azure AI Agents Persistent SDK for Java
    
    Low-level SDK for creating and managing persistent AI agents with threads, messages, runs, and tools.
    
    ## Installation
    
    ```xml
    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-ai-agents-persistent</artifactId>
        <version>1.0.0-beta.1</version>
    </dependency>
    ```
    
    ## Environment Variables
    
    ```bash
    PROJECT_ENDPOINT=https://<resource>.services.ai.azure.com/api/projects/<project> # Required for project configuration
    MODEL_DEPLOYMENT_NAME=gpt-4o-mini # Required for agent model selection
    AZURE_TOKEN_CREDENTIALS=prod  # Required only if DefaultAzureCredential is used in production
    ```
    
    ## Authentication
    
    ```java
    import com.azure.ai.agents.persistent.PersistentAgentsClient;
    import com.azure.ai.agents.persistent.PersistentAgentsClientBuilder;
    import com.azure.core.credential.TokenCredential;
    import com.azure.identity.AzureIdentityEnvVars;
    import com.azure.identity.DefaultAzureCredentialBuilder;
    import com.azure.identity.ManagedIdentityCredentialBuilder;
    
    String endpoint = System.getenv("PROJECT_ENDPOINT");
    TokenCredential credential = new DefaultAzureCredentialBuilder()
        .requireEnvVars(AzureIdentityEnvVars.AZURE_TOKEN_CREDENTIALS)
        .build();
    // Or use a specific credential directly in production:
    // See https://learn.microsoft.com/java/api/overview/azure/identity-readme?view=azure-java-stable#credential-classes
    // TokenCredential credential = new ManagedIdentityCredentialBuilder().build();
    
    PersistentAgentsClient client = new PersistentAgentsClientBuilder()
        .endpoint(endpoint)
        .credential(credential)
        .buildClient();
    ```
    
    ## Key Concepts
    
    The Azure AI Agents Persistent SDK provides a low-level API for managing persistent agents that can be reused across sessions.
    
    ### Client Hierarchy
    
    | Client | Purpose |
    |--------|---------|
    | `PersistentAgentsClient` | Sync client for agent operations |
    | `PersistentAgentsAsyncClient` | Async client for agent operations |
    
    ## Core Workflow
    
    ### 1. Create Agent
    
    ```java
    // Create agent with tools
    PersistentAgent agent = client.createAgent(
        modelDeploymentName,
        "Math Tutor",
        "You are a personal math tutor."
    );
    ```
    
    ### 2. Create Thread
    
    ```java
    PersistentAgentThread thread = client.createThread();
    ```
    
    ### 3. Add Message
    
    ```java
    client.createMessage(
        thread.getId(),
        MessageRole.USER,
        "I need help with equations."
    );
    ```
    
    ### 4. Run Agent
    
    ```java
    ThreadRun run = client.createRun(thread.getId(), agent.getId());
    
    // Poll for completion
    while (run.getStatus() == RunStatus.QUEUED || run.getStatus() == RunStatus.IN_PROGRESS) {
        Thread.sleep(500);
        run = client.getRun(thread.getId(), run.getId());
    }
    ```
    
    ### 5. Get Response
    
    ```java
    PagedIterable<PersistentThreadMessage> messages = client.listMessages(thread.getId());
    for (PersistentThreadMessage message : messages) {
        System.out.println(message.getRole() + ": " + message.getContent());
    }
    ```
    
    ### 6. Cleanup
    
    ```java
    client.deleteThread(thread.getId());
    client.deleteAgent(agent.getId());
    ```
    
    ## Best Practices
    
    1. **Use DefaultAzureCredential** for production authentication
    2. **Poll with appropriate delays** — 500ms recommended between status checks
    3. **Clean up resources** — Delete threads and agents when done
    4. **Handle all run statuses** — Check for RequiresAction, Failed, Cancelled
    5. **Use async client** for better throughput in high-concurrency scenarios
    
    ## Error Handling
    
    ```java
    import com.azure.core.exception.HttpResponseException;
    
    try {
        PersistentAgent agent = client.createAgent(modelName, name, instructions);
    } catch (HttpResponseException e) {
        System.err.println("Error: " + e.getResponse().getStatusCode() + " - " + e.getMessage());
    }
    ```
    
    ## Reference Links
    
    | Resource | URL |
    |----------|-----|
    | Maven Package | https://central.sonatype.com/artifact/com.azure/azure-ai-agents-persistent |
    | GitHub Source | https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/ai/azure-ai-agents-persistent |
    

Comments (0)

Sign in to join the conversation.

No comments yet.

Reviews (0)

No reviews yet.

Related