183 lines
4.4 KiB
Markdown
183 lines
4.4 KiB
Markdown
# Managed Agents API Patterns
|
|
|
|
Code patterns for creating and managing agents via the Anthropic SDK.
|
|
All examples use `@anthropic-ai/sdk` (TypeScript) with Python equivalents noted.
|
|
|
|
---
|
|
|
|
## Basic agent creation
|
|
|
|
```typescript
|
|
import Anthropic from "@anthropic-ai/sdk";
|
|
|
|
const client = new Anthropic();
|
|
|
|
// Create an agent with tools
|
|
const response = await client.messages.create({
|
|
model: "claude-sonnet-4-6",
|
|
max_tokens: 4096,
|
|
system: "You are a research agent. Produce structured briefs.",
|
|
tools: [
|
|
{
|
|
name: "web_search",
|
|
description: "Search the web for information",
|
|
input_schema: {
|
|
type: "object",
|
|
properties: {
|
|
query: { type: "string", description: "Search query" }
|
|
},
|
|
required: ["query"]
|
|
}
|
|
}
|
|
],
|
|
messages: [
|
|
{ role: "user", content: "Research the latest Claude Code features" }
|
|
]
|
|
});
|
|
```
|
|
|
|
## Agent with persistent sessions
|
|
|
|
```typescript
|
|
// Create a session-based agent
|
|
const session = await client.agents.sessions.create({
|
|
agent_id: "ag_your_agent_id",
|
|
system_prompt: `You are a data analyst. You have access to the
|
|
company database via the query tool. Always verify your findings
|
|
before reporting.`,
|
|
tools: [/* your tool definitions */]
|
|
});
|
|
|
|
// First interaction
|
|
const result1 = await client.agents.sessions.messages.create({
|
|
agent_id: "ag_your_agent_id",
|
|
session_id: session.id,
|
|
messages: [{ role: "user", content: "Analyze Q1 revenue trends" }]
|
|
});
|
|
|
|
// Continue the conversation (session remembers context)
|
|
const result2 = await client.agents.sessions.messages.create({
|
|
agent_id: "ag_your_agent_id",
|
|
session_id: session.id,
|
|
messages: [{ role: "user", content: "Now compare with Q4 of last year" }]
|
|
});
|
|
```
|
|
|
|
## Tool handling pattern
|
|
|
|
```typescript
|
|
async function runAgentLoop(
|
|
client: Anthropic,
|
|
messages: Anthropic.MessageParam[],
|
|
tools: Anthropic.Tool[]
|
|
) {
|
|
let response = await client.messages.create({
|
|
model: "claude-sonnet-4-6",
|
|
max_tokens: 4096,
|
|
tools,
|
|
messages
|
|
});
|
|
|
|
while (response.stop_reason === "tool_use") {
|
|
const toolUseBlocks = response.content.filter(
|
|
(b): b is Anthropic.ToolUseBlock => b.type === "tool_use"
|
|
);
|
|
|
|
const toolResults: Anthropic.ToolResultBlockParam[] = [];
|
|
for (const toolUse of toolUseBlocks) {
|
|
const result = await executeToolCall(toolUse.name, toolUse.input);
|
|
toolResults.push({
|
|
type: "tool_result",
|
|
tool_use_id: toolUse.id,
|
|
content: JSON.stringify(result)
|
|
});
|
|
}
|
|
|
|
messages.push({ role: "assistant", content: response.content });
|
|
messages.push({ role: "user", content: toolResults });
|
|
|
|
response = await client.messages.create({
|
|
model: "claude-sonnet-4-6",
|
|
max_tokens: 4096,
|
|
tools,
|
|
messages
|
|
});
|
|
}
|
|
|
|
return response;
|
|
}
|
|
```
|
|
|
|
## Cost optimization with prompt caching
|
|
|
|
```typescript
|
|
const response = await client.messages.create({
|
|
model: "claude-sonnet-4-6",
|
|
max_tokens: 1024,
|
|
system: [
|
|
{
|
|
type: "text",
|
|
text: longSystemPrompt, // cached — 90% cheaper on reuse
|
|
cache_control: { type: "ephemeral" }
|
|
}
|
|
],
|
|
messages: [{ role: "user", content: userQuery }]
|
|
});
|
|
```
|
|
|
|
## Error handling
|
|
|
|
```typescript
|
|
try {
|
|
const response = await client.messages.create(/* ... */);
|
|
} catch (error) {
|
|
if (error instanceof Anthropic.RateLimitError) {
|
|
// Retry with exponential backoff
|
|
await sleep(retryDelay);
|
|
retryDelay *= 2;
|
|
} else if (error instanceof Anthropic.APIError) {
|
|
console.error(`API error ${error.status}: ${error.message}`);
|
|
// Log for debugging, don't retry on 4xx
|
|
}
|
|
}
|
|
```
|
|
|
|
## Python equivalent
|
|
|
|
```python
|
|
import anthropic
|
|
|
|
client = anthropic.Anthropic()
|
|
|
|
response = client.messages.create(
|
|
model="claude-sonnet-4-6",
|
|
max_tokens=4096,
|
|
system="You are a research agent.",
|
|
messages=[{"role": "user", "content": "Research topic X"}]
|
|
)
|
|
```
|
|
|
|
## Deployment pattern: scheduled managed agent
|
|
|
|
```typescript
|
|
// Run as a scheduled job (e.g., via cron or cloud scheduler)
|
|
async function dailyReport() {
|
|
const client = new Anthropic();
|
|
|
|
const response = await runAgentLoop(
|
|
client,
|
|
[{ role: "user", content: "Generate the daily status report" }],
|
|
reportTools
|
|
);
|
|
|
|
// Extract and save the report
|
|
const text = response.content
|
|
.filter((b): b is Anthropic.TextBlock => b.type === "text")
|
|
.map((b) => b.text)
|
|
.join("\n");
|
|
|
|
await saveReport(text);
|
|
}
|
|
|
|
dailyReport().catch(console.error);
|
|
```
|