claude-api

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-science tasks.

Building LLM-Powered Applications with Claude

Choose the right surface, detect the project language, read the relevant docs.

What You Get

  • Language-detected SDK examples (Python, TypeScript, Go, Elixir, Rust, Lua, cURL)
  • Decision tree: single call vs workflow vs agent vs Agent SDK
  • Current model IDs, thinking/effort config, caching patterns
  • Tool use patterns (tool runner, manual loop, code execution)
  • Error taxonomy and live documentation URLs

Top Pitfalls (quick reference)

MistakeFix
Using budget_tokens on Opus 4.6 / Sonnet 4.6Use thinking: {type: "adaptive"} -- budget_tokens is deprecated
Lowballing max_tokensDefault ~16K non-streaming, ~64K streaming. Truncation = wasted retry
Prefilling assistant message on Opus 4.6Returns 400. Use structured outputs or system prompt instead
Silent cache invalidationCheck usage.cache_read_input_tokens. Common culprit: datetime.now() in system prompt
Redefining SDK typesUse Anthropic.MessageParam, Anthropic.Tool, etc. -- don't roll your own

Full list: shared/pitfalls.md

Defaults

Use Claude Opus 4.6 (claude-opus-4-6) unless the user names a different model. Use adaptive thinking (thinking: {type: "adaptive"}) for anything remotely complicated. Use streaming for long input/output -- .get_final_message() / .finalMessage() if you don't need individual events.

Language Detection

Infer from project files:

  • *.py, pyproject.toml, requirements.txt -> Python -- read from python/
  • *.ts, *.tsx, package.json, tsconfig.json -> TypeScript -- read from typescript/
  • *.js, *.jsx (no .ts present) -> TypeScript -- JS uses the same SDK
  • *.go, go.mod -> Go -- read from go/
  • *.ex, *.exs, mix.exs -> Elixir -- read from elixir/
  • *.rs, Cargo.toml -> Rust -- read from rust/
  • *.lua, .luarc.json -> Lua -- read from lua/

If ambiguous, ask. If unsupported language, suggest curl/ examples.

Which Surface?

Use CaseSurface
Single call (classify, summarize)Claude API
Multi-step pipeline, your toolsClaude API + tool use
Agent needing file/web/terminalAgent SDK
Custom agent, your own toolsClaude API agentic loop

Decision tree and "Should I Build an Agent?" criteria: shared/surfaces.md

Reading Guide

TaskRead
Single call (classify/summarize/extract){lang}/claude-api/README.md
Chat UI / streaming+ {lang}/claude-api/streaming.md
Long conversations (context overflow)+ Compaction section; details: shared/thinking-effort.md
Prompt caching / cache optimizationshared/prompt-caching.md + {lang}/claude-api/README.md
Tool use / function calling / agents+ shared/tool-use-concepts.md + {lang}/claude-api/tool-use.md
Batch processing+ {lang}/claude-api/batches.md
File uploads across requests+ {lang}/claude-api/files-api.md
Agent with built-in tools{lang}/agent-sdk/README.md + {lang}/agent-sdk/patterns.md
Model selection / capabilitiesshared/models.md
Thinking, effort, compactionshared/thinking-effort.md
Error handlingshared/error-codes.md

Go, Elixir, Rust, Lua, cURL: single file covers all basics. Read that plus shared/ files as needed.

When to Use WebFetch

Use when user asks for "latest" info, cached data seems wrong, or features aren't covered here. URLs: shared/live-sources.md.