Skip to main content
skill CX Codex

anthropic-claude-development — Claude Code skill: build on the

A skill that turns your agent into a guide for Anthropic Claude API work: Messages API, tool use, prompt engineering and production apps.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add Mindrally/skills --skill anthropic-claude-development -a claude-code
Open on GitHub

What anthropic-claude-development does

The skill loads a set of instructions that frame the agent as an expert in Anthropic Claude API development. The examples are Python: creating a client, calling client.messages.create, streaming with client.messages.stream, and sending images by URL or as base64. A separate section covers tool use — declaring tools with input_schema, checking for stop_reason == "tool_use", and feeding the result back into the conversation.

Prompt engineering gets its own block: system prompts, XML tags for structure, few-shot examples, chain-of-thought. Error handling covers RateLimitError, APIError and AuthenticationError, with a retry helper that backs off exponentially. Model choice is mapped to tasks: claude-opus-4-20250514 for hard reasoning, claude-sonnet-4-20250514 for a balance of cost and quality, claude-3-5-haiku-20241022 for fast replies.

One rule shows up again and again: never hardcode the API key, keep it in environment variables. For local work the skill points to python-dotenv and separate keys for development and production. If your key currently sits in a script, that is worth a look before the next commit.

What it helps with

  • call the Messages API from Python with a correct request shape
  • declare a tool and handle a tool_use stop reason
  • stream a model response token by token
  • pick a Claude model for the task at hand
  • add retries when a RateLimitError hits

Example prompts for the agent

  • show me how to call the Messages API with a system prompt
  • write the tool_use handling that sends the result back
  • add exponential backoff retries for RateLimitError

How to install anthropic-claude-development

1Skills CLI (Vercel)

npx skills add Mindrally/skills --skill anthropic-claude-development -a claude-code

2Manually: put the files in place

~/.claude/skills/anthropic-claude-development/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/anthropic-claude-development/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about anthropic-claude-development

How do I install anthropic-claude-development in Claude?

Run npx skills add Mindrally/skills --skill anthropic-claude-development -a claude-code. The skill then lives at ~/.claude/skills/anthropic-claude-development/SKILL.md.

What does anthropic-claude-development do?

It gives the agent guidance on Anthropic Claude API development: the Messages API, streaming, tool use, image inputs, prompt engineering, and error handling with retries.

What do I need before using it?

Python and the anthropic library. The skill advises keeping your key in the ANTHROPIC_API_KEY environment variable rather than in code.

Source text

SKILL.md · Apache-2.0
---
name: anthropic-claude-development
description: Expert guidance for Anthropic Claude API development including Messages API, tool use, prompt engineering, and building production applications with Claude models.
metadata:
  maintainer: Mindrally
  source: https://github.com/Mindrally/skills
---

# Anthropic Claude API Development

You are an expert in Anthropic Claude API development, including the Messages API, tool use, prompt engineering, and building production-ready applications with Claude models.

## Key Principles

- Write concise, technical responses with accurate Python examples
- Use type hints for all function signatures
- Follow Claude's usage policies and guidelines
- Implement proper error handling and retry logic
- Never hardcode API keys; use environment variables

## Setup and Configuration

### Environment Setup

```python
import os
from anthropic import Anthropic

# Always use environment variables for API keys
client = Anthropic(api_key=os.environ.get("ANTHROPIC_API_KEY"))
```

### Best Practices

- Store API keys in `.env` files, never commit them
- Use `python-dotenv` for local development
- Set up separate keys for development and production
- Configure proper timeout settings for your use case

## Messages API

### Basic Usage

```python
from anthropic import Anthropic

client = Anthropic()

message = client.messages.create(
    model="claude-sonnet-4-20250514",
    max_tokens=1024,
    system="You are a helpful assistant.",
    messages=[
        {"role": "user", "content": "Hello, Claude!"}
    ]
)

print(message.content[0].text)
```

### Streaming Responses

```python
with client.messages.stream(
    model="claude-sonnet-4-20250514",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Write a story"}]
) as stream:
    for text in stream.text_stream:
        print(text, end="", flush=True)
```

### Model Selection

- Use `claude-opus-4-20250514` for complex reasoning and analysis
- Use `claude-sonnet-4-20250514` for balanced performance and cost
- Use `claude-3-5-haiku-20241022` for fast, efficient responses
- Consider task complexity when selecting models

## Tool Use (Function Calling)

### Defining Tools

```python
tools = [
    {
        "name": "get_weather",
        "description": "Get the current weather in a given location",
        "input_schema": {
            "type": "object",
            "properties": {
                "location": {
                    "type": "string",
                    "description": "The city and state, e.g., San Francisco, CA"
                },
                "unit": {
                    "type": "string",
                    "enum": ["celsius", "fahrenheit"],
                    "description": "The unit of temperature"
                }
            },
            "required": ["location"]
        }
    }
]

response = client.messages.create(
    model="claude-sonnet-4-20250514",
    max_tokens=1024,
    tools=tools,
    messages=[{"role": "user", "content": "What's the weather in London?"}]
)
```

### Handling Tool Calls

```python
import json

def process_tool_use(response, messages, tools):
    # Check if Claude wants to use a tool
    if response.stop_reason == "tool_use":
        tool_use_block = next(
            block for block in response.content
            if block.type == "tool_use"
        )

        tool_name = tool_use_block.name
        tool_input = tool_use_block.input

        # Execute the tool
        tool_result = execute_tool(tool_name, tool_input)

        # Continue the conversation
        messages.append({"role": "assistant", "content": response.content})
        messages.append({
            "role": "user",
            "content": [{
                "type": "tool_result",
                "tool_use_id": tool_use_block.id,
                "content": json.dumps(tool_result)
            }]
        })

        # Get final response
        return client.messages.create(
            model="claude-sonnet-4-20250514",
            max_tokens=1024,
            tools=tools,
            messages=messages
        )

    return response
```

## Vision and Multimodal

### Image Analysis

```python
import base64

# From URL
message = client.messages.create(
    model="claude-sonnet-4-20250514",
    max_tokens=1024,
    messages=[{
        "role": "user",
        "content": [
            {
                "type": "image",
                "source": {
                    "type": "url",
                    "url": "https://example.com/image.jpg"
                }
            },
            {
                "type": "text",
                "text": "Describe this image in detail."
            }
        ]
    }]
)

# From base64
with open("image.png", "rb") as f:
    image_data = base64.standard_b64encode(f.read()).decode("utf-8")

message = client.messages.create(
    model="claude-sonnet-4-20250514",
    max_tokens=1024,
    messages=[{
        "role": "user",
        "content": [
            {
                "type": "image",
                "source": {
                    "type": "base64",
                    "media_type": "image/png",
                    "data": image_data
                }
            },
            {
                "type": "text",
                "text": "What do you see?"
            }
        ]
    }]
)
```

## Prompt Engineering for Claude

### System Prompts

- Be clear and specific about the assistant's role
- Include relevant context and constraints
- Specify output format when needed
- Use XML tags for structured instructions

```python
system_prompt = """You are a technical documentation writer.

<guidelines>
- Write clear, concise documentation
- Use proper markdown formatting
- Include code examples where appropriate
- Follow the Google developer documentation style guide
</guidelines>

<output_format>
Always structure your response with:
1. Overview
2. Prerequisites
3. Step-by-step instructions
4. Examples
5. Troubleshooting
</output_format>
"""
```

### Prompting Best Practices

- Use XML tags to structure complex prompts
- Provide examples for few-shot learning
- Be explicit about what you want and don't want
- Use chain-of-thought prompting for complex reasoning
- Specify the desired output format clearly

## Error Handling

### Retry Logic

```python
from anthropic import RateLimitError, APIError
import time

def call_with_retry(func, max_retries=3, base_delay=1):
    for attempt in range(max_retries):
        try:
            return func()
        except RateLimitError:
            delay = base_delay * (2 ** attempt)
            print(f"Rate limited. Retrying in {delay}s...")
            time.sleep(delay)
        except APIError as e:
            if attempt == max_retries - 1:
                raise
            time.sleep(base_delay)
    raise Exception("Max retries exceeded")
```

### Common Error Types

- `RateLimitError`: Implement exponential backoff
- `APIError`: Check API status, retry with backoff
- `AuthenticationError`: Verify API key
- `BadRequestError`: Validate input parameters

## Prompt Caching

### Using Caching

```python
# Enable caching for frequently used context
response = client.messages.create(
    model="claude-sonnet-4-20250514",
    max_tokens=1024,
    system=[{
        "type": "text",
        "text": "Large context that should be cached...",
        "cache_control": {"type": "ephemeral"}
    }],
    messages=[{"role": "user", "content": "Question about the context"}]
)
```

### Caching Best Practices

- Cache large, static content like documentation
- Place cached content at the beginning of the prompt
- Monitor cache hit rates for optimization
- Use caching for repeated similar queries

## Message Batches API

### Batch Processing

```python
# Create a batch for non-time-sensitive requests
batch = client.messages.batches.create(
    requests=[
        {
            "custom_id": "request-1",
            "params": {
                "model": "claude-sonnet-4-20250514",
                "max_tokens": 1024,
                "messages": [{"role": "user", "content": "Question 1"}]
            }
        },
        {
            "custom_id": "request-2",
            "params": {
                "model": "claude-sonnet-4-20250514",
                "max_tokens": 1024,
                "messages": [{"role": "user", "content": "Question 2"}]
            }
        }
    ]
)
```

## Cost Optimization

- Use appropriate models for task complexity
- Implement prompt caching for repeated context
- Use batches for non-urgent requests
- Set reasonable `max_tokens` limits
- Cache responses when appropriate
- Monitor token usage patterns

## Security Best Practices

- Never expose API keys in client-side code
- Implement rate limiting on your endpoints
- Validate and sanitize user inputs
- Log API usage for monitoring and auditing
- Follow Anthropic's acceptable use policy

## Dependencies

- anthropic
- python-dotenv
- pydantic (for input validation)
- tenacity (for retry logic)

© Mindrally · Apache-2.0 · Mindrally/skills

Similar skills

Everything for AI and ML →

From the same set214

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor