claude-api
affaan-m/everything-claude-code
Anthropic Claude API patterns for Python and TypeScript with streaming, tool use, vision, and batches.
What is claude-api?
Reference for building applications with the Claude API and SDKs. Covers the Messages API, streaming, tool use, vision capabilities, extended thinking, prompt caching, batches, and agent workflows. Use when integrating Claude into Python or TypeScript applications.
- Call Claude models via Python or TypeScript SDKs with the Messages API
- Stream responses for real-time output and better UX
- Define and execute tools for Claude to call external functions
- Send images for vision-based analysis and understanding
- Use extended thinking for complex multi-step reasoning tasks
- Cache large system prompts to reduce token costs by up to 90%
How to install claude-api
npx skills add https://github.com/affaan-m/everything-claude-code --skill claude-api- Python 3.7+ with `pip install anthropic` or Node.js with `npm install @anthropic-ai/sdk`
- Anthropic API key set in ANTHROPIC_API_KEY environment variable
How to use claude-api
- 1.Install the SDK for your language (Python or TypeScript)
- 2.Set your ANTHROPIC_API_KEY environment variable
- 3.Create a client instance and call client.messages.create() with your model and messages
- 4.For streaming, use client.messages.stream() and iterate over text events
- 5.For tool use, define tools in the request and handle tool_use blocks in the response
- 6.For vision, encode images as base64 and include them in message content
- 7.For batches, create requests with client.messages.batches.create() and poll for results
- 8.For cost optimization, use prompt caching with cache_control or switch to Haiku for simple tasks
Use cases
- Building chatbots or conversational interfaces that call Claude
- Processing images for analysis, OCR, or diagram understanding
- Creating agents that search codebases, databases, or APIs via tool use
- Optimizing costs for high-volume or repeated API calls with caching and batches
- Implementing complex reasoning tasks with extended thinking
- Backend developers building Claude-powered applications
- AI engineers implementing agent workflows
- Teams optimizing API costs and latency
- Full-stack developers integrating Claude into web or mobile apps
claude-api FAQ
Default to Sonnet 4 (claude-sonnet-4-0) for most tasks. Use Opus 4.1 for complex reasoning and research. Use Haiku 3.5 for speed and cost-sensitive applications. For production, use pinned snapshot IDs instead of aliases.
Use prompt caching (up to 90% savings on cached tokens), Batches API (50% reduction for non-urgent requests), or switch to Haiku for simple tasks (~75% cheaper). Streaming has the same cost but improves UX.
Define tools with name, description, and input_schema. Pass them in the request. Handle tool_use blocks in the response, execute the tool, and send results back in a follow-up message with tool_result blocks.
Yes. Encode images as base64 and include them in message content with type 'image'. Specify the media type (image/png, image/jpeg, etc.). Claude can analyze, describe, and extract information from images.
Create a loop that calls messages.create() with tools defined. Check the stop_reason. If it's 'tool_use', execute the tool and append the result to messages. Continue until stop_reason is 'end_turn'.
Full instructions (SKILL.md)
Source of truth, from affaan-m/everything-claude-code.
name: claude-api description: Anthropic Claude API patterns for Python and TypeScript. Covers Messages API, streaming, tool use, vision, extended thinking, batches, prompt caching, and Claude Agent SDK. Use when building applications with the Claude API or Anthropic SDKs. origin: ECC
Claude API
Build applications with the Anthropic Claude API and SDKs.
When to Activate
- Building applications that call the Claude API
- Code imports
anthropic(Python) or@anthropic-ai/sdk(TypeScript) - User asks about Claude API patterns, tool use, streaming, or vision
- Implementing agent workflows with Claude Agent SDK
- Optimizing API costs, token usage, or latency
Model Selection
| Model | ID | Best For |
|---|---|---|
| Opus 4.1 | claude-opus-4-1 | Complex reasoning, architecture, research |
| Sonnet 4 | claude-sonnet-4-0 | Balanced coding, most development tasks |
| Haiku 3.5 | claude-3-5-haiku-latest | Fast responses, high-volume, cost-sensitive |
Default to Sonnet 4 unless the task requires deep reasoning (Opus) or speed/cost optimization (Haiku). For production, prefer pinned snapshot IDs over aliases.
Python SDK
Installation
pip install anthropic
Basic Message
import anthropic
client = anthropic.Anthropic() # reads ANTHROPIC_API_KEY from env
message = client.messages.create(
model="claude-sonnet-4-0",
max_tokens=1024,
messages=[
{"role": "user", "content": "Explain async/await in Python"}
]
)
print(message.content[0].text)
Streaming
with client.messages.stream(
model="claude-sonnet-4-0",
max_tokens=1024,
messages=[{"role": "user", "content": "Write a haiku about coding"}]
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
System Prompt
message = client.messages.create(
model="claude-sonnet-4-0",
max_tokens=1024,
system="You are a senior Python developer. Be concise.",
messages=[{"role": "user", "content": "Review this function"}]
)
TypeScript SDK
Installation
npm install @anthropic-ai/sdk
Basic Message
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic(); // reads ANTHROPIC_API_KEY from env
const message = await client.messages.create({
model: "claude-sonnet-4-0",
max_tokens: 1024,
messages: [
{ role: "user", content: "Explain async/await in TypeScript" }
],
});
console.log(message.content[0].text);
Streaming
const stream = client.messages.stream({
model: "claude-sonnet-4-0",
max_tokens: 1024,
messages: [{ role: "user", content: "Write a haiku" }],
});
for await (const event of stream) {
if (event.type === "content_block_delta" && event.delta.type === "text_delta") {
process.stdout.write(event.delta.text);
}
}
Tool Use
Define tools and let Claude call them:
tools = [
{
"name": "get_weather",
"description": "Get current weather for a location",
"input_schema": {
"type": "object",
"properties": {
"location": {"type": "string", "description": "City name"},
"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
},
"required": ["location"]
}
}
]
message = client.messages.create(
model="claude-sonnet-4-0",
max_tokens=1024,
tools=tools,
messages=[{"role": "user", "content": "What's the weather in SF?"}]
)
# Handle tool use response
for block in message.content:
if block.type == "tool_use":
# Execute the tool with block.input
result = get_weather(**block.input)
# Send result back
follow_up = client.messages.create(
model="claude-sonnet-4-0",
max_tokens=1024,
tools=tools,
messages=[
{"role": "user", "content": "What's the weather in SF?"},
{"role": "assistant", "content": message.content},
{"role": "user", "content": [
{"type": "tool_result", "tool_use_id": block.id, "content": str(result)}
]}
]
)
Vision
Send images for analysis:
import base64
with open("diagram.png", "rb") as f:
image_data = base64.standard_b64encode(f.read()).decode("utf-8")
message = client.messages.create(
model="claude-sonnet-4-0",
max_tokens=1024,
messages=[{
"role": "user",
"content": [
{"type": "image", "source": {"type": "base64", "media_type": "image/png", "data": image_data}},
{"type": "text", "text": "Describe this diagram"}
]
}]
)
Extended Thinking
For complex reasoning tasks:
message = client.messages.create(
model="claude-sonnet-4-0",
max_tokens=16000,
thinking={
"type": "enabled",
"budget_tokens": 10000
},
messages=[{"role": "user", "content": "Solve this math problem step by step..."}]
)
for block in message.content:
if block.type == "thinking":
print(f"Thinking: {block.thinking}")
elif block.type == "text":
print(f"Answer: {block.text}")
Prompt Caching
Cache large system prompts or context to reduce costs:
message = client.messages.create(
model="claude-sonnet-4-0",
max_tokens=1024,
system=[
{"type": "text", "text": large_system_prompt, "cache_control": {"type": "ephemeral"}}
],
messages=[{"role": "user", "content": "Question about the cached context"}]
)
# Check cache usage
print(f"Cache read: {message.usage.cache_read_input_tokens}")
print(f"Cache creation: {message.usage.cache_creation_input_tokens}")
Batches API
Process large volumes asynchronously at 50% cost reduction:
import time
batch = client.messages.batches.create(
requests=[
{
"custom_id": f"request-{i}",
"params": {
"model": "claude-sonnet-4-0",
"max_tokens": 1024,
"messages": [{"role": "user", "content": prompt}]
}
}
for i, prompt in enumerate(prompts)
]
)
# Poll for completion
while True:
status = client.messages.batches.retrieve(batch.id)
if status.processing_status == "ended":
break
time.sleep(30)
# Get results
for result in client.messages.batches.results(batch.id):
print(result.result.message.content[0].text)
Claude Agent SDK
Build multi-step agents:
# Note: Agent SDK API surface may change — check official docs
import anthropic
# Define tools as functions
tools = [{
"name": "search_codebase",
"description": "Search the codebase for relevant code",
"input_schema": {
"type": "object",
"properties": {"query": {"type": "string"}},
"required": ["query"]
}
}]
# Run an agentic loop with tool use
client = anthropic.Anthropic()
messages = [{"role": "user", "content": "Review the auth module for security issues"}]
while True:
response = client.messages.create(
model="claude-sonnet-4-0",
max_tokens=4096,
tools=tools,
messages=messages,
)
if response.stop_reason == "end_turn":
break
# Handle tool calls and continue the loop
messages.append({"role": "assistant", "content": response.content})
# ... execute tools and append tool_result messages
Cost Optimization
| Strategy | Savings | When to Use |
|---|---|---|
| Prompt caching | Up to 90% on cached tokens | Repeated system prompts or context |
| Batches API | 50% | Non-time-sensitive bulk processing |
| Haiku instead of Sonnet | ~75% | Simple tasks, classification, extraction |
| Shorter max_tokens | Variable | When you know output will be short |
| Streaming | None (same cost) | Better UX, same price |
Error Handling
import time
from anthropic import APIError, RateLimitError, APIConnectionError
try:
message = client.messages.create(...)
except RateLimitError:
# Back off and retry
time.sleep(60)
except APIConnectionError:
# Network issue, retry with backoff
pass
except APIError as e:
print(f"API error {e.status_code}: {e.message}")
Environment Setup
# Required
export ANTHROPIC_API_KEY="your-api-key-here"
# Optional: set default model
export ANTHROPIC_MODEL="claude-sonnet-4-0"
Never hardcode API keys. Always use environment variables.
Related skills
More from affaan-m/everything-claude-code and the wider catalog.

claude-devfleet
Orchestrate parallel coding tasks across multiple Claude agents with dependency chains and isolated worktrees.

click-path-audit
Trace button handlers through state changes to find bugs where functions undo each other or leave UI inconsistent.

clickhouse-io
ClickHouse patterns for high-performance analytics, query optimization, and data engineering at scale.

code-tour
Create guided CodeTour `.tour` files with real file anchors for onboarding, architecture, and PR walkthroughs.

codebase-onboarding
Analyze unfamiliar codebases and generate structured onboarding guides with architecture maps and starter CLAUDE.md files.

coding-standards
Baseline coding conventions for naming, readability, immutability, and quality across projects.