---
title: क्विकस्टार्ट
description: कुछ ही मिनटों में askRunic और storeResult को किसी मौजूदा एजेंट में जोड़ें।
sidebar:
  order: 1
---
## इंस्टॉल करें

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

`@runic-labs/sdk`, `@runic-labs/cache` और `@runic-labs/ledger` पर निर्भर है — इन्हें अलग से इंस्टॉल करने की आवश्यकता नहीं है, जब तक कि आप स्वयं कस्टम स्टोर इंस्टेंस बनाना न चाहें (देखें [कैश](/cache) और [लेजर](/ledger))।

## आपके एजेंट द्वारा पहले से किए जाने वाले कॉल को रैप करें

अपने एजेंट में वह स्थान खोजें जहाँ वह किसी कार्य को LLM या टूल के कॉल में बदलता है, और उसे `askRunic` / `storeResult` से रैप करें:

```ts
import { askRunic, storeResult } from "@runic-labs/sdk";

async function reviewFile(repo: string, file: string) {
  const decision = { intent: "review_code", params: { repo, file } };

  const cached = await askRunic(decision);
  if (cached) {
    console.log(`cache hit — saved ${cached.tokensSpent} tokens`);
    return cached.artifact;
  }

  const response = await callYourLLM(promptFor(repo, file));
  await storeResult(decision, response.text, response.tokensUsed);
  return response.text;
}
```

बस इतना ही एकीकरण है। शुरुआत करने के लिए किसी कॉन्फ़िगरेशन की आवश्यकता नहीं है — `askRunic`/`storeResult` आपकी कार्यशील डायरेक्टरी में `.runic/` के अंतर्गत डिफ़ॉल्ट फ़ाइल-समर्थित स्टोर का उपयोग करते हैं।

## `intent` और `params` चुनना

सिग्नेचर सटीक-मिलान वाला है, इसलिए अपने उपयोग के मामले के लिए तय करें कि वास्तव में किन बातों से दो कॉल "एक ही निर्णय" बनते हैं:

- **अच्छा**: `{ intent: "summarize_pr", params: { repo: "acme/widgets", pr: 482 } }` — हर बार जब इस सटीक PR के बारे में पूछा जाता है, वही रेपो, वही PR नंबर, वही इंटेंट।
- **खराब**: `{ intent: "summarize_pr", params: { prompt: fullPromptString } }` — कच्चे प्रॉम्प्ट टेक्स्ट को पैरामीटर के रूप में शामिल करने का अर्थ है कि शब्दों में कोई भी बदलाव (यहाँ तक कि व्हाइटस्पेस भी) कैश मिस उत्पन्न करता है, जिससे उद्देश्य विफल हो जाता है।

`params` में केवल वे पैरामीटर रखें जो वास्तव में निर्णय की पहचान करते हैं। प्रॉम्प्ट टेक्स्ट, रीजनिंग ट्रेस और किसी भी गैर-नियतात्मक चीज़ को सिग्नेचर से पूरी तरह बाहर रखें — कारण जानने के लिए [यह कैसे काम करता है](/how-it-works) देखें।

## कैश में क्या है, जाँचें

```package-install
npm i -g @runic-labs/cli
```

```bash
runic cache status
runic ledger status
```

पूर्ण आउटपुट उदाहरणों के लिए [CLI](/cli) देखें।

## किसी अलग स्टोर स्थान की ओर इंगित करें

डिफ़ॉल्ट रूप से, Runic `process.cwd()` में `.runic/` पर लिखता है। यदि आपका एजेंट उस कार्यशील डायरेक्टरी से अलग किसी डायरेक्टरी से चलता है जहाँ आप स्टेट रखना चाहते हैं, तो इसे एनवायरनमेंट वेरिएबल से ओवरराइड करें:

```bash
RUNIC_HOME=/var/lib/my-agent/runic node agent.js
```

## इसके बजाय इन-मेमोरी स्टोरेज का उपयोग करें (टेस्ट, अस्थायी रन)

```ts
import { createRunicClient } from "@runic-labs/sdk";
import { createCache, MemoryCacheStore } from "@runic-labs/cache";
import { createLedger, MemoryLedgerStore } from "@runic-labs/ledger";

const runic = createRunicClient({
  cache: createCache(new MemoryCacheStore()),
  ledger: createLedger(new MemoryLedgerStore()),
});

const cached = await runic.askRunic({ intent: "summarize_pr", params: { repo, pr } });
```

ठीक यही `benchmarks/reuse-sweep` और `benchmarks/openrouter-savings` उपयोग करते हैं, इसलिए अलग-अलग स्क्रिप्ट रन के बीच कुछ भी स्थायी नहीं रहता।

## आगे

- [यह कैसे काम करता है](/how-it-works) — सिग्नेचर एल्गोरिदम का विस्तृत विवरण
- [बेंचमार्क](/benchmarks) — वास्तविक टोकन-बचत संख्याओं को पुनः प्रस्तुत करें
