Skip to main content

Quick start

pip install thaghr

That's it, no config file, no account, no external service to sign up for. thaghr is a plain Python CLI.

Your first campaign​

thaghr needs a target: a directory containing an agent.py with a run(http_client) function. thaghr ships one for you to try:

git clone https://github.com/thaghr/thaghr
cd thaghr
thaghr run examples/01-hello-agent --fault-rate 0.2 --trials 20

This runs 20 trials against the example agent, with a 20% chance per call that thaghr injects an HTTP 429 instead of letting the call through. You'll get a report card:

┌────────────────────────────────────────────┐
│ thaghr report card │
│ 01-hello-agent │
├────────────────────────────────────────────┤
│ trials 20 │
│ passed 16/20 │
│ pass^1: 80% │
│ errors 4/20 (RateLimitError) │
└────────────────────────────────────────────┘

Gate CI on it​

Add --fail-under and the same command exits non-zero if reliability drops below your threshold:

thaghr run examples/01-hello-agent --fault-rate 0.2 --trials 20 --fail-under 0.7

See CLI reference for every flag, or jump straight to GitHub Action to wire this into CI without writing the shell yourself.

Point it at your own agent​

Any directory with an agent.py exposing run(http_client) works. http_client is an httpx.Client thaghr has already wired with its fault-injection transport, pass it straight through to whatever SDK your agent uses:

# agent.py
import openai

def run(http_client=None):
client = openai.OpenAI(http_client=http_client)
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "Say hi in five words."}],
)
return {
"content": response.choices[0].message.content,
"prompt_tokens": response.usage.prompt_tokens,
"completion_tokens": response.usage.completion_tokens,
}

Next: Concepts explains what pass^k actually measures and why it's different from the metric you've probably seen before.