Guide
Dashboard walkthrough, integration setup, and configuration reference.
Quick Start
Get ARGUS monitoring on your pipeline in 5 steps.
Install ARGUS — Run pip install argus-agents in your project.
Copy the AI Setup Prompt — On the ARGUS landing page, click the AI Setup Prompt button (shown below). This copies a prompt that handles the full integration for you.

Paste into your AI coding tool — Paste the prompt into Claude Code, Cursor, or Copilot. The AI will audit your codebase and integrate ARGUS with the right config.
Run your pipeline — Execute your LangGraph / LangChain pipeline as usual. ARGUS captures the run automatically.
Open the dashboard — Run argus ui in your terminal. The web dashboard opens in your browser showing your runs.
After setup
CLI Commands
All commands available from your terminal after installing ARGUS.
Viewing runs
argus list
argus show last
argus show <run-id>
argus inspect <run-id> --step <node-name>
Dashboard
argus ui
Starts a local server on port 7842 and opens the dashboard in your browser. Press Ctrl+C in the terminal to stop it.
Replay & compare
argus replay <run-id> <node-name>
argus replay <run-id> <node-name> --app my_pipeline:build_graph
argus replay <run-id> <node-name> --only
argus diff <run-id-a> <run-id-b>
Account & diagnostics
argus login
argus logout
argus whoami
argus doctor
argus update
AI Integration Prompt
This is the full prompt copied by the AI Setup Prompt button. Paste it into Claude Code, Cursor, or Copilot. It audits your pipeline for compatibility, fixes issues, and adds ARGUS with the right config.
I want to add ARGUS monitoring to my LangGraph pipeline. Before writing any code, audit my codebase and then integrate it properly.
## STEP 1 — AUDIT MY PIPELINE
Find the file where my StateGraph is defined and check these things:
1. STATE TYPE: Find my state class. ARGUS works best when state is a TypedDict (or Pydantic model / dataclass). If my state is just a plain dict, convert it to a TypedDict with proper field annotations. Example:
# BAD — plain dict, ARGUS can't check field contracts
app = graph.compile()
result = app.invoke({"query": "...", "results": []})
# GOOD — TypedDict lets ARGUS verify fields between nodes
class AgentState(TypedDict):
query: str
results: list[str]
summary: str
2. NODE RETURN TYPES: Check every node function. Each should:
- Accept the state type as its first parameter (type-annotated)
- Return a dict with only the fields it's responsible for
- NOT return the entire state — just the fields it modifies
# BAD — no type hint, returns everything
def search(state):
return {**state, "results": [...]}
# GOOD — typed, returns only what it produces
def search(state: AgentState) -> dict:
return {"results": [...]}
3. GRAPH STRUCTURE: Check if the graph is:
- Linear (A → B → C) — auto-finalize works, no extra code needed
- Fan-out/fan-in (DAG) — auto-finalize works
- Cyclic (has loops / back-edges) — MUST call watcher.finalize() after invoke
4. ASYNC CHECK: If node functions are async (async def), ARGUS handles both — just make sure you're using await app.ainvoke() not app.invoke().
5. EXTERNAL CALLS: List which nodes make external API calls (OpenAI, search APIs, databases).
Print a summary of what you found and any fixes needed before proceeding.
## STEP 2 — FIX COMPATIBILITY ISSUES
If you found issues in Step 1, fix them now:
- Convert plain dict state to TypedDict
- Add type annotations to node function parameters
- Make nodes return only their output fields (not the full state)
- Ensure all fields referenced by downstream nodes exist in the TypedDict
## STEP 3 — INTEGRATE ARGUS
Install: pip install argus-agents
Add ArgusWatcher to the file where the graph is built:
from argus import ArgusWatcher
watcher = ArgusWatcher(graph) # pass StateGraph before compile()
app = graph.compile()
result = app.invoke(initial_state)
watcher.finalize() # ALWAYS call this — required for cyclic graphs, safe for all
print(watcher.run_id)
If the graph is already compiled elsewhere, use watch_compiled():
watcher = ArgusWatcher()
app = watcher.watch_compiled(app)
result = app.invoke(initial_state)
watcher.finalize()
## STEP 4 — PICK THE RIGHT CONFIG
Choose parameters based on what you found in the audit.
Note: record_http, semantic_judge, investigate, and persist_state are all enabled by default.
watcher = ArgusWatcher(graph,
# DETECTION STRICTNESS — catches empty lists, nested errors, type mismatches
strict=True,
# IF you want automatic root cause analysis on failures (default: True)
investigate=True, # or "always" to investigate every run
# IF any fields contain secrets or tokens
redact_keys={"token", "api_key", "password"},
# ADD validators for nodes that produce critical output:
validators={
# example: ensure summaries aren't empty stubs
"summarize": lambda o: (len(o.get("summary", "")) > 10, "Summary too short"),
# wildcard: runs on every node
"*": lambda o: ("error" not in o, "error key present"),
},
)
app = graph.compile()
result = app.invoke(initial_state)
watcher.finalize() # persists the run to .argus/runs/
After running the pipeline:
argus list # see all recorded runs
argus show last # inspect the most recent run
argus show <id> # inspect a specific run by ID
argus ui # open the web dashboardRuns List
Your pipeline execution history. Every run with ARGUS attached shows up here automatically.

Summary cards
Total Runs
Pipeline executions recorded in your workspace.
Clean
Runs where every node passed.
Failed
Runs with at least one failure or crash.
Pass Rate
Clean runs as a percentage of total.
Table columns
The Evaluation panel lets you filter runs by constraints like overall_status == clean.
Run Detail
Full picture of a single pipeline execution — metrics, execution trace, AI analysis, and initial state.

Header
Run ID, status, timestamp, duration, step count, and ARGUS version.
Root Cause Chain
Traces failures back to the originating node, not the node that complained.
Metrics
Duration
Wall-clock time for the full run.
Success Rate
Percentage of nodes that passed.
Failures
Nodes with any failure status.
Severity
Worst level seen: ok, warning, or critical.
Completed
Whether the pipeline reached the final node.

Execution timeline
Nodes listed in execution order with name, output type, duration, and status. Failed nodes show a root cause annotation — which field was missing and which upstream node dropped it. Expand any row to see full I/O JSON.
Node statuses
AI Analysis
When OPENAI_API_KEY is set, ARGUS investigates non-clean runs automatically. The analysis panel has three sections:


Correlation
Confirms the true origin node with failure signals and a confidence score.
Behavior
Raw initial state your pipeline received — the exact input at invocation time.
Compare
Side-by-side diff of two runs. Useful for verifying fixes, catching regressions, or understanding performance differences.


Open Compare — Sidebar link, or the Compare button on any run detail page.
Enter two run IDs — Run A is typically the broken run, Run B is the fix.
Read the verdict — Winner banner shows which run performed better and why.
Read the node diff — Status in A vs B per node. Missing nodes labelled only in A / only in B.
Approvals
Gate deployments on ARGUS results. Runs that meet your criteria get approved; everything else is held for review.

Rerun
Re-execute from a specific node using the frozen input state from a previous run. Test a fix without re-running the full pipeline or making upstream LLM calls. Use record_http=True for fully deterministic reruns from disk.
Open the failing run — Click the run ID to open its detail page.
Find the root cause node — Red banner at the top names the originating node.
Click the rerun icon — Each node row has a rerun icon. Click it on the root cause node.
Wait for the new run — ARGUS re-executes from that node forward, creates a new run.
Compare to confirm — Diff the original against the rerun — broken nodes should now pass.
From the CLI
argus replay <run-id> <node-name>
argus replay <run-id> <node-name> --app my_pipeline:build_graph
argus diff <original-run-id> <rerun-run-id>
Configuration Reference
All ArgusWatcher parameters. Graph is the only positional argument — everything else is keyword-only.
watcher = ArgusWatcher(
graph, # your LangGraph StateGraph — auto-calls watch()
# --- Output control ---
max_field_size=50_000, # max chars per field before truncation (default: 50k)
redact_keys={"token", "api_key"}, # field names to scrub from stored outputs
persist_state=True, # save run records to .argus/runs/ (default: True)
# --- Detection strictness ---
strict=True, # extra checks: nested error keys, rate-limit responses,
# empty lists, type mismatches. recommended for CI/staging.
# --- Semantic validators ---
validators={
"summarize": lambda o: (len(o.get("summary","")) > 10, "Summary too short"),
"*": lambda o: ("error" not in o, "error key present"), # runs on every node
},
# --- LLM investigation ---
investigate=True, # LLM root-cause analysis on failures (default: True)
# set to "always" for every node, False to disable
# --- Deterministic rerun ---
record_http=True, # saves every outbound API call to disk. (default: True)
# reruns replay from disk — zero extra cost.
# --- LLM semantic judge ---
semantic_judge=True, # LLM reviews every node's output for subtle quality issues.
# (default: True) needs OPENAI_API_KEY.
judge_model="gpt-4o", # or "gpt-4o-mini" for cheaper runs.
# --- Latency thresholds ---
config=ArgusConfig(
node_timeout_ms=30_000, # flag nodes that take >=95% of this (likely truncated)
min_expected_ms=500, # flag LLM nodes completing faster (likely cached/stale)
),
)
app = graph.compile()
result = app.invoke(initial_state)
watcher.finalize() # ALWAYS call — persists the run to .argus/runs/Access watcher.run_id after the run. Most parameters are enabled by default — record_http, semantic_judge,investigate, and persist_state are all True out of the box.
Always call watcher.finalize() after app.invoke(). It is required for cyclic graphs (loops / research agents) and safe to call on all graphs. Without it, the run stays in memory and is never written to disk — so argus list, argus show, and the dashboard will show nothing.
record_http
Captures every HTTP request/response during the original run. On rerun, serves recorded responses back — same data, zero cost, fully reproducible.
Enable when nodes call paid APIs and you want cheap, identical reruns. Skip when you want the rerun to hit the real API.
semantic_judge
ARGUS catches ~80% of production failures deterministically — missing fields, empty results, type mismatches, placeholder outputs. The remaining ~20% are subtle: wrong tone, unhelpful responses, outdated info. The semantic judge covers those.
Requires OPENAI_API_KEY. Enable for complex multi-agent pipelines. Skip for simple pipelines or zero-cost monitoring.
Latency Thresholds
Detects timing-correlated degradation — no LLM calls, purely algorithmic. Pass thresholds via ArgusConfig:
Both thresholds are optional and None by default — latency checks only run when configured.