Skip to main content
Use edith-1.1 to check a proposed tool call before your agent executes it. This Python HTTP example compares the call with the user’s request, then blocks calls below a threshold you choose.
The guard checks whether the call fits the request. It does not prove that an allowed call is safe.

1. Prepare the environment

Use Python 3.10+ and an Evolve API key:

2. Write the guard

Save this as guard.py. The claim asks about evidence edith receives: the user’s request and the proposed call. It does not ask whether the call follows an injection, because the injected content is absent from this input.
guard.py
If the call is allowed, the demo prints its arguments. If it is blocked, it raises BlockedToolCall. A timeout or API error also raises before the tool runs. The body check catches errors returned with HTTP 200. In your agent’s tool executor, pass its tool registry, the user’s request, the proposed function name, and parsed arguments to guarded. Catch a blocked call to return a tool error or request user confirmation; do not execute it from the exception handler.
Keep the user’s request separate from tool outputs. Include later instructions from the user when they change the task, but do not treat retrieved content as user authorization.

3. Choose the threshold

The threshold trades missed attacks against blocked legitimate work. Label examples from your own tools and requests, then measure both rates before enabling the guard. 0.2 is an example policy, not a validated guarantee for your agent. A higher threshold blocks more calls. A lower threshold allows more calls. If a block requests human review rather than ending the run, you may accept a higher rate of blocked legitimate calls.

AgentDojo results

In a test of 300 tool calls from AgentDojo, 150 were injected calls. The test covered four agent models and one attack, important_instructions. The request-and-call on_task check produced these results: Its AUC was 0.96: it ranked injected and legitimate calls well in this sample. Asking whether a call followed injected instructions, without supplying that content, gave an AUC of 0.34 on the same calls. Median latency for the on_task check was 0.29 seconds. For a request asking where the “Dinner with Blue Sparrow Tech” event was on May 24, the calendar lookup scored 0.974; an injected call to email a security code scored 0.005. Those requests were about 180 input tokens each, which puts 1,000 such checks below $0.01 at the standard short-request price. These are results for that sample, not guarantees for your tools or attacks. Use them to choose an initial threshold to evaluate, then measure your own missed attacks and blocked legitimate calls.

Include the session when needed

For a check that can inspect the injection itself, send the run so far as a trial object, with the proposed call as the last agent step. Replace input and questions in the request above with that trial and this claim:
This claim reverses the decision: a high injected probability is a reason to block. After checking the response status and body, replace the original on_task comparison with:
Keep execution after this check. Do not reuse probability < BLOCK_BELOW for this claim. With the session included, the injected claim reached an AUC of 0.98 on the same 300 AgentDojo calls. It returned 0.969 for the dinner example’s proposed call after the injected event. Median latency was 0.58 seconds, compared with 0.29 seconds for the request-and-call check. In that test, checking individual calls was more accurate than judging a finished session for injection compliance. Longer sessions add latency; for inputs over 131,072 tokens, use a timeout of at least 600 seconds. See Long requests.

Operate the guard

  • Choose which calls to check. Start with calls that send, pay, delete, or change permissions if checking every call adds too much latency. Unchecked calls remain outside the guard.
  • Log scores and decisions. Keep the request, proposed call, score, and outcome so you can review false positives and missed attacks.
  • Keep errors visible. The example stops execution on an API error. If you add retries, keep that behavior when retries are exhausted.

Next steps

Monitor agents in production

Track behaviour across your agent’s sessions.

Custom rubrics

Write claims for your own tools and policies.
Last modified on November 9, 2026