- Spec files
pypi-anthropic
Describes: pkg:pypi/anthropic@0.66.x
- Description
- The official Python library for the anthropic API
- Author
- tessl
- Last updated
bedrock.md docs/
1# AWS Bedrock Integration23Specialized client for accessing Claude models through Amazon Bedrock, with AWS authentication and Bedrock-specific configurations. This integration allows you to use Claude models within your AWS infrastructure.45## Capabilities67### Bedrock Client Classes89Synchronous and asynchronous clients for AWS Bedrock integration with Claude models.1011```python { .api }12class AnthropicBedrock:13def __init__(14self,15*,16aws_access_key: Optional[str] = None,17aws_secret_key: Optional[str] = None,18aws_session_token: Optional[str] = None,19aws_region: Optional[str] = None,20**kwargs21): ...2223messages: Messages24completions: Completions2526class AsyncAnthropicBedrock:27def __init__(28self,29*,30aws_access_key: Optional[str] = None,31aws_secret_key: Optional[str] = None,32aws_session_token: Optional[str] = None,33aws_region: Optional[str] = None,34**kwargs35): ...3637messages: AsyncMessages38completions: AsyncCompletions39```4041## Usage Examples4243### Basic Bedrock Setup4445```python46from anthropic import AnthropicBedrock4748# Basic configuration using AWS credentials49client = AnthropicBedrock(50aws_region="us-east-1"51)5253# Explicit credentials (not recommended for production)54client = AnthropicBedrock(55aws_access_key="AKIA...",56aws_secret_key="secret...",57aws_region="us-east-1"58)5960# Using session token for temporary credentials61client = AnthropicBedrock(62aws_access_key="ASIA...",63aws_secret_key="secret...",64aws_session_token="token...",65aws_region="us-east-1"66)67```6869### AWS Authentication Methods7071```python72import boto373import os74from anthropic import AnthropicBedrock7576# Method 1: Use default AWS credentials (recommended)77# This uses credentials from ~/.aws/credentials, environment variables, or IAM roles78client = AnthropicBedrock(79aws_region="us-east-1"80)8182# Method 2: Environment variables83os.environ["AWS_ACCESS_KEY_ID"] = "your-access-key"84os.environ["AWS_SECRET_ACCESS_KEY"] = "your-secret-key"85os.environ["AWS_DEFAULT_REGION"] = "us-east-1"8687client = AnthropicBedrock()8889# Method 3: AWS Profile90os.environ["AWS_PROFILE"] = "your-profile-name"9192client = AnthropicBedrock(93aws_region="us-west-2"94)9596# Method 4: Using boto3 session97session = boto3.Session(98aws_access_key_id="your-access-key",99aws_secret_access_key="your-secret-key",100region_name="us-east-1"101)102103# Extract credentials from session104credentials = session.get_credentials()105client = AnthropicBedrock(106aws_access_key=credentials.access_key,107aws_secret_key=credentials.secret_key,108aws_session_token=credentials.token,109aws_region=session.region_name110)111```112113### Messages with Bedrock114115```python116# Create message using Bedrock117message = client.messages.create(118model="anthropic.claude-sonnet-4-20250514-v1:0", # Bedrock model ARN format119max_tokens=1024,120messages=[121{"role": "user", "content": "Hello from AWS Bedrock!"}122]123)124125print(message.content[0].text)126```127128### Bedrock Model Selection129130```python131# Available Claude models on Bedrock (example model IDs)132BEDROCK_MODELS = {133"claude-sonnet-4": "anthropic.claude-sonnet-4-20250514-v1:0",134"claude-haiku-3": "anthropic.claude-haiku-3-20241022-v1:0",135"claude-opus-3": "anthropic.claude-opus-3-20240229-v1:0"136}137138def create_bedrock_message(model_name: str, prompt: str) -> str:139"""Create message with Bedrock model"""140141if model_name not in BEDROCK_MODELS:142raise ValueError(f"Unknown model: {model_name}")143144model_id = BEDROCK_MODELS[model_name]145146message = client.messages.create(147model=model_id,148max_tokens=1024,149messages=[150{"role": "user", "content": prompt}151]152)153154return message.content[0].text155156# Usage157response = create_bedrock_message("claude-sonnet-4", "What is AWS Bedrock?")158print(response)159```160161### Cross-Region Configuration162163```python164class BedrockMultiRegion:165"""Manage Bedrock clients across multiple AWS regions"""166167def __init__(self, regions: List[str]):168self.clients = {}169for region in regions:170self.clients[region] = AnthropicBedrock(aws_region=region)171172def create_message(self, region: str, **kwargs) -> Any:173"""Create message in specific region"""174if region not in self.clients:175raise ValueError(f"Region {region} not configured")176177return self.clients[region].messages.create(**kwargs)178179def find_best_region(self, model: str) -> str:180"""Find best region for a model (simplified example)"""181# In practice, you'd check model availability per region182if "opus" in model.lower():183return "us-east-1" # Opus might be primarily in us-east-1184else:185return "us-west-2" # Other models in us-west-2186187# Usage188multi_region = BedrockMultiRegion(["us-east-1", "us-west-2", "eu-west-1"])189190best_region = multi_region.find_best_region("claude-sonnet-4")191message = multi_region.create_message(192region=best_region,193model="anthropic.claude-sonnet-4-20250514-v1:0",194max_tokens=1024,195messages=[{"role": "user", "content": "Hello!"}]196)197```198199### Bedrock with IAM Roles200201```python202import boto3203from anthropic import AnthropicBedrock204205def create_bedrock_client_with_role(role_arn: str, session_name: str) -> AnthropicBedrock:206"""Create Bedrock client using IAM role assumption"""207208# Create STS client209sts_client = boto3.client('sts')210211# Assume role212response = sts_client.assume_role(213RoleArn=role_arn,214RoleSessionName=session_name215)216217# Extract temporary credentials218credentials = response['Credentials']219220# Create Bedrock client with temporary credentials221return AnthropicBedrock(222aws_access_key=credentials['AccessKeyId'],223aws_secret_key=credentials['SecretAccessKey'],224aws_session_token=credentials['SessionToken'],225aws_region="us-east-1"226)227228# Usage229bedrock_client = create_bedrock_client_with_role(230role_arn="arn:aws:iam::123456789012:role/BedrockAccessRole",231session_name="anthropic-session"232)233234message = bedrock_client.messages.create(235model="anthropic.claude-sonnet-4-20250514-v1:0",236max_tokens=1024,237messages=[{"role": "user", "content": "Hello with IAM role!"}]238)239```240241### Async Bedrock Usage242243```python244import asyncio245from anthropic import AsyncAnthropicBedrock246247async def bedrock_async_example():248# Create async Bedrock client249async_client = AsyncAnthropicBedrock(250aws_region="us-east-1"251)252253# Async message creation254message = await async_client.messages.create(255model="anthropic.claude-sonnet-4-20250514-v1:0",256max_tokens=1024,257messages=[258{"role": "user", "content": "Async Bedrock request"}259]260)261262return message.content[0].text263264# Run async265result = asyncio.run(bedrock_async_example())266print(f"Async Bedrock result: {result}")267```268269### Bedrock Error Handling270271```python272import boto3.exceptions273from anthropic import AnthropicBedrock, APIError274275def robust_bedrock_request(prompt: str, max_retries: int = 3) -> Optional[str]:276"""Make Bedrock request with robust error handling"""277278for attempt in range(max_retries):279try:280client = AnthropicBedrock(aws_region="us-east-1")281282message = client.messages.create(283model="anthropic.claude-sonnet-4-20250514-v1:0",284max_tokens=1024,285messages=[286{"role": "user", "content": prompt}287]288)289290return message.content[0].text291292except boto3.exceptions.NoCredentialsError:293print("❌ AWS credentials not found")294print("Configure credentials using AWS CLI or environment variables")295return None296297except boto3.exceptions.ClientError as e:298error_code = e.response['Error']['Code']299300if error_code == 'AccessDeniedException':301print("❌ Access denied to Bedrock")302print("Check IAM permissions for Bedrock access")303return None304305elif error_code == 'ThrottlingException':306print(f"⏳ Throttled (attempt {attempt + 1})")307if attempt < max_retries - 1:308time.sleep(2 ** attempt)309continue310311elif error_code == 'ModelNotReadyException':312print("⏳ Model not ready, retrying...")313if attempt < max_retries - 1:314time.sleep(5)315continue316317print(f"❌ AWS error: {error_code}")318return None319320except APIError as e:321print(f"❌ Anthropic API error: {e}")322return None323324except Exception as e:325print(f"❌ Unexpected error: {e}")326return None327328print("❌ Max retries reached")329return None330331# Usage332result = robust_bedrock_request("What are the benefits of using AWS Bedrock?")333if result:334print(f"Success: {result}")335```336337### Bedrock Configuration Management338339```python340import json341import boto3342from typing import Dict, Any343344class BedrockConfig:345"""Configuration management for Bedrock deployment"""346347def __init__(self, config_file: str = "bedrock-config.json"):348self.config_file = config_file349self.config = self.load_config()350351def load_config(self) -> Dict[str, Any]:352"""Load configuration from file"""353try:354with open(self.config_file, 'r') as f:355return json.load(f)356except FileNotFoundError:357return self.default_config()358359def default_config(self) -> Dict[str, Any]:360"""Default configuration"""361return {362"regions": ["us-east-1", "us-west-2"],363"models": {364"fast": "anthropic.claude-haiku-3-20241022-v1:0",365"balanced": "anthropic.claude-sonnet-4-20250514-v1:0",366"powerful": "anthropic.claude-opus-3-20240229-v1:0"367},368"max_tokens": 1024,369"timeout": 30,370"max_retries": 3371}372373def create_client(self, region: str = None) -> AnthropicBedrock:374"""Create configured Bedrock client"""375region = region or self.config["regions"][0]376377return AnthropicBedrock(378aws_region=region,379timeout=self.config["timeout"],380max_retries=self.config["max_retries"]381)382383def create_message(self, prompt: str, model_type: str = "balanced") -> str:384"""Create message with configured defaults"""385client = self.create_client()386model = self.config["models"].get(model_type, self.config["models"]["balanced"])387388message = client.messages.create(389model=model,390max_tokens=self.config["max_tokens"],391messages=[392{"role": "user", "content": prompt}393]394)395396return message.content[0].text397398# Usage399config = BedrockConfig()400401# Quick message with defaults402response = config.create_message("Explain machine learning", model_type="fast")403print(response)404405# Create client for custom usage406client = config.create_client(region="us-west-2")407```408409### Bedrock with VPC Configuration410411```python412import boto3413from anthropic import AnthropicBedrock414415def create_vpc_bedrock_client(vpc_config: Dict[str, Any]) -> AnthropicBedrock:416"""Create Bedrock client configured for VPC access"""417418# Note: VPC configuration typically happens at the AWS service level419# This is an example of how you might handle VPC-specific setups420421session = boto3.Session()422423# Configure session for VPC if needed424if vpc_config.get("endpoint_url"):425# Custom endpoint for VPC endpoint426client = AnthropicBedrock(427aws_region=vpc_config["region"],428# Custom endpoint configuration would go here429)430else:431client = AnthropicBedrock(432aws_region=vpc_config["region"]433)434435return client436437# VPC configuration example438vpc_config = {439"region": "us-east-1",440"vpc_id": "vpc-12345678",441"subnet_ids": ["subnet-12345678", "subnet-87654321"],442"security_group_ids": ["sg-12345678"],443"endpoint_url": "https://bedrock.us-east-1.amazonaws.com" # VPC endpoint444}445446vpc_client = create_vpc_bedrock_client(vpc_config)447```448449### Bedrock Cost Optimization450451```python452import time453from typing import Dict, List454455class BedrockCostOptimizer:456"""Optimize Bedrock usage for cost efficiency"""457458def __init__(self):459self.usage_stats = {}460self.model_costs = {461# Example costs per 1K tokens (input/output)462"anthropic.claude-haiku-3-20241022-v1:0": (0.00025, 0.00125),463"anthropic.claude-sonnet-4-20250514-v1:0": (0.003, 0.015),464"anthropic.claude-opus-3-20240229-v1:0": (0.015, 0.075)465}466467def select_optimal_model(self, prompt: str, priority: str = "cost") -> str:468"""Select model based on optimization priority"""469470if priority == "cost" and len(prompt) < 1000:471return "anthropic.claude-haiku-3-20241022-v1:0"472elif priority == "quality":473return "anthropic.claude-opus-3-20240229-v1:0"474else:475return "anthropic.claude-sonnet-4-20250514-v1:0"476477def estimate_cost(self, model: str, input_tokens: int, output_tokens: int) -> float:478"""Estimate cost for request"""479if model not in self.model_costs:480return 0.0481482input_cost, output_cost = self.model_costs[model]483return (input_tokens * input_cost / 1000) + (output_tokens * output_cost / 1000)484485def create_cost_optimized_message(self, client: AnthropicBedrock, prompt: str, **kwargs) -> tuple:486"""Create message with cost tracking"""487488# Select optimal model489model = self.select_optimal_model(prompt, kwargs.get("priority", "cost"))490491# Create message492start_time = time.time()493message = client.messages.create(494model=model,495messages=[{"role": "user", "content": prompt}],496**{k: v for k, v in kwargs.items() if k != "priority"}497)498duration = time.time() - start_time499500# Track usage501usage = message.usage502cost = self.estimate_cost(model, usage.input_tokens, usage.output_tokens)503504self.usage_stats[model] = self.usage_stats.get(model, {505"requests": 0,506"total_cost": 0.0,507"total_tokens": 0508})509510self.usage_stats[model]["requests"] += 1511self.usage_stats[model]["total_cost"] += cost512self.usage_stats[model]["total_tokens"] += usage.input_tokens + usage.output_tokens513514return message, {515"model": model,516"cost": cost,517"duration": duration,518"tokens": usage.input_tokens + usage.output_tokens519}520521# Usage522optimizer = BedrockCostOptimizer()523client = AnthropicBedrock(aws_region="us-east-1")524525message, stats = optimizer.create_cost_optimized_message(526client,527"Write a short summary of cloud computing",528max_tokens=200,529priority="cost"530)531532print(f"Model: {stats['model']}")533print(f"Cost: ${stats['cost']:.6f}")534print(f"Tokens: {stats['tokens']}")535print(f"Response: {message.content[0].text}")536```