"""
Anthropic Provider für LLM Enrichment.
Verwendet claude-haiku als Fallback (Level 3).
"""
import os
import json
from typing import Dict, Any
from .base import LLMProvider
try:
import anthropic
HAS_ANTHROPIC = True
except ImportError:
HAS_ANTHROPIC = False
class AnthropicProvider(LLMProvider):
"""Anthropic Claude API Provider mit JSON-Response."""
def __init__(self, model: str = None):
if not HAS_ANTHROPIC:
raise ImportError("anthropic nicht installiert. Bitte: pip install anthropic")
model = model or os.getenv('ANTHROPIC_MODEL_HIGH', 'claude-haiku-4-5-20251001')
super().__init__(model)
self.client = anthropic.Anthropic(
api_key=os.getenv('ANTHROPIC_API_KEY')
)
self.tokens_used = 0
def extract(self, prompt: str) -> Dict[str, Any]:
"""
Ruft Anthropic API auf und parsed JSON Response.
Args:
prompt: Der Enrichment-Prompt
Returns:
Dict mit extrahierten Daten
Raises:
ValueError: Bei API-Fehler oder JSON-Parse-Fehler
"""
try:
response = self.client.messages.create(
model=self.model,
max_tokens=1500,
messages=[{'role': 'user', 'content': prompt}]
)
# Token-Tracking
self.tokens_used = (
response.usage.input_tokens + response.usage.output_tokens
)
# Response extrahieren und JSON parsen
raw_text = response.content[0].text.strip()
data = json.loads(raw_text)
return data
except json.JSONDecodeError as e:
raise ValueError(f"JSON_PARSE_ERROR: {str(e)}")
except Exception as e:
raise ValueError(f"ANTHROPIC_API_ERROR: {str(e)}")