That agent stopped. Yours doesn't.
The demo asked the same dead question fifteen times and burned every cent of its budget doing it. Nothing inside it was going to stop — no retry cap, no sense of its own cost. The ceiling was the only thing that did. Put one on your agent in about five minutes.
No signup, no key, no network — it runs on your machine and governs a fake agent locally. The model call is simulated so it needs no LLM key; the costs come from the same pricing table this product bills against, and the decision around the call is the real one.
The step that never fired.
Step 16 was never sent. It was denied before the request executed, which is why the run finished at $0.048750 and not a cent over the $0.05 ceiling. A dashboard that tells you afterwards would have shown you the same number and none of the savings.
Three steps. No infrastructure.
Install the SDK
One package. No agent, no sidecar, nothing to run.
Wrap your loop
Two calls around the model call you already make: ask before you spend, report what it cost.
Watch the run
Every decision shows up in your dashboard, in order, with the spend at each point — and the run that got stopped, and why.
import { Thskyshield, ShieldKilledError } from '@thsky-21/thskyshield'
const shield = new Thskyshield({ siteId, apiKey })
// One ceiling for the whole run — the same four limits the demo used.
const run = await shield.beginRun({
budgetLimitUsd: 2.00, // hard cap for this run
iterationLimit: 30, // max steps
loopThreshold: 5, // identical prompts before it's a loop
timeoutSeconds: 300,
})
try {
while (!done) {
// Ask before you spend. This is the decision you watched in the demo.
const { requestId } = await run.beforeStep({
stepType: 'llm',
model: 'gpt-4o',
promptInput: currentPrompt, // hashed locally — the text never leaves you
})
const result = await callYourLLM(currentPrompt)
// Report what it actually cost, so the ceiling tracks reality.
await run.afterStep({ requestId, actualTokens: result.usage, model: 'gpt-4o' })
}
} catch (e) {
if (e instanceof ShieldKilledError) {
// Your agent stopped instead of spending the rest of your month.
console.log(`Stopped: ${e.reason} — spent $${e.spent}`)
}
} finally {
await run.end()
}Works with LangGraph · CrewAI · OpenAI Agents SDK · AWS Strands · or any loop you wrote yourself.
It watches before it acts.
Handing a kill switch to something you installed five minutes ago is a lot to ask. So new projects start in observe mode — the engine runs every check and stops nothing:
- Your first runs record every decision without acting on any of them.
- You see what a ceiling would have stopped, and what it would have saved — from real settled costs, not estimates.
- Flip to enforce when the numbers convince you. Nothing to undo if they don't.
Free while you build.
No card to start. Nothing to deploy, nothing to host — the ceiling lives behind an API call your agent already waits on.
Do it to your agent.
The demo agent had no way to stop itself. Neither does yours — until you give it one.