Docs

Setting up Triage

Triage is an OpenAI- and Anthropic-compatible endpoint. You send requests to it exactly as you would to either provider; it triages each one, picks a model from your ladder, forwards it through OpenRouter and streams the answer back.

1. Get a key

Open the app and make a workspace. You get a tri_ key once; save it. Then add your OpenRouter key (from openrouter.ai/keys): you pay OpenRouter directly, Triage takes nothing.

2. Point your client at it

Claude Code

export ANTHROPIC_BASE_URL=
export ANTHROPIC_API_KEY=tri_your_key
claude

OpenAI SDK (Python)

from openai import OpenAI
client = OpenAI(base_url="/v1", api_key="tri_your_key")
r = client.chat.completions.create(model="triage", messages=[{"role": "user", "content": "rename userId to accountId"}])
print(r.choices[0].message.content)

curl

curl /v1/chat/completions \
  -H "Authorization: Bearer tri_your_key" -H "Content-Type: application/json" \
  -d '{"model":"triage","messages":[{"role":"user","content":"plan the migration to a sharded setup"}]}' -i

The model name is ignored. Anything goes; triage reads best.

3. Read the receipt

Every response carries these headers:

HeaderWhat it says
x-triage-tagred, orange, yellow or green
x-triage-scoreThe severity score, 0 to 1
x-triage-tierSurgeon, Doctor, Nurse or Front desk
x-triage-modelThe model that actually answered
x-triage-whyThe reason, in one line

How the score is built

Every request starts at 0.15. These rules add or take away points, and the app lists the ones that fired for each request:

RulePoints
Words that need judgement: debug, design, migrate, refactor, deadlock, race condition, security, trade-offs, edge cases…+0.18 each, up to +0.60
Words that mean real work: fix, bug, error, test, implement, build, explain, function…+0.10 each, up to +0.20
Words that mean typing, on a short ask with nothing hard in it: rename, summarise, translate, format, list, extract…−0.15 each, down to −0.30
A long ask (over 80 words)up to +0.20
Big context (over ~5k tokens) / heavy context (over ~20k)+0.10 / +0.20
Code blocks+0.06 each, up to +0.15
A stack trace+0.15
Tools to drive (more than 10 tools)+0.10 (+0.15)
Images+0.08
The client asked for deep reasoning (reasoning_effort, thinking)+0.15
More than 12 turns deep+0.05

Tags: red at 0.70 and above, orange from 0.45, yellow from 0.22, green below that.

Budgets and modes

You set a daily dollar budget for the Surgeon. As it's spent, the score needed to reach the Surgeon rises from 0.70 toward 0.90; once it's gone, critical work goes to the Doctor until midnight UTC.

Strict (default) routes by tag from the first request. Generous sends everything to the Surgeon while more than half its budget is left, then turns strict.

A conversation (recognised by its system prompt and first message) can move up the ladder on a later turn but never down. If a request has tools, rungs whose model doesn't support tools are skipped.

Burning $TRIAGE for credit

In the app, enter an amount and press Burn. The app builds a normal token transfer to the dead address and appends your workspace tag to the calldata (the token ignores it), simulates it, and asks your wallet to sign. After a few confirmations, Triage reads the transaction from the chain, checks the transfer went to the dead address and carries your tag, and credits the workspace with tokens × the token's market price at that moment. Each burn credits once.

House requests are charged at OpenRouter's listed price for the model that answered, with no markup.

Privacy

Triage doesn't store prompts or replies. It keeps, per request: time, tag, score, model, token counts, cost and what was saved. The public board shows the same minus the workspace. Your own OpenRouter key is encrypted at rest with AES-256-GCM.