first commit

This commit is contained in:
2026-01-10 21:46:27 +01:00
parent d00593415d
commit 561f1a8fb1
30 changed files with 1932 additions and 1 deletions

View File

@@ -0,0 +1,59 @@
"""Anthropic (Claude) provider implementation."""
import logging
import anthropic
from .base import AIProvider, AIResponse, Message
logger = logging.getLogger(__name__)
class AnthropicProvider(AIProvider):
"""Anthropic Claude API provider."""
def __init__(self, api_key: str, model: str = "claude-sonnet-4-20250514") -> None:
self.client = anthropic.AsyncAnthropic(api_key=api_key)
self.model = model
@property
def provider_name(self) -> str:
return "anthropic"
async def generate(
self,
messages: list[Message],
system_prompt: str | None = None,
max_tokens: int = 1024,
temperature: float = 0.7,
) -> AIResponse:
"""Generate a response using Claude."""
# Build messages list (Anthropic format)
api_messages = [{"role": m.role, "content": m.content} for m in messages]
logger.debug(f"Sending {len(api_messages)} messages to Anthropic")
response = await self.client.messages.create(
model=self.model,
max_tokens=max_tokens,
temperature=temperature,
system=system_prompt or "",
messages=api_messages, # type: ignore[arg-type]
)
# Extract text from response
content = ""
for block in response.content:
if block.type == "text":
content += block.text
usage = {
"input_tokens": response.usage.input_tokens,
"output_tokens": response.usage.output_tokens,
}
return AIResponse(
content=content,
model=response.model,
usage=usage,
)