Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Build LLM-powered apps with the Anthropic Claude API or SDK across Python, TypeScript, Java, Go, Ruby, C#, and PHP.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
java/managed-agents/README.md
1# Managed Agents — Java23> **Bindings not shown here:** This README covers the most common managed-agents flows for Java. If you need a class, method, namespace, field, or behavior that isn't shown, WebFetch the Java SDK repo **or the relevant docs page** from `shared/live-sources.md` rather than guess. Do not extrapolate from cURL shapes or another language's SDK.45> **Agents are persistent — create once, reference by ID.** Store the agent ID returned by `client.beta().agents().create` and pass it to every subsequent `client.beta().sessions().create`; do not call `agents().create` in the request path. The Anthropic CLI is one convenient way to create agents and environments from version-controlled YAML — its URL is in `shared/live-sources.md`. The examples below show in-code creation for completeness; in production the create call belongs in setup, not in the request path.67## Installation89```xml10<dependency>11<groupId>com.anthropic</groupId>12<artifactId>anthropic-java</artifactId>13</dependency>14```1516## Client Initialization1718```java19import com.anthropic.client.okhttp.AnthropicOkHttpClient;2021// Default (uses ANTHROPIC_API_KEY env var)22var client = AnthropicOkHttpClient.fromEnv();23```2425---2627## Create an Environment2829```java30import com.anthropic.models.beta.environments.BetaCloudConfigParams;31import com.anthropic.models.beta.environments.EnvironmentCreateParams;32import com.anthropic.models.beta.environments.UnrestrictedNetwork;3334var environment = client.beta().environments().create(EnvironmentCreateParams.builder()35.name("my-dev-env")36.config(BetaCloudConfigParams.builder()37.networking(UnrestrictedNetwork.builder().build())38.build())39.build());40System.out.println("Environment ID: " + environment.id()); // env_...41```4243---4445## Create an Agent (required first step)4647> ⚠️ **There is no inline agent config.** Model, system, and tools live on the agent object, not the session. Always start with `client.beta().agents().create()` — the session takes either `.agent(agent.id())` or the typed `BetaManagedAgentsAgentParams.builder()...build()`.4849### Minimal5051```java52import com.anthropic.models.beta.agents.AgentCreateParams;53import com.anthropic.models.beta.agents.BetaManagedAgentsAgentToolset20260401Params;54import com.anthropic.models.beta.sessions.BetaManagedAgentsAgentParams;55import com.anthropic.models.beta.sessions.SessionCreateParams;5657// 1. Create the agent (reusable, versioned)58var agent = client.beta().agents().create(AgentCreateParams.builder()59.name("Coding Assistant")60.model("claude-opus-4-7")61.system("You are a helpful coding assistant.")62.addTool(BetaManagedAgentsAgentToolset20260401Params.builder()63.type(BetaManagedAgentsAgentToolset20260401Params.Type.AGENT_TOOLSET_20260401)64.build())65.build());6667// 2. Start a session68var session = client.beta().sessions().create(SessionCreateParams.builder()69.agent(BetaManagedAgentsAgentParams.builder()70.type(BetaManagedAgentsAgentParams.Type.AGENT)71.id(agent.id())72.version(agent.version())73.build())74.environmentId(environment.id())75.title("Quickstart session")76.build());77System.out.println("Session ID: " + session.id());78```7980### Updating an Agent8182Updates create new versions; the agent object is immutable per version.8384```java85import com.anthropic.models.beta.agents.AgentUpdateParams;8687var updatedAgent = client.beta().agents().update(agent.id(), AgentUpdateParams.builder()88.version(agent.version())89.system("You are a helpful coding agent. Always write tests.")90.build());91System.out.println("New version: " + updatedAgent.version());9293// List all versions94for (var version : client.beta().agents().versions().list(agent.id()).autoPager()) {95System.out.println("Version " + version.version() + ": " + version.updatedAt());96}9798// Archive the agent99var archived = client.beta().agents().archive(agent.id());100System.out.println("Archived at: " + archived.archivedAt().orElseThrow());101```102103---104105## Send a User Message106107```java108import com.anthropic.models.beta.sessions.events.BetaManagedAgentsUserMessageEventParams;109import com.anthropic.models.beta.sessions.events.EventSendParams;110111client.beta().sessions().events().send(session.id(), EventSendParams.builder()112.addEvent(BetaManagedAgentsUserMessageEventParams.builder()113.type(BetaManagedAgentsUserMessageEventParams.Type.USER_MESSAGE)114.addTextContent("Review the auth module")115.build())116.build());117```118119> 💡 **Stream-first:** Open the stream *before* (or concurrently with) sending the message. The stream only delivers events that occur after it opens — stream-after-send means early events arrive buffered in one batch. See [Steering Patterns](../../shared/managed-agents-events.md#steering-patterns).120121---122123## Stream Events (SSE)124125```java126import com.anthropic.models.beta.sessions.events.StreamEvents;127128// Open the stream first, then send the user message129try (var stream = client.beta().sessions().events().streamStreaming(session.id())) {130client.beta().sessions().events().send(session.id(), EventSendParams.builder()131.addEvent(BetaManagedAgentsUserMessageEventParams.builder()132.type(BetaManagedAgentsUserMessageEventParams.Type.USER_MESSAGE)133.addTextContent("Summarize the repo README")134.build())135.build());136137for (var event : (Iterable<StreamEvents>) stream.stream()::iterator) {138if (event.isAgentMessage()) {139event.asAgentMessage().content().forEach(block -> System.out.print(block.text()));140} else if (event.isAgentToolUse()) {141System.out.println("\n[Using tool: " + event.asAgentToolUse().name() + "]");142} else if (event.isSessionStatusIdle()) {143break;144} else if (event.isSessionError()) {145System.out.println("\n[Error]");146break;147}148}149}150```151152### Reconnecting and Tailing153154When reconnecting mid-session, list past events first to dedupe, then tail live events. The cross-variant `id` field is read from the raw `_json()` value:155156```java157import com.anthropic.core.JsonValue;158import java.util.HashSet;159import java.util.Map;160import java.util.Optional;161162try (var stream = client.beta().sessions().events().streamStreaming(session.id())) {163// Stream is open and buffering. List history before tailing live.164var seenEventIds = new HashSet<String>();165for (var past : client.beta().sessions().events().list(session.id()).autoPager()) {166Optional<Map<String, JsonValue>> obj = past._json().orElseThrow().asObject();167seenEventIds.add(obj.orElseThrow().get("id").asStringOrThrow());168}169170// Tail live events, skipping anything already seen171for (var event : (Iterable<StreamEvents>) stream.stream()::iterator) {172Optional<Map<String, JsonValue>> obj = event._json().orElseThrow().asObject();173if (!seenEventIds.add(obj.orElseThrow().get("id").asStringOrThrow())) continue;174if (event.isAgentMessage()) {175event.asAgentMessage().content().forEach(block -> System.out.print(block.text()));176} else if (event.isSessionStatusIdle()) {177break;178}179}180}181```182183---184185## Provide Custom Tool Result186187> ℹ️ The Java managed-agents bindings for `user.custom_tool_result` are not yet documented in this skill or in the apps source examples. Refer to `shared/managed-agents-events.md` for the wire format and the `anthropic-java` repository for the corresponding params types.188189---190191## Poll Events192193```java194for (var event : client.beta().sessions().events().list(session.id()).autoPager()) {195System.out.println(event.type() + ": " + event);196}197```198199---200201## Upload a File202203```java204import com.anthropic.models.beta.files.FileUploadParams;205import com.anthropic.models.beta.sessions.BetaManagedAgentsFileResourceParams;206import java.nio.file.Path;207208var dataCsv = Path.of("data.csv");209210var file = client.beta().files().upload(FileUploadParams.builder()211.file(dataCsv)212.build());213System.out.println("File ID: " + file.id());214215// Mount in a session216var session = client.beta().sessions().create(SessionCreateParams.builder()217.agent(agent.id())218.environmentId(environment.id())219.addResource(BetaManagedAgentsFileResourceParams.builder()220.type(BetaManagedAgentsFileResourceParams.Type.FILE)221.fileId(file.id())222.mountPath("/workspace/data.csv")223.build())224.build());225```226227### Add and Manage Resources on an Existing Session228229```java230import com.anthropic.models.beta.sessions.resources.ResourceAddParams;231import com.anthropic.models.beta.sessions.resources.ResourceDeleteParams;232233// Attach an additional file to an open session234var resource = client.beta().sessions().resources().add(session.id(), ResourceAddParams.builder()235.betaManagedAgentsFileResourceParams(BetaManagedAgentsFileResourceParams.builder()236.type(BetaManagedAgentsFileResourceParams.Type.FILE)237.fileId(file.id())238.build())239.build());240System.out.println(resource.id()); // "sesrsc_01ABC..."241242// List resources on the session — entries are a discriminated union243var listed = client.beta().sessions().resources().list(session.id());244for (var entry : listed.data()) {245if (entry.isFile()) {246var fileResource = entry.asFile();247System.out.println(fileResource.id() + " " + fileResource.type());248} else if (entry.isGitHubRepository()) {249var repoResource = entry.asGitHubRepository();250System.out.println(repoResource.id() + " " + repoResource.type());251}252}253254// Detach a resource255client.beta().sessions().resources().delete(resource.id(), ResourceDeleteParams.builder()256.sessionId(session.id())257.build());258```259260---261262## List and Download Session Files263264> ℹ️ Listing and downloading files an agent wrote during a session is not yet documented for Java in this skill or in the apps source examples. See `shared/managed-agents-events.md` and the `anthropic-java` repository for the file list/download bindings.265266---267268## Session Management269270```java271// List environments272var environments = client.beta().environments().list();273274// Retrieve a specific environment275var env = client.beta().environments().retrieve(environment.id());276277// Archive an environment (read-only, existing sessions continue)278client.beta().environments().archive(environment.id());279280// Delete an environment (only if no sessions reference it)281client.beta().environments().delete(environment.id());282283// Delete a session284client.beta().sessions().delete(session.id());285```286287---288289## MCP Server Integration290291```java292import com.anthropic.models.beta.agents.BetaManagedAgentsMcpToolsetParams;293import com.anthropic.models.beta.agents.BetaManagedAgentsUrlmcpServerParams;294295// Agent declares MCP server (no auth here — auth goes in a vault)296var agent = client.beta().agents().create(AgentCreateParams.builder()297.name("GitHub Assistant")298.model("claude-opus-4-7")299.addMcpServer(BetaManagedAgentsUrlmcpServerParams.builder()300.type(BetaManagedAgentsUrlmcpServerParams.Type.URL)301.name("github")302.url("https://api.githubcopilot.com/mcp/")303.build())304.addTool(BetaManagedAgentsAgentToolset20260401Params.builder()305.type(BetaManagedAgentsAgentToolset20260401Params.Type.AGENT_TOOLSET_20260401)306.build())307.addTool(BetaManagedAgentsMcpToolsetParams.builder()308.type(BetaManagedAgentsMcpToolsetParams.Type.MCP_TOOLSET)309.mcpServerName("github")310.build())311.build());312313// Session attaches vault(s) containing credentials for those MCP server URLs314var session = client.beta().sessions().create(SessionCreateParams.builder()315.agent(BetaManagedAgentsAgentParams.builder()316.type(BetaManagedAgentsAgentParams.Type.AGENT)317.id(agent.id())318.version(agent.version())319.build())320.environmentId(environment.id())321.addVaultId(vault.id())322.build());323```324325See `shared/managed-agents-tools.md` §Vaults for creating vaults and adding credentials.326327---328329## Vaults330331```java332import com.anthropic.core.JsonValue;333import com.anthropic.models.beta.vaults.VaultCreateParams;334import com.anthropic.models.beta.vaults.credentials.BetaManagedAgentsMcpOAuthCreateParams;335import com.anthropic.models.beta.vaults.credentials.BetaManagedAgentsMcpOAuthRefreshParams;336import com.anthropic.models.beta.vaults.credentials.BetaManagedAgentsMcpOAuthRefreshUpdateParams;337import com.anthropic.models.beta.vaults.credentials.BetaManagedAgentsMcpOAuthUpdateParams;338import com.anthropic.models.beta.vaults.credentials.CredentialCreateParams;339import com.anthropic.models.beta.vaults.credentials.CredentialUpdateParams;340import java.time.OffsetDateTime;341342// Create a vault343var vault = client.beta().vaults().create(VaultCreateParams.builder()344.displayName("Alice")345.metadata(VaultCreateParams.Metadata.builder()346.putAdditionalProperty("external_user_id", JsonValue.from("usr_abc123"))347.build())348.build());349System.out.println(vault.id()); // "vlt_01ABC..."350351// Add an OAuth credential352var credential = client.beta().vaults().credentials().create(vault.id(),353CredentialCreateParams.builder()354.displayName("Alice's Slack")355.auth(BetaManagedAgentsMcpOAuthCreateParams.builder()356.type(BetaManagedAgentsMcpOAuthCreateParams.Type.MCP_OAUTH)357.mcpServerUrl("https://mcp.slack.com/mcp")358.accessToken("xoxp-...")359.expiresAt(OffsetDateTime.parse("2026-04-15T00:00:00Z"))360.refresh(BetaManagedAgentsMcpOAuthRefreshParams.builder()361.tokenEndpoint("https://slack.com/api/oauth.v2.access")362.clientId("1234567890.0987654321")363.scope("channels:read chat:write")364.refreshToken("xoxe-1-...")365.clientSecretPostTokenEndpointAuth("abc123...")366.build())367.build())368.build());369370// Rotate the credential (e.g., after a token refresh)371client.beta().vaults().credentials().update(credential.id(),372CredentialUpdateParams.builder()373.vaultId(vault.id())374.auth(BetaManagedAgentsMcpOAuthUpdateParams.builder()375.type(BetaManagedAgentsMcpOAuthUpdateParams.Type.MCP_OAUTH)376.accessToken("xoxp-new-...")377.expiresAt(OffsetDateTime.parse("2026-05-15T00:00:00Z"))378.refresh(BetaManagedAgentsMcpOAuthRefreshUpdateParams.builder()379.refreshToken("xoxe-1-new-...")380.build())381.build())382.build());383384// Archive a vault385client.beta().vaults().archive(vault.id());386```387388---389390## GitHub Repository Integration391392Mount a GitHub repository as a session resource (a vault holds the GitHub MCP credential):393394```java395import com.anthropic.models.beta.sessions.BetaManagedAgentsGitHubRepositoryResourceParams;396397var session = client.beta().sessions().create(SessionCreateParams.builder()398.agent(agent.id())399.environmentId(environment.id())400.addVaultId(vault.id())401.addResource(BetaManagedAgentsGitHubRepositoryResourceParams.builder()402.type(BetaManagedAgentsGitHubRepositoryResourceParams.Type.GITHUB_REPOSITORY)403.url("https://github.com/org/repo")404.mountPath("/workspace/repo")405.authorizationToken("ghp_your_github_token")406.build())407.build());408```409410Multiple repositories on the same session:411412```java413import java.util.List;414415var resources = List.of(416BetaManagedAgentsGitHubRepositoryResourceParams.builder()417.type(BetaManagedAgentsGitHubRepositoryResourceParams.Type.GITHUB_REPOSITORY)418.url("https://github.com/org/frontend")419.mountPath("/workspace/frontend")420.authorizationToken("ghp_your_github_token")421.build(),422BetaManagedAgentsGitHubRepositoryResourceParams.builder()423.type(BetaManagedAgentsGitHubRepositoryResourceParams.Type.GITHUB_REPOSITORY)424.url("https://github.com/org/backend")425.mountPath("/workspace/backend")426.authorizationToken("ghp_your_github_token")427.build());428```429430Rotating a repository's authorization token:431432```java433import com.anthropic.models.beta.sessions.resources.ResourceUpdateParams;434435var listed = client.beta().sessions().resources().list(session.id());436var repoResourceId = listed.data().get(0).asGitHubRepository().id();437438client.beta().sessions().resources().update(repoResourceId, ResourceUpdateParams.builder()439.sessionId(session.id())440.authorizationToken("ghp_your_new_github_token")441.build());442```443