Explorer
/opt/struktur/lead-engine/llm/anthropic_provider.py
← Zurück ↓ Download
"""
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)}")