You just watched it work

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.

Didn't run it yet? It takes four seconds
npx @thsky-21/thskyshield-demo

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.

What you saw

The step that never fired.

step 15 allowed cost $0.003250 total $0.048750 ████████████ 98%
↳ loop detector: identical prompt ×15 of 20
KILLED step 16 budget ceiling reached
The step was denied before the model was called.

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.

Getting there

Three steps. No infrastructure.

01

Install the SDK

One package. No agent, no sidecar, nothing to run.

npm install @thsky-21/thskyshield
02

Wrap your loop

Two calls around the model call you already make: ask before you spend, report what it cost.

03

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.

agent/run.ts
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.

You don't have to trust us on day one

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.

See pricing →

Do it to your agent.

The demo agent had no way to stop itself. Neither does yours — until you give it one.