omnirouter-api / src /providers /anthropic_client.py
sumitrwk's picture
Upload 33 files
b534a53 verified
from anthropic import AsyncAnthropic
import logging
from src.schemas import RouterConfig, LLMResponse
from src.providers.base import BaseLLMProvider
logger = logging.getLogger(__name__)
class AnthropicProvider(BaseLLMProvider):
def __init__(self, api_key: str):
super().__init__(api_key)
self.client = AsyncAnthropic(api_key=self.api_key)
async def async_generate(self, prompt: str, config: RouterConfig) -> LLMResponse:
logger.info(f"Routing request to Anthropic using model: {config.model}")
# Anthropic's API structure is slightly different from OpenAI's
response = await self.client.messages.create(
model=config.model,
max_tokens=1024, # Anthropic requires max_tokens to be explicitly set
messages=[{"role": "user", "content": prompt}],
temperature=config.temperature,
)
content = response.content[0].text
prompt_tokens = response.usage.input_tokens
completion_tokens = response.usage.output_tokens
cost = self.calculate_cost(prompt_tokens, completion_tokens, config.model)
return LLMResponse(
content=content,
provider_used="anthropic",
model_used=config.model,
prompt_tokens=prompt_tokens,
completion_tokens=completion_tokens,
cost_estimate=cost
)
def calculate_cost(self, prompt_tokens: int, completion_tokens: int, model_name: str) -> float:
pricing = {
"claude-3-opus-20240229": {"prompt": 15.0, "completion": 75.0},
"claude-3-5-sonnet-20240620": {"prompt": 3.0, "completion": 15.0},
"claude-3-haiku-20240307": {"prompt": 0.25, "completion": 1.25}
}
rates = pricing.get(model_name, {"prompt": 0.0, "completion": 0.0})
cost = (prompt_tokens / 1_000_000) * rates["prompt"] + \
(completion_tokens / 1_000_000) * rates["completion"]
return round(cost, 6)