151 lines
3.2 KiB
Markdown
151 lines
3.2 KiB
Markdown
|
|
# Agent SDK Patterns — TypeScript
|
||
|
|
|
||
|
|
## Basic Agent
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
import { query } from "@anthropic-ai/claude-agent-sdk";
|
||
|
|
|
||
|
|
async function main() {
|
||
|
|
for await (const message of query({
|
||
|
|
prompt: "Explain what this repository does",
|
||
|
|
options: {
|
||
|
|
cwd: "/path/to/project",
|
||
|
|
allowedTools: ["Read", "Glob", "Grep"],
|
||
|
|
},
|
||
|
|
})) {
|
||
|
|
if ("result" in message) {
|
||
|
|
console.log(message.result);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
main();
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Hooks
|
||
|
|
|
||
|
|
### After Tool Use Hook
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
import { query, HookCallback } from "@anthropic-ai/claude-agent-sdk";
|
||
|
|
import { appendFileSync } from "fs";
|
||
|
|
|
||
|
|
const logFileChange: HookCallback = async (input) => {
|
||
|
|
const filePath = (input as any).tool_input?.file_path ?? "unknown";
|
||
|
|
appendFileSync(
|
||
|
|
"./audit.log",
|
||
|
|
`${new Date().toISOString()}: modified ${filePath}\n`,
|
||
|
|
);
|
||
|
|
return {};
|
||
|
|
};
|
||
|
|
|
||
|
|
for await (const message of query({
|
||
|
|
prompt: "Refactor utils.py to improve readability",
|
||
|
|
options: {
|
||
|
|
allowedTools: ["Read", "Edit", "Write"],
|
||
|
|
permissionMode: "acceptEdits",
|
||
|
|
hooks: {
|
||
|
|
PostToolUse: [{ matcher: "Edit|Write", hooks: [logFileChange] }],
|
||
|
|
},
|
||
|
|
},
|
||
|
|
})) {
|
||
|
|
if ("result" in message) console.log(message.result);
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Subagents
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
import { query } from "@anthropic-ai/claude-agent-sdk";
|
||
|
|
|
||
|
|
for await (const message of query({
|
||
|
|
prompt: "Use the code-reviewer agent to review this codebase",
|
||
|
|
options: {
|
||
|
|
allowedTools: ["Read", "Glob", "Grep", "Agent"],
|
||
|
|
agents: {
|
||
|
|
"code-reviewer": {
|
||
|
|
description: "Expert code reviewer for quality and security reviews.",
|
||
|
|
prompt: "Analyze code quality and suggest improvements.",
|
||
|
|
tools: ["Read", "Glob", "Grep"],
|
||
|
|
},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
})) {
|
||
|
|
if ("result" in message) console.log(message.result);
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## MCP Server Integration
|
||
|
|
|
||
|
|
### Browser Automation (Playwright)
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
for await (const message of query({
|
||
|
|
prompt: "Open example.com and describe what you see",
|
||
|
|
options: {
|
||
|
|
mcpServers: {
|
||
|
|
playwright: { command: "npx", args: ["@playwright/mcp@latest"] },
|
||
|
|
},
|
||
|
|
},
|
||
|
|
})) {
|
||
|
|
if ("result" in message) console.log(message.result);
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Session Resumption
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
import { query } from "@anthropic-ai/claude-agent-sdk";
|
||
|
|
|
||
|
|
let sessionId: string | undefined;
|
||
|
|
|
||
|
|
// First query: capture the session ID
|
||
|
|
for await (const message of query({
|
||
|
|
prompt: "Read the authentication module",
|
||
|
|
options: { allowedTools: ["Read", "Glob"] },
|
||
|
|
})) {
|
||
|
|
if (message.type === "system" && message.subtype === "init") {
|
||
|
|
sessionId = message.session_id;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Resume with full context from the first query
|
||
|
|
for await (const message of query({
|
||
|
|
prompt: "Now find all places that call it",
|
||
|
|
options: { resume: sessionId },
|
||
|
|
})) {
|
||
|
|
if ("result" in message) console.log(message.result);
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Custom System Prompt
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
import { query } from "@anthropic-ai/claude-agent-sdk";
|
||
|
|
|
||
|
|
for await (const message of query({
|
||
|
|
prompt: "Review this code",
|
||
|
|
options: {
|
||
|
|
allowedTools: ["Read", "Glob", "Grep"],
|
||
|
|
systemPrompt: `You are a senior code reviewer focused on:
|
||
|
|
1. Security vulnerabilities
|
||
|
|
2. Performance issues
|
||
|
|
3. Code maintainability
|
||
|
|
|
||
|
|
Always provide specific line numbers and suggestions for improvement.`,
|
||
|
|
},
|
||
|
|
})) {
|
||
|
|
if ("result" in message) console.log(message.result);
|
||
|
|
}
|
||
|
|
```
|