AI APIs sind der praktische Weg, große Modelle zu nutzen. Statt ein 70B Modell selbst zu hosten, machen dich APIs remote zu den Servern und bekommst Responses.
Was ist ein API?
API = Application Programming Interface. Eine Schnittstelle, über die deine Software mit dem Modell redet.
Praktisch:
Du → POST /v1/messages → OpenAI Server
OpenAI Server → Modell läuft → Response mit Text
OpenAI Server → JSON Response → Deine Anwendung
REST APIs: Das Standard-Format
Die meisten AI APIs sind REST APIs (Representational State Transfer).
REST nutzt HTTP-Methoden:
- POST: Sende Daten (Prompt), bekomme Antwort
- GET: Hole Informationen (z.B. Modellstatus)
- PUT: Update etwas
- DELETE: Lösche etwas
Beispiel POST Request (curl):
curl -X POST https://api.anthropic.com/v1/messages \
-H "x-api-key: YOUR_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-d '{
"model": "claude-3-sonnet-20240229",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "Was ist 2+2?"}
]
}'
Response (JSON):
{
"id": "msg_123abc",
"type": "message",
"role": "assistant",
"content": [
{"type": "text", "text": "2 + 2 = 4"}
],
"stop_reason": "end_turn"
}
Authentication: API Keys
Um eine API zu nutzen, brauchst du einen API Key. Das ist wie ein Passwort für die API.
Wichtig: Niemals den API Key in Code hardcoden oder auf GitHub posten!
Besser: Environment Variable:
# .env Datei (NICHT commitzen!)
ANTHROPIC_API_KEY=sk-ant-...
# Python
import os
api_key = os.getenv("ANTHROPIC_API_KEY")
Oder Secret Management Tools wie Vault, AWS Secrets Manager, etc.
Rate Limits
APIs haben Limits um Missbrauch zu verhindern.
Typische Limits:
- 100 Requests pro Minute (RPM)
- 100,000 Tokens pro Minute (TPM)
Wenn du das Limit überschreitest:
HTTP 429: Too Many Requests
Lösung: Exponential Backoff
import time
retries = 0
max_retries = 5
wait_time = 1
while retries < max_retries:
try:
response = api.make_request()
return response
except RateLimitError:
wait_time *= 2 # 1s → 2s → 4s → 8s → 16s
time.sleep(wait_time)
retries += 1
Preismodelle
Pay-Per-Token (OpenAI, Anthropic, Google)
Du zahlst pro Token (Input + Output):
Input: $1 pro 1M Tokens
Output: $3 pro 1M Tokens
Prompt: "Was ist AI?" (4 Tokens Input)
Antwort: "AI ist..." (50 Tokens Output)
Kosten: (4/1M * $1) + (50/1M * $3) = $0.00016
Pay-Per-Request (Alternative APIs)
Pauschale pro Request, egal Größe:
$0.10 pro Request
Gut für kleine Requests. Schlecht für große.
Subscription (z.B. ChatGPT Plus)
$20/Monat unlimited. Einfach, aber teuer wenn du viel nutzt.
Verschiedene AI APIs: Vergleich
| API | Modell | Input-Preis | Output-Preis | Latenz |
|---|---|---|---|---|
| OpenAI (GPT-4) | 175B+ | $30/1M | $60/1M | Schnell |
| Anthropic (Claude 3) | 200B+ | $3/1M | $15/1M | Mittel |
| Google (Gemini) | 200B+ | $1/1M | $2/1M | Schnell |
| Mistral | 70B+ | $0.25/1M | $0.75/1M | Mittel |
| Open WebUI (lokal) | - | Gratis | Gratis | Langsam |
Anthropic API Praktisch
Schritt 1: API Key holen
# Von https://console.anthropic.com/
export ANTHROPIC_API_KEY=sk-ant-...
Schritt 2: Python Request
import anthropic
client = anthropic.Anthropic()
message = client.messages.create(
model="claude-3-sonnet-20240229",
max_tokens=1024,
messages=[
{"role": "user", "content": "Schreib einen Limerick"}
]
)
print(message.content[0].text)
Schritt 3: Streaming (für bessere UX)
with client.messages.stream(
model="claude-3-sonnet-20240229",
max_tokens=1024,
messages=[{"role": "user", "content": "Hallo"}]
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
OpenAI API Praktisch
Ähnlich, aber mit unterschiedlichen Endpoints:
from openai import OpenAI
client = OpenAI(api_key="sk-...")
response = client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": "Hi"}]
)
print(response.choices[0].message.content)
Error Handling
APIs schlagen fehl. Sei vorbereitet:
try:
response = client.messages.create(...)
except anthropic.RateLimitError:
print("Rate limited, retry later")
except anthropic.APIError as e:
print(f"API Error: {e}")
Häufige Fehler:
- 401 Unauthorized: API Key falsch
- 429 Too Many Requests: Rate limit
- 500 Internal Server Error: Server Problem
- 503 Service Unavailable: API Down
Best Practices
- API Keys sicher: Environment Variables, Vaults
- Rate Limits beachten: Backoff implementieren
- Timeouts setzen: Nicht endlos warten
response = client.messages.create( ..., timeout=30 # 30 Sekunden ) - Logging: Alle Requests loggen für Debugging
- Monitoring: Kosten tracken
tokens_used = response.usage.output_tokens cost = tokens_used / 1_000_000 * 0.015 print(f"This request cost: ${cost}")
Lokale Alternative: Ollama
Wenn du keine API zahlen möchtest:
# Installiere Ollama
ollama pull llama2
# Starte Server
ollama serve
# Nutze lokal
curl -X POST http://localhost:11434/api/generate \
-d '{"model":"llama2","prompt":"Hi"}'
Vorteil: Gratis, privat. Nachteil: Langsam (läuft auf deinem Rechner).
Production API Architecture
Beispiel: Multi-Provider Fallback
import anthropic
from openai import OpenAI
import time
class APIRouter:
def __init__(self):
self.providers = [
{
'name': 'Claude',
'client': anthropic.Anthropic(),
'priority': 1 # Try first
},
{
'name': 'OpenAI',
'client': OpenAI(),
'priority': 2 # Fallback
}
]
def call(self, prompt, max_retries=3):
sorted_providers = sorted(
self.providers,
key=lambda x: x['priority']
)
for provider in sorted_providers:
for attempt in range(max_retries):
try:
if provider['name'] == 'Claude':
response = provider['client'].messages.create(
model="claude-3-sonnet",
max_tokens=1024,
messages=[{"role": "user", "content": prompt}]
)
return response.content[0].text
elif provider['name'] == 'OpenAI':
response = provider['client'].chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}]
)
return response.choices[0].message.content
except anthropic.RateLimitError:
wait_time = 2 ** attempt # Exponential backoff
time.sleep(wait_time)
continue
except Exception as e:
print(f"Error with {provider['name']}: {e}")
break # Try next provider
raise Exception("All providers failed")
# Nutze es
router = APIRouter()
response = router.call("Was ist AI?")
Cost Tracking in Production
class APIUsageTracker:
def __init__(self):
self.usage = {
'claude': {'input': 0, 'output': 0},
'openai': {'input': 0, 'output': 0}
}
def track_claude(self, response):
self.usage['claude']['input'] += response.usage.input_tokens
self.usage['claude']['output'] += response.usage.output_tokens
def calculate_cost(self):
claude_cost = (
(self.usage['claude']['input'] / 1_000_000) * 0.003 +
(self.usage['claude']['output'] / 1_000_000) * 0.015
)
openai_cost = (
(self.usage['openai']['input'] / 1_000_000) * 0.005 +
(self.usage['openai']['output'] / 1_000_000) * 0.015
)
return {
'claude': claude_cost,
'openai': openai_cost,
'total': claude_cost + openai_cost
}
# Nutze es
tracker = APIUsageTracker()
response = claude_client.messages.create(...)
tracker.track_claude(response)
costs = tracker.calculate_cost()
print(f"Total cost today: ${costs['total']:.4f}")
API Security Best Practices
1. API Key Rotation
# Secret Management (mit Vault)
import os
from vault import client as vault
# VOR dem Expiry (z.B. monatlich):
old_key = os.getenv('ANTHROPIC_API_KEY')
# Create new key
response = vault.create_api_key('anthropic')
new_key = response['key']
# Update Environment
os.environ['ANTHROPIC_API_KEY'] = new_key
# Delete old key (nach Transition-Period)
# vault.delete_api_key(old_key)
2. Rate Limiting
from ratelimit import limits, sleep_and_retry
import time
# Maximum 100 requests pro Minute
@sleep_and_retry
@limits(calls=100, period=60)
def api_call(prompt):
response = client.messages.create(...)
return response
# Bei Rate Limit: Automatisch 60s warten und Retry
3. Timeout Handling
import threading
def api_call_with_timeout(prompt, timeout_seconds=30):
result = {'response': None, 'error': None}
def call():
try:
result['response'] = client.messages.create(
model="claude-3-sonnet",
messages=[{"role": "user", "content": prompt}],
timeout=timeout_seconds
)
except Exception as e:
result['error'] = str(e)
thread = threading.Thread(target=call)
thread.daemon = True
thread.start()
thread.join(timeout=timeout_seconds + 5)
if result['error']:
raise Exception(f"API Error: {result['error']}")
if result['response'] is None:
raise Exception("API Call Timeout")
return result['response']
API Versioning & Compatibility
# Claude API Example
client = anthropic.Anthropic(
api_key="sk-ant-...",
base_url="https://api.anthropic.com",
default_headers={
"anthropic-version": "2024-06" # API Version
}
)
# VOR Major Updates:
# 1. Test mit New API Version
# 2. Gradual rollout (z.B. 10% → 50% → 100%)
# 3. Fallback zur Old Version bei Issues
# 4. Deprecation Warning vor End-of-Life
Production Monitoring Dashboard
import prometheus_client as prom
# Metrics
api_requests = prom.Counter(
'api_requests_total',
'Total API requests',
['provider', 'model']
)
api_latency = prom.Histogram(
'api_latency_seconds',
'API response latency',
['provider']
)
api_costs = prom.Gauge(
'api_costs_total',
'Total API costs',
['provider']
)
api_errors = prom.Counter(
'api_errors_total',
'Total API errors',
['provider', 'error_type']
)
# Nutze sie
@api_latency.labels(provider='claude').time()
def call_claude(prompt):
response = client.messages.create(...)
api_requests.labels(provider='claude', model='sonnet').inc()
api_costs.labels(provider='claude').set(calculate_cost(response))
return response
Literatur & Ressourcen
Letzte Aktualisierung: 21.03.2026 | Nächste Überprüfung: Juli 2026
