NOT-ANOTHER-HARNESS / THE RUNTIME

Build the agent
you want to run.

An explicit TypeScript runtime for agents that need to do more than answer once. Bring your model, define the tools, and own the control flow around every run.

agent.ts STREAMING
01const run = runAgent({
02 model,
03 prompt,
04 tools: createCodingTools(env),
05 maxSpendUsd: 2,
06});
07
08for await (const event of run.events) {
09 inspect(event);
10}
not-another-harnessexplicit loop · typed events · bounded tools
A RUNTIME WITH CLEAR EDGES

Every step is yours
to inspect and shape.

01 / ORCHESTRATE

The loop stays visible.

One model round trip per step. Tool calls run in your environment, then the runtime makes an explicit decision about continuing.

Read about the loop
02 / SET LIMITS

Budgets are first class.

Set spend, token, and step limits for a run. Track cumulative usage and know why an agent stopped.

Explore events
03 / OWN TOOLS

Tools fit your environment.

Start with bounded coding tools or provide your own. Configure approvals at the boundary where they belong.

Explore tools
A SMALL SURFACE AREA

Bring your model.
Keep your architecture.

Use any AI SDK v5 language model. Consume a typed event stream while work is happening, and await a final result when it’s done.

Provider choice stays with you Typed events, not hidden callbacks Node and Web runtime entry points
Read the SDK guide
QUICK STARTTypeScript
import { runAgent } from "not-another-harness";

const run = runAgent({
  model,
  prompt: "Review this change",
  tools, maxSpendUsd: 1,
});

for await (const event of run.events) {
  console.log(event.type);
}
KEEP EXPLORING

Try the agent built on the runtime.

NAH is a working coding agent built with this same harness.

Meet NAH