More work, per dollar, with Caveman Agent SDK
git clone https://github.com/JuliusBrussee/agent-sdk.gitApache-2.0 · Node 22.19+ · v0.2 is on main, not npm.
Your agent pays before it works. More tools means more words. You pay for words.
$2.50 / 1M in · $0.25 cached · OpenAI list
52 tools · 20.8K tokens re-read every message · $20,510 a year
Tool list only, at list prices, August 2026. An estimate, not a bill. 400 tokens per tool, 22 working days.
Follow one run. Four leaks. Four fixes.
Send one tool, not fifty
Most SDKs send every tool's manual, every message. Caveman sends one tool. The rest work inside it. Still checked. Still billed.
tool schemas per message
Remembers without slowing the answer
It remembers between turns, not during. The cache stays warm. Cached words cost a tenth.
recall, placed before your message
Long runs finish instead of failing
Full context kills most agents. The money is gone. Caveman trims and keeps going.
Every run hands back a receipt
What it did. What it cost. Where to resume. A crash never eats your money.
zero until real traffic proves it
Ten lines and it's running. In code, or as a folder.
import { agent, auto, run } from "@caveman-ai/agent";const support = agent({id: "support",instructions: "Answer from policy. Never invent policy.",model: auto(),});
support-bot/├── instructions.md├── skills/│ ├── refund-policy.md│ └── shipping-claims.md├── tools/│ └── lookup_order.ts└── evals/└── support.eval.ts
const result = await run(support, "Can I get a refund?");console.log(result.text);console.log(result.receipt);
import { loadAgentDir, run } from "@caveman-ai/agent";const support = await loadAgentDir("./support-bot");const result = await run(support, "Where is order A-123?");
import { agent, auto, memory, run } from "@caveman-ai/agent";const support = agent({id: "support",instructions: "Resolve support requests.",model: auto(),memory: memory({ namespace: "support" }),});
---name: refund-policydescription: When and how to refund an order.---# Refund policyFull body of the skill. Loaded on demand whenthe agent uses it. Never in the frozen prefix.
import { agent, auto, run } from "@caveman-ai/agent";const support = agent({id: "support",instructions: "Answer from policy. Never invent policy.",model: auto(),});
support-bot/├── instructions.md├── skills/│ ├── refund-policy.md│ └── shipping-claims.md├── tools/│ └── lookup_order.ts└── evals/└── support.eval.ts
Connect it to everything you already run. Anything in. One tool out.
OAuth apps, MCP servers, REST APIs, your own functions. Every call is typed, capped, and on the receipt.
- AGENTS.mdevery folder up
- Agent Skills.agents/skills
- Agent Plugins v1plugin.json
- Vercel OpenPlugin.plugin/plugin.json
- Slash commandswith arguments
- MCP & hookslisted, not run
Pinned adapters for Pi, Claude Agent SDK, Vercel AI SDK, Eve, Mastra.
OAuth apps · MCP servers · REST APIs · your keys
your loop, exact-pinned adapters
It tries cheaper plans and proves them first. If a check fails, the old build keeps serving.
- 01Watch the real workloadapproved evals only
- 02Try cheaper plansdevelopment cases
- 03Lock the winnerbefore the final tests open
- 04Check on unseen testsuntouched until now
.caveman/workload-profile.json
.caveman/build-report.json
the previous build keeps serving.
We'd rather print a zero.
- savings we can prove
- Printed as $0.0000 until real traffic proves them. Never a made-up percentage.
- unknown price
- Never counted as $0. A run capped in dollars stops instead.
- sandbox: "host"
- Means uncontained, and says so. Never implied.
- observe-only
- No Caveman engine: your provider, your calls, no optimization claim.
Build the agent.
Keep the receipt.
git clone https://github.com/JuliusBrussee/agent-sdk.gitcd agent-sdknpm ci --prefix packages/agentnpm test