Building LLM-Powered Applications with Claude

SkillFiles & storage

Reference for the Claude API / Anthropic SDK, model ids, pricing, params, streaming, tool use, MCP, agents, caching, token counting, model migration. TRIGGER, read BEFORE opening the target file; don't skip because it "looks like a one-liner", whenever: the prompt names Claude/Anthropic in any form (Claude, Anthropic, Fable, Opus, Sonnet, Haiku, `anthropic`, `@anthropic-ai`, `claude-*`, `us.anthropic.*`, `[1m]`); the user asks about an LLM (pricing/model choice/limits/caching), never answer from memory; OR the task is LLM-shaped with provider unstated (agent/MCP/tool-definition/multi-agent/RAG/LLM-judge/computer-use; generate/summarize/extract/classify/rewrite/converse over NL; debugging refusals/cutoffs/streaming/tool-calls/tokens). SKIP only when another provider is being worked on (overrides all triggers): OpenAI/GPT/Gemini/Llama/Mistral/Cohere/Ollama named in the query; OR `grep -rE 'openai|langchain_openai|google.generativeai|genai|mistralai|cohere|ollama'` over the project hits (run this grep FIRST if no provider named, don't Read the file).

Available today. Use it from your connected AI after setup.

Add ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.

Then ask your AI: use the Building LLM-Powered Applications with Claude skill

What this skill tells your AI

The instructions your AI receives, as published by justinlietz93/perfect_prompts in Skills/official-anthropic-skills/skills/claude-api/SKILL.md and read by ahel’s review.

This skill helps you build LLM-powered applications with Claude. Choose the right surface based on your needs, detect the project language, then read the relevant language-specific documentation.

Before You Start

Scan the target file (or, if no target file, the prompt and project) for non-Anthropic provider markers — import openai, from openai, langchain_openai, OpenAI(, gpt-4, gpt-5, file names like agent-openai.py or *-generic.py, or any explicit instruction to keep the code provider-neutral. If you find any, stop and tell the user that this skill produces Claude/Anthropic SDK code; ask whether they want to switch the file to Claude or want a non-Claude implementation. Do not edit a non-Anthropic file with Anthropic SDK calls.

Output Requirement

When the user asks you to add, modify, or implement a Claude feature, your code must call Claude through one of:

  1. The official Anthropic SDK for the project's language (anthropic, @anthropic-ai/sdk, com.anthropic.*, etc.). This is the default whenever a supported SDK exists for the project.
  2. Raw HTTP (curl, requests, fetch, httpx, etc.) — only when the user explicitly asks for cURL/REST/raw HTTP, the project is a shell/cURL project, or the language has no official SDK.

Never mix the two — don't reach for requests/fetch in a Python or TypeScript project just because it feels lighter. Never fall back to OpenAI-compatible shims.

Never guess SDK usage. Function names, class names, namespaces, method signatures, and import paths must come from explicit documentation — either the {lang}/ files in this skill or the official SDK repositories or documentation links listed in shared/live-sources.md. If the binding you need is not explicitly documented in the skill files, WebFetch the relevant SDK repo from shared/live-sources.md before writing code. Do not infer Ruby/Java/Go/PHP/C# APIs from cURL shapes or from another language's SDK.

If WebFetch or repository access fails (network restricted, timeouts, clone blocked): do not keep retrying — write code from the patterns and namespace/package tables in the {lang}/ file, run the compiler or interpreter on it, and iterate on the error output. For statically-typed SDKs (C#, Java, Go) a compile-fix loop against local errors reaches working code faster than blocked network research.

Defaults

Unless the user requests otherwise:

For the Claude model version, please use Claude Opus 5, which you can access via the exact model string claude-opus-5. Please default to using adaptive thinking (thinking: {type: "adaptive"}) for anything remotely complicated. And finally, please default to streaming for any request that may involve long input, long output, or high max_tokens — it prevents hitting request timeouts. Use the SDK's .get_final_message() / .finalMessage() helper to get the complete response if you don't need to handle individual stream events

⚠️ API Drift — Your Training Prior May Be Stale

Several common Claude API shapes changed in 2025–2026. If you recall a pattern from training, verify it against the {lang}/ files in this skill before writing — the rows below are the most frequent drift points:

AreaStale priorCurrent API
Extended thinkingthinking: {type: "enabled", budget_tokens: N}On Claude 4.6+ models: thinking: {type: "adaptive"}. budget_tokens is deprecated on Opus 4.6 / Sonnet 4.6 and rejected with a 400 on Fable 5 / Sonnet 5 / Opus 5 / 4.8 / 4.7. Pre-4.6 models still use budget_tokens.
Web search / web fetch tool typeweb_search_20250305, web_fetch_20250910web_search_20260209, web_fetch_20260209 (dynamic filtering) on Opus 5/4.8/4.7/4.6, Sonnet 5, and Sonnet 4.6. Older models keep the basic variants; on Vertex AI only basic web_search_20250305 is available (web fetch is not on Vertex) — see the Server Tools QR below.
PHP parameter namessnake_case wire names as named args (max_tokens)Top-level named args are camelCase (maxTokens). Nested array keys vary by feature (e.g. 'taskBudget', 'skillID', 'mcp_server_name') — copy the exact key from the documented example; do not bulk-convert.
Managed Agents credentialsKeep secrets host-side via custom tools (the only option before vaults shipped)Vault environment_variable credentials — stored by Anthropic, substituted at egress, never visible in the sandbox (shared/managed-agents-tools.md → Vaults). Host-side custom tools remain the fallback for self-hosted sandboxes.

The {lang}/ files in this skill are authoritative over recalled patterns.


Subcommands

If the User Request at the bottom of this prompt is a bare subcommand string (no prose), search every Subcommands table in this document — including any in sections appended below — and follow the matching Action column directly. This lets users invoke specific flows via /claude-api <subcommand>. If no table in the document matches, treat the request as normal prose.

SubcommandAction
migrateMigrate existing Claude API code to a newer model. Read shared/model-migration.md immediately and follow it in order: Step 0 (confirm scope — ask which files/directories before any edit), Step 1 (classify each file), then the per-target breaking-changes section. Do not summarize the guide — execute it. If the user did not name a target model, ask which model to migrate to in the same turn as the scope question. After the per-target changes are applied, audit the in-scope prompt text, tool descriptions, and request code against shared/prompt-audit.md — prompting written for the source model is part of every migration, and it does not announce itself.
prompt-auditAudit existing prompts, skills, and tool descriptions for dated patterns ("cruft") written for older models. Read shared/prompt-audit.md immediately and follow it in order: Step 0 (establish scope and target model from the request and the repository — state the assumptions in the report, do not stop to ask), inventory, provenance, then the pattern scan. Produce both deliverables in full — the audit report (findings with file:line, pattern, why it's obsolete for the target model, confidence) and a proposed diff — without pausing for confirmation; apply edits only if the request explicitly asked for them. Do not summarize the guide — execute it.
upgradeUpgrade the project's Anthropic SDK dependency across a major version — currently the Python SDK, anthropic 0.x → 1.x. Trailing words may name the language and/or a scope (upgrade python, upgrade python sdk src/). Read python/claude-api/sdk-upgrade.md immediately and follow it in order: Step 0 (confirm scope, then establish the current and target versions — a published 1.x must exist before you write a pin), the Step 1 inventory, each numbered section, then verification and the report. Do not summarize the guide — execute it. If the detected or named language has no sdk-upgrade.md in this skill, say that no major-version upgrade guide is bundled for that SDK yet and point the user at that SDK's CHANGELOG (repositories in shared/live-sources.md); do not improvise one from the Python guide. This is not model migration — to move code to a newer Claude model, use migrate.

Language Detection

First decide whether the request involves a specific SDK language at all. Some tasks don't: auditing prompt text (prompt-audit), choosing a model, pricing and limits questions, and conceptual API questions are language-agnostic. For those, skip this section and don't ask the user for a language.

When the task does involve reading or writing SDK code, determine which language the user is working in before reading code examples:

  1. Look at project files to infer the language:

    • *.py, requirements.txt, pyproject.toml, setup.py, Pipfile → Python — read from python/
    • *.ts, *.tsx, package.json, tsconfig.json → TypeScript — read from typescript/
    • *.js, *.jsx (no .ts files present) → TypeScript — JS uses the same SDK, read from typescript/
    • *.java, pom.xml, build.gradle → Java — read from java/
    • *.kt, *.kts, build.gradle.kts → Java — Kotlin uses the Java SDK, read from java/
    • *.scala, build.sbt → Java — Scala uses the Java SDK, read from java/
    • *.go, go.mod → Go — read from go/
    • *.rb, Gemfile → Ruby — read from ruby/
    • *.cs, *.csproj → C# — read from csharp/
    • *.php, composer.json → PHP — read from php/
  2. If multiple languages detected (e.g., both Python and TypeScript files):

    • Check which language the user's current file or question relates to
    • If still ambiguous, ask: "I detected both Python and TypeScript files. Which language are you using for the Claude API integration?"
  3. If language can't be inferred (empty project, no source files, or unsupported language):

    • Use AskUserQuestion with options: Python, TypeScript, Java, Go, Ruby, cURL/raw HTTP, C#, PHP
    • If AskUserQuestion is unavailable, default to Python examples and note: "Showing Python examples. Let me know if you need a different language."
  4. If unsupported language detected (Rust, Swift, C++, Elixir, etc.):

    • Suggest cURL/raw HTTP examples from curl/ and note that community SDKs may exist
    • Offer to show Python or TypeScript examples as reference implementations
  5. If user needs cURL/raw HTTP examples, read from curl/.

Language-Specific Feature Support

Every SDK language above supports both the beta Tool Runner and Managed Agents (beta) — Python (@beta_tool decorator), TypeScript (betaZodTool + Zod), Java (annotated classes), Go (BetaToolRunner in the toolrunner pkg), Ruby (BaseTool + tool_runner), C# (BetaToolRunner + raw JSON schema), PHP (BetaRunnableTool + toolRunner()); code entry points are in the Tool Use Patterns quick reference below. cURL is raw HTTP (no SDK features) and supports Managed Agents.

Managed Agents code examples: see the reading guide in the ## Managed Agents (Beta) section below.


Which Surface Should I Use?

Start simple. Default to the simplest tier that meets your needs. Single API calls and workflows handle most use cases — only reach for agents when the task genuinely requires open-ended, model-driven exploration. "Simplest" means the least code you own: for a hosted, scheduled, or memory-backed agent, Managed Agents is usually the simplest option (no loop code, no state files, no scheduler), even though it's a bigger platform.

Use CaseTierRecommended SurfaceWhy
Classification, summarization, extraction, Q&ASingle LLM callClaude APIOne request, one response
Batch processing or embeddingsSingle LLM callClaude APISpecialized endpoints
Multi-step pipelines with code-controlled logicWorkflowClaude API + tool useYou orchestrate the loop
Custom agent with your own toolsAgentClaude API + tool useMaximum flexibility
Server-managed stateful agent with workspaceAgentManaged AgentsAnthropic runs the loop and hosts the tool-execution sandbox
Persisted, versioned agent configsAgentManaged AgentsAgents are stored objects; sessions pin to a version
Long-running multi-turn agent with file mountsAgentManaged AgentsPer-session containers, SSE event stream, Skills + MCP
Agent that runs on a schedule (cron, "every night")AgentManaged Agents — scheduled deploymentsDeployments fire sessions autonomously; no client-side scheduler

Note: Managed Agents is the right choice when you want Anthropic to run the agent loop and host the container where tools execute — file ops, bash, code execution all run in the per-session workspace. If you want to host the compute yourself or run your own custom tool runtime, Claude API + tool use is the right choice — use the tool runner for the agentic loop — its per-turn hooks still give you approval gates, logging, error interception, and conditional execution (see shared/tool-use-concepts.md) — or the manual loop when you want to own the entire loop yourself.

Cloud-provider access. Claude Platform on AWS is Anthropic-operated with same-day API parity — see shared/claude-platform-on-aws.md for client setup. For per-feature availability on Claude Platform on AWS, Amazon Bedrock, Google Vertex AI, and Microsoft Foundry, see shared/platform-availability.md — that table is the single source of truth in this skill; do not infer availability from anywhere else.

Building an Agent: Four Approaches

Once you've decided you actually need an agent (open-ended, model-driven tool use), there are four distinct ways to build one. Two independent questions separate them: who supplies the harness (the agent loop + context management) and who supplies the deployment (the infra the agent runs on). The Tool Runner and the Claude Agent SDK both supply a harness only — you still host and deploy them yourself — which is why they're easy to conflate. Managed Agents (CMA) is the only option that supplies both the harness and managed deployment; the manual loop supplies neither.

#ApproachYou writeHarness & deploymentTools availableUse when
1Claude API — manual loopThe while stop_reason == "tool_use" loop yourselfYou build the harness; you hostOnly tools you defineYou want to own the entire loop — no beta dependency, or a control flow the Tool Runner's per-turn hooks don't fit
2Claude API — Tool Runner (client.beta.messages.tool_runner + @beta_tool / betaZodTool)Just the tool functionsSDK supplies the loop (harness only); you hostOnly tools you defineA custom-tool agent without hand-writing the loop (most cases). Per-turn hooks still give you approval gates, error interception, result modification (e.g. cache_control), retries, streaming, and compaction
3Managed Agents (REST, beta)Agent config + your tool resultsAnthropic supplies the harness and hosts a per-session sandbox (harness + deployment)Anthropic-hosted sandbox (bash, files, code exec) + Skills/MCP + your toolsYou want Anthropic to run the loop and host the per-session workspace; persisted/versioned configs; long-running sessions
4Claude Agent SDK — separate product (claude-agent-sdk / @anthropic-ai/claude-agent-sdk)A prompt + optionsSDK supplies the Claude Code harness + built-in tools (harness only); you hostBuilt-in Read/Write/Edit/Bash/Glob/Grep/WebSearch/WebFetch + MCP + subagentsYou want a batteries-included coding/filesystem agent running on your own infra

The harness/deployment split is the key mental model: options 1, 2, and 4 all leave deployment to you; only option 3 (CMA) adds managed deployment. Options 1–3 are what this skill generates; option 4 is a different library with its own docs — see the disambiguation below.

Tool Runner ≠ Claude Agent SDK. These sound alike but are different packages:

  • Tool Runner is part of the regular Anthropic API SDK (anthropic / @anthropic-ai/sdk), reached via client.beta.messages.tool_runner. It automates the request → execute → loop cycle for tools you define. No built-in tools, no filesystem access, no sandbox — you supply every tool and host the compute. It is option 2 above, a thin helper over POST /v1/messages.
  • Claude Agent SDK (claude-agent-sdk / @anthropic-ai/claude-agent-sdk) is Claude Code packaged as a library. It ships built-in tools (file read/write/edit, bash, grep, web search), the full agent loop, context management, hooks, subagents, permissions, and sessions. You call query(prompt, options) and it drives everything.

Both are harness-only — you host and deploy them. The difference is scope of harness: the Tool Runner loops over tools you define (with per-turn hooks for approval, interception, result modification, and retries — but no built-in tools); the Agent SDK is the full Claude Code harness with built-in tools. Neither provides managed deployment — that's what Managed Agents (CMA) adds (Anthropic hosts the loop and a per-session sandbox).

This skill covers the Claude API and Managed Agents (options 1–3); it does not generate Claude Agent SDK code. If the user actually wants the Claude Agent SDK, point them to its docs (code.claude.com/docs/en/agent-sdk) — don't substitute the API Tool Runner for it, or vice-versa.

Should I Build an Agent?

Before choosing the agent tier, check all four criteria:

  • Complexity — Is the task multi-step and hard to fully specify in advance? (e.g., "turn this design doc into a PR" vs. "extract the title from this PDF")
  • Value — Does the outcome justify higher cost and latency?
  • Viability — Is Claude capable at this task type?
  • Cost of error — Can errors be caught and recovered from? (tests, review, rollback)

If the answer is "no" to any of these, stay at a simpler tier (single call or workflow).


Architecture

Everything goes through POST /v1/messages. Tools and output constraints are features of this single endpoint — not separate APIs.

User-defined tools — You define tools (via decorators, Zod schemas, or raw JSON), and the SDK's tool runner handles calling the API, executing your functions, and looping until Claude is done. For full control, you can write the loop manually.

Server-side tools — Anthropic-hosted tools that run on Anthropic's infrastructure. Code execution is fully server-side (declare it in tools, Claude runs code automatically). Computer use can be server-hosted or self-hosted.

Structured outputs — Constrains the Messages API response format (output_config.format) and/or tool parameter validation (strict: true). The recommended approach is client.messages.parse() which validates responses against your schema automatically. Note: the old output_format parameter is deprecated; use output_config: {format: {...}} on messages.create().

Supporting endpoints — Batches (POST /v1/messages/batches), Files (POST /v1/files), Token Counting (POST /v1/messages/count_tokens — see shared/token-counting.md), and Models (GET /v1/models, GET /v1/models/{id} — live capability/context-window discovery) feed into or support Messages API requests.


Current Models (cached: 2026-06-24)

ModelModel IDContextInput $/1MOutput $/1M
Claude Fable 5claude-fable-51M$10.00$50.00
Claude Mythos 5 (Project Glasswing only)claude-mythos-51M$10.00$50.00
Claude Opus 5claude-opus-51M$5.00$25.00
Claude Opus 4.8claude-opus-4-81M$5.00$25.00
Claude Opus 4.7claude-opus-4-71M$5.00$25.00
Claude Opus 4.6claude-opus-4-61M$5.00$25.00
Claude Sonnet 5claude-sonnet-51M$3.00 ($2.00 intro through 2026-08-31)$15.00 ($10.00 intro)
Claude Sonnet 4.6claude-sonnet-4-61M$3.00$15.00
Claude Haiku 4.5claude-haiku-4-5200K$1.00$5.00

Partner pricing: The prices above are Anthropic first-party API rates — they also apply to Claude on Microsoft Foundry, which is billed through the Microsoft Marketplace at standard API rates. Claude on Amazon Bedrock and Vertex AI is partner-operated with separate pricing — see Bedrock or Vertex AI. For WebFetch, use the Pricing row in shared/live-sources.md.

ALWAYS use claude-opus-5 unless the user explicitly names a different model. This is non-negotiable. Do not use claude-sonnet-5, claude-sonnet-4-6, or any other model unless the user literally says "use sonnet" or "use haiku". Never downgrade for cost — that's the user's decision, not yours. Use claude-fable-5 only when the user explicitly asks for Claude Fable 5, "fable", or Anthropic's most capable model — it has different API behavior than the Opus family (see below) and pricing that exceeds Opus-tier. Use only the exact model ID strings from the table — they are complete as-is; never append date suffixes (claude-sonnet-4-6, never claude-sonnet-4-6-20251114 or any other date-suffixed variant you might recall from training data). If the user requests an older model not in the table (e.g., "opus 4.5", "sonnet 3.7"), read shared/models.md for the exact ID — do not construct one yourself.

Claude Fable 5 (claude-fable-5) — most capable widely released model

Claude Fable 5 is Anthropic's most capable widely released model, for the most demanding reasoning and long-horizon agentic work; everything below also applies to Claude Mythos 5 (claude-mythos-5, Project Glasswing — same capabilities, pricing, and API surface; successor to the invitation-only claude-mythos-preview). 1M context window (the maximum is also the default), 128K max output. Key API differences from Opus-tier — see shared/model-migration.md → Migrating to Claude Fable 5 for details:

Shortened here. Read the whole file on GitHub.

Signals

GitHub stars
23
Forks
1
Last commit
Aug 2026
Hacker News mentions
3

ahel review

  • K1binfo
    installs-packages (in python/claude-api/README.md)
  • K1binfo
    installs-packages (in python/claude-api/tool-use.md)
  • K1binfo
    installs-packages (in python/managed-agents/README.md)
  • K1binfo
    installs-packages (in ruby/claude-api/README.md)
  • K1binfo
    installs-packages (in ruby/managed-agents/README.md)
  • K1binfo
    installs-packages (in shared/anthropic-cli.md)
  • K1binfo
    installs-packages (in shared/claude-platform-on-aws.md)

Automated review, not a security audit. Ruleset v1+k2.

Advanced
Item type
skill
Key
claude-api-justinlietz93
Source
github.com/justinlietz93/perfect_prompts