{"slug":"claude-api-2","title":"claude-api","summary":"Build apps with the Claude API or Anthropic SDK. TRIGGER when: code imports `anthropic`/`@anthropic-ai/sdk`/`claude_agent_sdk`, or user asks to use Claude API, Anthropic SDKs, or Agent SDK. DO NOT TRIGGER when: code imports `openai`/other AI SDK, general programming, or ML/data-s","platform":"ChatGPT","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-08-17T11:41:27.754393Z","repo":{"url":"https://github.com/sickn33/agentic-awesome-skills","stars":46883,"forks":6831,"license":"MIT","updatedAt":"2026-09-25T05:43:16Z"},"bodyHtml":"<h1>Agent SDK — Python</h1>\n<p>The Claude Agent SDK provides a higher-level interface for building AI agents with built-in tools, safety features, and agentic capabilities.</p>\n<h2>Installation</h2>\n<pre><code>pip install claude-agent-sdk\n</code></pre>\n<hr>\n<h2>Quick Start</h2>\n<pre><code>import anyio\nfrom claude_agent_sdk import query, ClaudeAgentOptions, ResultMessage\n\nasync def main():\n    async for message in query(\n        prompt=\"Explain this codebase\",\n        options=ClaudeAgentOptions(allowed_tools=[\"Read\", \"Glob\", \"Grep\"])\n    ):\n        if isinstance(message, ResultMessage):\n            print(message.result)\n\nanyio.run(main)\n</code></pre>\n<hr>\n<h2>Built-in Tools</h2>\n<table>\n<thead>\n<tr>\n<th>Tool</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Read</td>\n<td>Read files in the workspace</td>\n</tr>\n<tr>\n<td>Write</td>\n<td>Create new files</td>\n</tr>\n<tr>\n<td>Edit</td>\n<td>Make precise edits to existing files</td>\n</tr>\n<tr>\n<td>Bash</td>\n<td>Execute shell commands</td>\n</tr>\n<tr>\n<td>Glob</td>\n<td>Find files by pattern</td>\n</tr>\n<tr>\n<td>Grep</td>\n<td>Search files by content</td>\n</tr>\n<tr>\n<td>WebSearch</td>\n<td>Search the web for information</td>\n</tr>\n<tr>\n<td>WebFetch</td>\n<td>Fetch and analyze web pages</td>\n</tr>\n<tr>\n<td>AskUserQuestion</td>\n<td>Ask user clarifying questions</td>\n</tr>\n<tr>\n<td>Agent</td>\n<td>Spawn subagents</td>\n</tr>\n</tbody>\n</table>\n<hr>\n<h2>Primary Interfaces</h2>\n<h3><code>query()</code> — Simple One-Shot Usage</h3>\n<p>The <code>query()</code> function is the simplest way to run an agent. It returns an async iterator of messages.</p>\n<pre><code>from claude_agent_sdk import query, ClaudeAgentOptions, ResultMessage\n\nasync for message in query(\n    prompt=\"Explain this codebase\",\n    options=ClaudeAgentOptions(allowed_tools=[\"Read\", \"Glob\", \"Grep\"])\n):\n    if isinstance(message, ResultMessage):\n        print(message.result)\n</code></pre>\n<h3><code>ClaudeSDKClient</code> — Full Control</h3>\n<p><code>ClaudeSDKClient</code> provides full control over the agent lifecycle. Use it when you need custom tools, hooks, streaming, or the ability to interrupt execution.</p>\n<pre><code>import anyio\nfrom claude_agent_sdk import ClaudeSDKClient, ClaudeAgentOptions, AssistantMessage, TextBlock\n\nasync def main():\n    options = ClaudeAgentOptions(allowed_tools=[\"Read\", \"Glob\", \"Grep\"])\n    async with ClaudeSDKClient(options=options) as client:\n        await client.query(\"Explain this codebase\")\n        async for message in client.receive_response():\n            if isinstance(message, AssistantMessage):\n                for block in message.content:\n                    if isinstance(block, TextBlock):\n                        print(block.text)\n\nanyio.run(main)\n</code></pre>\n<p><code>ClaudeSDKClient</code> supports:</p>\n<ul>\n<li><strong>Context manager</strong> (<code>async with</code>) for automatic resource cleanup</li>\n<li><strong><code>client.query(prompt)</code></strong> to send a prompt to the agent</li>\n<li><strong><code>receive_response()</code></strong> for streaming messages until completion</li>\n<li><strong><code>interrupt()</code></strong> to stop agent execution mid-task</li>\n<li><strong>Required for custom tools</strong> (via SDK MCP servers)</li>\n</ul>\n<hr>\n<h2>Permission System</h2>\n<pre><code>from claude_agent_sdk import query, ClaudeAgentOptions, ResultMessage\n\nasync for message in query(\n    prompt=\"Refactor the authentication module\",\n    options=ClaudeAgentOptions(\n        allowed_tools=[\"Read\", \"Edit\", \"Write\"],\n        permission_mode=\"acceptEdits\"  # Auto-accept file edits\n    )\n):\n    if isinstance(message, ResultMessage):\n        print(message.result)\n</code></pre>\n<p>Permission modes:</p>\n<ul>\n<li><code>\"default\"</code>: Prompt for dangerous operations</li>\n<li><code>\"plan\"</code>: Planning only, no execution</li>\n<li><code>\"acceptEdits\"</code>: Auto-accept file edits</li>\n<li><code>\"dontAsk\"</code>: Don't prompt (useful for CI/CD)</li>\n<li><code>\"bypassPermissions\"</code>: Skip all prompts (requires <code>allow_dangerously_skip_permissions=True</code> in options)</li>\n</ul>\n<hr>\n<h2>MCP (Model Context Protocol) Support</h2>\n<pre><code>from claude_agent_sdk import query, ClaudeAgentOptions, ResultMessage\n\nasync for message in query(\n    prompt=\"Open example.com and describe what you see\",\n    options=ClaudeAgentOptions(\n        mcp_servers={\n            \"playwright\": {\"command\": \"npx\", \"args\": [\"@playwright/mcp@latest\"]}\n        }\n    )\n):\n    if isinstance(message, ResultMessage):\n        print(message.result)\n</code></pre>\n<hr>\n<h2>Hooks</h2>\n<p>Customize agent behavior with hooks using callback functions:</p>\n<pre><code>from claude_agent_sdk import query, ClaudeAgentOptions, HookMatcher, ResultMessage\n\nasync def log_file_change(input_data, tool_use_id, context):\n    file_path = input_data.get('tool_input', {}).get('file_path', 'unknown')\n    print(f\"Modified: {file_path}\")\n    return {}\n\nasync for message in query(\n    prompt=\"Refactor utils.py\",\n    options=ClaudeAgentOptions(\n        permission_mode=\"acceptEdits\",\n        hooks={\n            \"PostToolUse\": [HookMatcher(matcher=\"Edit|Write\", hooks=[log_file_change])]\n        }\n    )\n):\n    if isinstance(message, ResultMessage):\n        print(message.result)\n</code></pre>\n<p>Available hook events: <code>PreToolUse</code>, <code>PostToolUse</code>, <code>PostToolUseFailure</code>, <code>Notification</code>, <code>UserPromptSubmit</code>, <code>SessionStart</code>, <code>SessionEnd</code>, <code>Stop</code>, <code>SubagentStart</code>, <code>SubagentStop</code>, <code>PreCompact</code>, <code>PermissionRequest</code>, <code>Setup</code>, <code>TeammateIdle</code>, <code>TaskCompleted</code>, <code>ConfigChange</code></p>\n<hr>\n<h2>Common Options</h2>\n<p><code>query()</code> takes a top-level <code>prompt</code> (string) and an <code>options</code> object (<code>ClaudeAgentOptions</code>):</p>\n<pre><code>async for message in query(prompt=\"...\", options=ClaudeAgentOptions(...)):\n</code></pre>\n<table>\n<thead>\n<tr>\n<th>Option</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>cwd</code></td>\n<td>string</td>\n<td>Working directory for file operations</td>\n</tr>\n<tr>\n<td><code>allowed_tools</code></td>\n<td>list</td>\n<td>Tools the agent can use (e.g., <code>[\"Read\", \"Edit\", \"Bash\"]</code>)</td>\n</tr>\n<tr>\n<td><code>tools</code></td>\n<td>list</td>\n<td>Built-in tools to make available (restricts the default set)</td>\n</tr>\n<tr>\n<td><code>disallowed_tools</code></td>\n<td>list</td>\n<td>Tools to explicitly disallow</td>\n</tr>\n<tr>\n<td><code>permission_mode</code></td>\n<td>string</td>\n<td>How to handle permission prompts</td>\n</tr>\n<tr>\n<td><code>allow_dangerously_skip_permissions</code></td>\n<td>bool</td>\n<td>Must be <code>True</code> to use <code>permission_mode=\"bypassPermissions\"</code></td>\n</tr>\n<tr>\n<td><code>mcp_servers</code></td>\n<td>dict</td>\n<td>MCP servers to connect to</td>\n</tr>\n<tr>\n<td><code>hooks</code></td>\n<td>dict</td>\n<td>Hooks for customizing behavior</td>\n</tr>\n<tr>\n<td><code>system_prompt</code></td>\n<td>string</td>\n<td>Custom system prompt</td>\n</tr>\n<tr>\n<td><code>max_turns</code></td>\n<td>int</td>\n<td>Maximum agent turns before stopping</td>\n</tr>\n<tr>\n<td><code>max_budget_usd</code></td>\n<td>float</td>\n<td>Maximum budget in USD for the query</td>\n</tr>\n<tr>\n<td><code>model</code></td>\n<td>string</td>\n<td>Model ID (default: determined by CLI)</td>\n</tr>\n<tr>\n<td><code>agents</code></td>\n<td>dict</td>\n<td>Subagent definitions (<code>dict[str, AgentDefinition]</code>)</td>\n</tr>\n<tr>\n<td><code>output_format</code></td>\n<td>dict</td>\n<td>Structured output schema</td>\n</tr>\n<tr>\n<td><code>thinking</code></td>\n<td>dict</td>\n<td>Thinking/reasoning control</td>\n</tr>\n<tr>\n<td><code>betas</code></td>\n<td>list</td>\n<td>Beta features to enable (e.g., <code>[\"context-1m-2025-08-07\"]</code>)</td>\n</tr>\n<tr>\n<td><code>setting_sources</code></td>\n<td>list</td>\n<td>Settings to load (e.g., <code>[\"project\"]</code>). Default: none (no CLAUDE.md files)</td>\n</tr>\n<tr>\n<td><code>env</code></td>\n<td>dict</td>\n<td>Environment variables to set for the session</td>\n</tr>\n</tbody>\n</table>\n<hr>\n<h2>Message Types</h2>\n<pre><code>from claude_agent_sdk import query, ClaudeAgentOptions, ResultMessage, SystemMessage\n\nasync for message in query(\n    prompt=\"Find TODO comments\",\n    options=ClaudeAgentOptions(allowed_tools=[\"Read\", \"Glob\", \"Grep\"])\n):\n    if isinstance(message, ResultMessage):\n        print(message.result)\n    elif isinstance(message, SystemMessage) and message.subtype == \"init\":\n        session_id = message.session_id  # Capture for resuming later\n</code></pre>\n<hr>\n<h2>Subagents</h2>\n<pre><code>from claude_agent_sdk import query, ClaudeAgentOptions, AgentDefinition, ResultMessage\n\nasync for message in query(\n    prompt=\"Use the code-reviewer agent to review this codebase\",\n    options=ClaudeAgentOptions(\n        allowed_tools=[\"Read\", \"Glob\", \"Grep\", \"Agent\"],\n        agents={\n            \"code-reviewer\": AgentDefinition(\n                description=\"Expert code reviewer for quality and security reviews.\",\n                prompt=\"Analyze code quality and suggest improvements.\",\n                tools=[\"Read\", \"Glob\", \"Grep\"]\n            )\n        }\n    )\n):\n    if isinstance(message, ResultMessage):\n        print(message.result)\n</code></pre>\n<hr>\n<h2>Error Handling</h2>\n<pre><code>from claude_agent_sdk import query, ClaudeAgentOptions, CLINotFoundError, CLIConnectionError, ResultMessage\n\ntry:\n    async for message in query(\n        prompt=\"...\",\n        options=ClaudeAgentOptions(allowed_tools=[\"Read\"])\n    ):\n        if isinstance(message, ResultMessage):\n            print(message.result)\nexcept CLINotFoundError:\n    print(\"Claude Code CLI not found. Install with: pip install claude-agent-sdk\")\nexcept CLIConnectionError as e:\n    print(f\"Connection error: {e}\")\n</code></pre>\n<hr>\n<h2>Best Practices</h2>\n<ol>\n<li><strong>Always specify allowed_tools</strong> — Explicitly list which tools the agent can use</li>\n<li><strong>Set working directory</strong> — Always specify <code>cwd</code> for file operations</li>\n<li><strong>Use appropriate permission modes</strong> — Start with <code>\"default\"</code> and only escalate when needed</li>\n<li><strong>Handle all message types</strong> — Check for <code>ResultMessage</code> to get agent output</li>\n<li><strong>Limit max_turns</strong> — Prevent runaway agents with reasonable limits</li>\n</ol>\n","files":[{"path":"csharp/claude-api.md","sizeBytes":1758,"isText":true},{"path":"curl/examples.md","sizeBytes":4475,"isText":true},{"path":"go/claude-api.md","sizeBytes":3980,"isText":true},{"path":"java/claude-api.md","sizeBytes":3941,"isText":true},{"path":"LICENSE.txt","sizeBytes":11357,"isText":true},{"path":"php/claude-api.md","sizeBytes":1568,"isText":true},{"path":"python/agent-sdk/patterns.md","sizeBytes":8208,"isText":true},{"path":"python/agent-sdk/README.md","sizeBytes":9869,"isText":true},{"path":"python/claude-api/batches.md","sizeBytes":4948,"isText":true},{"path":"python/claude-api/files-api.md","sizeBytes":3881,"isText":true},{"path":"python/claude-api/README.md","sizeBytes":10942,"isText":true},{"path":"python/claude-api/streaming.md","sizeBytes":5217,"isText":true},{"path":"python/claude-api/tool-use.md","sizeBytes":16730,"isText":true},{"path":"ruby/claude-api.md","sizeBytes":1816,"isText":true},{"path":"shared/error-codes.md","sizeBytes":7050,"isText":true},{"path":"shared/live-sources.md","sizeBytes":10727,"isText":true},{"path":"shared/models.md","sizeBytes":4625,"isText":true},{"path":"shared/tool-use-concepts.md","sizeBytes":14761,"isText":true},{"path":"SKILL.md","sizeBytes":18934,"isText":true},{"path":"typescript/agent-sdk/patterns.md","sizeBytes":3274,"isText":true},{"path":"typescript/agent-sdk/README.md","sizeBytes":7839,"isText":true},{"path":"typescript/claude-api/batches.md","sizeBytes":2594,"isText":true},{"path":"typescript/claude-api/files-api.md","sizeBytes":2260,"isText":true},{"path":"typescript/claude-api/README.md","sizeBytes":8627,"isText":true},{"path":"typescript/claude-api/streaming.md","sizeBytes":5582,"isText":true},{"path":"typescript/claude-api/tool-use.md","sizeBytes":12821,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"human-reviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"human-reviewed","screen":{"ran":true,"outcome":"flagged-cleared-by-moderator","suspicious":2,"notes":2,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-08-17T11:42:03.642612Z","sha256":"1D8A3A3EDD3575353420818603652BB3C69C438ECADEFEA8729565FF02702A9C","sizeBytes":64753},"review":null,"source":{"repositoryUrl":"https://github.com/sickn33/agentic-awesome-skills","path":"skills/claude-api","license":"MIT","commit":"f2bba339de74414b0771234cbe4f6a15258e32a3","subtreeSha":"3C0C977246ECEFD69292634D43F04F4260857875B2C087BF2ED6826A7F2EA642","lastSyncedAt":"2026-09-25T06:48:39.853703Z"},"reviewedAt":"2026-09-06T17:57:55.910887Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/sickn33/agentic-awesome-skills/tree/main/skills/claude-api"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install sickn33-agentic-awesome-skills@llmmart"},{"target":"git","command":"git clone https://github.com/sickn33/agentic-awesome-skills.git"}]}