# Bedrock Provisioned Throughput Underutilized

> Underutilized Bedrock Provisioned Throughput means invocations exist but output stays under 100,000 tokens per day across the 30-day window, far below one Model Unit's capacity. ZopNight recommends shrinking to the 1-MU floor, pricing savings as the per-MU-hour rate times the removed units times 730 hours, abstaining on committed-term PTs.

Source: https://zop.dev/integrations/aws/recommendations/bedrock-provisioned-throughput-underutilized
Updated: 2026-08-19

---

## Traffic present but output tokens thin

- resource.Type: bedrock-pt
- MetricsAware: Invocations (must show activity) and OutputTokenCount (Sum-stat datapoints), both taken from [Bedrock's invocation and token counters](https://docs.aws.amazon.com/bedrock/latest/userguide/monitoring.html)

## The per-day output token floor

```text
bedrockPTUnderutilizedLookbackDays=30, bedrockPTUnderutilizedTokensPerDayFloor=100000
```

## Costing the model units above the one-unit floor

Concrete or abstain, now a quantified rightsizing rec (as of this PR). Sums per-period OutputTokenCount Datapoints across the 30-day window and divides by lookback days to derive per-day output throughput. The detection signal (invocations exist but per-day output tokens fall below the floor, and a single MU on Claude 3 Sonnet handles ~250k output tokens/min at peak) gates the rec. When it fires, the rule prices the Model-Unit reduction off the real [no-commitment per-MU-hour rate](https://aws.amazon.com/bedrock/pricing/) the aggregator now resolves under the foundation-model-id key (discoverer ListFoundationModels harvest, exact-matched to the offer-file display token; see aggregator docs/COST.md): savings = perMURate × (currentMU − 1) × 730h (target = the 1-MU floor, since traffic sits far below a single MU's capacity), capped at the resource's own monthly cost; optimized = cost − savings. bedrock_pt_underutilized.go implements SKURatesAware (SetSKURates), mirroring RC-1610's LookupSKURate consumption. The rule abstains, never emitting a $0 or fabricated rec, when: the per-MU rate isn't ingested; the PT is already at the 1-MU floor (RC-1603 on-demand migration is the lever there); or the PT is on a committed term (bedrockResourceIsCommittedTerm, billed at a rate other than the captured no-commitment one, mirroring RC-1610). 1-month/6-month/Custom commitment-term PT resources remain unresolvable regardless (no per-term price dimension in the offer file). Emit + abstain matrix pinned in bedrock_pt_underutilized_test.go (TestBedrockPTUnderutilized_EmitsQuantifiedSaving + the abstain cases).

## Sizing model units to peak token throughput

1. Review InputTokenCount/OutputTokenCount over the past 14 days
2. Calculate the smallest MU count that comfortably covers peak token throughput
3. Adjust ModelUnits via UpdateProvisionedModelThroughput or recreate at lower MU
4. Confirm steady-state latency stays within SLA

## Invocations plus output token count

Invocations, OutputTokenCount (30-day lookback, Sum-statistic)
