Stats and Insights - Inktomi93/OrbWeaver GitHub Wiki

Insights shows activity and generation figures recorded for your retained library: replies, swipes, words, tokens, model speed and recorded spending. Use it to compare your characters and models, not to reconcile your provider bill.

Accounting is partial. Prompt extraction and captioning costs are omitted, and background-work accounting is incomplete. Open Accounting coverage beside the spending figures for the limits. Image and compaction spending are library-level activity, not per-character costs.

Every figure is about your own library. Nothing here estimates what you "probably" did; if a number was never recorded, the tile says so instead of printing a zero.

Where to find it

  1. Open Corpus.
  2. Switch the mode to Insights.

The list on the side is your character leaderboard. The main area is the dashboard, or one character's stats once you pick a row. The side panel has three tabs, Models, Time and Personas. On a phone the leaderboard is its own screen and the title reads "Insights ยท 50 of 328" style, so you can see the size of what's ranked.

With no chats yet it says No insights yet and points you at Chats. Play one turn and the dashboard fills in.

The dashboard

The top line says when the numbers were last updated and has a Recompute now button (more on that below). Then four blocks.

All-time totals

Your whole library, all time. There's no range to pick.

Tile What it counts
Characters Characters in your library
Chats Rooms you've started, forks included
Words Your turns plus the replies you kept. Words in swipes you didn't keep are shown beside it and are not in the total
Replies Character replies
Swipes Alternate replies you generated and didn't keep
Forked chats Chats that were forked off another
Spend Dollars reported for your generations. "Not recorded" if nothing ever reported a cost
Time generating Wall-clock time the model spent writing, summed over replies and swipes
First chat The date of the first chat you started
Swiped replies How many of the replies you got you swiped at least once
Swipes to kept reply For replies you swiped, how far past the first take the one you kept was, on average

Under the tiles, a crown row names your most-played character by reply count. It isn't a link; the same character is sitting at the top of the leaderboard, so click that one.

Rhythm

Active days, Longest streak and Busiest day. A day is active once you exchange a turn or open a chat in it. The streak is the longest run of consecutive calendar days with activity. Busiest day counts turns exchanged plus chats opened, and the line under it tells you which day it was.

Economics

This is the block I built the rest of the page to justify.

Tile What it means
Tokens in / Tokens out Totals as the provider reported them. Each label says Recorded, Estimated or Not recorded
Avg gen, p50 gen, p90 gen How long a reply takes to finish, over your last 100 kept replies
Avg TTFT Time to first token: how long you wait before the reply starts streaming, same window
Throughput (output / gen time) Output tokens divided by recorded generation time, in tokens per second
Cache hits (of input) The share of tokens you sent that the provider served from its prompt cache
Reasoning (of replies + swipes) The share of generations that produced a thinking pass
Time reasoning Total time spent in thinking passes, where the model reported it

Cache hits is worth a second look. The denominator is everything you sent, so the figure answers "how much of my prompt was cached?" the same way on every provider. An earlier version divided cache reads by cache reads plus writes, which read 100% on any provider that reports reads but not writes. That was wrong and it's gone. If a provider reports no cache figures at all, the tile is a dash. How a turn is built explains what breaks the cache in the first place.

Momentum

Rising and Falling: which characters got more or fewer replies between the two most recent months that had any activity, as two bar lists on one shared scale so +10 and -184 don't look the same length. The month pair is named above the bars. It's anchored to your data, not to the calendar, so a quiet current month doesn't make everyone look like they're falling. Up to ten each way.

Per-character stats

The leaderboard ranks every character that has a rollup, which means every character that holds a seat in a started room. A card you've never opened a chat with isn't ranked, so the count reads "50 of 328" rather than the size of your library. Sort by Replies, Gen time, Swipes or Recent. The page is 50 rows; the search box is a server search over the whole ranked set, so a character past the cut is still reachable by name. Two characters with the same name get a short id tag so you can tell them apart.

Pick a row and the main area becomes that character's page: Activity (chats, replies, your turns, swipes, words, forked chats), Economics (tokens, spend, reasoning, throughput) and Latency (the same TTFT and gen percentiles, scoped to that character). One honest gap: per-character cache hits reads as a dash, because cache accounting is kept per model and per library, never per character.

The side tabs

Models. One row per model and provider: generations, how many distinct characters you've used it with, output tokens and spend, under a ranked bar list of generations by model. Each row also has its own speed line: Time to first token (average and p90, over that model's last 100 generations) and Throughput in tokens per second. Each is labelled Recorded, Estimated or Not recorded like everything else, and a model with no recorded generation time gets a dash for throughput. With nothing drilled, a Latency (all models) block shows TTFT and gen time across everything.

Time. Replies per day and output tokens per day as histograms, the Rhythm trio again, messages by weekday, and a weekday-by-hour heatmap with the peak cell called out ("Peak: Tue 21:00"). The heatmap counts your messages and the characters' replies. Days, weekdays and hours follow your browser's timezone, so a late-night session counts on the day you lived it.

Personas. Which of you you've been. Messages by persona as a bar list, then each persona's chats, messages, output tokens and when you last used it. A persona counts as used by a chat when it's the chat's pinned persona (the one that opened it) or the persona on someone's seat. It's read live from your chats rather than from a rollup, so a persona you made a minute ago is already on the list.

A scope note. When you've drilled into a character, the Personas tab narrows to only the chats with that character. Models and Time can't; their rollups don't have a per-character axis. So they keep showing whole-library numbers and say so in a line at the top, rather than passing them off as the character's.

How the numbers are made

Nothing on this page is sampled or approximated at read time except the latency percentiles, which are computed over your most recent 100 generations each time you look.

flowchart LR
    Turn["A reply, swipe, edit or delete"] --> Rollups["Per-library, per-character, per-day and per-model rollups"]
    Import["SillyTavern or backup import"] --> Rebuild["Full rebuild from the chat history"]
    Recompute["Recompute now"] --> Rebuild
    Rebuild --> Rollups
    Rollups --> Insights["Insights"]

What counts. A chat is yours when one of your characters is seated in it and it was actually started; a room that only ever held a seeded greeting doesn't count anywhere. Shared-room activity follows the characters retained in your library, not who paid for the model call. A room can therefore appear in more than one character owner's Insights. The host still supplies the connection and pays for generation; these library figures are not a payer ledger. A reply's figures are its kept version; every other version is a swipe. Swipes add to the swipe count, the swipe words, tokens and generation time, and to the model it ran on, but not to the per-day token chart.

Words. A word is a run of letters or digits; punctuation splits. "Don't" is two words. Shrug.

Tokens. Live turns record what the provider reported, or nothing. A SillyTavern import keeps the counts SillyTavern stored and estimates the rest from the text, and those show with a ~ in front. A total that mixes measured and estimated reads as estimated. Any figure with no accounting behind it is a dash, and token and cost totals leave those turns out rather than counting them as zero.

Spend. Available provider-reported prices take precedence. When an OpenRouter bring-your-own-key response reports both its gateway fee and upstream charge, Orbweaver preserves both. Otherwise, compatible configured token rates can establish an estimate. Missing prices stay unknown, and subscription-notional estimates are not added to metered spending. Library totals sum the available compatible prices, so a subtotal can be incomplete. An observed OpenRouter response-cache hit is free; it does not turn missing token counts into known zeros. None of this reconciles your invoice.

Latency. TTFT is the gap between sending the request and the first streamed token. Gen time is request start to finish. Both are per generation and come from your most recent 100, so a slow week shows up and an old one ages out.

Reasoning. A generation counts as a thinking pass when the model returned a non-blank reasoning block. Time reasoning is the window the provider reported, where it reported one.

Edits and deletes. Editing a message adjusts its word count in place. Deleting messages subtracts exactly what they added. Forking a chat counts the fork as its own chat, so a forked playthrough's replies are counted on their own.

Elsewhere in Corpus. The same per-character economics feed the Corpus home: the "invested but quiet" tiles use your exchanges and output tokens per character, and the Model economics block routes generations by a character's genre.

When the numbers look wrong

Message changes update the stored totals as they are saved. Recompute now rebuilds the figures from the records that remain; it cannot recover accounting that was never recorded or was lost. Press Recompute now on the dashboard to rebuild and refresh the page; a second press while one is running is refused with a quiet "already running" note rather than starting a second pass. An import runs this rebuild for you when it finishes. The owner can also run Reconcile stats from Jobs in Settings to rebuild every account on the install at once.

Use the dash as information. A dash on Spend after a long session with a provider means that provider isn't reporting cost and the catalog has no price for the model. A dash on Cache hits means the provider isn't reporting cache usage at all. Neither is a bug in your library.

Limits

  • Deleting an image can remove its cost record from a later recompute. Backup and restore preserve image-generation history, but not embedding or compaction spend history.
  • Generation averages do not cover every background operation. Last active can include changes to chat settings, not only replies.
  • Lifetime only. No date range on the dashboard.
  • The Characters tile counts a card the first time you chat with it, and counts your whole library after a recompute, so a shelf of never-played cards reads low until then.
  • Cache hits are not kept per character.
  • Models and Time tabs always show the whole library, even with a character open.
  • Spend can include compatible reported and configured-rate estimates; missing prices are omitted. Subscription-notional and metered prices cannot form one total.
  • Words are counted on plain letters and digits, so accented text undercounts a little.

Now go look at your p90 and pretend you didn't see it.