"""Anthropic provider — direct Anthropic SDK integration.""" from __future__ import annotations import os from typing import Any from voice_to_notes.providers.base import AIProvider class AnthropicProvider(AIProvider): """Connects to the Anthropic API.""" def __init__( self, api_key: str | None = None, model: str = "claude-sonnet-4-6", ) -> None: self._api_key = api_key or os.environ.get("ANTHROPIC_API_KEY", "") self._model = model self._client: Any = None def _ensure_client(self) -> Any: if self._client is not None: return self._client if not self._api_key: raise RuntimeError( "Anthropic API key not configured. Set ANTHROPIC_API_KEY or provide it in settings." ) try: import anthropic self._client = anthropic.Anthropic(api_key=self._api_key) except ImportError: raise RuntimeError("anthropic package is required. Install with: pip install anthropic") return self._client def chat(self, messages: list[dict[str, str]], **kwargs: Any) -> str: client = self._ensure_client() # Anthropic expects a system message separately system_msg = "" chat_messages = [] for msg in messages: if msg.get("role") == "system": system_msg = msg.get("content", "") else: chat_messages.append(msg) create_kwargs: dict[str, Any] = { "model": kwargs.get("model", self._model), "messages": chat_messages, "max_tokens": kwargs.get("max_tokens", 2048), } if system_msg: create_kwargs["system"] = system_msg response = client.messages.create(**create_kwargs) # Anthropic returns content blocks return "".join(block.text for block in response.content if hasattr(block, "text")) def is_available(self) -> bool: return bool(self._api_key) @property def name(self) -> str: return "Anthropic"