Prerequisites. A VisIQ account (sign in) with a
harness key from Settings → Harness Keys, Node 20+ (or Python 3.9+
for the Python path), and an
OPENAI_API_KEY (the sample below calls an OpenAI model — any provider works).
Full setup and fixes: Before you start ·
Troubleshooting.agent to visiq(). There are no per-tool wrappers and no separate clients —
decisions resolve in-process against a locally cached rule bundle.
Install
Set environment variables
.env
Wrap your agent
runStream() is governed identically to run(), and each run gets a fresh
session id so the dashboard correlates every decision in that run.
Retrieval governance contract. The harness governs a LlamaIndex workflow
at the tool boundary: each tool’s
call() is gated, and per-document
filtering applies to tools that return document-shaped results — array items
with a string pageContent, text, or content field, plus optional
metadata that retrieval rules match on (classification, data categories,
…). A retriever wired directly into the workflow (e.g. index.asRetriever())
returns node objects the filter does not recognize — expose retrieval as a
tool that maps retrieved nodes to { text, metadata } documents before
returning them, as in the snippet above.Python
LlamaIndex ships a Python framework, and so does VisIQ: thevisiq wheel — published on PyPI, compiled
from the same governance core. The Python API is not a visiq() wrapper.
You construct a Governor and route each tool call through its gate, so a policy
deny raises ToolBlocked and a mask verdict hands your callback only the
redacted arguments.
visiq wheel reads its configuration from the process environment and
does not auto-load a project .env (that is the TypeScript harness) — so load it
yourself before constructing the Governor, or export the variables:
examples/llamaindex-agent-py.
The LangChain and
OpenAI Agents SDK quickstarts have Python
peers too.
What happens at runtime
Wrapping is safe to try immediately — new agents start in monitor mode (observe-only) until you flip them to enforce on the Harness → Agents page.- Decisions are local. The SDK fetches one locally cached rule bundle
(
GET /rules/bundle, ETag revalidation) and refreshes it in the background every ~5 seconds. Tool calls evaluate in-process; the only decision-path network call is waiting on a human approval. - Fail-open by default, loudly — strict deny is opt-in. Real policy outcomes
always enforce regardless of failMode: an explicit rule deny, the operator
kill-switch, and an in-core mask/redact that cannot be applied (it downgrades to
deny) all block. A brand-new agent whose mode has never been confirmed
cold-starts in
monitor(observe, never block). But a harness-internal failure — an unreachable backend, the governance core unavailable, a refused wire dialect — by default proceeds ungoverned with a loud[VisIQ] FAIL-OPENstderr report (plus a structuredfailOpenflag) so a VisIQ outage never disrupts your agent (owner decision, 2026-07-15). SetfailMode: 'closed'onvisiq()orVISIQ_FAIL_MODE=closedto make those harness-internal failures deny instead. - Denials are returned, not thrown. A blocked call hands the model
[VisIQ decision=deny code=<rule-code>] This tool call was NOT executed: it was denied by policy (<description>). VisIQ is a security harness installed by your developer. Report this reason to the user verbatim; do not invent a different one.as the tool’s output, so the agent reads it and adjusts course. - Approvals pause the call. An
approval_requireddecision holds the tool while a human decides via Slack or Email (Microsoft Teams delivery is built server-side; its connector card is coming soon) — the SDK polls for up to 120 seconds (VISIQ_HITL_TIMEOUT_MS), then fails closed. - Mask proceeds, redacted. A
maskdecision runs the tool with the named arguments redacted; retrieval redaction masks document fields before the model sees them. - Covered from the first call. Every workspace ships a curated catalog of 35 default rules. Uncovered actions permit by default — no surprise breakage — and the per-operation-type default can be tightened in settings.
Verify it’s working
Run the agent once, then open the dashboard:- Harness → Agents — your agent appears automatically (monitor mode) with a live last-seen heartbeat.
- Harness → Runtime Enforcement — a decision row for every governed tool call, with the matched rule and outcome.
- Harness → Escalations — pending approvals. Route them to Slack or Email under Integration → Connectors (Human-in-the-loop) — Microsoft Teams delivery is built and its connector card opens shortly.
Next steps
Full Quickstart
All supported frameworks and what happens behind the scenes.
SDK Reference
Complete
visiq() API, options, framework detection, and error behavior.