"""Opt-in live test for the Amazon Bedrock provider.
This file is intentionally named ``bedrock_live.py`` so the standard pytest
suite does not collect it. Run it explicitly with:
rye run pytest -q -s tests/lib/bedrock_live.py
The test loads ``.env`` from the repository root when it exists. Set
``BEDROCK_LIVE_ENV_FILE`` to load a different file. Existing environment
variables take precedence over values from the file.
Useful environment variables:
- ``BEDROCK_LIVE_MODEL`` (defaults to ``openai.gpt-oss-120b``)
- ``BEDROCK_LIVE_REGION`` (otherwise uses the normal AWS region chain)
- ``BEDROCK_LIVE_PROFILE`` (otherwise uses the normal AWS credential chain)
- ``AWS_BEDROCK_BASE_URL`` (required; GPT-OSS uses the ``/v1`` endpoint)
The normal AWS environment variables, shared config, credential-process, SSO,
and workload credential sources are resolved by botocore. The test explicitly
disables the ``AWS_BEARER_TOKEN_BEDROCK`` fallback so a passing run proves that
AWS credentials and SigV4 signing worked.
"""
from __future__ import annotations
import os
import re
from pathlib import Path
from openai import OpenAI
from openai.providers import bedrock
_REPOSITORY_ROOT = Path(__file__).resolve().parents[2]
_ENV_NAME = re.compile(r"[A-Za-z_][A-Za-z0-9_]*")
def _load_env_file() -> None:
configured_path = os.environ.get("BEDROCK_LIVE_ENV_FILE")
path = Path(configured_path).expanduser() if configured_path else _REPOSITORY_ROOT / ".env"
if not path.exists():
if configured_path:
raise RuntimeError(f"BEDROCK_LIVE_ENV_FILE does not exist: {path}")
return
for line_number, raw_line in enumerate(path.read_text().splitlines(), start=1):
line = raw_line.strip()
if not line or line.startswith("#"):
continue
if line.startswith("export "):
line = line.removeprefix("export ").lstrip()
name, separator, raw_value = line.partition("=")
name = name.strip()
if not separator or _ENV_NAME.fullmatch(name) is None:
raise RuntimeError(f"Invalid environment assignment at {path}:{line_number}")
value = raw_value.strip()
if len(value) >= 2 and value[0] == value[-1] and value[0] in {"'", '"'}:
value = value[1:-1]
elif " #" in value:
value = value.split(" #", 1)[0].rstrip()
os.environ.setdefault(name, value)
_load_env_file()
def test_bedrock_live_response() -> None:
model = os.environ.get("BEDROCK_LIVE_MODEL") or "openai.gpt-oss-120b"
region = os.environ.get("BEDROCK_LIVE_REGION") or None
profile = os.environ.get("BEDROCK_LIVE_PROFILE") or None
base_url = os.environ.get("AWS_BEDROCK_BASE_URL") or None
if base_url is None:
raise RuntimeError(
"Set AWS_BEDROCK_BASE_URL to the Bedrock GPT-OSS endpoint, for example "
"https://bedrock-mantle.us-west-2.api.aws/v1."
)
with OpenAI(
provider=bedrock(
region=region,
profile=profile,
base_url=base_url,
api_key=None,
),
timeout=60,
max_retries=2,
) as client:
response = client.responses.create(
model=model,
input="Reply with exactly: bedrock live test ok",
store=False,
)
output_text = response.output_text.strip()
assert output_text, f"Bedrock returned no output text for response {response.id}"
assert "bedrock live test ok" in output_text.lower()
print(f"Bedrock live response {response.id}: {output_text}")openai/openai-python
Publicmirrored from https://github.com/openai/openai-pythonAvailable
tests/lib/bedrock_live.py
100lines · modepreview