---
title: Schnellstart
description: >-
  Binde askRunic und storeResult in wenigen Minuten in einen bestehenden Agenten
  ein.
sidebar:
  order: 1
---
## Installation

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

`@runic-labs/sdk` hängt von `@runic-labs/cache` und `@runic-labs/ledger` ab — du musst diese nicht separat installieren, es sei denn, du möchtest selbst benutzerdefinierte Store-Instanzen erstellen (siehe [Cache](/cache) und [Ledger](/ledger)).

## Kapsle den Aufruf, den dein Agent bereits ausführt

Finde die Stelle in deinem Agenten, an der eine Aufgabe in einen Aufruf eines LLM oder Tools umgewandelt wird, und kapsle sie mit `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;
}
```

Das ist die gesamte Integration. Für den Einstieg ist keine Konfiguration erforderlich — `askRunic`/`storeResult` verwenden einen standardmäßigen dateibasierten Store unter `.runic/` in deinem Arbeitsverzeichnis.

## Auswahl von `intent` und `params`

Die Signatur ist eine exakte Übereinstimmung. Entscheide daher, wodurch zwei Aufrufe für deinen Anwendungsfall tatsächlich zur „gleichen Entscheidung“ werden:

- **Gut**: `{ intent: "summarize_pr", params: { repo: "acme/widgets", pr: 482 } }` — gleiches Repository, gleiche PR-Nummer, gleiche Absicht, jedes Mal, wenn genau diese PR abgefragt wird.
- **Schlecht**: `{ intent: "summarize_pr", params: { prompt: fullPromptString } }` — wenn der rohe Prompt-Text als Parameter enthalten ist, führt jede Formulierungsänderung (selbst Leerraum) zu einem Cache-Miss und vereitelt den Zweck.

Füge in `params` nur die Parameter ein, die die Entscheidung tatsächlich identifizieren. Lass Prompt-Text, Reasoning-Traces und alles Nichtdeterministische vollständig aus der Signatur heraus — unter [So funktioniert es](/how-it-works) erfährst du, warum.

## Prüfen, was im Cache liegt

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

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

Unter [CLI](/cli) findest du vollständige Ausgabebeispiele.

## Einen anderen Store-Speicherort festlegen

Standardmäßig schreibt Runic nach `.runic/` in `process.cwd()`. Überschreibe dies mit einer Umgebungsvariable, wenn dein Agent aus einem anderen Arbeitsverzeichnis ausgeführt wird als dem, in dem der Status gespeichert werden soll:

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

## Stattdessen In-Memory-Speicher verwenden (Tests, kurzlebige Ausführungen)

```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 } });
```

Genau das verwenden `benchmarks/reuse-sweep` und `benchmarks/openrouter-savings`, sodass zwischen separaten Skriptausführungen nichts erhalten bleibt.

## Nächste Schritte

- [So funktioniert es](/how-it-works) — der Signaturalgorithmus im Detail
- [Benchmarks](/benchmarks) — reale Zahlen zu Token-Einsparungen reproduzieren
