Skip to main content

Install

Silo runs entirely on your machine. There is no account, no API key, and nothing is sent anywhere.
Always invoke the CLI as npx @burn0/silo. An unrelated package named silo exists on the public registry, so npx silo can fetch and run that instead.

Create an environment

Scaffold a ready-made world to run against:
This writes a complete environment into .silo/environments/demo — seeded data, a state type, 42 tools, tasks, and the verifiers that grade them. It is ordinary TypeScript and JSON in your repo; edit any of it.
--template crm — a staged sales pipeline: accounts, contacts, leads, opportunities and activity history. Good starting point, populated and small enough to read.
See what it can be asked to do:

Write an agent

Silo does not give you an agent — it gives you a world and a boundary. Your agent is an ordinary file that Silo calls with the task, the available tools, and a callTool function. Put it wherever you like:
Both are plain ES modules, so your project needs "type": "module" in its package.json. Named silo.agent.ts in the directory you run from, it is picked up automatically; anywhere else, point at it with --agent ./path/to/file.ts. This example is deliberately dumb. It calls one known tool and reports the number, so you can see a run end to end before wiring up a model.

Bring Your Own Agent

The full contract, how tool errors come back, and where a real model loop plugs in.

Run it

Every rollout starts from a fresh copy of the world, so runs cannot contaminate each other.

Inspect the result

Each run leaves a directory behind:
result.json shows how the answer was graded, and why:
result.json
The expected figure is not written down anywhere. The verifier derives it from the seeded world, so editing an amount in data/ changes the correct answer and the grading follows. trace.jsonl is the record of what actually happened:
When a run fails, read this first. It tells you whether the agent picked the wrong tool, sent bad arguments, or looped.

Try a task that changes the world

TASK-004 only asks a question. TASK-002 asks for work:
The agent above only reports a forecast, so it fails — and the reason is legible rather than a bare score. Note that it still scored 0.60: some optional checks passed. A run passes only when every required check does. state-diff.json confirms it:
state-diff.json
Nothing changed. An empty state diff alongside a failure is the signature of an agent that read but never wrote.