Speed Measure Opencode
OpenCode TUI plugin to display LLM prefill and decode speeds in the sidebar
0
366
近 7 天 196
35.8
生态多维模型
4 天前
2026-10-01
快速安装与配置
opencode.json写入当前项目的 opencode.json,只对这个仓库生效。
opencode.json
{
"$schema": "https://opencode.ai/config.json",
"plugin": ["speed-measure-opencode-plugin@0.2.0"]
}写入 ~/.config/opencode/opencode.json,对所有项目生效。
~/.config/opencode/opencode.json
{
"$schema": "https://opencode.ai/config.json",
"plugin": ["speed-measure-opencode-plugin@0.2.0"]
}若你要在本地改造这个插件,先装到项目里再从本地路径引用。
shell
pnpm add -D speed-measure-opencode-pluginOpenCode 启动时会通过内嵌运行时自动加载 npm 依赖并缓存至本地目录,无需手动在全局环境执行安装。
OpenCode TUI のサイドバーに、現在のセッションにおける LLM 応答の Prefill(TTFT)速度と Decode 速度を表示する OpenCode プラグイン。OpenCode 2.x と 1.18.x の両方に対応しています。
表示例
ストリーミング中:
Speed
Prefill: 340 ms
Decode: ~45.2 chars/s
完了後:
Speed
Prefill: 340 ms │ 2.1k tok/s
Decode: 58.3 tok/s
- Prefill: 最初のトークンが返るまでの時間(TTFT)と、入力トークン数から算出したプレフィル速度
- Decode: ストリーミング中は生成済み文字数を経過時間で割った概算値(
chars/s)がライブ更新され、完了後は API が返したトークン数に基づく確定値(tok/s)へ切り替わる
インストール
推奨(npm 経由)
opencode plugin speed-measure-opencode-plugin -g # グローバル設定に追加
opencode plugin speed-measure-opencode-plugin # プロジェクト単位で追加
-gは設定の書き込み先(グローバル~/.config/opencodeか プロジェクト.opencodeか)を変えるものであり、パッケージのインストール先(OpenCode 管理キャッシュ)は変わりません。
更新手順
OpenCode 1.18.30 の管理キャッシュは npm spec 文字列ごとに分かれます。@latest のように同じ spec を使い続けると既存のキャッシュが再利用されるため、更新にはバージョンの明示が必要です。
npm のパッケージページで最新版の番号を確認し、次の例にある 0.1.0 ではなく、確認した最新版を指定してください。--force は設定内の同名プラグイン指定を、指定したバージョンに置き換えます。
導入時に選んだ scope に対応するコマンドを実行してください。
opencode plugin speed-measure-opencode-plugin@0.1.0 -g --force # グローバル設定を更新
opencode plugin speed-measure-opencode-plugin@0.1.0 --force # プロジェクト設定を更新
代替(ソースから)
開発者向けの手順です。
git clone https://github.com/japan4415/speed-measure-opencode-plugin.git
cd speed-measure-opencode-plugin
npm install
npm run build
npm run build により dist/index.js が生成される。
OpenCode 2.x の場合、TUI 設定は ~/.config/opencode/cli.json(v2 に tui.jsonc は存在しない)の plugins にリポジトリのディレクトリを登録する。v2 はローカルプラグインを <ディレクトリ>/tui というリテラルパスで解決するため、単一ファイル(dist/index.js)を直接指定しても無視される。リポジトリ直下の tui.js がこのエントリポイントであり、dist/index.js を再エクスポートする。
{
"plugins": [
"/path/to/speed-measure-opencode-plugin"
]
}
OpenCode 1.18.x の場合は ~/.config/opencode/tui.jsonc にビルド済みファイルのパスを登録する。
{
"plugin": [
"/path/to/speed-measure-opencode-plugin/dist/index.js"
]
}
@opentui/solid の bun-plugin は .tsx / .jsx のみを変換対象とするため、事前ビルド済みの dist/index.js は追加変換なしでそのまま読み込まれる。
設定
~/.config/opencode/speed-measure.json を作成すると表示をカスタマイズできる(XDG_CONFIG_HOME 設定時は $XDG_CONFIG_HOME/opencode/speed-measure.json を優先する)。ファイルが無い場合や不正な値の場合は既定値にフォールバックする。
| キー | 型 | 既定値 | 説明 |
|---|---|---|---|
showTTFT |
boolean | true |
Prefill 行に TTFT(ms)を表示するか |
showAverages |
boolean | false |
セッション全体の平均値を表示するか |
showCache |
boolean | false |
キャッシュ関連の値を表示するか |
liveIntervalMs |
number | 150 |
ストリーミング中の live 更新間隔(ミリ秒) |
order |
number | 150 |
サイドバー内での表示順(builtin の internal:sidebar-context は order=100)。1.18.x のみ有効。OpenCode 2.x では slot の配置順はプラグインの有効順に従うため無視される |
OpenCode 2.x での計測
OpenCode 2.x では TUI プラグイン API が新しくなり、本プラグインは v2 のイベント(session.step.* / session.text.* / session.reasoning.* / session.tool.*)で計測します。1.18.x では従来どおり session.next.* を主経路とし、応答がなければ message.part.* にフォールバックします。
- TTFT は
session.step.startedが持つリクエスト dispatch 時刻(started)を起点とするため、1.18.x で報告されていた「v2 経路で TTFT がほぼ 0 になる」問題は 2.x では発生しません - Decode 速度の分母は
session.step.streamed(provider レスポンス本体の終了時刻)までの窓です。ツール実行はこの境界の後に決着するため、1.18.x 経路のようなツール実行時間の明示減算は不要になります。step.streamedが取れない場合はstep.endedからツール実行区間を除く従来の計算にフォールバックします - ストリーミング完了から
step.endedまでの間はライブ表示が凍結されます(ツール決着待ちの時間が chars/s を希釈しないため)
サイドバーへの配置は v2 の slot sidebar.content への追加であり、表示位置はプラグインの有効順に従います(order 設定は 2.x では無視されます)。平均値の保持には v2 の storage.memory を使います。
なお OpenCode 2.x 自体にも、応答フッターに組込みの tok/s 表示(session.tps 設定、デフォルト ON)があります。これはステップ開始からの総時間(プリフィルを含む)で割ったターン全体の加重平均であり、本プラグインの Decode 速度(first token 以降の生成フェーズのみ)とは分母が異なるため、値は一致しません。
開発
開発には Node.js ^20.19.0 || >=22.12.0 が必要(Vite 7 の要件)。公開済みの dist/index.js は OpenCode の Bun ランタイムで読み込まれるため、この開発要件は npm パッケージの engines.node には設定しない。
npm test # vitest によるユニットテスト
npm run typecheck # tsc --noEmit
npm run build # tsup + Solid universal 変換で dist/index.js を生成
既知の制限
本パッケージは OpenCode が動的 import する TUI プラグインであり、TypeScript から直接 import する用途は想定していないため、型宣言は同梱していない。
OpenCode 1.18.30 の tokens.input は、既にキャッシュ読み出し分を除いた入力トークン数である。Anthropic / OpenAI / Google / Bedrock のように cached_tokens を報告するプロバイダでは、この値から Prefill 速度を正しく算出できる。
一方、cached_tokens を報告しないプロバイダでは、tokens.input が全プロンプトトークンになることがある。実測したローカル vLLM では次の結果となり、キャッシュによって TTFT だけが短縮されたため Prefill 速度が膨張した。
| ケース | TTFT | prompt_tokens |
見かけ Prefill | cold 比 |
|---|---|---|---|---|
| 完全 cold | 12,384 ms | 4,217 | 341 tok/s | 基準 |
| 完全 warm | 460 ms | 4,217 | 9,170 tok/s | 27倍 |
| 部分ヒット | 2,460 ms | 4,215 | 1,713 tok/s | 5倍 |
500,000 tok/s を超える算出値を表示しない閾値は、極端な異常値を抑えるだけの緩和策である。上記の 5〜27倍の膨張はいずれも閾値を下回って素通りするため、cached_tokens を報告しないプロバイダでキャッシュが効いている間、Prefill 速度は参考値であり TTFT のみが信頼できる。また、将来の高速なハードウェアや小さいモデルで正当に閾値を超えた場合も速度が省略される。
同类生态推荐
Usage Stats
opencode-usage-stats-plugin
An OpenCode plugin that tracks LLM token usage and displays interactive statistics in the terminal UI.
Sidebar Token Metrics
opencode-sidebar-token-metrics
OpenCode sidebar plugin showing generation speed (tok/s), cache hit rate, and average time-to-first-token (TTFT).
Telescope
@bojackduy/opencode-telescope
OpenCode TUI plugin for fuzzy and semantic search across local conversation history, session transcripts, and AI coding chats