---
title: Démarrage rapide
description: Intégrez askRunic et storeResult dans un agent existant en quelques minutes.
sidebar:
  order: 1
---
## Installer

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

`@runic-labs/sdk` dépend de `@runic-labs/cache` et `@runic-labs/ledger` — vous n’avez pas besoin de les installer séparément, sauf si vous souhaitez construire vous-même des instances de stockage personnalisées (voir [Cache](/cache) et [Ledger](/ledger)).

## Encapsulez l’appel que votre agent effectue déjà

Trouvez l’endroit de votre agent où il transforme une tâche en appel à un LLM ou à un outil, puis encapsulez-le avec `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;
}
```

C’est toute l’intégration. Aucune configuration n’est nécessaire pour commencer — `askRunic`/`storeResult` utilisent un stockage par défaut basé sur des fichiers sous `.runic/` dans votre répertoire de travail.

## Choisir `intent` et `params`

La signature utilise une correspondance exacte ; déterminez donc ce qui fait réellement que deux appels représentent « la même décision » dans votre cas d’utilisation :

- **Bon** : `{ intent: "summarize_pr", params: { repo: "acme/widgets", pr: 482 } }` — même dépôt, même numéro de PR, même intention, à chaque fois que cette PR précise est interrogée.
- **Mauvais** : `{ intent: "summarize_pr", params: { prompt: fullPromptString } }` — inclure le texte brut de l’invite comme paramètre signifie que tout changement de formulation (même un espace) produit un échec du cache, ce qui annule l’intérêt.

Placez dans `params` uniquement les paramètres qui identifient réellement la décision. Excluez entièrement de la signature le texte de l’invite, les traces de raisonnement et tout élément non déterministe — consultez [Comment cela fonctionne](/how-it-works) pour comprendre pourquoi.

## Inspecter ce qui est en cache

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

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

Consultez [CLI](/cli) pour des exemples de sortie complets.

## Utiliser un autre emplacement de stockage

Par défaut, Runic écrit dans `.runic/` de `process.cwd()`. Remplacez-le par une variable d’environnement si votre agent s’exécute depuis un répertoire de travail différent de celui où vous souhaitez conserver l’état :

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

## Utiliser plutôt le stockage en mémoire (tests, exécutions éphémères)

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

C’est exactement ce qu’utilisent `benchmarks/reuse-sweep` et `benchmarks/openrouter-savings`, donc rien ne persiste entre des exécutions distinctes du script.

## Suite

- [Comment cela fonctionne](/how-it-works) — l’algorithme de signature en détail
- [Benchmarks](/benchmarks) — reproduisez des chiffres réels d’économies de jetons
