Voice is POST /v1/audio/speech and word timings come from POST /v1/audio/transcriptions over the rendered audio. Music, sound effects, images, and video generate through /v1/audio/music, /v1/audio/foley, /v1/images/generations, and /v1/videos/generations. The shared catalog is a listing under media/<type>/ in our own object store, browsed through /v1/s3 — an empty prefix reports itself as empty rather than reading as a bad query. One client (scripts/lib/api.mjs) holds every route and the one credential: a Hanzo IAM token in $HANZO_API_KEY, read from Hanzo KMS. No credential file, no per-repo .env, no per-provider CLI to install or keep current. $HANZO_BASE_URL points the same code at a local Hanzo Engine. Word timings are passed through, never interpolated: a caption cut on invented boundaries reads as correct and drifts against the voice. When the service returns text without them, the word array is empty and the caller is told. Deletes the provider cascade this replaces, its model ladders, and the account linking in telemetry — the install id stands alone.
4.0 KiB
media-use usage dashboard
Reproducible definition of the media-use usage dashboard. The dashboard answers
"how much is media-use used, for what, is reuse working, and what can't it
satisfy" from the telemetry scripts/lib/telemetry.mjs already emits. Build it
in an authorized Frames analytics project; this doc is the source of truth
so it can be recreated. Local complement: resolve --stats (same questions,
from .media/ + ~/.media, no dashboard access needed).
Identity (see scripts/lib/telemetry.mjs)
Events attribute to the same install as the CLI and studio — the shared
install id in ~/.frames/config.json (anonymousId) and nothing else. No
account is stitched in: pseudonymous, always. $ip:null. Opt-out:
FRAMES_NO_TELEMETRY=1 / DO_NOT_TRACK=1 (also CI, dev).
Event catalog (verified present in-project)
Every event carries surface: "media-use". Event properties are coarse —
never intent text, file names, or paths.
| Event | Fires on | Key properties |
|---|---|---|
media_use_resolve |
a resolve that produced/returned an asset | type, source, provider, via, local_only, provider_override |
media_use_resolve_miss |
a resolve that found nothing | type, local_only, provider_override (no intent) |
media_use_candidates |
--candidates / --dry-run listing |
type, counts |
media_use_doctor_run |
--doctor |
ok, checks_failed, failed[] |
media_use_compare |
grade-compare / compare |
command, cells, truncated, total, render_ready_timed_out |
media_use_transcribe · media_use_duck · media_use_transcript_cut |
audio-engine ops | op-specific |
Dashboard tiles
- Invocation volume —
query-trends, count ofmedia_use_resolveover time (daily). "How much." - By media type —
media_use_resolvebroken down bytype(bgm/sfx/image/icon/logo/voice/grade/lut). "For what." - Resolve hit-rate — trends formula:
A / (A + B)where A =media_use_resolve, B =media_use_resolve_miss. "Is the catalog covering needs." - Provider mix —
media_use_resolvebroken down byprovider; a second tile byvia(url/params-fallback/params) to catch CDN→params LUT downgrades. - Top misses —
media_use_resolve_missbroken down bytype(the tuning signal — pair with localresolve --stats, which also shows the missed intents that telemetry deliberately omits). - Doctor health —
media_use_doctor_runbroken down byfailed[](which dependency check fails most) +checks_faileddistribution. - Compare cost —
media_use_comparebycommand, plustruncated/render_ready_timed_outrates (observe before lifting the 16-cell cap). - Adoption (optional) — if the
first_runproperty ships (plan U5), segmentmedia_use_resolvefirst-run vs repeat.
Recreate in an analytics dashboard
For each tile, confirm the event/property schema, build its trend or breakdown,
then add it to a dashboard. Keep names prefixed media-use: so the dashboard is
greppable. Cross-surface note: because identity is shared with CLI/studio, you
can also break these down by the same person across cli_command* and studio:*
events.