Now Supporting Multi-agent Workflows

Ship agents that actually finish the job

Baton is the runtime for production AI agents. Typed tool contracts, evals on every change, and a trace for every decision so you can ship without guessing what it did.

Triage

Reads the ticket, pulls order and entitlement context from your systems, and resolves or escalates. Hands off to a human the moment grounding confidence drops below threshold.

tool_call   search_tickets(q="402 on renewal", limit=20)      142ms
tool_call   fetch_customer(id="cus_9F2K1M")                     88ms
tool_call   stripe.list_invoices(customer="cus_9F2K1M")        231ms
eval        grounding 0.94 · policy_check pass · pii_scan clean
resolve     refund issued, $240.00 · confidence 0.91
            p95 1.42s · 4 tool calls · 2,318 tokens
Triage

Reads the ticket, pulls order and entitlement context from your systems, and resolves or escalates. Hands off to a human the moment grounding confidence drops below threshold.

tool_call   search_tickets(q="402 on renewal", limit=20)      142ms
tool_call   fetch_customer(id="cus_9F2K1M")                     88ms
tool_call   stripe.list_invoices(customer="cus_9F2K1M")        231ms
eval        grounding 0.94 · policy_check pass · pii_scan clean
resolve     refund issued, $240.00 · confidence 0.91
            p95 1.42s · 4 tool calls · 2,318 tokens

TRUSTED BY TEAMS RUNNING AGENTS IN PRODUCTION

  • Halcyon

  • Corvus

  • Ferrite

  • Kestrel

  • Basalt

  • Meridian

  • Alder

  • Nimbus

  • Petra

  • Sable

  • Halcyon

  • Corvus

  • Ferrite

  • Kestrel

  • Basalt

  • Meridian

  • Alder

  • Nimbus

  • Petra

  • Sable

  • Halcyon

  • Corvus

  • Ferrite

  • Kestrel

  • Basalt

  • Meridian

  • Alder

  • Nimbus

  • Petra

  • Sable

Platform

Four primitives, one control plane

Everything an agent needs to run in production, and nothing it doesn’t.

Everything an agent needs to run in production, and nothing it doesn’t.

01.

Tool calling

search_tickets(…)

q

string

limit

number

status

enum

Tool calling

Register tools with typed schemas. Bad arguments never run, and failures retry with the error attached.

02.

Evals

grounding

0.94

citations

1.00

policy

pass

Evals

Run your suite on every prompt, model, and tool change. Regressions block the deploy instead of reaching users.

03.

Observability

session.start

1.42s

search_tickets

142ms

fetch_customer

88ms

issue_refund

196ms

Observability

Every run emits a trace: spans per tool call, token spend, and latency. Query by session, customer, or release.

04.

Human handoff

confidence

0.62

threshold 0.85 · not met

paged @oncall

Human handoff

Set confidence and policy thresholds per agent. Below them, Baton escalates with the transcript instead of guessing.

search_tickets(…)

q

string

limit

number

status

enum

Tool calling

Register tools with typed schemas. Bad arguments never run, and failures retry with the error attached.

grounding

0.94

citations

1.00

policy

pass

Evals

Run your suite on every prompt, model, and tool change. Regressions block the deploy instead of reaching users.

session.start

1.42s

search_tickets

142ms

fetch_customer

88ms

issue_refund

196ms

Observability

Every run emits a trace: spans per tool call, token spend, and latency. Query by session, customer, or release.

confidence

0.62

threshold 0.85 · not met

paged @oncall

Human handoff

Set confidence and policy thresholds per agent. Below them, Baton escalates with the transcript instead of guessing.

search_tickets(…)

q

string

limit

number

status

enum

Tool calling

Register tools with typed schemas. Bad arguments never run, and failures retry with the error attached.

grounding

0.94

citations

1.00

policy

pass

Evals

Run your suite on every prompt, model, and tool change. Regressions block the deploy instead of reaching users.

session.start

1.42s

search_tickets

142ms

fetch_customer

88ms

issue_refund

196ms

Observability

Every run emits a trace: spans per tool call, token spend, and latency. Query by session, customer, or release.

confidence

0.62

threshold 0.85 · not met

paged @oncall

Human handoff

Set confidence and policy thresholds per agent. Below them, Baton escalates with the transcript instead of guessing.

The Difference

Every agent demos well. Baton is for what happens next

The same four moments decide whether an agent survives contact with real customers. Here is how each one goes.

Without Baton

A tool call fails on a malformed argument in production.

You hear about the regression from a customer, three days late.

Debugging means grepping logs across four services.

The agent guesses when grounding confidence drops.

With Baton

Schema validation rejects the call before your handler runs.

The eval suite blocks the deploy that caused it.

One trace shows every span, token, and decision in order.

It hands off to a person with the full transcript attached.

Outcomes

What changes the week after you ship

Numbers from teams that moved an agent off a homegrown wrapper and onto Baton. Same models, same tools — a runtime that tells you what happened.

94%

of runs finish without a human

+31 pts vs. before

20 min

median time to diagnose a bad run

down from two days

3.2×

more agents shipped per quarter

same headcount

0

malformed tool calls in production

since typed contracts

Baton

WORKSPACE

New run

Runs

12

Agents

4

Traces

128

Runs /

New run

diagnose the refund failures

Intent · triage workflow · 4 steps

1

Pull the failing run traces

2

Re-run evals on the tool call

3

Draft the fix for review

4

Post the summary in #oncall

Workflow

Define, evaluate, ship, operate

The same loop your services already follow, with the agent treated like any other deployable. Pick a stage to see what it looks like.

Define

Declare the agent, its tools, and its guardrails in code. Contracts are typed and versioned alongside the service that owns them.

Evaluate

Ship

Operate

Agent Definition

v1.8.0

RUNTIME

Hosted

managed

VPC

your cloud

Custom

endpoint

TOOLS

search

4 args

fetch

1 arg

invoices

2 args

Strict schema validation

Reject malformed calls

Save definition

Diff

Why Baton

Built for the part after the demo

Prototypes are easy. Baton is for the months afterwards, when the agent is in front of customers and every failure has a name attached to it.

Every decision leaves a trace

One span per tool call, with arguments, timing, and the eval scores that gated the result — queryable for 90 days.

run_8f21ac · checkout-agent

run_8f21ac · checkout-agent

resolved

session.start

session.start

1.42s

tool · search_tickets

tool · search_tickets

142ms

tool · fetch_customer

tool · fetch_customer

88ms

tool · stripe.list_invoices

tool · list_invoices

231ms

eval · grounding 0.94

eval · grounding 0.94

34ms

eval · pii_scan clean

eval · pii_scan clean

26ms

handoff.check · clear

handoff.check · clear

12ms

tool · issue_refund

tool · issue_refund

196ms

eval · policy_check pass

eval · policy_check pass

29ms

tool · notify_customer

tool · notify_customer

104ms

session.end

session.end

18ms

audit.write

audit.write

15ms

grounding

0.94

citation coverage

1.00

latency p95

1.4s

Evals gate every deploy

A regression below your floor fails the build, not the customer.

1.4s

median p95

99.95%

runtime uptime

q

string

limit

number

status

enum

cursor

string

customer_id

string

amount

number

currency

enum

reason

string

idempotency_key

string

dry_run

boolean

Typed tool contracts

Arguments are validated against your schema before a handler ever runs.

confidence 0.62 · below threshold

Paged @oncall · transcript attached

agent stopped · awaiting reviewer

Handoff before harm

Below your threshold the agent stops and escalates instead of guessing.

How It Works

From install to your first trace in three steps.

No sales call, no onboarding project. Install, declare your tools, and read the first trace.

run_8f21ac

resolved

1.42s

end to end

3

tool calls

2,318

tokens

0.94

grounding

Open trace

search_tickets

typed

q

*

string

limit

number

status

enum

schema valid · 1 required

Register

Test

baton init

zsh

Node

Python

Go

$

npm i @baton/sdk

·

added 1 package · 1.2s

$

baton login

Install SDK

run_8f21ac

resolved

1.42s

end to end

3

tool calls

2,318

tokens

0.94

grounding

Open trace

search_tickets

typed

q

*

string

limit

number

status

enum

schema valid · 1 required

Register

Test

baton init

zsh

Node

Python

Go

$

npm i @baton/sdk

·

added 1 package · 1.2s

$

baton login

Install SDK

Step 01

Install and point at your workspace

Add the SDK, set your key, and choose the model the agent runs on. Two lines of setup before anything else.

Step 02

Declare the tools it may call

Each tool is a JSON Schema plus a handler. Baton validates every argument before your code is ever reached.

Step 03

Invoke it and read the trace

Call the agent. The run comes back with a span per tool call, the eval scores, and the handoff decision attached.

How It Works

From install to your first trace in three steps.

No sales call, no onboarding project. Install, declare your tools, and read the first trace.

Step 01

Install and point at your workspace

Add the SDK, set your key, and choose the model the agent runs on. Two lines of setup before anything else.

run_8f21ac

resolved

1.42s

end to end

3

tool calls

2,318

tokens

0.94

grounding

Open trace

search_tickets

typed

q

*

string

limit

number

status

enum

schema valid · 1 required

Register

Test

baton init

zsh

Node

Python

Go

$

npm i @baton/sdk

·

added 1 package · 1.2s

$

baton login

Install SDK

Step 02

Declare the tools it may call

Each tool is a JSON Schema plus a handler. Baton validates every argument before your code is ever reached.

run_8f21ac

resolved

1.42s

end to end

3

tool calls

2,318

tokens

0.94

grounding

Open trace

search_tickets

typed

q

*

string

limit

number

status

enum

schema valid · 1 required

Register

Test

baton init

zsh

Node

Python

Go

$

npm i @baton/sdk

·

added 1 package · 1.2s

$

baton login

Install SDK

Step 03

Invoke it and read the trace

Call the agent. The run comes back with a span per tool call, the eval scores, and the handoff decision attached.

run_8f21ac

resolved

1.42s

end to end

3

tool calls

2,318

tokens

0.94

grounding

Open trace

search_tickets

typed

q

*

string

limit

number

status

enum

schema valid · 1 required

Register

Test

baton init

zsh

Node

Python

Go

$

npm i @baton/sdk

·

added 1 package · 1.2s

$

baton login

Install SDK

INTEGRATIONS

Keep your stack. Baton meets it there

Every model provider, warehouse, and tool your agents already call. Declare it once as a typed contract and Baton traces every hop.

Pricing

Priced on runs, not seats

Every plan includes typed tool contracts, evals, and full traces. You pay for what your agents actually execute.

Developer

For prototypes and weekend builds

$0

forever

10K agent runs / month

3 tool contracts

7-day trace retention

Community support

Team

Most popular

For teams running agents in production

$400

/month

500K agent runs / month

Unlimited tool contracts

90-day trace retention

Eval suites on every deploy

Human handoff routing

Shared Slack channel

Enterprise

For regulated and high-volume workloads

Custom

annual

Unlimited agent runs

Self-hosted or in your VPC

1-year trace retention

SSO, SAML, and audit logs

99.99% uptime SLA

Dedicated support engineer

Customers

Teams who stopped guessing

Teams who moved agents out of a prototype and into something they trust on a Friday afternoon.

We were shipping agents on a homegrown wrapper and had no idea why they failed. Baton’s traces cut our mean time to diagnosis from two days to about twenty minutes.

Priya Raghunathan

Staff Engineer, Corvid Health

FAQ

Questions engineers actually ask

The things teams want settled before they put an agent in front of a customer.

Still deciding?

Read the quickstart and get a live trace out of your own agent in about ten minutes.

Which models can Baton drive?

Can we run Baton in our own infrastructure?

How do typed tool contracts work?

How is an agent run counted?

What happens when an agent is uncertain?

Do you retain our prompts and outputs?

Which models can Baton drive?

Can we run Baton in our own infrastructure?

How do typed tool contracts work?

How is an agent run counted?

What happens when an agent is uncertain?

Do you retain our prompts and outputs?

Create a free website with Framer, the website builder loved by startups, designers and agencies.