Bedrock exposes two distinct API surfaces, each captured as a separate source in Coolhand:
| Source | Endpoint |
|---|---|
bedrock |
OpenAI-compatible Chat Completions format |
bedrock_anthropic |
Native Anthropic Messages API format |
Model IDs use Bedrock naming — not provider model names
bedrock (OpenAI-compatible):
amazon.nova-pro-v1:0
amazon.nova-lite-v1:0
meta.llama3-70b-instruct-v1:0
amazon.titan-text-premier-v1:0
bedrock_anthropic (native Anthropic):
anthropic.claude-3-5-sonnet-20241022-v2:0
anthropic.claude-3-5-haiku-20241022-v1:0
anthropic.claude-sonnet-4-5-20250929-v1:0
The same underlying Claude model has a different identifier on bedrock_anthropic vs. direct anthropic logs. Cross-provider filtering by model requires awareness of this naming difference.
System prompt (bedrock_anthropic only)
Same as Anthropic Best Practices: the system prompt is a top-level system field, not a role: "system" message.
Structured outputs
bedrock: Native structured outputs are GA on Bedrock as of February 2026 via outputConfig.textFormat / response_format. Support varies by model; check the AWS documentation for per-model availability.
bedrock_anthropic: Same as Anthropic Best Practices — native structured outputs supported on current models; tool use is the fallback for older models/SDKs.
Caching
bedrock: Cached Input Tokens are captured when the model reports a cache hit, and Cache Creation Tokens are captured for GPT-5.6 and later models that report cache writes; earlier models leave that field blank. Like other OpenAI-compatible endpoints, both counts are subsets of the request's input token count rather than separate additive counts, so Coolhand subtracts them when working out how much of the prompt was billed at the standard input rate. Both the Chat Completions and Responses surfaces are read, which matters because some OpenAI models on Bedrock are served only through Responses. Cache reads are discounted 90% and cache writes are billed at 1.25× the uncached input rate. TTL and invalidation for older, non-GPT-5.6 models are model-dependent and not uniformly documented by AWS for the OpenAI-compatible interface.
bedrock_anthropic: Same mechanics as Anthropic Best Practices — explicit cache_control: { type: "ephemeral" } markers, ~1.25× write rate / ~0.1× read rate. TTL is 5 minutes by default; Claude 4.5 and later also accept "ttl": "1h" on Bedrock, billed at ~2× the input rate. Coolhand captures both Cache Creation Tokens and Cached Input Tokens, plus the per-TTL split into 5-Minute and 1-Hour Cache Creation Tokens.
Batch processing
AWS Bedrock Batch Inference reads a JSONL input file from S3, processes the requests asynchronously, and writes results to an S3 output path. Supported on most Bedrock models, including Claude and Nova models on both API surfaces.
- Completion target: within 24 hours (specify
completion_window: "24h"in the job request) - Input and output stay in your AWS account (S3 buckets you control)
- 50% of on-demand pricing on supported foundation models
Docs: https://docs.aws.amazon.com/bedrock/latest/userguide/batch-inference.html
Non-standard token fields (bedrock only)
| Field | When present |
|---|---|
| Cached Input Tokens | When model reports a cache hit |
| Audio Input Tokens | Multimodal requests with audio input |
Extended thinking (bedrock_anthropic only)
Same as Anthropic Best Practices: must be explicitly requested; may include [redacted thinking] blocks.
Latency
bedrock: Wall-clock time from the collector, not server-side processing time. Includes network transit to AWS and Bedrock routing overhead.
bedrock_anthropic: Prefers the x-envoy-upstream-service-time response header (server-side processing time in ms) when present, and falls back to the collector's wall-clock duration. Same behavior as direct Anthropic logs. Cross-region inference adds additional routing latency when enabled.