@runic-labs/ledger
使用したトークンと節約したトークンの追記専用の集計。
@runic-labs/ledger は純粋な記録管理です。予算を強制することも、呼び出しを拒否することも、報告していないコストを見積もることもありません。答えるのは一つの問いだけです。これらの決定を解決するのに実際どれだけのコストがかかり、そのうち再利用によってどれだけ回避できたのか?
npm install @runic-labs/ledgerpnpm add @runic-labs/ledgeryarn add @runic-labs/ledgerbun add @runic-labs/ledgercreateLedger(store?)
import { createLedger, FileLedgerStore, defaultLedgerFilePath } from "@runic-labs/ledger";
const ledger = createLedger(new FileLedgerStore({ filePath: defaultLedgerFilePath() }));
ストアを渡さない場合、デフォルトでは .runic/ledger.json(または $RUNIC_HOME/ledger.json)配下の FileLedgerStore になります。
recordMiss(signature, tokensSpent)?void
キャッシュミスを記録します。エージェントが独自に生成し、tokensSpent を消費しました。
voidrecordHit(signature)?void
キャッシュヒットを記録し、このシグネチャに対する元のミスと同じ tokensSpent を記録します。
voidsummary()?LedgerSummary
集計済みの合計値。以下を参照してください。
LedgerSummaryall()?LedgerEvent[]
完全な生イベントログ。
LedgerEvent[]clear()?void
すべてのイベントを削除します。
voidLedgerSummary
interface LedgerSummary {
totalSpent: number;
totalSaved: number;
hitsBySignature: Record<string, number>;
}
const summary = ledger.summary();
const totalHits = Object.values(summary.hitsBySignature).reduce((a, b) => a + b, 0);
const tokensWithoutRunic = summary.totalSpent + summary.totalSaved;
const savingsPercent = Math.round((summary.totalSaved / tokensWithoutRunic) * 100);
これは benchmarks/openrouter-savings と benchmarks/reuse-sweep の両方が最終的な数値を表示するために使う計算と完全に同じです。詳しくは ベンチマーク を参照してください。
recordHit が tokensSpent 引数を受け取らない理由
ヒットの価値は、そのシグネチャに対する元のミスのコストとして定義されます。レジャーは、呼び出し元が各ヒットで正しく繰り返し指定することを信用するのではなく、自身でそれを検索します。何らかの理由でヒットしているシグネチャに先行するミスがない場合(通常の利用では起こらないはずですが、レジャーは起こり得ないと決めつけません)、推測するのではなく 0 を記録します。
ストレージバックエンド
@runic-labs/cache と同じパターンです。テストや一時的な実行には MemoryLedgerStore、別々のプロセス起動をまたいだ永続化には FileLedgerStore を使用します。別のバックエンドには、LedgerStore インターフェースを自分で実装してください。
interface LedgerStore {
append(event: LedgerEvent): void;
all(): LedgerEvent[];
clear(): void;
}