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:
- Mergi la https://console.anthropic.com
- Navigheaza la API Keys
- Creeaza o cheie noua
- 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_tokensSolutia 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 truncatedSolutia 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].textEroare: 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 automaticallyEroare: 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 solutionsSolutia 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."
raiseEroare: 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