# src/anki_generator/clients/llm.py from typing import Dict, Optional import json from anthropic import Anthropic from anki_generator.settings import get_settings, Settings class AnthropicClient: def __init__(self, settings: Optional[Settings] = None): self.settings = settings or get_settings() self.client = Anthropic(api_key=self.settings.anthropic_api_key.get_secret_value()) self.model = self.settings.anthropic_model self.max_tokens = self.settings.max_tokens self.temperature = self.settings.temperature def get_card_info(self, word: str, source: str) -> Dict: """Get card information from Anthropic API""" prompt = f""" Create an Anki card for the German word "{word}" (source: {source}). IMPORTANT: Respond with ONLY the JSON object, no other text. Format: {{ "german_word": "", "part_of_speech": "", "english_meaning": "", "article": "", "plural_form": "", "example_sentence": "", "sentence_translation": "", "usage_notes": "", "related_words": "", "image_search_term": "", "tags": [] }} """ message = self.client.messages.create( model=self.model, max_tokens=self.max_tokens, temperature=self.temperature, system="You are a helpful German language teaching assistant. Return ONLY valid JSON without any additional text or explanations.", messages=[ { "role": "user", "content": prompt } ] ) try: return json.loads(message.content[0].text) except (json.JSONDecodeError, IndexError) as e: print(message) raise ValueError(f"Failed to parse API response as JSON: {e}")