agent-in-the-loop
A lightweight Python client for the Agent In The Loop (AITL) confidence evaluation API. Attach a callback to your LangChain / LangGraph run, then call evaluate_confidence() when you want a score. Context, trace ID, and agent name are picked up automatically — no manual wiring.
This library cannot be used without an API key from trellar.io.
Create an account and API key
trellar.io is the only place that issues API keys for this library. Create an account there, then generate an API key from the dashboard. Without that key, evaluate_confidence() cannot authenticate and the client will not work.
Then pass the key into the SDK (see Environment Variables):
evaluate_confidence(api_key="..."), orAGENT_IN_THE_LOOP_API_KEYin the environment
Installation
pip install "agent-in-the-loop[langchain]"
The langchain extra is required because agent runs are captured via a LangChain callback handler (get_agent_guard). Requires Python 3.9+.
Quick Start
from agent_in_the_loop import get_agent_guard, evaluate_confidence
# agent_name must be a stable, unique name for this agent graph — the
# backend uses it to track the graph's network profile across runs.
guard = get_agent_guard("research-agent")
graph.invoke(inputs, config={"callbacks": [guard]})
# context, trace_id, and agent_name are picked up from the guard
result = evaluate_confidence()
print(result.score) # int, 1-10
print(result.explanation) # str, human-readable reasoning
Where to call evaluate_confidence
Call it from a graph node (or after invoke()), at the point in the run you want scored. The payload is the events captured so far — later nodes are not included.
There are two ways to use the result:
1. Gate — validate before the graph continues
Put the call on an edge you do not want the graph to cross until AITL has scored the run. Use result.score / result.explanation to decide whether to proceed or stop.
def confidence_gate(state):
result = evaluate_confidence()
if result.score < 7:
return {**state, "halt": True, "reason": result.explanation}
return {**state, "halt": False}
Wire that node in front of the next step, and only continue when the score is acceptable.
2. Observe — send a validation, do not restrict the graph
Put the call anywhere you want a score recorded (a node, or after invoke()). Store or log result if you want it; do not branch on it. The graph continues either way.
def report_confidence(state):
result = evaluate_confidence()
return {**state, "confidence_score": result.score, "confidence_explanation": result.explanation}
Environment Variables
The SDK always talks to the managed AITL backend at https://api.trellar.io — this is fixed and cannot be overridden via an environment variable or function argument.
The API key itself is created only at trellar.io. Once you have it, you can pass it to evaluate_confidence(api_key=...) or set it as an environment variable so you do not pass it on every call:
| Variable | Description | Default |
|---|---|---|
AGENT_IN_THE_LOOP_API_KEY |
Bearer token for authentication | (required) |
export AGENT_IN_THE_LOOP_API_KEY=your-api-key
result = evaluate_confidence() # api_key read from the env var
API Reference
get_agent_guard
get_agent_guard(agent_name: str) -> BaseCallbackHandler
| Parameter | Type | Description |
|---|---|---|
agent_name |
str |
Stable, unique name identifying this agent graph (e.g. "research-agent") |
Returns a LangChain callback handler bound to agent_name. Pass it to graph.invoke(..., config={"callbacks": [guard]}).
Raises:
ValueError— ifagent_nameis empty or blank
evaluate_confidence
evaluate_confidence(
*,
api_key: str | None = None,
timeout: float = 30.0,
) -> AgentLoopResult
| Parameter | Type | Description |
|---|---|---|
api_key |
str | None |
Bearer token. Falls back to AGENT_IN_THE_LOOP_API_KEY |
timeout |
float |
HTTP request timeout in seconds (default 30.0) |
context, trace_id, and agent_name are resolved automatically from the active guard created by get_agent_guard — there is no way to pass them manually. Requests always go to https://api.trellar.io; callers cannot redirect them.
Raises:
ValueError— if no active guard is found, itstrace_idcannot be resolved, orapi_keyis missingrequests.HTTPError— on non-2xx HTTP responses
AgentLoopResult
A frozen dataclass with two fields:
| Field | Type | Description |
|---|---|---|
score |
int |
Confidence score from 1 (low) to 10 (high) |
explanation |
str |
Human-readable explanation of the score |
License
MIT — see LICENSE for details.
Release files for agent-in-the-loop 0.2.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| agent_in_the_loop-0.2.4.tar.gz | 17.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| agent_in_the_loop-0.2.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 31.5 kB
Release files / agent_in_the_loop-0.2.4.tar.gz
| Download URL | agent_in_the_loop-0.2.4.tar.gz |
|---|---|
| Size | 17.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0b93e1edb0ecd59a9046b524c16a6be91af88c9e56958fb2d36906a74e3dd279
|
|
BLAKE2b-256 checksum How to use checksums |
9a4a28d804f07c7b5881d9012ccb3d4f8ffe1af916e42e4925f1535f7aa60e9b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 18, 2026.
Transparency logRelease files / agent_in_the_loop-0.2.4-py3-none-any.whl
| Download URL | agent_in_the_loop-0.2.4-py3-none-any.whl |
|---|---|
| Size | 14.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
92e8efe059a51e1d4b891052ab8fad7e3232d6fd3a6d2ac2d5e9b084c663c2a6
|
|
BLAKE2b-256 checksum How to use checksums |
aa5fb13733cbfc1b3f984148a31bc516a76476ca1542fd366a3a5f8651b20184
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 18, 2026.
Transparency log