Introdução
Runic é um cache entre sessões e um livro-razão de tokens para decisões que um agente já resolveu.
Os agentes tomam novamente decisões que já tomaram. O mesmo PR é resumido duas vezes, o mesmo arquivo é revisado duas vezes, a mesma entrada do changelog é gerada duas vezes — e, a cada vez, o agente paga o preço integral para regenerar uma resposta que já produziu. O Runic se lembra da resposta.
O que é o Runic
O Runic fica ao lado de tudo o que um agente já usa para agir — incluindo chamadas de ferramentas MCP — como uma verificação opcional: “já resolvi esta decisão exata antes?”
- Um cache, indexado por uma assinatura normalizada de correspondência exata de uma decisão que o agente já tomou —
{ intent, params }, nunca texto bruto da tarefa, nunca um rastreamento de raciocínio. - Um livro-razão, que registra tokens gastos (informados pelo agente) em comparação com tokens economizados na reutilização. Apenas contabilidade, sem imposição.
- Escopo por sessão. O compartilhamento entre sessões/agentes é uma fase posterior, quando for comprovado que a reutilização por sessão importa.
O que o Runic deliberadamente não é
- Não é uma camada de execução. O Runic nunca chama uma capacidade, faz deploy de algo ou executa código — o agente faz isso por conta própria, da forma como já faz.
- Não é um sistema de permissões ou sandboxing. Não há nada para verificar se nada é executado.
- Não é um cache semântico. A correspondência é exata na decisão resolvida, não aproximada na formulação que levou a ela. Veja Escopo para entender por que isso é uma restrição, não um atalho.
Instalação
npm install @runic-labs/sdkpnpm add @runic-labs/sdkyarn add @runic-labs/sdkbun add @runic-labs/sdkO ciclo
agent resolves a task into a structured decision
│
▼
askRunic({ intent, params })
│
├─ hit → return cached artifact, log tokens saved
└─ miss → agent generates its own way (as it does today)
│
▼
storeResult({ intent, params }, artifact, tokensSpent)
Duas funções constituem todo o contrato voltado ao agente. Tudo o mais neste repositório dá suporte a essas duas chamadas.
// Every call regenerates the answer, even for a decision you've
// already resolved once today.
async function summarizePr(repo: string, pr: number) {
const result = await callYourLLM(promptFor(repo, pr));
return result; // paid full price, every single time
}import { askRunic, storeResult } from "@runic-labs/sdk";
async function summarizePr(repo: string, pr: number) {
const decision = { intent: "summarize_pr", params: { repo, pr } };
const cached = await askRunic(decision);
if (cached) return cached.artifact; // no LLM call, no tokens spent
const result = await callYourLLM(promptFor(repo, pr));
await storeResult(decision, result, result.tokensUsed);
return result;
}Números reais, não estimativas
O Runic nunca mede o custo de tokens por conta própria — o agente o informa, usando o que seu próprio provedor realmente retornou. Uma execução real no OpenRouter, resolvendo 48 decisões, das quais apenas 8 eram de fato únicas:
{
"decisions": 48,
"uniqueDecisions": 8,
"apiCalls": 8,
"cacheHits": 40,
"tokensSpent": 2582,
"tokensSaved": 12910,
"tokensWithoutRunic": 15492,
"savingsPercent": 83
}
Veja Benchmarks para saber como reproduzir isso por conta própria, além de uma varredura sintética que mostra que o mesmo mecanismo se mantém em 10.000 decisões.
Pacotes
| Pacote | Faz |
|---|---|
@runic-labs/sdk |
askRunic / storeResult — todo o contrato voltado ao agente |
@runic-labs/cache |
armazenamento de assinatura → artefato (em memória + baseado em arquivo) |
@runic-labs/ledger |
contabilidade de gastos em comparação com economias |
@runic-labs/cli |
runic cache status, runic ledger status |
Próximos passos
- Início rápido — conecte o Runic ao seu agente em poucos minutos
- Como funciona — o algoritmo de assinatura e por que a correspondência é exata
- Escopo — o que foi removido do plano anterior de camada de execução e por quê
Contribuindo
O Runic é de código aberto e aceita contribuições. Consulte CONTRIBUTING.md no repositório para ver as diretrizes.
Licença
MIT