Módulo 2: The Bedrock Cost Model

8. Proyecto: `GENAI-COST-PROFILE.md` de Andes Cargo

Descripción

Las siete lecciones anteriores produjeron, dispersas, todas las piezas de un perfil de costo completo: los cinco modelos de precio de Bedrock con cifras citadas (lección 2), el límite de cuota que el precio no cubre (lección 3), la confirmación real de hasta dónde llega Infracost (lecciones 4 a 6), y la calculadora propia que resuelve lo que Infracost no puede (lección 7). Este proyecto final convierte esas piezas dispersas en un solo documento: GENAI-COST-PROFILE.md, en la raíz de andes-cargo-infra/, junto a COST-PROFILE.md que finops-and-cost-guardrails-guide ya dejó ahí — complemento, nunca reemplazo, exactamente como ADR-001 prometió en su fila del Módulo 2.

Conexión con el módulo

Este documento cierra el módulo, y hace algo que ninguna lección anterior hizo todavía: reconcilia el volumen que este módulo usó para probar la calculadora (5.000 invocaciones/mes, en la lección 7) contra el volumen total real que COST-PROFILE.md ya declaró para Andes Cargo (~400 manifiestos/mes, en total). Esa reconciliación —hecha en voz alta, no escondida— es, en sí misma, el ejercicio de honestidad que cierra este módulo.


Paso 1 — La reconciliación que este documento tiene que hacer, antes de escribir una sola línea

Antes de llegar al documento, vale la pena resolver una tensión real que un lector atento de esta guía ya podría haber notado: la lección 7 corrió la calculadora con un supuesto de 5.000 invocaciones al mes. Pero COST-PROFILE.md, el documento hermano de finops-and-cost-guardrails-guide, ya declaró que Andes Cargo procesa, en total, ~400 manifiestos al mes. Si extract-shipment-manifest-fields es un camino de escalamiento —una minoría del total, según ADR-001—, ¿cómo puede el volumen de invocaciones de Bedrock (5.000) ser más de 12 veces el volumen total de manifiestos de Andes Cargo (400)?

No puede, y esta lección no lo esconde. La lección 7 usó 5.000 como un número redondo, útil para probar la calculadora y sus casos de pytest — nunca se presentó ahí como "el volumen real de Andes Cargo hoy". El proyecto que cierra este módulo es exactamente el lugar donde esa tensión se resuelve, en voz alta: GENAI-COST-PROFILE.md declara dos escenarios, no uno, cada uno con su propia justificación:

   DOS ESCENARIOS, DECLARADOS POR SEPARADO

   REALISTA                              ESTRÉS
   40 manifiestos escalados/mes           5.000 manifiestos escalados/mes
   (10% del total de ~400/mes             (deliberadamente exagerado --
    que COST-PROFILE.md ya declaró)        más de 12x el total actual --
                                            el mismo tipo de escenario que
                                            ADR-001 nombra como la señal
                                            para reconsiderar el parser)

   Corrido con la calculadora real        Ya corrido en la lección 7,
   de esta lección                        reusado aquí sin repetir el comando

Esta es la misma disciplina que COST-PROFILE.md ya estableció para sí mismo: un supuesto de volumen es una hipótesis declarada, no una medición — y cuando dos documentos del mismo ecosistema usan números distintos, la responsabilidad de esta guía es reconciliarlos explícitamente, no dejar que un lector futuro se pregunte cuál de los dos es "el correcto".


Paso 2 — Corriendo el escenario realista, el único número nuevo de esta lección

python3 bedrock_cost_estimate.py \
  --model amazon.nova-lite-v1:0 \
  --input-tokens 800 \
  --output-tokens 150 \
  --monthly-requests 40

Qué esperar (literal — corrido de verdad):

Model                          amazon.nova-lite-v1:0
Input tokens / request         800
Output tokens / request        150
Monthly requests (declared)    40

Monthly input tokens           32,000
Monthly output tokens          6,000

Input cost   ($0.0600/1M tok)    $0.00
Output cost  ($0.2400/1M tok)    $0.00
----------------------------------------------------
TOTAL MONTHLY COST                           $0.00

El total redondea a $0.00. No es un error de la calculadora — es la aritmética real: 40 invocaciones al mes, a este tamaño de token, producen un costo de fracciones de centavo que round(..., 2) reporta, con precisión, como cero dólares. Esta lección no esconde ese resultado ni lo reemplaza por el número más "interesante" de la lección 7 — lo presenta tal cual, y saca la conclusión correcta de él: al volumen realista de hoy, esta carga de trabajo específica no necesita gestión activa de costo todavía. Eso no es lo mismo que "Bedrock es gratis" — es una conclusión de FinOps informada por un número real, exactamente la disciplina que finops-and-cost-guardrails-guide ya instaló para el resto de Andes Cargo.


Paso 3 — El documento completo

En la raíz de andes-cargo-infra/, crea GENAI-COST-PROFILE.md:

# GENAI-COST-PROFILE.md — Andes Cargo AI Workload Cost Model

**Status:** Active · **Owner:** Platform/FinOps · **Framework:** FinOps Foundation (Inform phase)
**Covers:** the token-based cost of `extract-shipment-manifest-fields`, the one Bedrock-backed
escalation path defined in `ADR-001-llm-as-escalation-path.md` (Module 1)
**Complements, never replaces:** `COST-PROFILE.md` (`finops-and-cost-guardrails-guide`, Module 1),
which covers the three billable AWS services already in `andes-cargo-infra/` (S3, Lambda,
DynamoDB). This document adds the fourth billable surface -- Bedrock -- with its own pricing
model, because none of the three services `COST-PROFILE.md` covers are billed per token.
**Does not cover:** infrastructure-as-code cost estimation via Infracost (attempted, not achieved
-- section 6); a cost gate as executable policy (Module 6); Provisioned Throughput as a real
decision (named with numbers in Module 6, lesson 7, not decided here).

## 1. Scope

This document declares which Bedrock model `extract-shipment-manifest-fields` uses, the volume
assumption behind that choice, the resulting monthly cost projection from
`scripts/bedrock_cost_estimate.py`, and the honest result of attempting to get that same number
from Infracost. It does not estimate infrastructure cost for `bedrock.tf` itself (the guardrail
resource has no per-existence charge) -- it estimates the cost of *invoking* the model that
resource governs, which is the number no Terraform-reading tool can produce alone (Module 2,
lesson 6).

## 2. Chosen model and rationale

**Amazon Nova Lite (`amazon.nova-lite-v1:0`), on-demand pricing tier.**

Module 1, lesson 6 named Amazon Nova Micro and Nova Lite as the starting candidates for this task,
deferring the final choice to Module 2 "with real cost numbers." Module 2, lesson 2 confirmed the
starting candidates are close in price (Nova Micro at $0.035/$0.14 per 1M tokens in/out; Nova Lite
at $0.06/$0.24), roughly 1.7x apart. Given a task with real semantic ambiguity -- free-text
manifests, unstructured, no fixed format, where a partner's phrasing varies email to email -- Nova
Lite is chosen over Nova Micro as the starting point: the price difference at Andes Cargo's
current volume (section 4) is negligible in absolute terms, and Nova Lite's larger capacity gives
more headroom for reliable extraction on a task Nova Micro was not specifically evaluated against
in this guide. **This is a judgment call, not a measurement** -- no real invocation happens in
this guide (the honesty ledger in Module 8, lesson 5 restates this without hedging). The smoke
test harness Module 7 builds is the mechanism that would validate or overturn this choice with
real evidence, once a real account runs it.

## 3. Pricing reference (on-demand, `us-east-1`, verified Aug 2026)

| Model | Input ($/1M tokens) | Output ($/1M tokens) | Source |
|---|---:|---:|---|
| Amazon Nova Micro | $0.035 | $0.14 | AWS Price List API, `AmazonBedrock` offer |
| **Amazon Nova Lite (chosen)** | **$0.06** | **$0.24** | AWS Price List API, `AmazonBedrock` offer |
| Amazon Nova Pro | $0.80 | $3.20 | AWS Price List API, `AmazonBedrock` offer |
| Amazon Nova Premier | $2.50 | $12.50 | AWS Price List API, `AmazonBedrock` offer |

**All prices above are marked VARIABLE, not permanent literals** -- see Module 2, lesson 2. What
is stable is the *shape* of the model: input and output priced separately, output consistently
several times more expensive than input, across every model in the catalog.

## 4. Volume assumptions -- two scenarios, declared explicitly

`COST-PROFILE.md` (`finops-and-cost-guardrails-guide`, section 4) already declares Andes Cargo's
total manifest volume: **~400 manifests/month**, a starting hypothesis, not a measurement, for a
small logistics operation. `ADR-001` defines the escalation path as a minority of that total,
triggered only when the deterministic `key=value` parser fails. This document declares two
scenarios against that baseline, both fed through `scripts/bedrock_cost_estimate.py`:

| Scenario | Escalated manifests/month | Rationale |
|---|---:|---|
| **Realistic** | 40 (10% of the 400/month total) | A conservative starting estimate of how often free-text manifests arrive, until Module 7's escalation-rate SLI measures the real number from live events |
| **Stress** | 5,000 | Deliberately pessimistic: an order-of-magnitude larger Andes Cargo, or a pathological scenario where a large partner permanently switches to free-text format overnight -- the scenario `ADR-001`'s Consequences section names as the trigger to reconsider the deterministic parser's coverage |

Both scenarios share the same per-invocation size assumption: **800 input tokens, 150 output
tokens** -- a free-text manifest roughly the length of a short email, and a structured response of
five extracted fields (`shipmentId`, origin, destination, weight, confidence). This size assumption
has the same status as the volume assumption: a starting hypothesis, not a measurement.

## 5. Monthly cost projection (`scripts/bedrock_cost_estimate.py`, run for real)

```
$ python3 bedrock_cost_estimate.py --model amazon.nova-lite-v1:0 --input-tokens 800 --output-tokens 150 --monthly-requests 40
...
TOTAL MONTHLY COST                           $0.00

$ python3 bedrock_cost_estimate.py --model amazon.nova-lite-v1:0 --input-tokens 800 --output-tokens 150 --monthly-requests 5000
...
TOTAL MONTHLY COST                           $0.42
```

**At today's realistic volume, the projected monthly cost rounds to $0.00.** This is not a bug in
the calculator -- it is the honest answer: 40 invocations/month of a cheap model, at this token
size, produce a fractional-cent cost that Python's `round(..., 2)` correctly reports as zero
dollars. Even at the deliberately pessimistic stress scenario -- 12.5x the entire current manifest
volume, all of it escalated -- the projected cost is $0.42/month. **The conclusion this document
draws is not "Bedrock is free," it is "at Andes Cargo's current scale, this specific workload does
not need active cost management yet"** -- a FinOps judgment, informed by a real number, not an
assumption that AI cost is automatically significant. This conclusion is revisited the moment
Module 7's real escalation-rate measurement, or real production volume, changes section 4's
assumption -- see section 7.

## 6. Infracost attempt result (Module 2, lessons 4-6)

`infracost --version` confirmed `2.16.1`, the same version `finops-and-cost-guardrails-guide`
already fixed -- zero reinstallation. `infracost scan andes-cargo-infra/`, run for real against a
project containing a draft `aws_bedrock_guardrail` resource, never reached the point of analyzing
that resource: Infracost's authentication gate blocked first, falling back to device-flow login in
this environment. Independently, `infracost.io/docs/supported_resources/aws/` was checked directly
and confirmed no `aws_bedrock_*` resource is listed in Infracost's catalog as of this writing --
so even with a completed login, a dollar figure for this specific resource is unlikely with the
current version. Structurally, this would remain true even with full catalog support: no
Terraform resource represents a single `InvokeModel` call, so no plan-reading tool can derive a
per-invocation cost from HCL alone (Module 2, lesson 6). Section 5's number comes from
`scripts/bedrock_cost_estimate.py`, not from Infracost, for this exact reason.

## 7. Document maintenance

This document's two most important numbers -- the escalation rate (section 4) and the per-invocation
token size (section 4) -- are both hypotheses, not measurements, exactly like `COST-PROFILE.md`
declares for its own volume assumptions. Module 7, lesson 4 of this guide computes a real
escalation rate from a fixed, deterministic set of test events, without invoking any model -- the
first real data point against which section 4's "10%" guess should be checked. This document is
reviewed, not rewritten from scratch, the moment that real number exists, or the moment Andes
Cargo's total manifest volume (the `COST-PROFILE.md` baseline this document builds on) changes.

Paso 4 — Verificando el documento

wc -l GENAI-COST-PROFILE.md
grep -c '^## ' GENAI-COST-PROFILE.md

Qué esperar (literal — el contenido lo escribiste tú, así que su forma es determinista):

117 GENAI-COST-PROFILE.md
7

Ciento diecisiete líneas, siete secciones — alcance, modelo elegido, precios, volumen, proyección, resultado de Infracost, mantenimiento. Si tu conteo no da 7, revisa que no hayas fusionado ni omitido ninguna de las siete ## del Paso 3.


Por qué esta reconciliación importa más que el número final

El punto más importante de esta lección no es que el costo de extract-shipment-manifest-fields sea bajo —eso ya lo mostró la lección 7—. Es que este documento no escondió la tensión entre dos números de dos guías hermanas, y en vez de elegir uno en silencio, declaró ambos, con su propia justificación cada uno. Es la misma disciplina de honestidad que sostuvo cada intento representativo de este módulo: cuando dos fuentes de verdad de este ecosistema no coinciden exactamente, la respuesta correcta nunca es picking uno y fingir que el otro no existe — es explicar, con evidencia, por qué ambos tienen su lugar.


Errores comunes

Presentar solo el escenario de estrés ($0.42) y omitir el realista ($0.00), porque "es el número que ya se calculó en la lección 7" (de pereza de reconciliación). Qué pasa: alguien, al escribir su propio documento, reusa directamente el número de la lección 7 sin volver a correr la calculadora con el volumen real de COST-PROFILE.md. Cómo detectarlo: si tu GENAI-COST-PROFILE.md no menciona el número ~400/mes de la guía hermana en ningún lugar. Cómo corregirlo: el Paso 1 de esta lección existe exactamente para forzar esa reconciliación — sin ella, tu documento contradice silenciosamente a COST-PROFILE.md, el mismo tipo de divergencia no declarada que la sección de mantenimiento de ese documento advirtió como el peor escenario posible.

Interpretar un total de $0.00 como "no hace falta pensar en el costo de esta carga de trabajo nunca" (de sobre-generalización). Qué pasa: alguien, viendo el resultado del Paso 2, concluye que el Módulo 6 (FinOps para tokens) es innecesario para Andes Cargo. Cómo detectarlo: si tu reacción al $0.00 es "entonces no hace falta un presupuesto para esto". Cómo corregirlo: la sección 5 del documento es explícita — la conclusión no es "gratis para siempre", es "no necesita gestión activa todavía, a este volumen específico". El Módulo 6 sigue existiendo porque el volumen puede cambiar, y el presupuesto que ese módulo construye es exactamente el mecanismo que detecta ese cambio antes de que se vuelva un problema real — no una respuesta a un problema que ya existe hoy.

Tratar los precios de la sección 3 como definitivos, sin la nota de "VARIABLE" (de expectativa, el mismo error que ya se nombró en la lección 2). Qué pasa: alguien cita este documento meses después como si el precio de Nova Lite fuera un hecho permanente. Cómo detectarlo: si estás tomando una decisión de presupuesto real basada en un precio de este documento sin haberlo revisado de nuevo. Cómo corregirlo: la sección 3 lo dice explícitamente, con la misma disciplina que COST-PROFILE.md ya estableció para S3/Lambda/DynamoDB — verifica contra aws.amazon.com/bedrock/pricing/ el día que necesites el número real.


Ejercicios

Ejercicio 1 — Verifica que el documento no perdió ningún dato de las lecciones anteriores. Compara, sección por sección, el Paso 3 contra las lecciones 2, 5, 6 y 7 de este módulo. ¿Los cinco modelos de precio, el resultado del intento de Infracost, y la proyección de costo coinciden exactamente con lo que esas lecciones ya mostraron?

Ver solución

Deberían coincidir exactamente: los cuatro modelos citados en la sección 3 (Nova Micro, Nova Lite, Nova Pro, Nova Premier) con los mismos precios de la lección 2; el resultado del intento de Infracost en la sección 6 (bloqueo por autenticación, confirmado sin aws_bedrock_* en el catálogo público) con el hallazgo real de las lecciones 5 y 6; y la proyección de $0.42/mes del escenario de estrés en la sección 5 con la salida literal de la lección 7. Si encontraste alguna diferencia, revisa que no se haya introducido un número inventado al transcribir — la misma disciplina que COST-PROFILE.md ya exigió para sí mismo.

Ejercicio 2 — Explica por qué la sección 2 dice explícitamente "This is a judgment call, not a measurement" sobre la elección de Nova Lite. ¿Por qué el documento no simplemente afirma "Nova Lite es el modelo correcto" sin esa salvedad?

Ver solución

Porque ninguna invocación real de ningún modelo ocurre en esta guía — la elección de Nova Lite sobre Nova Micro se basa en un razonamiento de capacidad relativa (una tarea con más ambigüedad semántica probablemente se beneficia de un modelo con más capacidad), no en una tasa de éxito medida contra datos reales. Afirmar "Nova Lite es el modelo correcto" sin esa salvedad sería presentar una decisión de juicio como si fuera un hecho verificado — exactamente el tipo de honestidad rota que esta guía entera evita, la misma disciplina que etiqueta "(representativo)" cada vez que una salida de un modelo aparece en cualquier otra lección de esta guía.

Ejercicio 3 — Predice qué cambiaría en este documento si, en el Módulo 7, la tasa de escalamiento real medida resultara ser 25% en vez del 10% asumido en la sección 4. Basándote en la sección 7 ("Document maintenance"), ¿qué pasos seguirías?

Ver solución

Según la sección 7, este documento se revisa —no se reescribe desde cero— la primera vez que existe un número real de tasa de escalamiento. Con un 25% real en vez del 10% asumido, el escenario "Realista" de la sección 4 pasaría de 40 a 100 manifiestos escalados/mes (25% de 400), y habría que volver a correr scripts/bedrock_cost_estimate.py con ese nuevo volumen para actualizar la sección 5 con el total real correspondiente. El resto del documento —el modelo elegido, los precios citados, el resultado del intento de Infracost— no necesitaría cambiar, porque ninguno de esos tres depende del valor específico de la tasa de escalamiento.


Resumen y siguiente paso

Este proyecto final del Módulo 2 escribió GENAI-COST-PROFILE.md: siete secciones que declaran el modelo elegido (Nova Lite, con su justificación explícita como decisión de juicio, no medición), el precio citado y verificado, dos escenarios de volumen reconciliados contra COST-PROFILE.md de la guía hermana ($0.00/mes realista, $0.42/mes de estrés), y el resultado honesto del intento de Infracost (bloqueado por autenticación, y estructuralmente fuera de su catálogo de cualquier forma). Verificaste el documento con wc y un conteo de secciones, y confirmaste que la reconciliación de números entre guías hermanas —no esconder una tensión real— es, en sí misma, el trabajo más importante de esta lección.

Antes de avanzar deberías poder: explicar la función de cada una de las siete secciones del documento; recitar por qué se eligió Nova Lite sobre Nova Micro, sin mirar el documento; y explicar por qué un total de $0.00 no significa "no hace falta pensar en esto nunca".

Con GENAI-COST-PROFILE.md cerrado, el Módulo 2 completo —ocho lecciones, desde la intuición de "precio por token" hasta este documento— queda atrás. El Módulo 3 abre con la fila de ADR-001 que le corresponde: declarar la infraestructura completa de la carga de IA como código real, validado y planeado de verdad, sin necesitar LocalStack ni una cuenta AWS para hacerlo — el módulo con más peso ejecutado de toda esta guía.

Recursos

  1. finops-and-cost-guardrails-guide, Módulo 1, lección 7 (07-hands-on-writing-the-cost-profile-document.md) — la fuente de COST-PROFILE.md, el documento hermano que esta lección reconcilia explícitamente, nunca reemplaza.
  2. ADR-001-llm-as-escalation-path.md (Módulo 1, lección 8, esta misma guía) — la fuente de la fila que asigna a este módulo la responsabilidad de fijar el costo del camino de escalamiento.
  3. Este módulo, lecciones 2, 5, 6 y 7 — la fuente completa de cada dato de este documento: precios, el resultado de Infracost, y la calculadora.
  4. FinOps Foundation — FinOps Framework — la fuente de la fase Inform, citada en el encabezado del documento de esta lección, la misma que COST-PROFILE.md ya citó.