Files
promptfoo--promptfoo/site/docs/providers/aws-bedrock.md
T
wehub-resource-sync 0d3cb498a3
CI / Shell Format Check (push) Has been cancelled
CI / Check Ruby (3.4) (push) Has been cancelled
CI / CI Config (push) Has been cancelled
CI / Test on Node ${{ matrix.node }} and ${{ matrix.os }}${{ matrix.shard && format(' (shard {0}/3)', matrix.shard) || '' }} (push) Has been cancelled
CI / Build on Node ${{ matrix.node }} (push) Has been cancelled
CI / Style Check (push) Has been cancelled
CI / Generate Assets (push) Has been cancelled
CI / Check Python (3.14) (push) Has been cancelled
CI / Check Python (3.9) (push) Has been cancelled
CI / Build Docs (push) Has been cancelled
CI / Code Scan Action (push) Has been cancelled
CI / Site tests (push) Has been cancelled
CI / webui tests (push) Has been cancelled
CI / Run Integration Tests (push) Has been cancelled
CI / Run Smoke Tests (push) Has been cancelled
CI / Go Tests (push) Has been cancelled
CI / Share Test (push) Has been cancelled
CI / Redteam (Production API) (push) Has been cancelled
CI / Redteam (Staging API) (push) Has been cancelled
CI / GitHub Actions Lint (push) Has been cancelled
CI / Check Ruby (3.0) (push) Has been cancelled
release-please / release-please (push) Has been cancelled
release-please / build (push) Has been cancelled
release-please / publish-npm (push) Has been cancelled
release-please / publish-npm-backfill (push) Has been cancelled
release-please / docker (push) Has been cancelled
release-please / publish-code-scan-action (push) Has been cancelled
release-please / attest-code-scan-action (push) Has been cancelled
Deploy local.promptfoo.app / Deploy to Cloudflare Pages (push) Has been cancelled
Test and Publish Multi-arch Docker Image / test (push) Has been cancelled
Test and Publish Multi-arch Docker Image / build-docker-and-push-digests (map[digest-suffix:linux-amd64 platform:linux/amd64 runner:ubuntu-latest]) (push) Has been cancelled
Test and Publish Multi-arch Docker Image / build-docker-and-push-digests (map[digest-suffix:linux-arm64 platform:linux/arm64 runner:ubuntu-24.04-arm]) (push) Has been cancelled
Test and Publish Multi-arch Docker Image / merge-docker-digests (push) Has been cancelled
Test and Publish Multi-arch Docker Image / Attest Multi-arch Image (push) Has been cancelled
Validate Renovate Config / Validate Renovate Configuration (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:24:08 +08:00

1931 lines
70 KiB
Markdown

---
title: AWS Bedrock
sidebar_label: AWS Bedrock
sidebar_position: 3
description: Configure Amazon Bedrock for LLM evals with Claude, Llama, Nova, and Mistral models using AWS-managed infrastructure
---
# Bedrock
The `bedrock` provider lets you use Amazon Bedrock in your evals. It supports Bedrock model IDs directly, including regional IDs and inference profile IDs. Because AWS changes the Bedrock catalog over time, use the [AWS supported models documentation](https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html), [model IDs documentation](https://docs.aws.amazon.com/bedrock/latest/userguide/model-ids.html#model-ids-arns), or `aws bedrock list-foundation-models` as the source of truth for current model IDs and regional availability.
## Setup
1. **Model Access**: Access rules vary by provider and can change over time.
- Check the [AWS supported models documentation](https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html) for the current access path and regional availability of the model you want to use
- **Anthropic models**: May require one-time use case submission through the model catalog
- **AWS Marketplace models**: Some third-party models require IAM permissions with `aws-marketplace:Subscribe`
- **Access control**: Organizations maintain control through IAM policies and Service Control Policies (SCPs)
2. Install the `@aws-sdk/client-bedrock-runtime` package:
```sh
npm install @aws-sdk/client-bedrock-runtime
```
3. The AWS SDK will automatically pull credentials from the following locations:
- IAM roles on EC2
- `~/.aws/credentials`
- `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` environment variables
See [setting node.js credentials (AWS)](https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/setting-credentials-node.html) for more details.
4. Edit your configuration file to point to the AWS Bedrock provider. Here's an example:
```yaml
providers:
- id: bedrock:us.anthropic.claude-sonnet-4-6
```
Note that the provider is `bedrock:` followed by the [ARN/model id](https://docs.aws.amazon.com/bedrock/latest/userguide/model-ids.html#model-ids-arns) of the model.
5. Additional config parameters are passed like so:
```yaml
providers:
- id: bedrock:us.anthropic.claude-sonnet-4-6
config:
accessKeyId: YOUR_ACCESS_KEY_ID
secretAccessKey: YOUR_SECRET_ACCESS_KEY
region: 'us-west-2'
max_tokens: 256
temperature: 0.7
```
## Application Inference Profiles
AWS Bedrock supports Application Inference Profiles, which allow you to use a single ARN to access multiple foundation models across different regions. This helps optimize costs and availability while maintaining consistent performance.
### Using Inference Profiles
When using an inference profile ARN, you must specify the `inferenceModelType` in your configuration to indicate which model family the profile is configured for:
```yaml
providers:
- id: bedrock:arn:aws:bedrock:us-east-1:123456789012:application-inference-profile/my-profile
config:
inferenceModelType: 'claude' # Required for inference profiles
region: 'us-east-1'
max_tokens: 256
temperature: 0.7
```
### Supported Model Types
The `inferenceModelType` config option supports the following values:
- `claude` - For Anthropic Claude models
- `nova` - For Amazon Nova models (v1)
- `nova2` - For Amazon Nova 2 models (with reasoning support)
- `llama` - For Meta Llama models (defaults to Llama 4)
- `llama2` - For Meta Llama 2 models
- `llama3` - For Meta Llama 3 models
- `llama3.1` or `llama3_1` - For Meta Llama 3.1 models
- `llama3.2` or `llama3_2` - For Meta Llama 3.2 models
- `llama3.3` or `llama3_3` - For Meta Llama 3.3 models
- `llama4` - For Meta Llama 4 models
- `mistral` - For Mistral models
- `cohere` - For Cohere models
- `ai21` - For AI21 models
- `titan` - For Amazon Titan models
- `deepseek` - For DeepSeek models
- `openai` - For OpenAI open-weight (gpt-oss) models
- `qwen` - For Alibaba Qwen models
- `zai` - For Z.AI GLM models
- `minimax` - For MiniMax models
- `moonshot` - For Moonshot Kimi models
- `nvidia` - For NVIDIA Nemotron models
- `writer` - For Writer Palmyra models
- `gemma` - For Google Gemma models
### Example: Multi-Region Inference Profile
```yaml
# yaml-language-server: $schema=https://promptfoo.dev/config-schema.json
providers:
# Claude Opus 4.7 via global inference profile
- id: bedrock:arn:aws:bedrock:us-east-2::inference-profile/global.anthropic.claude-opus-4-7
config:
inferenceModelType: 'claude'
region: 'us-east-2'
max_tokens: 1024
temperature: 0.7
# Using an inference profile that routes to Claude models
- id: bedrock:arn:aws:bedrock:us-east-1:123456789012:application-inference-profile/claude-profile
config:
inferenceModelType: 'claude'
max_tokens: 1024
temperature: 0.7
anthropic_version: 'bedrock-2023-05-31'
# Using an inference profile for Llama models
- id: bedrock:arn:aws:bedrock:us-west-2:123456789012:application-inference-profile/llama-profile
config:
inferenceModelType: 'llama3.3'
max_gen_len: 1024
temperature: 0.7
# Using an inference profile for Nova models
- id: bedrock:arn:aws:bedrock:eu-west-1:123456789012:application-inference-profile/nova-profile
config:
inferenceModelType: 'nova'
interfaceConfig:
max_new_tokens: 1024
temperature: 0.7
```
:::tip
Application Inference Profiles provide several benefits:
- **Automatic failover**: If one region is unavailable, requests automatically route to another region
- **Cost optimization**: Routes to the most cost-effective available model
- **Simplified management**: Use a single ARN instead of managing multiple model IDs
When using inference profiles, ensure the `inferenceModelType` matches the model family your profile is configured for, as the configuration parameters differ between model types.
:::
## Converse API
The Converse API provides a unified interface across supported Bedrock models with
native support for extended thinking (reasoning), tool calling, and guardrails. Use
the `bedrock:converse:` prefix to access this API.
### Basic Usage
```yaml
providers:
- id: bedrock:converse:anthropic.claude-3-5-sonnet-20241022-v2:0
config:
region: us-east-1
maxTokens: 4096
temperature: 0.7
```
### Extended Thinking
Enable Claude's extended thinking capabilities for complex reasoning tasks:
```yaml
providers:
- id: bedrock:converse:us.anthropic.claude-sonnet-4-5-20250929-v1:0
config:
region: us-west-2
maxTokens: 20000
thinking:
type: enabled
budget_tokens: 16000
showThinking: true # Include thinking content in output
```
The `thinking` configuration controls Claude's reasoning behavior:
- `type: enabled` - Activates extended thinking
- `budget_tokens` - Maximum tokens allocated for thinking (minimum 1024)
- For Claude Opus 4.7 and 4.8, promptfoo converts `type: enabled` to adaptive thinking because manual thinking is not accepted by those models.
Use `showThinking: true` to include the model's reasoning process in the output, or `false` to only show the final response.
:::warning
Do not set `temperature`, `topP`, or `topK` when using extended thinking. These sampling parameters are incompatible with reasoning mode.
:::
### Configuration Options
| Option | Description |
| --------------------- | --------------------------------------------------------- |
| `maxTokens` | Maximum output tokens |
| `temperature` | Sampling temperature (0-1) |
| `topP` | Nucleus sampling parameter |
| `stopSequences` | Array of stop sequences |
| `thinking` | Extended thinking configuration (Claude models) |
| `reasoningConfig` | Reasoning configuration (Amazon Nova 2 models) |
| `showThinking` | Include thinking in output (default: true) |
| `performanceConfig` | Performance settings (`latency: optimized`) |
| `serviceTier` | Service tier object (`type: priority \| default \| flex`) |
| `guardrailIdentifier` | Guardrail ID for content filtering |
| `guardrailVersion` | Guardrail version (default: DRAFT) |
### Performance Configuration
Optimize for latency or cost:
```yaml
providers:
- id: bedrock:converse:anthropic.claude-3-5-sonnet-20241022-v2:0
config:
performanceConfig:
latency: optimized # or 'standard'
serviceTier:
type: priority # or 'default', 'flex'
```
### Supported Models
The Converse API works with Bedrock models that support the `Converse` operation.
Because AWS changes that compatibility matrix over time, use the
[AWS Converse supported models documentation](https://docs.aws.amazon.com/bedrock/latest/userguide/conversation-inference-supported-models-features.html)
as the source of truth for current support.
### Model Context Protocol (MCP) Servers
The Converse provider can attach [Model Context Protocol](https://modelcontextprotocol.io)
servers and surface their tools to the model alongside any `tools` you configure
manually. MCP tool definitions are discovered at provider startup, converted to
Bedrock `toolSpec` entries, and sent on every request.
```yaml
providers:
- id: bedrock:converse:us.anthropic.claude-sonnet-4-6
config:
region: us-east-1
maxTokens: 1024
mcp:
enabled: true
servers:
# Remote MCP server (Streamable HTTP)
- name: deepwiki
url: https://mcp.deepwiki.com/mcp
# Or a local stdio MCP server
# - name: filesystem
# command: npx
# args: ['-y', '@modelcontextprotocol/server-filesystem', '/tmp']
# Optional: only expose specific tools
tools:
- ask_question
toolChoice: auto
```
**Single-turn execution.** When the model returns a `tool_use` block, the provider
executes the requested MCP tool and returns the **raw tool result** as the final
output. The result is not fed back to the model for a follow-up turn — there is no
agent loop. Write your assertions against the tool output text directly, or wrap
the provider in an agent harness if you need a synthesized natural-language answer.
**Tool name collisions.** If an entry under `config.tools` has the same `name` as
an MCP-discovered tool, the MCP version wins and the duplicate is dropped with a
warning. Bedrock rejects duplicate tool names with `ValidationException`, so
deduping is required.
**Lifecycle.** Stdio MCP servers spawn a child process; the provider registers
itself with the evaluator's shutdown hook so transports are released when the
eval finishes. If MCP initialization fails (bad URL, missing binary, handshake
failure), the failure is surfaced as a `ProviderResponse.error` on the first
`callApi` rather than crashing the eval. MCP errors during a tool call are
likewise propagated to `error` so failed runs do not pass silently.
**Disabling tools.** Setting `toolChoice: none` (or `tool_choice: none`) skips
the entire tool path: no MCP definitions are sent in the request and no MCP
tools are invoked even if the model returns a stale `tool_use` block.
## Authentication
Amazon Bedrock supports multiple authentication methods, including API key
authentication for simplified access. Credentials are resolved in this priority order:
### Credential Resolution Order
Credentials are resolved in the following priority order:
1. **Explicit credentials in config** (`accessKeyId`, `secretAccessKey`)
2. **Bedrock API Key authentication** (`apiKey`)
3. **SSO profile authentication** (`profile`)
4. **AWS default credential chain** (environment variables, `~/.aws/credentials`)
The first available credential method is used automatically.
### Authentication Options
#### 1. Explicit credentials (highest priority)
Specify AWS access keys directly in your configuration. **For security, use environment variables instead of hardcoding credentials:**
```yaml title="promptfooconfig.yaml"
providers:
- id: bedrock:us.anthropic.claude-3-5-sonnet-20241022-v2:0
config:
accessKeyId: '{{env.AWS_ACCESS_KEY_ID}}'
secretAccessKey: '{{env.AWS_SECRET_ACCESS_KEY}}'
sessionToken: '{{env.AWS_SESSION_TOKEN}}' # Optional, for temporary credentials
region: 'us-east-1' # Optional, defaults to us-east-1
```
**Environment variables:**
```bash
export AWS_ACCESS_KEY_ID="your_access_key_id"
export AWS_SECRET_ACCESS_KEY="your_secret_access_key"
export AWS_SESSION_TOKEN="your_session_token" # Optional
```
:::warning Security Best Practice
**Do not commit credentials to version control.** Use environment variables or a dedicated secrets management system to handle sensitive keys.
:::
This method overrides all other credential sources, including EC2 instance roles and SSO profiles.
#### 2. API Key authentication
Amazon Bedrock API keys provide simplified authentication without managing AWS IAM credentials.
**Using environment variables:**
Set the `AWS_BEARER_TOKEN_BEDROCK` environment variable:
```bash
export AWS_BEARER_TOKEN_BEDROCK="your-api-key-here"
```
```yaml title="promptfooconfig.yaml"
providers:
- id: bedrock:us.anthropic.claude-3-5-sonnet-20241022-v2:0
config:
region: 'us-east-1' # Optional, defaults to us-east-1
```
**Using config file:**
Specify the API key directly in your configuration:
```yaml title="promptfooconfig.yaml"
providers:
- id: bedrock:us.anthropic.claude-3-5-sonnet-20241022-v2:0
config:
apiKey: 'your-api-key-here'
region: 'us-east-1' # Optional, defaults to us-east-1
```
:::note
API keys are limited to Amazon Bedrock and Amazon Bedrock Runtime actions. They cannot be used with:
- InvokeModelWithBidirectionalStream operations
- Agents for Amazon Bedrock API operations
- Data Automation for Amazon Bedrock API operations
For these advanced features, use traditional AWS IAM credentials instead.
:::
#### 3. SSO profile authentication
Use a named profile from your AWS configuration for AWS SSO setups or managing multiple AWS accounts:
```yaml title="promptfooconfig.yaml"
providers:
- id: bedrock:us.anthropic.claude-3-5-sonnet-20241022-v2:0
config:
profile: 'YOUR_SSO_PROFILE'
region: 'us-east-1' # Optional, defaults to us-east-1
```
**Prerequisites for SSO profiles:**
1. **Install AWS CLI v2**: Ensure AWS CLI v2 is installed and on your PATH.
2. **Configure AWS SSO**: Set up AWS SSO using the AWS CLI:
```bash
aws configure sso
```
3. **Profile configuration**: Your `~/.aws/config` should contain the profile:
```ini
[profile YOUR_SSO_PROFILE]
sso_start_url = https://your-sso-portal.awsapps.com/start
sso_region = us-east-1
sso_account_id = 123456789012
sso_role_name = YourRoleName
region = us-east-1
```
4. **Active SSO session**: Ensure you have an active SSO session:
```bash
aws sso login --profile YOUR_SSO_PROFILE
```
**Use SSO profiles when:**
- Managing multi-account AWS environments
- Working in organizations with centralized AWS SSO
- Your team needs different role-based permissions
- You need to switch between different AWS contexts
#### 4. Default credentials (lowest priority)
Use the AWS SDK's standard credential chain:
```yaml title="promptfooconfig.yaml"
providers:
- id: bedrock:us.anthropic.claude-3-5-sonnet-20241022-v2:0
config:
region: 'us-east-1' # Only region specified
```
**The AWS SDK checks these sources in order:**
1. **Environment variables**: `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_SESSION_TOKEN`
2. **Shared credentials file**: `~/.aws/credentials` (from `aws configure`)
3. **AWS IAM roles**: EC2 instance profiles, ECS task roles, Lambda execution roles
4. **Shared AWS CLI credentials**: Including cached SSO credentials
**Use default credentials when:**
- Running on AWS infrastructure (EC2, ECS, Lambda) with IAM roles
- Developing locally with AWS CLI configured (`aws configure`)
- Working in CI/CD environments with IAM roles or environment variables
**Quick setup for local development:**
```bash
# Option 1: Using AWS CLI
aws configure
# Option 2: Using environment variables
export AWS_ACCESS_KEY_ID="your_access_key"
export AWS_SECRET_ACCESS_KEY="your_secret_key"
export AWS_DEFAULT_REGION="us-east-1"
```
## Example
See [GitHub](https://github.com/promptfoo/promptfoo/tree/main/examples/amazon-bedrock) for full examples of Claude, Nova, AI21, Llama 3.3, Grok, Mantle Chat Completions, and OpenAI-compatible Bedrock model usage.
```yaml title="promptfooconfig.yaml"
# yaml-language-server: $schema=https://promptfoo.dev/config-schema.json
prompts:
- 'Write a tweet about {{topic}}'
providers:
# Using inference profiles (requires inferenceModelType)
- id: bedrock:arn:aws:bedrock:us-east-1:123456789012:application-inference-profile/my-claude-profile
config:
inferenceModelType: 'claude'
region: 'us-east-1'
temperature: 0.7
max_tokens: 256
# Using regular model IDs
- id: bedrock:meta.llama3-1-405b-instruct-v1:0
config:
region: 'us-east-1'
temperature: 0.7
max_tokens: 256
- id: bedrock:us.meta.llama3-3-70b-instruct-v1:0
config:
max_gen_len: 256
- id: bedrock:amazon.nova-lite-v1:0
config:
region: 'us-east-1'
interfaceConfig:
temperature: 0.7
max_new_tokens: 256
- id: bedrock:us.amazon.nova-premier-v1:0
config:
region: 'us-east-1'
interfaceConfig:
temperature: 0.7
max_new_tokens: 256
- id: bedrock:us.anthropic.claude-sonnet-4-5-20250929-v1:0
config:
region: 'us-east-1'
temperature: 0.7
max_tokens: 256
- id: bedrock:us.anthropic.claude-opus-4-1-20250805-v1:0
config:
region: 'us-east-1'
temperature: 0.7
max_tokens: 256
- id: bedrock:us.anthropic.claude-3-5-sonnet-20241022-v2:0
config:
region: 'us-east-1'
temperature: 0.7
max_tokens: 256
- id: bedrock:us.anthropic.claude-3-5-haiku-20241022-v1:0
config:
region: 'us-east-1'
temperature: 0.7
max_tokens: 256
- id: bedrock:us.anthropic.claude-opus-4-8
config:
region: 'us-east-1'
temperature: 0.7
max_tokens: 256
- id: bedrock:openai.gpt-5.5 # frontier: Responses API, needs a Bedrock API key
config:
region: 'us-east-2'
apiKey: '{{env.AWS_BEARER_TOKEN_BEDROCK}}'
reasoning_effort: 'medium'
max_output_tokens: 256
- id: bedrock:openai.gpt-oss-120b-1:0
config:
region: 'us-west-2'
temperature: 0.7
max_completion_tokens: 256
reasoning_effort: 'medium'
- id: bedrock:openai.gpt-oss-20b-1:0
config:
region: 'us-west-2'
temperature: 0.7
max_completion_tokens: 256
reasoning_effort: 'low'
- id: bedrock:qwen.qwen3-coder-480b-a35b-v1:0
config:
region: 'us-west-2'
temperature: 0.7
max_tokens: 256
showThinking: true
- id: bedrock:qwen.qwen3-32b-v1:0
config:
region: 'us-east-1'
temperature: 0.7
max_tokens: 256
tests:
- vars:
topic: Our eco-friendly packaging
- vars:
topic: A sneak peek at our secret menu item
- vars:
topic: Behind-the-scenes at our latest photoshoot
```
## Model-specific Configuration
Different models may support different configuration options. Here are some model-specific parameters:
### General Configuration Options
- `inferenceModelType`: (Required for inference profiles) Specifies the model family when using application inference profiles. See [Supported Model Types](#supported-model-types) for the full list of values.
### Amazon Nova Models
Amazon Nova models (e.g., `amazon.nova-lite-v1:0`, `amazon.nova-pro-v1:0`, `amazon.nova-micro-v1:0`, `amazon.nova-premier-v1:0`) support advanced features like tool use and structured outputs. You can configure them with the following options:
```yaml
providers:
- id: bedrock:amazon.nova-lite-v1:0
config:
interfaceConfig:
max_new_tokens: 256 # Maximum number of tokens to generate
temperature: 0.7 # Controls randomness (0.0 to 1.0)
top_p: 0.9 # Nucleus sampling parameter
top_k: 50 # Top-k sampling parameter
stopSequences: ['END'] # Optional stop sequences
toolConfig: # Optional tool configuration
tools:
- toolSpec:
name: 'calculator'
description: 'A basic calculator for arithmetic operations'
inputSchema:
json:
type: 'object'
properties:
expression:
description: 'The arithmetic expression to evaluate'
type: 'string'
required: ['expression']
toolChoice: # Optional tool selection
tool:
name: 'calculator'
```
:::note
Nova models use a slightly different configuration structure compared to other Bedrock models, with separate `interfaceConfig` and `toolConfig` sections.
:::
### Amazon Nova 2 Models (Reasoning)
Amazon Nova 2 models introduce extended thinking capabilities with configurable reasoning levels. Nova 2 Lite (`amazon.nova-2-lite-v1:0`) supports step-by-step reasoning and task decomposition with a 1 million token context window.
```yaml
providers:
# Use cross-region model ID (us.) for on-demand access
- id: bedrock:us.amazon.nova-2-lite-v1:0
config:
interfaceConfig:
max_new_tokens: 4096
reasoningConfig:
type: enabled # Enable extended thinking
maxReasoningEffort: medium # low, medium, or high
```
**Reasoning Configuration:**
- `type`: Set to `enabled` to activate extended thinking, or `disabled` for fast responses (default)
- `maxReasoningEffort`: Controls thinking depth - `low`, `medium`, or `high`
When extended thinking is enabled, the model's reasoning process is captured in the response output with `<thinking>` tags, similar to other reasoning models.
:::warning
When using `reasoningConfig` with `type: enabled`:
- **For all reasoning modes**: Do not set `temperature`, `top_p`, or `top_k` - these are incompatible with reasoning mode
- **For `maxReasoningEffort: high`**: Also do not set `max_new_tokens` - the model manages output length automatically
:::
**Regional Model IDs:**
Nova 2 models require cross-region inference profiles for on-demand access:
- `us.amazon.nova-2-lite-v1:0` - US region (recommended)
- `eu.amazon.nova-2-lite-v1:0` - EU region
- `apac.amazon.nova-2-lite-v1:0` - Asia Pacific region
- `global.amazon.nova-2-lite-v1:0` - Global cross-region inference
**Using Nova 2 with Converse API:**
Nova 2 reasoning is also supported via the Converse API, which provides a unified interface across Bedrock models:
```yaml
providers:
- id: bedrock:converse:us.amazon.nova-2-lite-v1:0
config:
maxTokens: 4096
reasoningConfig:
type: enabled
maxReasoningEffort: medium
```
The same parameter constraints apply when using the Converse API.
### Amazon Nova Sonic Model
The Amazon Nova Sonic model (`amazon.nova-sonic-v1:0`) is a multimodal model that supports audio input and text/audio output with tool-using capabilities. It has a different configuration structure compared to other Nova models:
```yaml
providers:
- id: bedrock:amazon.nova-sonic-v1:0
config:
inferenceConfiguration:
maxTokens: 1024 # Maximum number of tokens to generate
temperature: 0.7 # Controls randomness (0.0 to 1.0)
topP: 0.95 # Nucleus sampling parameter
textOutputConfiguration:
mediaType: text/plain
toolConfiguration: # Optional tool configuration
tools:
- toolSpec:
name: 'getDateTool'
description: 'Get information about the current date'
inputSchema:
json: '{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{},"required":[]}'
toolUseOutputConfiguration:
mediaType: application/json
# Optional audio output configuration
audioOutputConfiguration:
mediaType: audio/lpcm
sampleRateHertz: 24000
sampleSizeBits: 16
channelCount: 1
voiceId: matthew
encoding: base64
audioType: SPEECH
```
Note: Nova Sonic has advanced multimodal capabilities including audio input/output, but audio input requires base64 encoded data which may be better handled through the API directly rather than in the configuration file.
### Amazon Nova Reel (Video Generation)
Amazon Nova Reel (`amazon.nova-reel-v1:1`) generates studio-quality videos from text prompts. Videos are generated in 6-second increments up to 2 minutes.
:::note Prerequisites
Nova Reel requires an Amazon S3 bucket for video output. Your AWS credentials must have:
- `bedrock:InvokeModel` and `bedrock:StartAsyncInvoke` permissions
- `s3:PutObject` permission on the output bucket
- `s3:GetObject` permission for downloading generated videos
:::
Check the [AWS supported models documentation](https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html)
for current Nova Reel regional availability.
#### Basic Configuration
```yaml
providers:
- id: bedrock:video:amazon.nova-reel-v1:1
config:
region: us-east-1
s3OutputUri: s3://my-bucket/videos # Required
durationSeconds: 6 # Default: 6
seed: 42 # Optional: for reproducibility
```
#### Task Types
Nova Reel supports three task types:
**TEXT_VIDEO (default)** - Generate a 6-second video from a text prompt:
```yaml
providers:
- id: bedrock:video:amazon.nova-reel-v1:1
config:
s3OutputUri: s3://my-bucket/videos
taskType: TEXT_VIDEO
durationSeconds: 6
```
**MULTI_SHOT_AUTOMATED** - Generate longer videos (12-120 seconds) from a single prompt:
```yaml
providers:
- id: bedrock:video:amazon.nova-reel-v1:1
config:
s3OutputUri: s3://my-bucket/videos
taskType: MULTI_SHOT_AUTOMATED
durationSeconds: 18 # Must be multiple of 6
```
**MULTI_SHOT_MANUAL** - Define individual shots with separate prompts:
```yaml
providers:
- id: bedrock:video:amazon.nova-reel-v1:1
config:
s3OutputUri: s3://my-bucket/videos
taskType: MULTI_SHOT_MANUAL
durationSeconds: 12
shots:
- text: 'Drone footage of a forest from high altitude'
- text: 'Camera arcs around vehicles in a forest'
```
#### Image-to-Video Generation
Use an image as the starting frame (must be 1280x720):
```yaml
providers:
- id: bedrock:video:amazon.nova-reel-v1:1
config:
s3OutputUri: s3://my-bucket/videos
image: file://path/to/image.png
```
#### Configuration Options
| Option | Description | Default |
| ----------------- | ------------------------------------------------------------ | ---------- |
| `s3OutputUri` | S3 bucket URI for output (required) | - |
| `taskType` | `TEXT_VIDEO`, `MULTI_SHOT_AUTOMATED`, or `MULTI_SHOT_MANUAL` | TEXT_VIDEO |
| `durationSeconds` | Video duration (6, or 12-120 in multiples of 6) | 6 |
| `seed` | Random seed (0-2,147,483,646) | - |
| `image` | Starting frame image (file:// path or base64) | - |
| `shots` | Shot definitions for MULTI_SHOT_MANUAL | - |
| `pollIntervalMs` | Polling interval in ms | 10000 |
| `maxPollTimeMs` | Maximum polling time in ms | 900000 |
| `downloadFromS3` | Download video to local blob storage | true |
Generated videos are 1280x720 resolution at 24 FPS in MP4 format.
:::warning Generation Time
Video generation is asynchronous and takes approximately:
- 6-second video: ~90 seconds
- 2-minute video: ~14-17 minutes
The provider polls for completion automatically.
:::
### AI21 Models
For AI21 models (e.g., `ai21.jamba-1-5-mini-v1:0`, `ai21.jamba-1-5-large-v1:0`), you can use the following configuration options:
```yaml
config:
max_tokens: 256
temperature: 0.7
top_p: 0.9
frequency_penalty: 0.5
presence_penalty: 0.3
```
### Claude Models
For Claude models (e.g., `anthropic.claude-fable-5`, `anthropic.claude-sonnet-5`, `anthropic.claude-sonnet-4-6`, `anthropic.claude-sonnet-4-5-20250929-v1:0`, `anthropic.claude-haiku-4-5-20251001-v1:0`, `anthropic.claude-sonnet-4-20250514-v1:0`, `anthropic.us.claude-3-5-sonnet-20241022-v2:0`), you can use the following configuration options:
**Note**: Claude Opus 4.8 (`anthropic.claude-opus-4-8`) and Claude Opus 4.7 (`anthropic.claude-opus-4-7`) are available via cross-region inference profiles (`us.`, `eu.`, `jp.`, `global.`) and, in select regions, through the base foundation model ID. Claude Opus 4.6 (`anthropic.claude-opus-4-6-v1`) and Claude Opus 4.5 (`anthropic.claude-opus-4-5-20251101-v1:0`) require an inference profile ARN and cannot be used as a direct model ID. See the [Application Inference Profiles](#application-inference-profiles) section for setup. promptfoo automatically omits unsupported sampling parameters (`temperature`, `topP`, and `topK` — including raw `top_k` in `additionalModelRequestFields`) and converts configured manual thinking to adaptive thinking for Opus 4.7, Opus 4.8, and Sonnet 5.
**Note**: Claude Sonnet 5 (`anthropic.claude-sonnet-5`) is available through the base foundation model ID and the `us.`/`eu.`/`global.` cross-region inference profiles (e.g. `bedrock:global.anthropic.claude-sonnet-5`); use the `global.` profile for dynamic routing. Cost is reported on both the default `bedrock:` (InvokeModel) and `bedrock:converse:` paths — the `global.` endpoint bills at the standard $3/$15 rate and regional/geo profiles (`us.`/`eu.`) add the 10% Claude 4.5+ regional premium.
#### Claude Fable and Mythos models
[Claude Fable 5](https://docs.aws.amazon.com/bedrock/latest/userguide/model-card-anthropic-claude-fable-5.html)
supports Bedrock Runtime and Converse. Use the `global.anthropic.claude-fable-5`
inference profile — on-demand invocation of the base `anthropic.claude-fable-5` ID
returns a `ValidationException`, and the `us.`/`eu.` geo profiles listed on the
model card may not be provisioned in every region. Fable 5 also supports
Bedrock's Anthropic-compatible Messages endpoint through the explicit
`bedrock:messages:anthropic.claude-fable-5` provider ID in `us-east-1` and
`eu-north-1` (this route may additionally require account enablement from AWS).
[Claude Mythos 5](https://docs.aws.amazon.com/bedrock/latest/userguide/model-card-anthropic-claude-mythos-5.html)
is available only through the Anthropic-compatible Messages endpoint in `us-east-1`.
Promptfoo routes the bare `bedrock:anthropic.claude-mythos-5` ID to that endpoint.
Set a Bedrock API key in `AWS_BEARER_TOKEN_BEDROCK` or `config.apiKey`:
```yaml
providers:
- id: bedrock:anthropic.claude-mythos-5
config:
region: us-east-1
apiKey: '{{env.AWS_BEARER_TOKEN_BEDROCK}}'
```
AWS requires provider data sharing to be enabled for Fable 5 and Mythos 5 — without
it every request fails with `data retention mode 'default' is not available for this
model`. Opt in per region via the Data Retention API:
```bash
aws bedrock put-account-data-retention --mode provider_data_share --region us-east-1
```
Both models use always-on adaptive thinking, so promptfoo omits sampling controls,
converts manual thinking budgets (`thinking: { type: 'enabled', budget_tokens: N }`)
to adaptive thinking, and omits `thinking: { type: 'disabled' }`. Regional and geo
endpoints cost 10% more than the global endpoint; Promptfoo applies that premium when
calculating costs.
```yaml
config:
max_tokens: 256
temperature: 0.7
anthropic_version: 'bedrock-2023-05-31'
tools: [...] # Optional: Specify available tools
tool_choice: { ... } # Optional: Specify tool choice
thinking: { ... } # Optional: Enable Claude's extended thinking capability
showThinking: true # Optional: Control whether thinking content is included in output
```
When using Claude's extended thinking capability, you can configure it like this:
```yaml
config:
max_tokens: 20000
thinking:
type: 'enabled'
budget_tokens: 16000 # Must be ≥1024 and less than max_tokens
showThinking: true # Whether to include thinking content in the output (default: true)
```
:::tip
The `showThinking` parameter controls whether thinking content is included in the response output:
- When set to `true` (default), thinking content will be included in the output
- When set to `false`, thinking content will be excluded from the output
This is useful when you want to use thinking for better reasoning but don't want to expose the thinking process to end users.
:::
### Titan Models
:::warning Retired
Amazon **Titan text** models (`amazon.titan-text-express/lite/premier`) have been retired on
Bedrock and are no longer available in any Region. Use [Amazon Nova](#amazon-nova-models)
instead. Titan **embeddings** models remain available (see [Embeddings](#embeddings)).
:::
For the (legacy) Titan text models, you can use the following configuration options:
```yaml
config:
maxTokenCount: 256
temperature: 0.7
topP: 0.9
stopSequences: ['END']
```
### Llama
For Llama models (e.g., `meta.llama3-1-70b-instruct-v1:0`, `meta.llama3-2-90b-instruct-v1:0`, `meta.llama3-3-70b-instruct-v1:0`, `meta.llama4-scout-17b-instruct-v1:0`, `meta.llama4-maverick-17b-instruct-v1:0`), you can use the following configuration options:
```yaml
config:
max_gen_len: 256
temperature: 0.7
top_p: 0.9
```
#### Llama 3.2 Vision
Llama 3.2 Vision models (`us.meta.llama3-2-11b-instruct-v1:0`, `us.meta.llama3-2-90b-instruct-v1:0`) support image inputs. You can use them with either the legacy InvokeModel API or the Converse API:
**Using InvokeModel API (legacy):**
```yaml title="promptfooconfig.yaml"
providers:
- id: bedrock:us.meta.llama3-2-11b-instruct-v1:0
config:
region: us-east-1
max_gen_len: 256
prompts:
- file://llama_vision_prompt.json
tests:
- vars:
image: file://path/to/image.jpg
```
```json title="llama_vision_prompt.json"
[
{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/jpeg",
"data": "{{image}}"
}
},
{
"type": "text",
"text": "What is in this image?"
}
]
}
]
```
**Using Converse API:**
```yaml title="promptfooconfig.yaml"
providers:
- id: bedrock:converse:us.meta.llama3-2-11b-instruct-v1:0
config:
region: us-east-1
maxTokens: 256
```
The Converse API uses the same prompt format shown above for [Nova Vision](#nova-vision-capabilities).
### Cohere Models
For Cohere models (e.g., `cohere.command-r-v1:0`), you can use the following configuration options:
```yaml
config:
max_tokens: 256
temperature: 0.7
p: 0.9
k: 0
stop_sequences: ['END']
```
### Mistral Models
Legacy Mistral text-completion models such as `mistral.mistral-7b-instruct-v0:2` support:
```yaml
config:
max_tokens: 256
temperature: 0.7
top_p: 0.9
top_k: 50
```
Mistral chat-completion models such as `mistral.mistral-large-2407-v1:0`,
`mistral.devstral-2-123b`, `mistral.mistral-large-3-675b-instruct`, and
`mistral.pixtral-large-2502-v1:0` use `messages` requests and support the same
options except `top_k`.
### DeepSeek Models
For DeepSeek models, you can use the following configuration options:
```yaml
config:
# Deepseek params
max_tokens: 256
temperature: 0.7
top_p: 0.9
# Promptfoo control params
showThinking: true # Optional: Control whether thinking content is included in output
```
`deepseek.r1-v1:0` supports extended thinking output. The `showThinking` parameter controls whether R1 thinking content is included in the response output:
- When set to `true` (default), thinking content will be included in the output
- When set to `false`, thinking content will be excluded from the output
`deepseek.v3-v1:0` and `deepseek.v3.2` use chat-completion style `messages`
requests and return the final assistant message directly.
### OpenAI Models
Amazon Bedrock hosts two families of OpenAI models, and they are served by **different
APIs**. promptfoo routes each `bedrock:openai.*` id to the correct one automatically.
#### Frontier models (GPT-5.x)
- **`openai.gpt-5.5`**: Flagship frontier model (US East / Ohio `us-east-2`)
- **`openai.gpt-5.4`**: Frontier model (US East / Ohio `us-east-2` and US West / Oregon `us-west-2`)
The frontier models are served only through Bedrock's **OpenAI-compatible Responses API**
on the regional "mantle" endpoint (`https://bedrock-mantle.<region>.api.aws/openai/v1`) —
not the native `InvokeModel` API. promptfoo routes `bedrock:openai.gpt-5.5` to its OpenAI
Responses provider pointed at that endpoint, so the output is **identical to the
[`openai:responses:gpt-5.5`](/docs/providers/openai/) provider** (the clean final answer;
chain-of-thought is hidden).
Authentication uses an **Amazon Bedrock API key**, not the AWS SDK credential chain. Set
`AWS_BEARER_TOKEN_BEDROCK` (or `config.apiKey`):
```yaml
providers:
- id: bedrock:openai.gpt-5.5
config:
region: us-east-2 # gpt-5.5: us-east-2; gpt-5.4: us-east-2 or us-west-2
apiKey: '{{env.AWS_BEARER_TOKEN_BEDROCK}}' # or just export AWS_BEARER_TOKEN_BEDROCK
reasoning_effort: low # none | low | medium | high | xhigh
max_output_tokens: 2048
```
Prefer the `bedrock:openai.gpt-5.5` form above. It wraps the OpenAI Responses provider,
points it at the mantle endpoint, and normalizes the `openai.`-prefixed id for GPT-5
capability detection (reasoning effort, verbosity) and billing. Using
`openai:responses:openai.gpt-5.5` directly is **not** equivalent — the base provider does
not recognize the `openai.` prefix as a GPT-5 model, so reasoning/verbosity controls would
be dropped.
#### Open-weight models (GPT OSS)
- **`openai.gpt-oss-120b-1:0`**: 120 billion parameter general-purpose model
- **`openai.gpt-oss-20b-1:0`**: 20 billion parameter general-purpose model
- **`openai.gpt-oss-safeguard-120b`**: 120 billion parameter safety model
- **`openai.gpt-oss-safeguard-20b`**: 20 billion parameter safety model
The open-weight models are served through Bedrock's native `InvokeModel` API and use the
standard AWS SDK credential chain, with OpenAI-style request parameters:
```yaml
providers:
- id: bedrock:openai.gpt-oss-120b-1:0
config:
region: us-west-2
max_completion_tokens: 1024 # OpenAI-style parameter (not max_tokens)
temperature: 0.7
top_p: 0.9
frequency_penalty: 0.1
presence_penalty: 0.1
stop: ['END', 'STOP']
reasoning_effort: medium # low | medium | high
showThinking: false # strip the <reasoning> block from output (see below)
```
#### Reasoning Effort
Both families accept the native `reasoning_effort` request parameter, which promptfoo
forwards as-is so the API validates it for the specific model:
- **GPT OSS** (`openai.gpt-oss-*`): `low`, `medium`, `high`
- **Frontier** (`openai.gpt-5.x`): `none`, `low`, `medium`, `high`, `xhigh`
Note that `minimal` is **not** a valid value for these Bedrock models (the API rejects it).
Higher effort produces more thorough reasoning at the cost of latency and output tokens.
#### Reasoning Output and `showThinking` (GPT OSS only)
When invoked through `InvokeModel`, the open-weight models prepend their chain-of-thought
wrapped in `<reasoning>...</reasoning>` before the final answer. This differs from OpenAI's
first-party API, which hides chain-of-thought.
By default promptfoo returns this output **verbatim**, so the reasoning stays visible to your
assertions and red-team graders — an eval framework should not hide model-returned content by
default. Use `showThinking` to transform it:
- **`showThinking: false`** — strip the reasoning block so `output` is the clean final answer,
matching the [`openai:` providers](/docs/providers/openai/) (which hide chain-of-thought).
- **`showThinking: true`** — surface the reasoning in the `Thinking: <reasoning>\n\n<answer>`
format the OpenAI chat provider uses.
The frontier models return clean output already, so this option does not apply to them.
:::note Codex on Bedrock
OpenAI's [Codex](https://developers.openai.com/codex/) coding agent uses these same
frontier model IDs (`openai.gpt-5.5`, `openai.gpt-5.4`). To run the full coding agent
against Bedrock, use `openai:codex-sdk` with `model_provider: amazon-bedrock` — see
[Run on Amazon Bedrock](/docs/providers/openai-codex-sdk/#option-3-run-on-amazon-bedrock)
in the Codex SDK docs. For direct (non-agentic) inference, use `bedrock:openai.gpt-5.5`
as shown above.
:::
### xAI Grok Models
xAI's **Grok 4.3** (`xai.grok-4.3`) runs on the same Bedrock **Mantle** engine as the OpenAI
frontier models and is served through the **OpenAI-compatible Responses API** on the regional
mantle endpoint (`https://bedrock-mantle.<region>.api.aws/openai/v1`) — not `InvokeModel` or
`Converse`. It is offered in **`us-west-2`** (check the Bedrock model card for current regional
availability) and authenticates with an **Amazon Bedrock API key** (set
`AWS_BEARER_TOKEN_BEDROCK`, or `config.apiKey`).
```yaml
providers:
- id: bedrock:xai.grok-4.3
config:
region: us-west-2 # Grok 4.3 is only available in us-west-2
apiKey: '{{env.AWS_BEARER_TOKEN_BEDROCK}}' # or just export AWS_BEARER_TOKEN_BEDROCK
reasoning_effort: low # Grok is reasoning-first: none | low | medium | high
max_output_tokens: 4096
```
:::note
- Grok 4.3 is **reasoning-first**: reasoning is always active and the effort is configurable
(`none` | `low` | `medium` | `high`). promptfoo forwards `reasoning_effort` (or
`reasoning: { effort }`) and surfaces reasoning token counts in `tokenUsage`.
- Grok accepts an explicit `temperature`. When you omit it, promptfoo does not inject the OpenAI
provider default, so Bedrock uses Grok's model default instead.
- **Cost is not reported** for Grok (`cost` is left undefined). The Responses
billing tables are keyed on OpenAI model names; refer to the
[Amazon Bedrock pricing page](https://aws.amazon.com/bedrock/pricing/) for Grok rates.
:::
### Mantle Chat Completions (`bedrock:mantle:`) {#mantle-chat-completions}
The Bedrock **Mantle** engine also exposes an OpenAI-compatible **Chat Completions** API. Most
mantle chat models use `https://bedrock-mantle.<region>.api.aws/v1/chat/completions`; xAI and
Gemma 4 chat models use the `/openai/v1/chat/completions` variant. Use the
**`bedrock:mantle:<id>`** prefix to talk to it. This is the only way to reach mantle-served chat models that the native
`InvokeModel`/`Converse` APIs don't serve — so they don't appear in
`aws bedrock list-foundation-models` — for example `zai.glm-4.6`, `deepseek.v3.1`,
`google.gemma-4-*`, and the mantle-namespaced Qwen `*-instruct` IDs.
Like the other mantle paths, it authenticates with an **Amazon Bedrock API key**
(`AWS_BEARER_TOKEN_BEDROCK`, or `config.apiKey`):
```yaml
providers:
- id: bedrock:mantle:zai.glm-4.6
config:
region: us-west-2
apiKey: '{{env.AWS_BEARER_TOKEN_BEDROCK}}' # or just export AWS_BEARER_TOKEN_BEDROCK
max_tokens: 1024
```
:::note
- **The mantle catalog is regional.** List the models available in a Region with
`GET https://bedrock-mantle.<region>.api.aws/v1/models`, and set `region` accordingly —
the default is `us-east-1`.
- Use the bare `bedrock:openai.gpt-5.5` / `bedrock:xai.grok-4.3` forms (above) for the OpenAI
frontier and Grok models: those go through the **Responses API** and surface reasoning
tokens. `bedrock:mantle:` is the **Chat Completions** path for mantle chat models such as
`zai.glm-4.6`, `deepseek.v3.1`, `google.gemma-4-*`, and supported xAI chat ids.
- Models that the native APIs do serve (Claude, Nova, Llama, Qwen, the
[OpenAI-compatible families](#openai-compatible-models) above, etc.) are usually better
reached via `bedrock:<id>` or `bedrock:converse:<id>`.
:::
### Qwen Models
Qwen model IDs include `qwen.qwen3-coder-next`, `qwen.qwen3-next-80b-a3b`,
`qwen.qwen3-vl-235b-a22b`, `qwen.qwen3-coder-480b-a35b-v1:0`,
`qwen.qwen3-coder-30b-a3b-v1:0`, `qwen.qwen3-235b-a22b-2507-v1:0`, and
`qwen.qwen3-32b-v1:0`. Qwen models support advanced features including hybrid
thinking modes, tool calling, and extended context understanding.
**Regional Availability**: Check the [AWS Bedrock console](https://console.aws.amazon.com/bedrock/home) or use `aws bedrock list-foundation-models` to verify which Qwen models are available in your target region, as availability varies by model and region.
You can configure them with the following options:
```yaml
config:
max_tokens: 2048 # Maximum number of tokens to generate
temperature: 0.7 # Controls randomness (0.0 to 1.0)
top_p: 0.9 # Nucleus sampling parameter
frequency_penalty: 0.1 # Reduces repetition of frequent tokens
presence_penalty: 0.1 # Reduces repetition of any tokens
stop: ['END', 'STOP'] # Stop sequences
showThinking: true # Control whether thinking content is included in output
tools: [...] # Tool calling configuration (optional)
tool_choice: 'auto' # Tool selection strategy (optional)
```
#### Hybrid Thinking Modes
Qwen models support hybrid thinking modes where the model can apply step-by-step reasoning before delivering the final answer. The `showThinking` parameter controls whether thinking content is included in the response output:
- When set to `true` (default), thinking content will be included in the output
- When set to `false`, thinking content will be excluded from the output
This allows you to access the model's reasoning process during generation while having the option to present only the final response to end users.
#### Tool Calling
Qwen models support tool calling with OpenAI-compatible function definitions.
```yaml
config:
tools:
- type: function
function:
name: calculate
description: Perform arithmetic calculations
parameters:
type: object
properties:
expression:
type: string
description: The mathematical expression to evaluate
required: ['expression']
tool_choice: auto # 'auto', 'none', or specific function name
```
#### Model Variants
- **Qwen3-Coder-480B-A35B**: Mixture-of-experts model optimized for coding and agentic tasks with 480B total parameters and 35B active parameters
- **Qwen3-Coder-30B-A3B**: Smaller MoE model with 30B total parameters and 3B active parameters, optimized for coding tasks
- **Qwen3-Coder-Next**: Coding model exposed through Bedrock
- **Qwen3-Next-80B-A3B**: General-purpose MoE model
- **Qwen3-VL-235B-A22B**: Vision-language model that also accepts text prompts
- **Qwen3-235B-A22B**: General-purpose MoE model with 235B total parameters and 22B active parameters for reasoning and coding
- **Qwen3-32B**: Dense model with 32B parameters for consistent performance in resource-constrained environments
#### Usage Example
```yaml
providers:
- id: bedrock:qwen.qwen3-coder-480b-a35b-v1:0
config:
region: us-west-2
max_tokens: 2048
temperature: 0.7
top_p: 0.9
showThinking: true
tools:
- type: function
function:
name: code_analyzer
description: Analyze code for potential issues
parameters:
type: object
properties:
code:
type: string
description: The code to analyze
required: ['code']
tool_choice: auto
```
### OpenAI-compatible Models (GLM, MiniMax, Kimi, Nemotron, Gemma, Palmyra) {#openai-compatible-models}
Several Bedrock families speak the OpenAI Chat Completions schema over `InvokeModel`
(`{ messages, max_tokens, ... }` → `{ choices: [{ message: { content } }] }`), so they share
one handler and the same configuration options. They also work through the [Converse API](#converse-api)
(`bedrock:converse:<id>`).
| Family | Example model IDs |
| --------------- | ------------------------------------------------------------------------------------------------------------------------- |
| Z.AI GLM | `zai.glm-5`, `zai.glm-4.7`, `zai.glm-4.7-flash` |
| MiniMax | `minimax.minimax-m2`, `minimax.minimax-m2.1`, `minimax.minimax-m2.5` |
| Moonshot Kimi | `moonshotai.kimi-k2.5`, `moonshot.kimi-k2-thinking` |
| NVIDIA Nemotron | `nvidia.nemotron-nano-9b-v2`, `nvidia.nemotron-nano-12b-v2`, `nvidia.nemotron-nano-3-30b`, `nvidia.nemotron-super-3-120b` |
| Google Gemma 3 | `google.gemma-3-4b-it`, `google.gemma-3-12b-it`, `google.gemma-3-27b-it` |
| Writer Palmyra | `us.writer.palmyra-x5-v1:0`, `us.writer.palmyra-x4-v1:0`, `writer.palmyra-vision-7b` |
```yaml
providers:
- id: bedrock:zai.glm-5
config:
region: us-east-1
max_tokens: 1024 # Maximum number of tokens to generate
temperature: 0.7 # Optional — omit to use the model's own default
top_p: 0.9 # Optional nucleus sampling
stop: ['END'] # Optional stop sequences
reasoning_effort: high # Optional, reasoning models only ('low' | 'medium' | 'high')
showThinking: false # Strip <think>/<reasoning> blocks from the output (default: keep)
tools: [...] # Optional OpenAI-format tool definitions
tool_choice: 'auto' # Optional tool selection strategy
```
:::note
- **Writer Palmyra** is served for on-demand throughput only through its `us.` inference
profile (`bedrock:us.writer.palmyra-x5-v1:0`); the bare `writer.palmyra-x*` IDs reject
on-demand `InvokeModel`.
- **Reasoning models** (MiniMax M2, Kimi K2 Thinking) emit a `<think>` or `<reasoning>`
block. By default it is returned verbatim; set `showThinking: false` to return only the
final answer. Give reasoning models a larger `max_tokens` budget so the answer is not
truncated by the reasoning.
- **NVIDIA Nemotron** reasons in-line without tags, so `showThinking` cannot strip it.
Disable its reasoning with NVIDIA's `/no_think` system directive instead (add a
`system` message of `/no_think` to your prompt) for a direct answer.
- This handler does not force a `temperature`/`top_p` default, so each model uses its
provider-recommended sampling unless you set them explicitly.
:::
**Regional Availability**: Check the [AWS Bedrock console](https://console.aws.amazon.com/bedrock/home)
or AWS model cards to confirm which of these models are enabled in your target region. Use
`aws bedrock list-foundation-models` for direct foundation model IDs and
`aws bedrock list-inference-profiles` for inference profiles such as Writer Palmyra's `us.`
route — availability varies by model and region. TwelveLabs Pegasus
(`twelvelabs.pegasus-1-2-v1:0`, video understanding) is also available through the Converse
API, and TwelveLabs Marengo (`twelvelabs.marengo-embed-*`) is an [embeddings](#embeddings) model.
## Model-graded tests
You can use Bedrock models to grade outputs. By default, model-graded tests use an OpenAI grader and require the `OPENAI_API_KEY` environment variable to be set. However, when using AWS Bedrock, you have the option of overriding the grader for [model-graded assertions](/docs/configuration/expected-outputs/model-graded/) to point to AWS Bedrock or other providers.
You can use either regular model IDs or application inference profiles for grading:
:::warning
Because of how model-graded evals are implemented, **the LLM grading models must support chat-formatted prompts** (except for embedding or classification models).
:::
To set this for all your test cases, add the [`defaultTest`](/docs/configuration/guide/#default-test-cases) property to your config:
```yaml title="promptfooconfig.yaml"
defaultTest:
options:
provider:
# Using a regular model ID
id: bedrock:us.anthropic.claude-3-5-sonnet-20241022-v2:0
config:
temperature: 0
# Other provider config options
# Or using an inference profile
# id: bedrock:arn:aws:bedrock:us-east-1:123456789012:application-inference-profile/grading-profile
# config:
# inferenceModelType: 'claude'
# temperature: 0
```
You can also do this for individual assertions:
```yaml
# ...
assert:
- type: llm-rubric
value: Do not mention that you are an AI or chat assistant
provider:
text:
id: provider:chat:modelname
config:
region: us-east-1
temperature: 0
# Other provider config options...
```
Or for individual tests:
```yaml
# ...
tests:
- vars:
# ...
options:
provider:
id: provider:chat:modelname
config:
temperature: 0
# Other provider config options
assert:
- type: llm-rubric
value: Do not mention that you are an AI or chat assistant
```
## Multimodal Capabilities
Several Bedrock models support multimodal inputs including images and text:
- **Amazon Nova** - Supports images and videos
- **Llama 3.2 Vision** - Supports images (11B and 90B variants)
- **Claude 3+** - Supports images (via Converse API)
- **Pixtral Large** - Supports images (via Converse API)
To use these capabilities, structure your prompts to include both image data and text content.
### Nova Vision Capabilities
Amazon Nova supports comprehensive vision understanding for both images and videos:
- **Images**: Supports PNG, JPG, JPEG, GIF, WebP formats via Base-64 encoding. Multiple images allowed per payload (up to 25MB total).
- **Videos**: Supports various formats (MP4, MKV, MOV, WEBM, etc.) via Base-64 (less than 25MB) or Amazon S3 URI (up to 1GB).
Here's an example configuration for running multimodal evaluations:
```yaml title="promptfooconfig.yaml"
# yaml-language-server: $schema=https://promptfoo.dev/config-schema.json
description: 'Bedrock Nova Eval with Images'
prompts:
- file://nova_multimodal_prompt.json
providers:
- id: bedrock:amazon.nova-pro-v1:0
config:
region: 'us-east-1'
inferenceConfig:
temperature: 0.7
max_new_tokens: 256
tests:
- vars:
image: file://path/to/image.jpg
```
The prompt file (`nova_multimodal_prompt.json`) should be structured to include both image and text content. This format will depend on the specific model you're using:
```json title="nova_multimodal_prompt.json"
[
{
"role": "user",
"content": [
{
"image": {
"format": "jpg",
"source": { "bytes": "{{image}}" }
}
},
{
"text": "What is this a picture of?"
}
]
}
]
```
See [GitHub](https://github.com/promptfoo/promptfoo/blob/main/examples/amazon-bedrock/models/promptfooconfig.nova.multimodal.yaml) for a runnable example.
When loading image files as variables, promptfoo automatically converts them to the appropriate format for the model. The supported image formats include:
- jpg/jpeg
- png
- gif
- bmp
- webp
- svg
## Embeddings
To override the embeddings provider for all assertions that require embeddings (such as similarity), use `defaultTest`:
```yaml
defaultTest:
options:
provider:
embedding:
id: bedrock:embeddings:amazon.titan-embed-text-v2:0
config:
region: us-east-1
```
## Guardrails
To use guardrails, set the `guardrailIdentifier` and `guardrailVersion` in the provider config.
For example:
```yaml
providers:
- id: bedrock:us.anthropic.claude-3-5-sonnet-20241022-v2:0
config:
guardrailIdentifier: 'test-guardrail'
guardrailVersion: 1 # The version number for the guardrail. The value can also be DRAFT.
```
## Environment Variables
The following environment variables can be used to configure the Bedrock provider:
**Authentication:**
- `AWS_BEARER_TOKEN_BEDROCK`: Bedrock API key for simplified authentication
**Configuration:**
- `AWS_BEDROCK_REGION`: Default region for Bedrock API calls
- `AWS_BEDROCK_MAX_TOKENS`: Default maximum number of tokens to generate
- `AWS_BEDROCK_TEMPERATURE`: Default temperature for generation
- `AWS_BEDROCK_TOP_P`: Default top_p value for generation
- `AWS_BEDROCK_FREQUENCY_PENALTY`: Default frequency penalty (for supported models)
- `AWS_BEDROCK_PRESENCE_PENALTY`: Default presence penalty (for supported models)
- `AWS_BEDROCK_STOP`: Default stop sequences (as a JSON string)
- `AWS_BEDROCK_MAX_RETRIES`: Number of retry attempts for failed API calls (default: 10)
Model-specific environment variables:
- `MISTRAL_MAX_TOKENS`, `MISTRAL_TEMPERATURE`, `MISTRAL_TOP_P`, `MISTRAL_TOP_K`: For Mistral models
- `COHERE_TEMPERATURE`, `COHERE_P`, `COHERE_K`, `COHERE_MAX_TOKENS`: For Cohere models
These environment variables can be overridden by the configuration specified in the YAML file.
## Troubleshooting
### Authentication Issues
#### "Unable to locate credentials" Error
```text
Error: Unable to locate credentials. You can configure credentials by running "aws configure".
```
**Solutions:**
1. **Check credential priority**: Ensure credentials are available in the expected priority order
2. **Verify AWS CLI setup**: Run `aws configure list` to see active credentials
3. **SSO session expired**: Run `aws sso login --profile YOUR_PROFILE`
4. **Environment variables**: Verify `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` are set
#### "AccessDenied" or "UnauthorizedOperation" Errors
**Solutions:**
1. **Check IAM permissions**: Ensure your credentials have `bedrock:InvokeModel` permission
2. **Model access**: Enable model access in the AWS Bedrock console
3. **Region mismatch**: Verify the region in your config matches where you enabled model access
#### SSO-Specific Issues
**"SSO session has expired":**
```bash
aws sso login --profile YOUR_PROFILE
```
**"Profile not found":**
- Check `~/.aws/config` contains the profile
- Verify profile name matches exactly (case-sensitive)
#### Debugging Authentication
Enable debug logging to see which credentials are being used:
```bash
export AWS_SDK_JS_LOG=1
npx promptfoo eval
```
This will show detailed AWS SDK logs including credential resolution.
### Model Configuration Issues
#### Inference profile requires inferenceModelType
If you see this error when using an inference profile ARN:
```text
Error: Inference profile requires inferenceModelType to be specified in config. Options: claude, nova, nova2, llama (defaults to v4), llama2, llama3, llama3.1, llama3.2, llama3.3, llama4, mistral, cohere, ai21, titan, deepseek, openai, qwen, zai, minimax, moonshot, nvidia, writer, gemma
```
This means you're using an application inference profile ARN but haven't specified which model family it's configured for. Add the `inferenceModelType` to your configuration:
```yaml
providers:
# Incorrect - missing inferenceModelType
- id: bedrock:arn:aws:bedrock:us-east-1:123456789012:application-inference-profile/my-profile
# Correct - includes inferenceModelType
- id: bedrock:arn:aws:bedrock:us-east-1:123456789012:application-inference-profile/my-profile
config:
inferenceModelType: 'claude' # Specify the model family
```
#### ValidationException: On-demand throughput isn't supported
If you see this error:
```text
ValidationException: Invocation of model ID anthropic.claude-3-5-sonnet-20241022-v2:0 with on-demand throughput isn't supported. Retry your request with the ID or ARN of an inference profile that contains this model.
```
This usually means you need to use the region-specific model ID. Update your provider configuration to include the regional prefix:
```yaml
providers:
# Instead of this:
- id: bedrock:anthropic.claude-sonnet-4-5-20250929-v1:0
# Use this:
- id: bedrock:us.anthropic.claude-sonnet-4-5-20250929-v1:0 # US region
# or
- id: bedrock:eu.anthropic.claude-sonnet-4-5-20250929-v1:0 # EU region
# or
- id: bedrock:apac.anthropic.claude-sonnet-4-5-20250929-v1:0 # APAC region
```
Make sure to:
1. Choose the correct regional prefix (`us.`, `eu.`, or `apac.`) based on your AWS region
2. Configure the corresponding region in your provider config
3. Ensure you have model access enabled in your AWS Bedrock console for that region
### AccessDeniedException: You don't have access to the model with the specified model ID
If you see this error, the cause depends on which model provider you're using:
**For models without provider-specific access steps**:
- Check the [AWS supported models documentation](https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html)
for the current access flow
- Verify your IAM permissions include `bedrock:InvokeModel`
- Check your region configuration matches the model's region
**For Anthropic models (Claude)**:
- First-time use may require submitting use case details in the Bedrock console
- Check the AWS documentation for the current access flow
**For AWS Marketplace models**:
- Ensure your IAM permissions include `aws-marketplace:Subscribe`
- Subscribe to the model through AWS Marketplace
## Knowledge Base
AWS Bedrock Knowledge Bases provide Retrieval Augmented Generation (RAG) functionality, allowing you to query a knowledge base with natural language and get responses based on your data.
### Prerequisites
To use the Knowledge Base provider, you need:
1. An existing Knowledge Base created in AWS Bedrock
2. Install the `@aws-sdk/client-bedrock-agent-runtime` package:
```sh
npm install @aws-sdk/client-bedrock-agent-runtime
```
### Configuration
Configure the Knowledge Base provider by specifying `kb` in your provider ID. Note that the model ID needs to include the regional prefix (`us.`, `eu.`, or `apac.`):
```yaml title="promptfooconfig.yaml"
providers:
- id: bedrock:kb:us.anthropic.claude-3-7-sonnet-20250219-v1:0
config:
region: 'us-east-2'
knowledgeBaseId: 'YOUR_KNOWLEDGE_BASE_ID'
temperature: 0.0
max_tokens: 1000
numberOfResults: 5 # Optional: number of chunks to retrieve (AWS default when not specified)
```
The provider ID follows this pattern: `bedrock:kb:[REGIONAL_MODEL_ID]`
For example:
- `bedrock:kb:us.anthropic.claude-3-5-sonnet-20241022-v2:0` (US region)
- `bedrock:kb:eu.anthropic.claude-3-5-sonnet-20241022-v2:0` (EU region)
Configuration options include:
- `knowledgeBaseId` (required): The ID of your AWS Bedrock Knowledge Base
- `region`: AWS region where your Knowledge Base is deployed (e.g., 'us-east-1', 'us-east-2', 'eu-west-1')
- `temperature`: Controls randomness in response generation (default: 0.0)
- `max_tokens`: Maximum number of tokens in the generated response
- `numberOfResults`: Number of chunks to retrieve from the knowledge base (optional, uses AWS default when not specified)
- `accessKeyId`, `secretAccessKey`, `sessionToken`: AWS credentials (if not using environment variables or IAM roles)
- `profile`: AWS profile name for SSO authentication
### Knowledge Base Example
Here's a complete example to test your Knowledge Base with a few questions:
```yaml title="promptfooconfig.yaml"
prompts:
- 'What is the capital of France?'
- 'Tell me about quantum computing.'
providers:
- id: bedrock:kb:us.anthropic.claude-3-7-sonnet-20250219-v1:0
config:
region: 'us-east-2'
knowledgeBaseId: 'YOUR_KNOWLEDGE_BASE_ID'
temperature: 0.0
max_tokens: 1000
numberOfResults: 10
# Regular Claude model for comparison
- id: bedrock:us.anthropic.claude-3-5-sonnet-20241022-v2:0
config:
region: 'us-east-2'
temperature: 0.0
max_tokens: 1000
tests:
- description: 'Basic factual questions from the knowledge base'
```
### Citations
The Knowledge Base provider returns both the generated response and citations from the source documents. These citations are included in the eval results and can be used to verify the accuracy of the responses.
:::info
When viewing eval results in the UI, citations appear in a separate section within the details view of each response. You can click on the source links to visit the original documents or copy citation content for reference.
:::
### Response Format
When using the Knowledge Base provider, the response will include:
1. **output**: The text response generated by the model based on your query
2. **metadata.citations**: An array of citations that includes:
- `retrievedReferences`: References to source documents that informed the response
- `generatedResponsePart`: Parts of the response that correspond to specific citations
### Context Evaluation with contextTransform
The Knowledge Base provider supports extracting context from citations for evaluation using the `contextTransform` feature:
```yaml title="promptfooconfig.yaml"
tests:
- vars:
query: 'What is promptfoo?'
assert:
# Extract context from all citations
- type: context-faithfulness
contextTransform: |
if (!metadata?.citations) return '';
return metadata.citations
.flatMap(citation => citation.retrievedReferences || [])
.map(ref => ref.content?.text || '')
.filter(text => text.length > 0)
.join('\n\n');
threshold: 0.7
# Extract context from first citation only
- type: context-relevance
contextTransform: 'metadata?.citations?.[0]?.retrievedReferences?.[0]?.content?.text || ""'
threshold: 0.6
```
This approach allows you to:
- **Evaluate real retrieval**: Test against the actual context retrieved by your Knowledge Base
- **Measure faithfulness**: Verify responses don't hallucinate beyond the retrieved content
- **Assess relevance**: Check if retrieved context is relevant to the query
- **Validate recall**: Ensure important information appears in retrieved context
See the [Knowledge Base contextTransform example](https://github.com/promptfoo/promptfoo/tree/main/examples/amazon-bedrock) for complete configuration examples.
## Bedrock Agents
Amazon Bedrock Agents uses the reasoning of foundation models (FMs), APIs, and data to break down user requests, gathers relevant information, and efficiently completes tasks—freeing teams to focus on high-value work. For detailed information on testing and evaluating deployed agents, see the [AWS Bedrock Agents Provider](./bedrock-agents.md) documentation.
Quick example:
```yaml
providers:
- id: bedrock-agent:YOUR_AGENT_ID
config:
agentAliasId: PROD_ALIAS
region: us-east-1
enableTrace: true
```
## Video Generation
AWS Bedrock supports video generation through asynchronous invoke APIs. Videos are generated in the cloud and output to an S3 bucket that you specify.
### Luma Ray 2
Generate videos using Luma Ray 2, which produces high-quality videos from text prompts or images.
**Provider ID:** `bedrock:video:luma.ray-v2:0`
Check the [AWS supported models documentation](https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html)
for current Luma Ray regional availability.
#### Basic Configuration
```yaml title="promptfooconfig.yaml"
providers:
- id: bedrock:video:luma.ray-v2:0
config:
region: us-west-2
s3OutputUri: s3://my-bucket/luma-outputs/
```
#### Configuration Options
| Option | Type | Default | Description |
| ---------------- | ------- | ------- | ------------------------------------------ |
| `s3OutputUri` | string | - | **Required.** S3 bucket for video output |
| `duration` | string | "5s" | Video duration: "5s" or "9s" |
| `resolution` | string | "720p" | Output resolution: "540p" or "720p" |
| `aspectRatio` | string | "16:9" | Aspect ratio (see supported ratios below) |
| `loop` | boolean | false | Whether video should seamlessly loop |
| `startImage` | string | - | Start frame image (file:// path or base64) |
| `endImage` | string | - | End frame image (file:// path or base64) |
| `pollIntervalMs` | number | 10000 | Polling interval in milliseconds |
| `maxPollTimeMs` | number | 600000 | Maximum wait time (10 min default) |
| `downloadFromS3` | boolean | true | Download video from S3 after generation |
#### Supported Aspect Ratios
- `1:1` - Square
- `16:9` - Widescreen (default)
- `9:16` - Vertical/Portrait
- `4:3` - Standard
- `3:4` - Portrait standard
- `21:9` - Ultrawide
- `9:21` - Ultra-tall
#### Text-to-Video Example
```yaml title="promptfooconfig.yaml"
providers:
- id: bedrock:video:luma.ray-v2:0
config:
region: us-west-2
s3OutputUri: s3://my-bucket/videos/
duration: '5s'
resolution: '720p'
aspectRatio: '16:9'
prompts:
- 'A majestic eagle soaring through clouds at golden hour'
tests:
- vars: {}
```
#### Image-to-Video Example
Animate images by providing start and/or end frames:
```yaml title="promptfooconfig.yaml"
providers:
- id: bedrock:video:luma.ray-v2:0
config:
region: us-west-2
s3OutputUri: s3://my-bucket/videos/
startImage: file://./start-frame.jpg
endImage: file://./end-frame.jpg
duration: '5s'
prompts:
- 'Smooth transition with camera movement'
tests:
- vars: {}
```
#### Processing Time
- **5-second videos:** 2-5 minutes
- **9-second videos:** 4-8 minutes
#### Required Permissions
Your AWS credentials need these IAM permissions:
```json
{
"Statement": [
{
"Effect": "Allow",
"Action": ["bedrock:InvokeModel", "bedrock:GetAsyncInvoke", "bedrock:StartAsyncInvoke"],
"Resource": "arn:aws:bedrock:*:*:model/luma.ray-v2:0"
},
{
"Effect": "Allow",
"Action": ["s3:PutObject", "s3:GetObject"],
"Resource": "arn:aws:s3:::my-bucket/*"
}
]
}
```
## See Also
- [Amazon SageMaker Provider](./sagemaker.md) - For custom-deployed or fine-tuned models on AWS
- [RAG Evaluation Guide](../guides/evaluate-rag.md) - Complete guide to evaluating RAG systems with context-based assertions
- [Context-based Assertions](../configuration/expected-outputs/model-graded/index.md) - Documentation on context-faithfulness, context-relevance, and context-recall
- [Configuration Reference](../configuration/reference.md) - Complete configuration options including contextTransform
- [Command Line Interface](../usage/command-line.md) - How to use promptfoo from the command line
- [Provider Options](../providers/index.md) - Overview of all supported providers
- [Amazon Bedrock Examples](https://github.com/promptfoo/promptfoo/tree/main/examples/amazon-bedrock) - Runnable examples of Bedrock integration, including Knowledge Base and contextTransform examples