npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@howaboua/opencode-tps-counter

v0.1.0

Published

OpenCode plugin that reports Latency and E2E TPS per assistant turn

Readme

OpenCode TPS Counter Plugin

This plugin posts a compact generation speed line after assistant responses in OpenCode:

▣ Lat.: <value>s | E2E TPS: <value>

What the metrics mean

  • E2E TPS: Effective local throughput in this OpenCode session.
    • Formula: (output tokens + reasoning tokens) / (effective end - turn start - merged tool execution time)
    • effective end prefers the last streamed token time when available, and falls back to message completion time.
    • This is measured from OpenCode message/event timestamps, not provider-native telemetry.
  • Lat.: Time to first token for the assistant turn.
    • Formula: first streamed token time - turn start
    • If streaming timing is unavailable, it shows n/a.

How the plugin measures a turn

  • The plugin reports only when an assistant message is finalized with finish: "stop".
  • It groups all assistant messages in that turn by parentID (tool-call steps plus the final assistant stop).
  • It sums output + reasoning tokens across the grouped assistant messages.
  • It tracks stream windows from both stored parts and live message.part.updated events so latency still works when part timing is incomplete.
  • It merges overlapping tool runtimes and subtracts that merged tool time from the end-to-end duration.

Important limitation

These numbers are based on OpenCode-local timing and token accounting. They are useful for relative comparisons in the same environment, but they will not always match provider dashboards (for example OpenRouter throughput) because provider-side queueing/transport internals are not exposed in plugin events.

Reliability is highest when a provider streams chunks continuously. If a provider buffers output and flushes large chunks (or nearly the full response) at once, the measured generation window becomes artificially short and the reported rate can spike.

Example: some Z.ai responses can arrive in bursts where most assistant text appears nearly at once. In that case, the displayed value is less representative of true model-side throughput. This behavior comes from provider streaming characteristics and is not fully fixable from plugin-side event timing.

Trigger behavior

The plugin reports when an assistant message reaches finish: "stop" on message.updated. This is more reliable than waiting for session.idle.

Install from npm

Add the plugin package to your OpenCode config. OpenCode installs npm plugins automatically.

Example opencode.json:

{
  "plugin": ["@howaboua/opencode-tps-counter@^0.1.0"]
}

Local development

Install dev dependencies:

bun install

Type-check the plugin:

bun x tsc --noEmit

Use local plugin wiring while developing:

{
  "plugin": ["file:///absolute/path/to/opencode-tps-counter/index.ts"]
}