AI Security

Erori API Claude: Ghid complet de depanare

Nicu Constantin
--6 min lectura
#claude#anthropic#api#troubleshooting#llm

Claude de la Anthropic este un AI puternic, dar erorile API pot fi frustrante. Acest ghid acopera toate erorile comune ale API-ului Claude si solutiile lor.

Eroare: 401 Authentication Error

Simptom:

{
  "type": "error",
  "error": {
    "type": "authentication_error",
    "message": "Invalid API Key"
  }
}

Solutia 1 - Verifica formatul cheii API:

import anthropic
 
# Claude API keys start with "sk-ant-"
# Example: sk-ant-api03-xxxxxxxxxxxxxxxx
 
# Check your key
api_key = os.environ.get("ANTHROPIC_API_KEY")
print(f"Key prefix: {api_key[:15]}..." if api_key else "No key found!")
 
# Correct initialization
client = anthropic.Anthropic()  # Uses ANTHROPIC_API_KEY env var
 
# Or explicit key
client = anthropic.Anthropic(api_key="sk-ant-api03-...")

Solutia 2 - Verifica variabila de mediu:

# .env file
ANTHROPIC_API_KEY=sk-ant-api03-your-key-here
 
# Verify it's loaded
python -c "import os; print(os.environ.get('ANTHROPIC_API_KEY', 'NOT SET')[:20])"

Solutia 3 - Regenereaza cheia:

  1. Mergi la https://console.anthropic.com
  2. Navigheaza la API Keys
  3. Creeaza o cheie noua
  4. Actualizeaza-ti aplicatia

Eroare: 429 Rate Limit Exceeded

Simptom:

{
  "type": "error",
  "error": {
    "type": "rate_limit_error",
    "message": "Rate limit exceeded"
  }
}

Solutia 1 - Implementeaza exponential backoff:

import anthropic
import time
from tenacity import retry, wait_exponential, stop_after_attempt
 
@retry(
    wait=wait_exponential(multiplier=1, min=4, max=60),
    stop=stop_after_attempt(5)
)
def call_claude_with_retry(messages):
    client = anthropic.Anthropic()
    return client.messages.create(
        model="claude-sonnet-4-20250514",
        max_tokens=1024,
        messages=messages
    )
 
# Usage
try:
    response = call_claude_with_retry([
        {"role": "user", "content": "Hello!"}
    ])
except anthropic.RateLimitError as e:
    print(f"Rate limit exceeded after retries: {e}")

Solutia 2 - Verifica headerele de rate limit:

# Claude returns rate limit info in headers
response = client.messages.with_raw_response.create(
    model="claude-sonnet-4-20250514",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Hi"}]
)
 
print(f"Requests remaining: {response.headers.get('x-ratelimit-remaining-requests')}")
print(f"Tokens remaining: {response.headers.get('x-ratelimit-remaining-tokens')}")

Solutia 3 - Solicita cresterea limitei:

Contacteaza Anthropic prin consola pentru limite mai mari in cazul utilizarii in productie.

Eroare: 400 Context Window Exceeded

Simptom:

{
  "type": "error",
  "error": {
    "type": "invalid_request_error",
    "message": "prompt is too long: 250000 tokens > 200000 maximum"
  }
}

Solutia 1 - Numara token-urile inainte de trimitere:

# Anthropic Python SDK includes token counting
client = anthropic.Anthropic()
 
# Count tokens (approximate)
def count_tokens_approx(text):
    # Rough estimate: ~4 characters per token
    return len(text) // 4
 
# Or use the API's token counting
def count_with_api(messages, model="claude-sonnet-4-20250514"):
    response = client.messages.count_tokens(
        model=model,
        messages=messages
    )
    return response.input_tokens

Solutia 2 - Trunchiaza mesajele:

def truncate_messages(messages, max_tokens=150000):
    """Keep recent messages within token limit."""
    # Start from most recent
    truncated = []
    total_tokens = 0
 
    for msg in reversed(messages):
        msg_tokens = count_tokens_approx(msg["content"])
        if total_tokens + msg_tokens > max_tokens:
            break
        truncated.insert(0, msg)
        total_tokens += msg_tokens
 
    return truncated

Solutia 3 - Foloseste un model cu context mai mare:

# Model context windows:
# claude-3-haiku: 200K tokens
# claude-sonnet-4: 200K tokens
# claude-opus-4: 200K tokens
 
# For very long documents, consider chunking
def process_long_document(doc, question):
    chunks = split_into_chunks(doc, chunk_size=50000)
    summaries = []
 
    for chunk in chunks:
        response = client.messages.create(
            model="claude-sonnet-4-20250514",
            max_tokens=1024,
            messages=[
                {"role": "user", "content": f"Summarize this section:\n{chunk}"}
            ]
        )
        summaries.append(response.content[0].text)
 
    # Final answer from summaries
    combined = "\n".join(summaries)
    final = client.messages.create(
        model="claude-sonnet-4-20250514",
        max_tokens=1024,
        messages=[
            {"role": "user", "content": f"Based on these summaries, answer: {question}\n\n{combined}"}
        ]
    )
    return final.content[0].text

Eroare: 529 Overloaded

Simptom:

{
  "type": "error",
  "error": {
    "type": "overloaded_error",
    "message": "Overloaded"
  }
}

Cauza: Serverele Anthropic sunt la capacitate maxima.

Solutia - Retry cu backoff:

import anthropic
from tenacity import retry, wait_exponential, retry_if_exception_type
 
@retry(
    retry=retry_if_exception_type(anthropic.APIStatusError),
    wait=wait_exponential(multiplier=2, min=5, max=120),
    stop=stop_after_attempt(5)
)
def robust_claude_call(messages):
    client = anthropic.Anthropic()
    return client.messages.create(
        model="claude-sonnet-4-20250514",
        max_tokens=1024,
        messages=messages
    )
 
# The retry decorator handles 529 automatically

Eroare: Blocare de moderare a continutului

Simptom:

{
  "type": "error",
  "error": {
    "type": "invalid_request_error",
    "message": "Output blocked by content filtering policy"
  }
}

Solutia 1 - Verifica input-ul pentru incalcari ale politicii:

# Common triggers:
# - Requests for harmful content
# - Attempts to jailbreak
# - Explicit content requests
 
# If your legitimate use case is blocked:
# 1. Rephrase the request
# 2. Add context explaining legitimate purpose
# 3. Contact Anthropic for enterprise solutions

Solutia 2 - Gestioneaza cu gratie:

def safe_claude_call(messages):
    try:
        response = client.messages.create(
            model="claude-sonnet-4-20250514",
            max_tokens=1024,
            messages=messages
        )
        return response.content[0].text
 
    except anthropic.BadRequestError as e:
        if "content filtering" in str(e).lower():
            return "I can't help with that request. Please try rephrasing."
        raise

Eroare: Timeout

Simptom:

anthropic.APITimeoutError: Request timed out

Solutia 1 - Creste timeout-ul:

client = anthropic.Anthropic(
    timeout=120.0  # 2 minutes
)
 
# Or per-request
response = client.messages.create(
    model="claude-sonnet-4-20250514",
    max_tokens=1024,
    messages=messages,
    timeout=180.0  # 3 minutes for long responses
)

Solutia 2 - Foloseste streaming:

# Streaming avoids timeout for long responses
with client.messages.stream(
    model="claude-sonnet-4-20250514",
    max_tokens=4096,
    messages=[{"role": "user", "content": "Write a detailed essay..."}]
) as stream:
    for text in stream.text_stream:
        print(text, end="", flush=True)

Eroare: Format invalid de mesaje

Simptom:

{
  "type": "error",
  "error": {
    "type": "invalid_request_error",
    "message": "messages: roles must alternate between user and assistant"
  }
}

Solutia - Corecteaza structura mesajelor:

# ❌ Wrong - consecutive user messages
messages = [
    {"role": "user", "content": "Hello"},
    {"role": "user", "content": "How are you?"}  # Error!
]
 
# ✅ Correct - alternating roles
messages = [
    {"role": "user", "content": "Hello"},
    {"role": "assistant", "content": "Hi there!"},
    {"role": "user", "content": "How are you?"}
]
 
# ✅ Or combine consecutive messages
messages = [
    {"role": "user", "content": "Hello\n\nHow are you?"}
]

Gestionarea system prompt-ului:

# Claude uses system parameter, not system role in messages
response = client.messages.create(
    model="claude-sonnet-4-20250514",
    max_tokens=1024,
    system="You are a helpful assistant.",  # System prompt here!
    messages=[
        {"role": "user", "content": "Hello"}
    ]
)

Referinta rapida: Claude vs OpenAI

| Functionalitate | Claude (Anthropic) | OpenAI | |-----------------|-------------------|--------| | Prefix cheie API | sk-ant- | sk- | | System prompt | parametru system | Mesaj cu rol "system" | | Acces la raspuns | response.content[0].text | response.choices[0].message.content | | Header rate limit | x-ratelimit-remaining-requests | La fel | | Context maxim | 200K token-uri | Variaza dupa model |

Setup pentru productie

import anthropic
from tenacity import retry, wait_exponential, stop_after_attempt
import logging
 
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
 
class ClaudeClient:
    def __init__(self):
        self.client = anthropic.Anthropic(timeout=60.0)
 
    @retry(
        wait=wait_exponential(multiplier=1, min=2, max=60),
        stop=stop_after_attempt(5)
    )
    def chat(self, messages, system=None, max_tokens=1024):
        try:
            kwargs = {
                "model": "claude-sonnet-4-20250514",
                "max_tokens": max_tokens,
                "messages": messages
            }
            if system:
                kwargs["system"] = system
 
            response = self.client.messages.create(**kwargs)
            return response.content[0].text
 
        except anthropic.RateLimitError:
            logger.warning("Rate limited, retrying...")
            raise  # Let tenacity handle
 
        except anthropic.BadRequestError as e:
            logger.error(f"Bad request: {e}")
            raise
 
# Usage
claude = ClaudeClient()
response = claude.chat(
    messages=[{"role": "user", "content": "Hello!"}],
    system="You are a helpful assistant."
)

Construiesti cu Claude?

Aplicatiile Claude pentru productie necesita o arhitectura robusta. Echipa noastra ofera:

  • Dezvoltare de integrari Claude
  • Gestionare erori si rezilienta
  • Optimizarea costurilor
  • Audituri de securitate

Obtine expertiza Claude

Ai nevoie de ajutor cu conformitatea EU AI Act sau securitatea AI?

Programeaza o consultatie gratuita de 30 de minute. Fara obligatii.

Programeaza un Apel

Weekly AI Security & Automation Digest

Get the latest on AI Security, workflow automation, secure integrations, and custom platform development delivered weekly.

No spam. Unsubscribe anytime.