Open-source · runs free & offline

Find out if your AI app obeys instructions it should not.

Point RAGProbe at your chat endpoint and it sends 63 prompt-injection attacks, in 4 languages, from the OWASP Top 10 for LLMs — 123 once you plant a test string with --canary. Every hit is proved by a planted marker, not judged by another model, so the number is checkable and it can fail your CI build.

Get started

Scan your own app in three commands

Free, offline until you point it at something, and nothing to sign up for. Works on Python 3.9 and later.

1

Install it

One dependency, no account, no API key. The attacks, the sample app and the benchmark are installed with it, so nothing else to download.

2

See what a scan looks like

Ten seconds against a deliberately vulnerable sample app: it scans, turns on defences one at a time and rescans, printing a grade each time.

3

Scan your own app

Sends the attacks to your endpoint and reports how many worked, with a 95% interval and the exact messages that got through. Add --canary with a test string from your system prompt to measure leaks, and --fail-over 0.05 to fail a build.

What it can and cannot see. A scan proves your app followed an instruction hidden in a user message, because the reply contains a random marker it was asked to join — an echo cannot do that. Attacks that arrive inside a retrieved document or a tool result are skipped, because only your app can feed those channels, and every report lists what it skipped. A clean result means these attacks did not work, not that the app is safe.

How to scan your app →Quickstart →GitHub →

What it tests

Three apps, one attacker

The attacker controls some text each app reads. RAGProbe measures whether that text can take the app over — then whether a layered defence stops it.

Chat assistant

A support bot with a secret in its system prompt. Can a user talk it out, or hijack it?

RAG assistant

Answers from retrieved docs — one written by the attacker. Does the poison get retrieved, and obeyed?

Email agent

Reads and sends mail with tools. Can a planted email make it leak private data to an outsider?

The benchmark

Measured on a benchmark you can cite

RAGProbe Bench v2 — a frozen, versioned attack set, not a handful of ad-hoc prompts. Every earlier version stays exactly as it was, so a number published last month still means the same thing today.

800
tagged items
138
runnable attacks
5
OWASP risks
4
languages

Checkable, not guessed

Every runnable attack plants a secret canary, so success is scored by an oracle — no human judgement, no LLM-as-referee.

Tagged and split

Each item carries its OWASP risk, technique, language, source and licence, split into train / dev / test so detectors are reported only on held-out data.

Reproducible by design

Every run records a manifest — version, commit, model, seed, and a fingerprint of the exact attacks — and caches model replies, so a number repeats exactly.

Read the datasheet →

Real models

What actually happens on live models

Bench v1, every runnable attack (82; 78 for Gemini, which cannot run tool-calling attacks). Lower is better for attacks; higher for questions.

Qwen 3.8 27B

1%attacks that work, no defence1 of 82 · 95% CI 0–7%
1%attacks that work, layered defence1 of 82 · 95% CI 0–7%
96%ordinary questions answered25 of 26 · 95% CI 81–99%
Secret leaked: 0 of 33 leak attacks, with no defence
Extended set of 138: 6% → 4% (no defence → layered)

gpt-oss 20B

37%attacks that work, no defence30 of 82 · 95% CI 27–47%
20%attacks that work, layered defence16 of 82 · 95% CI 12–29%
100%ordinary questions answered26 of 26 · 95% CI 87–100%
Secret leaked: 1 of 33 leak attacks, with no defence
Extended set of 138: 33% → 21% (no defence → layered)

gpt-oss 120B

27%attacks that work, no defence22 of 82 · 95% CI 18–37%
23%attacks that work, layered defence19 of 82 · 95% CI 15–33%
100%ordinary questions answered26 of 26 · 95% CI 87–100%
Secret leaked: 1 of 33 leak attacks, with no defence
Extended set of 138: 28% → 29% (no defence → layered)

Gemini 3.5 Flash-Lite

5%attacks that work, no defence4 of 78 · 95% CI 2–12%
4%attacks that work, layered defence3 of 78 · 95% CI 1–11%
100%ordinary questions answered26 of 26 · 95% CI 87–100%
Secret leaked: 0 of 33 leak attacks, with no defence
Extended set of 134: 10% → 7% (no defence → layered)

Temperature 0, one trial per attack, free-tier APIs, reply budget 2048 tokens (4096 for gpt-oss 20B). Layered defence with the leetspeak-aware detector. Utility is 26 ordinary questions with no defence on. The extended line is Bench v2 (138 attacks; 134 for Gemini). gpt-oss 20B cut off some replies at its token limit; those score as 'attack failed', so its figures are lower bounds. Re-scored on 1 November 2026 after the oracle and retrieval fixes; leaks are through a poisoned document only. Intervals are wide at this sample size: when two intervals overlap the difference may be noise. Not a safety rating — see what these numbers do and do not show.

Measured, not established

Both detectors caught less German than English

Two injection detectors on the labelled test split, split by language. Both caught roughly half as much German, and Meta’s Prompt Guard 2 almost none — but on 34 and 19 items neither gap is statistically significant.

Attacks caught (recall), by language
Higher is better · deepset/prompt-injections test split
Rule-based detectorMeta Prompt Guard 2
60%40%20%0%Rule-based · English · 50%Prompt Guard 2 · English · 24%50%24%EnglishRule-based · German · 26%Prompt Guard 2 · German · 5%26%5%German
Prompt Guard 2 caught 24% of English attacks and 5% in German. Fisher’s exact test gives p = 0.13, so treat this as a reason to measure your own detector in your users’ languages, not as a proven gap.
Lab drill · simulated model

Against a model that obeys everything, the layered defence holds — and only there

A hardened prompt, data-marking, a detector, a tool policy and an output filter — stacked. Attack success falls from 92% to 0, with no legitimate requests wrongly blocked. On real models the same defence did not hold up: its one significant result lost significance once cut-off replies were excluded, and it did not repeat on a fresh set of attacks.

The victim here is a simulated model built to obey every instruction it can parse, so this measures the defences and the harness, not any real model. On real models the same defence clearly helped one of four — the honest version is in Real models above.

Attack-success rate by defence
Lower is better
NoneNo defence · 92%92%LayeredLayered · 0%0%
Every OWASP category reaches grade A against this simulated victim — what one layer misses, the next catches.
The report card

OWASP Top 10 scorecard

A grade per risk under the layered defence — the share of attacks that still get through. These grades come from the 12 hand-written scenarios that cover every risk, run against a simulated worst-case victim that obeys everything, so they test the defences and not a real model. The frozen benchmark is the bigger set (82 attacks in v1, 138 in v2), and the real-model numbers above come from that.

Prompt Injection
LLM01
A
100% → 0%stopped
Sensitive Info Disclosure
LLM02
A
100% → 0%stopped
Excessive Agency
LLM06
A
100% → 0%stopped
System Prompt Leakage
LLM07
A
100% → 0%stopped
Vector & Embedding
LLM08
A
50% → 0%stopped

Open the full scorecard →

Beyond one prompt

Attacks that don’t look like attacks

The numbers below come from a worst-case drill against a simulated victim, rebuilt on every push — including where the defences fall short.

Poisoned tools

The attacker's text hides in a tool description or a tool result and tells the agent to leak data. A rule about what a tool may do stops it however it arrives.

100% → 0%
data leaked: no defence → tool policy

Multi-turn chains

Each message looks harmless; together they build the attack. The layered defence stops the secret-leak chains but not all of the rest — an honest gap.

100% → 50%
attacks that work: no defence → layered

Hidden injections

Invisible characters and look-alike letters hide the words from a keyword detector. Cleaning the text first brings detection back.

0% → 83%
caught on zero-width text: as received → cleaned

Open the attack lab →

The other half

A regression gate for answer quality

RAGProbe started as a pytest for RAG: a golden set, a baseline, and a CI gate that fails when a prompt or retrieval change quietly breaks answers. The dashboard and the report below are that half of the tool: they track answer quality on a sample app over time, not security. Live numbers from the latest run:

87.5%
pass rate
16
golden cases
100.0%
hit rate@3
0.929
MRR

Live dashboard →Latest report →