Silent watcher for LangGraph multiagent pipelines — detects silent failures, captures full state, enables step-level replay.
Project description
ARGUS
Your LangGraph pipeline runs. No exception. But three nodes later something crashes with a KeyError. The node that crashed didn't cause it — some node upstream returned a dict with a missing field, and nothing caught it.
ARGUS sits between your nodes and tells you exactly where it went wrong.
Install
pip install argus-agents
Setup
from argus import ArgusWatcher
watcher = ArgusWatcher()
watcher.watch(graph) # before graph.compile()
app = graph.compile()
app.invoke(initial_state)
watcher.finalize()
That's it. No changes to your node functions.
Strict mode — catches additional failure patterns at the cost of more noise. Use in staging/CI:
watcher = ArgusWatcher(strict=True)
Or without LangGraph:
session = ArgusSession(strict=True)
What it catches
Silent failures — a node returns {} or a dict missing a required field. No exception raised, pipeline keeps running. ARGUS compares each node's output against the next node's type annotations and flags it immediately.
In strict mode, four more patterns are caught:
- Error keys nested inside a sub-dict:
{"result": {"error": "upstream_failed"}} - Rate limit responses that default mode treats as non-critical
- Empty result fields (
results: []) promoted from warning to failure list[int]returned wherelist[str]is declared in the TypedDict
Semantic failures — structure is fine but the value is wrong. Pass a validator:
watcher = ArgusWatcher(validators={
"classify": lambda o: (o.get("label") in ["yes", "no"], "unexpected label"),
"*": lambda o: ("error" not in o, "error key present in output"),
})
"*" runs on every node. If a validator returns False, that node is marked semantic_fail.
Crashes — full traceback captured per node, with a one-line diagnosis:
└─ KeyError: 'score'
└─ at pipeline.py:47 → result = state["score"] * weight
└─ Field 'score' was absent from the incoming state
CLI
argus list # all runs
argus show last # most recent run
argus show run <id> # by full id or 8-char prefix
argus replay <id> <node> --app my_module:build_graph # re-run from a broken node
argus inspect <id> --step <node> # raw input/output for a node
argus diff <id> # diff replay vs original
argus diff <id-a> <id-b> # diff any two runs
argus --help has the full setup guide and flag reference.
Output
argus run-abc12345 · 2024-04-05 12:30 · 1243 ms
status ● silent_failure
1 fetch 43 ms ✓ pass
2 validate 12 ms ⚠ silent failure
└─ Field "score" is missing
└─ process received bad state
3 process 891 ms ✗ crashed
└─ KeyError: 'score'
└─ Field 'score' was absent from the incoming state
root cause validate
Parallel nodes shown as a grouped panel. Cyclic graphs show each iteration separately. Human interrupt chains stitched into one trace on resume.
Replay
A 10-node pipeline fails at node 7. You fix the bug. Instead of re-running nodes 1–6 and burning API credits:
argus replay <run-id> node_7 --app my_module:build_graph
ARGUS restores the exact state at node 7 from disk and runs from there. build_graph is a zero-arg function returning your graph — compiled or uncompiled, both work.
Then diff it:
argus diff <replay-id>
Node statuses
✓ |
pass |
~ |
pass with warnings (empty optional fields) |
⚠ |
silent failure (missing required fields) |
⊗ |
semantic fail (validator returned False) |
⏸ |
interrupted (human-in-the-loop pause) |
✗ |
crashed |
Not just LangGraph
from argus import ArgusSession
session = ArgusSession(validators={"classify": lambda o: (o.get("label"), "no label")})
session.set_edges({"fetch": ["classify"], "classify": ["process"]})
fetch = session.wrap("fetch", fetch_fn)
classify = session.wrap("classify", classify_fn)
process = session.wrap("process", process_fn)
state = fetch(initial_state)
state = classify(state)
state = process(state)
session.finalize()
Works with Prefect, Temporal, or plain Python functions.
Requires Python 3.9+. LangGraph 0.2+ only needed for ArgusWatcher.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file argus_agents-0.3.4.tar.gz.
File metadata
- Download URL: argus_agents-0.3.4.tar.gz
- Upload date:
- Size: 711.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9200155e86de97a590dccdea142a75ffe6a6e0542d5a9e5ecf9ba05280961e87
|
|
| MD5 |
f55ba3e7bac0d307d9a35e944a234450
|
|
| BLAKE2b-256 |
2c2c2969e49900debc755246cbd1f3bd6588575c9bb36a4d68621e5e98f2ae45
|
Provenance
The following attestation bundles were made for argus_agents-0.3.4.tar.gz:
Publisher:
publish.yml on VaradDurge/ARGUS
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
argus_agents-0.3.4.tar.gz -
Subject digest:
9200155e86de97a590dccdea142a75ffe6a6e0542d5a9e5ecf9ba05280961e87 - Sigstore transparency entry: 1410481075
- Sigstore integration time:
-
Permalink:
VaradDurge/ARGUS@3d577d742f3443afc95a6262c06a358df7223570 -
Branch / Tag:
refs/tags/v0.3.4 - Owner: https://github.com/VaradDurge
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@3d577d742f3443afc95a6262c06a358df7223570 -
Trigger Event:
release
-
Statement type:
File details
Details for the file argus_agents-0.3.4-py3-none-any.whl.
File metadata
- Download URL: argus_agents-0.3.4-py3-none-any.whl
- Upload date:
- Size: 496.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b7fbd99260ee3da2edf54f711863e141588b20b78b231025a399e853e291643e
|
|
| MD5 |
f68fc66db03b113a9d3736c6d0468a42
|
|
| BLAKE2b-256 |
f788cc2eb74ec4b5eb77f4c135721586fe0e3391b29d25fa1ac70d3cae1b3d0d
|
Provenance
The following attestation bundles were made for argus_agents-0.3.4-py3-none-any.whl:
Publisher:
publish.yml on VaradDurge/ARGUS
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
argus_agents-0.3.4-py3-none-any.whl -
Subject digest:
b7fbd99260ee3da2edf54f711863e141588b20b78b231025a399e853e291643e - Sigstore transparency entry: 1410481206
- Sigstore integration time:
-
Permalink:
VaradDurge/ARGUS@3d577d742f3443afc95a6262c06a358df7223570 -
Branch / Tag:
refs/tags/v0.3.4 - Owner: https://github.com/VaradDurge
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@3d577d742f3443afc95a6262c06a358df7223570 -
Trigger Event:
release
-
Statement type: