import org.springaicommunity.claude.agent.sdk.ClaudeClient;
import org.springaicommunity.claude.agent.sdk.ClaudeSyncClient;
import org.springaicommunity.claude.agent.sdk.config.PermissionMode;
import org.springaicommunity.claude.agent.sdk.parsing.ParsedMessage;
import org.springaicommunity.claude.agent.sdk.transport.CLIOptions;
import org.springaicommunity.claude.agent.sdk.types.AssistantMessage;
import org.springaicommunity.claude.agent.sdk.types.ResultMessage;
import java.nio.file.Path;
import java.util.Iterator;
String agentsJson = """
{
"orchestrator": {
"description": "Coordinates analysis and synthesizes results",
"prompt": "You are an orchestrator. Delegate to workers and synthesize findings."
},
"security-worker": {
"description": "Finds security issues",
"prompt": "You are a security expert. Find vulnerabilities. Be very brief."
},
"quality-worker": {
"description": "Reviews code quality",
"prompt": "You are a code quality expert. Find maintainability issues. Be very brief."
}
}
""";
CLIOptions options = CLIOptions.builder()
.model(CLIOptions.MODEL_HAIKU)
.permissionMode(PermissionMode.BYPASS_PERMISSIONS)
.agents(agentsJson)
.build();
try (ClaudeSyncClient client = ClaudeClient.sync(options)
.workingDirectory(Path.of("."))
.build()) {
String prompt = """
You are the ORCHESTRATOR. Analyze this code by delegating to security-worker and quality-worker:
public class UserAuth {
String password = "admin123";
public boolean login(String user, String pwd) {
return pwd.equals(password);
}
}
1. Briefly explain delegation strategy
2. Delegate to BOTH workers
3. Synthesize findings (max 3 bullet points)
""";
client.connect(prompt);
Iterator<ParsedMessage> response = client.receiveResponse();
while (response.hasNext()) {
ParsedMessage msg = response.next();
if (msg.isRegularMessage()) {
if (msg.asMessage() instanceof AssistantMessage am) {
am.getTextContent().ifPresent(System.out::println);
} else if (msg.asMessage() instanceof ResultMessage rm) {
if (rm.totalCostUsd() != null) {
System.out.printf("[Cost: $%.4f]%n", rm.totalCostUsd());
}
}
}
}
}