@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
Logs a cache miss — the agent generated its own way and spent tokensSpent.
voidrecordHit(signature)?void
Logs a cache hit, recording the same tokensSpent as the original miss for this signature.
voidsummary()?LedgerSummary
Aggregated totals — see below.
LedgerSummaryall()?LedgerEvent[]
The full raw event log.
LedgerEvent[]clear()?void
Removes all events.
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;
}