Schnellstart
Binde askRunic und storeResult in wenigen Minuten in einen bestehenden Agenten ein.
Installation
npm install @runic-labs/sdkpnpm add @runic-labs/sdkyarn add @runic-labs/sdkbun add @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 und 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:
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 erfährst du, warum.
Prüfen, was im Cache liegt
npm install -g @runic-labs/clipnpm add -g @runic-labs/clinpm install -g @runic-labs/clibun add -g @runic-labs/clirunic cache status
runic ledger status
Unter 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:
RUNIC_HOME=/var/lib/my-agent/runic node agent.js
Stattdessen In-Memory-Speicher verwenden (Tests, kurzlebige Ausführungen)
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 — der Signaturalgorithmus im Detail
- Benchmarks — reale Zahlen zu Token-Einsparungen reproduzieren