OpenInference AWS Bedrock Instrumentation
Python autoinstrumentation library for AWS Bedrock calls made using boto3 (sync) and aioboto3 (async).
This package implements OpenInference tracing for invoke_model, invoke_agent and converse calls made using the bedrock-runtime and bedrock-agent-runtime clients from both boto3 (sync) and aioboto3 (async).
Supported Models
Find the list of Bedrock-supported models and their IDs here. Future testing is planned for additional models.
| Model | Supported Methods |
|---|---|
Anthropic Claude 2.0 |
converse, invoke |
Anthropic Claude 2.1 |
converse, invoke |
Anthropic Claude 3 Sonnet 1.0 |
converse |
Anthropic Claude 3.5 Sonnet |
converse |
Anthropic Claude 3 Haiku |
converse |
Meta Llama 3 8b Instruct |
converse |
Amazon Nova Micro |
converse, invoke |
Amazon Nova Lite |
converse, invoke |
Amazon Nova Pro |
converse, invoke |
Meta Llama 3 70b Instruct |
converse |
Mistral AI Mistral 7B Instruct |
converse |
Mistral AI Mixtral 8X7B Instruct |
converse |
Mistral AI Mistral Large |
converse |
Mistral AI Mistral Small |
converse |
Installation
pip install openinference-instrumentation-bedrock
Async (aioboto3) support
To instrument async Bedrock calls made via aioboto3, install aioboto3 in addition to this package:
pip install openinference-instrumentation-bedrock aioboto3
Quickstart
In a notebook environment (jupyter, colab, etc.) install openinference-instrumentation-bedrock, arize-phoenix and boto3.
You can test out this quickstart guide in Google Colab!
pip install openinference-instrumentation-bedrock arize-phoenix boto3
For async usage with aioboto3:
pip install openinference-instrumentation-bedrock arize-phoenix aioboto3
Ensure that boto3 is configured with AWS credentials.
Tracing Setup (Phoenix or Arize AX)
The tracing setup below is shared for both sync (boto3) and async (aioboto3) usage.
from urllib.parse import urljoin
import boto3
import phoenix as px
from openinference.instrumentation.bedrock import BedrockInstrumentor
from opentelemetry import trace as trace_api
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk import trace as trace_sdk
from opentelemetry.sdk.trace.export import SimpleSpanProcessor
Next, we'll start a phoenix server and set it as a collector.
px.launch_app()
session_url = px.active_session().url
phoenix_otlp_endpoint = urljoin(session_url, "v1/traces")
phoenix_exporter = OTLPSpanExporter(endpoint=phoenix_otlp_endpoint)
tracer_provider = trace_sdk.TracerProvider()
tracer_provider.add_span_processor(SimpleSpanProcessor(span_exporter=phoenix_exporter))
trace_api.set_tracer_provider(tracer_provider=tracer_provider)
BedrockInstrumentor().instrument()
Now, all calls to invoke_model are instrumented and can be viewed in the phoenix UI.
When Bedrock returns a model stop reason, the span records it as llm.finish_reason for
both invoke_model and converse, including their streaming and async variants.
Quickstart (boto3)
session = boto3.session.Session()
client = session.client("bedrock-runtime")
prompt = b'{"prompt": "Human: Hello there, how are you? Assistant:", "max_tokens_to_sample": 1024}'
response = client.invoke_model(modelId="anthropic.claude-v2", body=prompt)
response_body = json.loads(response.get("body").read())
print(response_body["completion"])
Alternatively, all calls to converse are instrumented and can be viewed in the phoenix UI.
session = boto3.session.Session()
client = session.client("bedrock-runtime")
message1 = {
"role": "user",
"content": [{"text": "Create a list of 3 pop songs."}]
}
message2 = {
"role": "user",
"content": [{"text": "Make sure the songs are by artists from the United Kingdom."}]
}
messages = []
messages.append(message1)
response = client.converse(
modelId="anthropic.claude-3-5-sonnet-20240620-v1:0",
messages=messages
)
out = response["output"]["message"]
messages.append(out)
print(out.get("content")[-1].get("text"))
messages.append(message2)
response = client.converse(
modelId="anthropic.claude-v2:1",
messages=messages
)
out = response['output']['message']
print(out.get("content")[-1].get("text"))
Amazon Nova models are supported via both invoke_model and converse.
session = boto3.session.Session()
client = session.client("bedrock-runtime")
# invoke_model with Nova
import json
request_body = {
"schemaVersion": "messages-v1",
"messages": [{"role": "user", "content": [{"text": "Hello! What is 2+2?"}]}],
"inferenceConfig": {"maxTokens": 512, "temperature": 0.7},
}
response = client.invoke_model(
modelId="amazon.nova-micro-v1:0",
body=json.dumps(request_body),
)
response_body = json.loads(response["body"].read())
print(response_body["output"]["message"]["content"][0]["text"])
All calls to invoke_agent are instrumented and can be viewed in the phoenix UI. You can enable the agent traces by passing enableTrace=True argument.
session = boto3.session.Session()
client = session.client("bedrock-agent-runtime")
agent_id = '<AgentId>'
agent_alias_id = '<AgentAliasId>'
session_id = f"default-session1_{int(time.time())}"
attributes = dict(
inputText="When is a good time to visit the Taj Mahal?",
agentId=agent_id,
agentAliasId=agent_alias_id,
sessionId=session_id,
enableTrace=True
)
response = client.invoke_agent(**attributes)
for idx, event in enumerate(response['completion']):
if 'chunk' in event:
chunk_data = event['chunk']
if 'bytes' in chunk_data:
output_text = chunk_data['bytes'].decode('utf8')
print(output_text)
elif 'trace' in event:
print(event['trace'])
Async Quickstart (aioboto3)
OpenInference AWS Bedrock instrumentation also supports async Bedrock calls using aioboto3.
import aioboto3
import asyncio
async def main():
session = aioboto3.session.Session(region_name="us-east-1")
async with session.client(
"bedrock-runtime",
aws_access_key_id="test",
aws_secret_access_key="test",
) as client:
response = await client.converse(
modelId="anthropic.claude-3-haiku-20240307-v1:0",
messages=[
{
"role": "user",
"content": [{"text": "What is the sum of numbers from 1 to 10?"}],
}
],
)
print(response["output"]["message"]["content"][-1]["text"])
asyncio.run(main())
All async calls to invoke_agent are instrumented and can be viewed in the phoenix UI. You can enable the agent traces by passing enableTrace=True argument.
import aioboto3
import asyncio
import time
async def main():
session = aioboto3.session.Session(region_name="us-east-1")
agent_id = '<AgentId>'
agent_alias_id = '<AgentAliasId>'
session_id = f"default-session1_{int(time.time())}"
attributes = dict(
inputText="When is a good time to visit the Taj Mahal?",
agentId=agent_id,
agentAliasId=agent_alias_id,
sessionId=session_id,
enableTrace=True
)
async with session.client(
"bedrock-runtime",
aws_access_key_id="test",
aws_secret_access_key="test",
) as client:
response = await client.invoke_agent(**attributes)
for idx, event in enumerate(response['completion']):
if 'chunk' in event:
chunk_data = event['chunk']
if 'bytes' in chunk_data:
output_text = chunk_data['bytes'].decode('utf8')
print(output_text)
elif 'trace' in event:
print(event['trace'])
asyncio.run(main())
More Info
Metadata
Release files for openinference-instrumentation-bedrock 0.1.56
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| openinference_instrumentation_bedrock-0.1.56.tar.gz | 242.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| openinference_instrumentation_bedrock-0.1.56-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 315.3 kB
Release files / openinference_instrumentation_bedrock-0.1.56.tar.gz
| Download URL | openinference_instrumentation_bedrock-0.1.56.tar.gz |
|---|---|
| Size | 242.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f70d1a722c9501e61e9a90bd5a7bd4638f95536287f5df3ba6137387d42577c0
|
|
BLAKE2b-256 checksum How to use checksums |
91f4e215192f6f969de7961791b54932201807a20149864eac0febe11c2ff686
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 1, 2026.
Transparency logRelease files / openinference_instrumentation_bedrock-0.1.56-py3-none-any.whl
| Download URL | openinference_instrumentation_bedrock-0.1.56-py3-none-any.whl |
|---|---|
| Size | 72.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
fad02080c64752fcc64496cf72a5614ad736345d4fa8cc9168ebe5550e95f877
|
|
BLAKE2b-256 checksum How to use checksums |
da6cb1d3cece50fbf5d628293e6aab0f38277fe71bf688133129e1186e8f7a4c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 1, 2026.
Transparency log