---
title: '@runic-labs/ledger'
description: खर्च किए गए टोकनों बनाम बचाए गए टोकनों का केवल-परिशिष्ट लेखांकन।
sidebar:
  order: 5
---
`@runic-labs/ledger` शुद्ध बहीखाता है — यह कभी बजट लागू नहीं करता, कभी किसी कॉल को अस्वीकार नहीं करता, और कभी उस लागत का अनुमान नहीं लगाता जिसकी आपने रिपोर्ट नहीं की। यह एक प्रश्न का उत्तर देता है: *इन निर्णयों का समाधान करने में वास्तव में कितनी लागत आई, और पुन: उपयोग से उसमें से कितना बचा?*

```package-install
npm i @runic-labs/ledger
```

## `createLedger(store?)`

```ts
import { createLedger, FileLedgerStore, defaultLedgerFilePath } from "@runic-labs/ledger";

const ledger = createLedger(new FileLedgerStore({ filePath: defaultLedgerFilePath() }));
```

यदि कोई स्टोर पास नहीं किया जाता है, तो डिफ़ॉल्ट रूप से `.runic/ledger.json` (या `$RUNIC_HOME/ledger.json`) के अंतर्गत `FileLedgerStore` उपयोग होता है।

| Prop | Type | Default | Description |
| - | - | - | - |
| `recordMiss(signature, tokensSpent)?` | `void` | - | Logs a cache miss — the agent generated its own way and spent tokensSpent. |
| `recordHit(signature)?` | `void` | - | Logs a cache hit, recording the same tokensSpent as the original miss for this signature. |
| `summary()?` | `LedgerSummary` | - | Aggregated totals — see below. |
| `all()?` | `LedgerEvent[]` | - | The full raw event log. |
| `clear()?` | `void` | - | Removes all events. |

## `LedgerSummary`

```ts
interface LedgerSummary {
  totalSpent: number;
  totalSaved: number;
  hitsBySignature: Record<string, number>;
}
```

```ts
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` दोनों अपने अंतिम अंक प्रिंट करने के लिए करते हैं — [बेंचमार्क](/benchmarks) देखें।

## `recordHit` में `tokensSpent` आर्ग्युमेंट क्यों नहीं है

किसी हिट का मान *उस सिग्नेचर के मूल मिस की लागत के बराबर* परिभाषित होता है — लेजर स्वयं उसे ढूँढता है, बजाय इसके कि कॉलर पर हर हिट में उसे सही ढंग से दोहराने का भरोसा करे। यदि किसी ऐसे सिग्नेचर के लिए कोई पूर्व मिस मौजूद नहीं है जिसे किसी तरह हिट किया जा रहा है (सामान्य उपयोग में ऐसा नहीं होना चाहिए, लेकिन लेजर यह नहीं मानता कि ऐसा नहीं हो सकता), तो अनुमान लगाने के बजाय यह `0` रिकॉर्ड करता है।

## स्टोरेज बैकएंड

`@runic-labs/cache` जैसा ही पैटर्न: परीक्षणों और अस्थायी रन के लिए `MemoryLedgerStore`, तथा अलग-अलग प्रक्रिया आह्वानों के बीच स्थायित्व के लिए `FileLedgerStore`। किसी अलग बैकएंड के लिए `LedgerStore` इंटरफ़ेस स्वयं लागू करें:

```ts
interface LedgerStore {
  append(event: LedgerEvent): void;
  all(): LedgerEvent[];
  clear(): void;
}
```

## आगे

- [कैश](/cache) — संबंधित सिग्नेचर-कुंजीकृत स्टोर
- [CLI](/cli) — `runic ledger status` कमांड लाइन से इस सारांश को पढ़ता है
