Skip to content

Amazon Bedrock ​

Run foundation models on AWS with BedrockModel — Claude, Nova, Llama, Mistral, and more. Best when you need AWS-native deployment, IAM-based auth, and enterprise compliance.

For standalone invoke / stream usage, see LLM Models — Amazon Bedrock.

Install ​

bash
pip install --extra-index-url https://elsai-agents.elsai.ai/root/ elsai-agents==0.3.5
pip install --extra-index-url https://core-packages.elsai.ai/root/elsai-model/ "elsai-model[bedrock]==2.1.1"

Setup ​

  1. Enable model access in the Amazon Bedrock console.
  2. Configure AWS credentials (environment variables, aws configure, or an IAM role).
  3. Export your chosen model ID:
bash
export AWS_ACCESS_KEY_ID=...
export AWS_SECRET_ACCESS_KEY=...
export AWS_DEFAULT_REGION=us-west-2
export BEDROCK_MODEL_ID=global.anthropic.claude-sonnet-4-6

Agent — basic ​

python
import os
from elsai import Agent
from elsai_model import LLM, Provider

model = LLM(
    provider=Provider.BEDROCK,
    model=os.getenv("BEDROCK_MODEL_ID", "global.anthropic.claude-sonnet-4-6"),
    region_name=os.getenv("AWS_DEFAULT_REGION", "us-west-2"),
    max_tokens=256,
    temperature=0.2,
)
agent = Agent(
    model=model,
    system_prompt="You are a concise assistant.",
)
result = agent("Summarize what an AI agent is in two sentences.")
print(result)

Prompt caching ​

Pass cache_config on BedrockModel from elsai-model. The SDK injects cache points on each request — use plain string system prompts.

Bedrock needs enough static tokens before the cache breakpoint (~1024+).

python
import os
from elsai import Agent
from elsai_model.bedrock import BedrockModel
from elsai_model.models import CacheConfig

region = os.getenv("AWS_DEFAULT_REGION")

model = BedrockModel(
    model_id=os.getenv("BEDROCK_MODEL_ID"),
    region_name=region,
    max_tokens=512,
    temperature=0.2,
    cache_config=CacheConfig(strategy="auto", ttl="1h"),
)

agent = Agent(
    model=model,
    system_prompt="...",
)
agent("What is 2+2?")   # first call — writes to cache
agent("What is 3+3?")   # second call — reads from cache

Set ttl="1h" only on models that support one-hour cache. Omit ttl for the default five-minute cache.

Or via the factory:

python
from elsai_model import LLM, Provider

model = LLM(
    provider=Provider.BEDROCK,
    model=os.getenv("BEDROCK_MODEL_ID"),
    region_name=region,
    cache_config=CacheConfig(strategy="auto"),
)
agent = Agent(model=model, system_prompt="...")

Check cache activity on the agent result:

python
result = agent("What is 2+2?")
print(result.metrics.accumulated_usage.get("cacheWriteInputTokens", 0))
print(result.metrics.accumulated_usage.get("cacheReadInputTokens", 0))

cache_prompt="default" is deprecated — use cache_config instead.

When ARMS is initialized, cache tokens appear on traces automatically. See Monitor Amazon Bedrock — Prompt cache tracking.

Example — multi-agent, prompt cache, and ARMS ​

Share one cached BedrockModel across agents, initialize ARMS, then run twice — first call writes to cache, second reads from cache. Check generation spans in ARMS for gen_ai.usage.cache_* attributes. See Prompt cache tracking.

Requires AWS credentials and ELSAI_ARMS_URL / ELSAI_ARMS_API_KEY in the environment. Use a long static system prompt (~1024+ tokens) so Bedrock can cache.

python
import os

import elsai_arms
from elsai import Agent
from elsai.agent import AgentConfig
from elsai_model.bedrock import BedrockModel
from elsai_model.models import CacheConfig

elsai_arms.init(
    otlp_endpoint=os.environ["ELSAI_ARMS_URL"],
    otlp_headers={"x-api-key": os.environ["ELSAI_ARMS_API_KEY"]},
    pricing_json="./pricing.json",
)

model = BedrockModel(
    model_id=os.getenv("BEDROCK_MODEL_ID", "global.anthropic.claude-sonnet-4-6"),
    region_name=os.getenv("AWS_REGION", "us-west-2"),
    cache_config=CacheConfig(strategy="auto", ttl="1h"),
)

researcher = Agent(
    model=model,
    system_prompt="Long static context...",
    config=AgentConfig(name="researcher", description="..."),
)
manager = Agent(model=model, tools=[researcher], config=AgentConfig(name="manager"))

manager("your prompt")  # run 1: cache WRITE
manager("your prompt")  # run 2: cache READ — check ARMS spans
ModelModel ID
Claude Sonnet 4.6 (SDK default)global.anthropic.claude-sonnet-4-6
Claude 3.5 Sonnet v2anthropic.claude-3-5-sonnet-20241022-v2:0
Amazon Nova Prous.amazon.nova-pro-v1:0
Amazon Nova Liteus.amazon.nova-lite-v1:0
Llama 3.1 70Bus.meta.llama3-1-70b-instruct-v1:0

Copyright © 2026 elsai foundry.