Monitoring

Usage

Usage is org-scoped analytics for LLM, STT, and TTS consumption with estimated costs. It helps you see how much each workspace, product area, call import, and model is consuming — and what that usage likely costs.

Usage is not a quota or billing portal. Optional Flexprice event metering is a separate system and is not shown in the Usage UI.

Models and providers tracked here come from your enabled integrations. Usage is attributed per workspace when the underlying workflow is workspace-scoped.


Opening the Usage page

In the sidebar, go to Usage → Overview (/usage).

The page has two tabs when your org is licensed for enterprise features and you are an org admin:

TabURLWho can access
Overview/usageAll org members
Pricing overrides/usage?tab=pricingOrg admins with enterprise license

Summary metrics

The top of the Overview tab shows rollup cards for the selected date range and filters:

MetricDescription
Input tokensPrompt or input tokens sent to LLM providers
Output tokensCompletion or output tokens returned by LLMs
Total tokensSum of input and output tokens
LLM callsNumber of LLM API calls
STT audioSpeech-to-text audio duration (shown when non-zero)
TTS charactersText-to-speech characters synthesized (shown when non-zero)
Cache readTokens read from provider prompt cache (shown when non-zero)
Cache writeTokens written to provider prompt cache (shown when non-zero)
ReasoningReasoning tokens billed separately by some providers (shown when non-zero)
Estimated costTotal estimated cost for the filtered range

Click Cost breakdown to open a modal with line items:

  • Input, output, cache read, cache write, reasoning
  • Audio (STT), TTS
  • Total estimated cost

If any usage in the range has no matching catalog rate, the breakdown shows an unpriced usage warning. Those rows still appear in token/volume metrics but do not contribute to cost totals.

Currency display

Toggle between USD and INR in the filter bar. INR amounts use a live USD→INR rate from Frankfurter when available, with a fallback estimate when the FX service is unreachable.


Filters

Filters narrow the summary cards and drill-down table. All filter state is stored in the URL, so you can bookmark or share a specific view.

FilterDescription
Date rangeStart and end dates, interpreted in your browser's IANA timezone
WorkspaceLimit to one workspace
Call importLimit to one call import batch
DatasetFilter by dataset name on call import rows
TagFilter by call import tag
Evaluation runFilter by evaluation resource
Usage kindLLM, STT, or TTS
ModelProvider model identifier
Source / product sectionProduct area (playground, evaluators, call imports, etc.)

Drill-down navigation

Click rows in the breakdown table to drill deeper. Breadcrumbs at the top show your current path; click a breadcrumb to go back up.

At the organization level, the table groups by workspace. Inside a workspace you see a composite view:

  • Call import batches — CSV uploads or manual audio recordings
  • Product areas — usage from other parts of the platform (not tied to a single call import)

From a call import batch you can drill into evaluation runs, then model, then usage kind. From a product area you drill into model, then usage kind.

Each drill level returns at most 100 rows. If more exist, results are truncated at that level.

Product sections

SectionWhat it tracks
Call importsCall import batch processing
Call import evaluationsEvaluations run on imported calls
PlaygroundText playground and experiments
Voice playgroundVoice agent playground — LLM, STT, and TTS
ChatChat conversations
TelephonyTelephony and live calls
EvaluatorsEvaluator definitions and runs
MetricsMetrics and scoring
Judge alignmentJudge alignment workflows
Prompt optimizationPrompt optimization jobs
PersonasPersona generation
AgentsAgent configuration
Prompt partialsPrompt partials
Conversation evaluationsConversation evaluations
Test agentTest agent sessions
OtherUsage not attributed to a named product area

Data freshness and history

Freshness

Usage counters are buffered in Redis and flushed to Postgres by the worker-usage service on a Celery Beat schedule (default: every 2 minutes). The UI reads Postgres only.

The page shows Updated with a last_updated_at timestamp when available. Expect roughly 2 minutes of lag between new API usage and what appears on this page.

For fresh data in self-hosted deployments, ensure beat, worker-usage, and the default worker are running (or use eai start-all).

History limits

DeploymentHistory windowPricing overrides tab
OSS (no license)Last 7 daysHidden
Enterprise (EFFICIENTAI_LICENSE)UnlimitedOrg admins only

On OSS deployments, an amber banner explains the 7-day cap and points to EFFICIENTAI_LICENSE. If you pick a wider date range, it is automatically clamped to the allowed window.

See Configuration for license setup.


Pricing overrides

Enterprise org admins can open Pricing overrides (/usage?tab=pricing) to set per-model rates that override the built-in catalog for cost estimation.

Override fields by usage kind

Usage kindRate fields (USD)
LLMInput / 1M tokens, output / 1M tokens, cache read / 1M, cache write / 1M, reasoning / 1M, audio / minute
STTAudio / minute
TTSCharacters / 1M

For each override you set:

  • Provider credential — models come from enabled integrations
  • Usage kind — LLM, STT, or TTS
  • Model — provider model identifier
  • Effective from — date the override starts applying
  • Rates — USD values for the fields above

You can prefill rates from the catalog or an existing override. Saving creates or updates the override; deleting removes it.

How overrides affect costs

Overrides apply to new usage recorded on or after effective_from. Costs already stamped on daily rollup rows are not changed automatically.

To backfill historical costs after a catalog or override change, use the CLI or API recompute workflow. The Usage UI does not expose recompute jobs today — see CLI Commands.


Operations

Self-hosted operators manage pricing catalogs and cost backfills outside the UI.

RequirementPurpose
beatSchedules usage flush, FX refresh, OSS history prune
worker-usageFlushes Redis counters and runs cost recompute jobs
Default workerEvaluator cron dispatch (indirectly drives much platform usage)

Common tuning variables (see env.example):

VariableDefaultPurpose
USAGE_FLUSH_BEAT_SECONDS120Flush interval (~2 min UI lag)
USAGE_READ_CACHE_TTL_SECONDS90Redis cache TTL for summary/breakdown/filters
USAGE_FLUSH_MAX_BATCHES_PER_RUN30Batches per flush tick

For seeding rates, diffing catalogs, and recomputing stored costs, see CLI Commands — Usage pricing.

Community & contact

  1. Found a bug or have a feature request? Open a GitHub issue.
  2. Join our Discord for faster replies!