Conversations grouped by similarity, each group named from its own contents. No fixed taxonomy and no other bucket. Select a row for detail.
{% if p.use_cases %}| Use case | Tags | Conversations | Spend | Share | |
|---|---|---|---|---|---|
| {{ loop.index }} |
▶ {{ u.name }}
{{ u.description }}
|
{{ u.sessions | num }} | {{ u.cost_usd | money }} | {{ u.cost_share | pct(1) }} | |
|
Per conversation {{ u.cost_per_session | money }} Invocations {{ u.invocations | num }} Distinct prompts {{ u.distinct_prompts | num }} Active days {{ u.active_days | num }} Tokens in / out {{ u.input_tokens | num }} / {{ u.output_tokens | num }} First → last seen {{ u.first_seen or '—' }} → {{ u.last_seen or '—' }} Model {% if u.models %}{{ u.models[0].model | shortmodel }}{% else %}—{% endif %} Application {% if u.apps %}{{ u.apps[0].app }}{% else %}—{% endif %} Category {{ u.category }} Confidence {{ u.confidence | pct }} Tools called{% for t in u.tools %}{{ t.tool }}{% if not loop.last %} · {% endif %}{% endfor %}
Cost improvements{% for r in u.recommendations %}
{{ r.title }}
{% if r.annual_saving_usd %}— up to {{ r.annual_saving_usd | money }}/yr{% endif %}
{% endfor %}
{{ r.detail }}
Sample prompts{% for e in u.examples %}{{ e }}{% endfor %}
|
|||||
What was actually invoked — the models, tools, applications and IAM principals present in the logs, with their counts.
| Model | Conversations | Invocations | Input tokens | Output tokens | Spend |
|---|---|---|---|---|---|
| {{ b.key | shortmodel }} {{ b.key }} | {{ b.sessions | num }} | {{ b.invocations | num }} | {{ b.input_tokens | num }} | {{ b.output_tokens | num }} | {{ b.cost_usd | money }} |
| Tool | Conversations | Invocations | Spend |
|---|---|---|---|
| {{ b.key }} | {{ b.sessions | num }} | {{ b.invocations | num }} | {{ b.cost_usd | money }} |
| Execution role | Conversations | Invocations | Spend |
|---|---|---|---|
| {{ b.key }} | {{ b.sessions | num }} | {{ b.invocations | num }} | {{ b.cost_usd | money }} |
| Principal ARN | Conversations | Spend |
|---|---|---|
| {{ b.key }} | {{ b.sessions | num }} | {{ b.cost_usd | money }} |
Retrospective detection over retained prompts. Counts and labels only — matched values are never written into this file.
{% if not p.risk %}| Type | Finding | Top application | Conversations | Occurrences |
|---|---|---|---|---|
| {{ f.kind }} | {{ f.label }} | {% if f.top_apps %}{{ f.top_apps[0].app }}{% if f.top_apps | length > 1 %} +{{ f.top_apps | length - 1 }}{% endif %}{% else %}—{% endif %} | {{ f.sessions | num }} | {{ f.occurrences | num }} |
Ranked by whole conversation rather than by request. A twenty-turn session is one unit of work; tools that count requests never show it that way.
| Spend | Invocations | Turns | Model | Application | Opening prompt |
|---|---|---|---|---|---|
| {{ s.cost_usd | money }} | {{ s.invocations | num }} | {{ s.turns | num }} | {{ s.model | shortmodel }} | {{ s.app }} | {{ s.first_turn | default('—', true) | truncate(100) }} |
{{ p.source.ingest.records_read | num }} invocation records were joined into {{ p.totals.sessions | num }} conversations, reduced to {{ p.totals.distinct_snippets | num }} distinct prompts, and grouped into {{ p.totals.clusters }} clusters. Each cluster was named once — that is {{ p.run.inference.complete_calls | num }} model call{{ 's' if p.run.inference.complete_calls != 1 }}, regardless of corpus size.
How to read the conversation count. Bedrock logs one invocation at a time and records no conversation id, so conversations are rebuilt by matching each request against the one whose output it contains. The join is exact — no similarity, no guessing — but three things split one real conversation into several: a retry, a context compaction, and an assistant branch the user abandoned. So {{ p.totals.sessions | num }} is an upper bound, and against a synthetic corpus with known ground truth it runs about 10% high. Everything derived from it — cost per conversation, conversations per use case — is a lower bound in the same proportion. Spend is unaffected: it is summed per invocation and never divided by this number.
| Analysis cost | {{ p.run.inference.cost_usd | money }} |
| Naming calls | {{ p.run.inference.complete_calls | num }} |
| Cached input tokens | {{ p.run.inference.cached_input_tokens | num }} |
| Records read | {{ p.source.ingest.records_read | num }} |
| Records skipped | {{ p.source.ingest.records_skipped | num }} |
| Own calls excluded | {{ p.source.ingest.excluded_own_calls | num }} |
| Cost coverage | {{ p.source.cost_coverage | pct(1) }} |
| Snippet strategy | {{ p.run.config.snippet_strategy }} |
| Granularity | {{ p.run.config.granularity }} |
| Run time | {{ p.run.duration_seconds }}s |
| Run id | {{ p.run.id }} |