Vaara

io.github.vaaraio由 GitHub 账号 vaaraio 发布v2.17.0更新于 Oct 29, 2026

Accountable autonomy proxy: gating, tamper-evident audit, time anchor for every action

概览

AI 生成的概览

Vaara 是一个本地运行的治理代理,对 AI 智能体的工具调用进行风险评分并放行、拦截或升级,同时写入防篡改的签名审计记录。

可以做什么
  • 管控工具调用:按策略为每次调用评分并决定放行、拦截或升级,可通过装饰器、管道 API 或置于 MCP 服务器前的代理实现。
  • 记录与验证:把决策、调用和结果写入哈希链审计轨迹,并导出可供他人离线核验的签名回执。
  • 回传结果:把真实结果反馈给评分器,使其重新调整各信号的权重。
  • 生成合规证据:从审计轨迹生成条款级的欧盟 AI 法案证据报告,支持 JSON、PDF 或 HTML。
  • 影子模式:只分类和记录每次调用而不拦截,之后再查看若启用强制会有什么结果。
适用场景
当智能体会执行有后果的操作(转账、写文件、调用工具),而你需要一份第三方(如审计师或监管机构)无需信任你的日志即可核验的记录时适用。也适合在现有 MCP 服务器前加一道策略闸门。
运行要求
以 Python 包形式本地运行(Python 3.10+),可通过 uvx 或 pip 安装,基础依赖为 cryptography、rfc8785 和 cbor2。可选扩展提供 HTTP 服务、ML 分类器和框架适配器。未声明需要账号、API 密钥或环境变量;审计轨迹默认保存在本地。
安装前请注意
它位于智能体操作的执行路径上:启用强制后调用可能被拦截或升级,拒绝和升级都会抛出错误。审计轨迹和回执默认写入本地存储。向公开透明日志发布轨迹头为可选且默认关闭。它不构成合规认证或法律意见,商业授权另行提供。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Vaara,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

[Vaara]

[PyPI] [License] [CI] [OpenSSF Scorecard] [Vaara Conformance: 55 suites, 0 failing] [DOI 10.5281/zenodo.22027975] [OpenSSF Best Practices] [Hugging Face Space]

[PyPI downloads]

Accountable Autonomy.

A verifiable receipt for every autonomous action, checkable by anyone.

Your AI agent transferred the funds, wrote the file, called the tool. Later, someone who does not trust you asks you to prove exactly what it did and why: a regulator, an auditor, a customer after an incident. Your own logs will not settle it, because you could have edited them.

Quick start

bash
pip install vaara                            # Python: CLI, MCP proxy, serverbrew tap vaaraio/tap && brew install vaara   # macOS: CLI + menu-bar app (built from source)npm install @vaara/client                    # TypeScript client for the HTTP API
python
import vaara
@vaara.governdef transfer_funds(to: str, amount: float) -> str:    ...

That is the whole thing. Every call to a governed function is risk-scored and decided against your policy before the body runs. An allowed call runs, and the decision, the call, and the outcome land in a hash-chained, tamper-evident record anyone can verify offline, with a signed receipt beside it. Sign the whole trail at export (vaara trail export) for third-party proof. Records persist to ~/.vaara/trail/audit.db by default, so evidence survives restarts. Python 3.10+. The base install carries three runtime dependencies, cryptography, rfc8785 and cbor2, which sign and canonicalise the receipts.

Both deny and escalate raise vaara.Blocked, since an escalation means a human has not answered yet. On a fresh install the example above runs. The default operating point is balanced, which allows below 0.55 and denies above 0.85, and a first call to transfer_funds scores 0.275 with a conformal interval of [0.085, 0.465]. Vaara decides on the interval's upper bound, and with no outcome history that interval is wide, so a riskier call escalates before its point estimate reaches the threshold. Feeding real outcomes back through report_outcome narrows it. The other presets are listed by vaara mode list. To watch decisions without acting on them, start with @vaara.govern(shadow=True).

Check a receipt with nothing installed

vaara.io/verify.html is the receipt explorer, in English and Finnish. A static page and one script, no build step and no dependencies. Paste in a receipt and it recomputes the DSSE pre-authentication encoding, takes its digest, and checks the Ed25519 signature with WebCrypto. The receipt never leaves the tab, nothing uploads, and the page works with the network off, so verification is not a service and Vaara is not a party to it. Save the page with its script and it keeps working.

It also states what a passing check does not establish: that the key belongs to the party you expect, that the signed statement is true, that decided_at means anything without an external time authority, or that one receipt is a whole history.

The explorer on the same page reads the public transparency log straight from your browser. Look a trail head up by digest, or paste a public key to see everything published under it. No account and no sign-in, because the key is the identity. Publishing to that log is opt-in and off by default (vaara trail publish-head), so an absence there means nothing was published rather than nothing happened.

See who else has checked it

vaara.io/conformance.html is the results page. It carries every suite and its verdict, and every party other than the maintainer who ran the checkers and reported what they found in public. Rows are chained, each holding the digest of the row before it, so removing or reordering one breaks every digest after it and the break is visible to anyone. The maintainer cannot take a row down either. A run that disagrees with ours is a row too, with the reason stated, and there is no blacklist.

The aggregate runner grades every suite at once, and grades another implementation's vectors the same way:

bash
git clone https://github.com/vaaraio/vaara && cd vaarapip install cryptography rfc8785                                     # enough for 53 of the 55 suites; the two that skip name their extrapython scripts/conformance_runner.py                                 # grade the reference corpuspython scripts/conformance_runner.py --vectors-dir ./your_vectors    # grade your own

It prints a prefilled link at the end of every run, so asking for a row takes one click. The named, versioned rule set, what a pass does and does not establish, and the full suite list are in docs/conformance-profile.md.

Prefer the explicit pipeline?

The decorator drives the same engine you can call directly when you want the decision object in hand.

python
from vaara.pipeline import InterceptionPipeline
pipeline = InterceptionPipeline()result = pipeline.intercept(    agent_id="agent-007",    tool_name="fs.write_file",    parameters={"path": "/etc/service.yaml", "content": "..."},    agent_confidence=0.8,)if result.allowed:    pipeline.report_outcome(result.action_id, outcome_severity=0.0)else:    print(result.reason)

Every call gets a risk score and an allow / block / escalate decision against your policy, then the call, the decision, and the real outcome are written to the audit trail. report_outcome closes the loop: the scorer reweights based on which signals actually predicted the outcome. Every release carries SLSA v1 build provenance as a GitHub artifact attestation (SLSA Build Level 2), and the PyPI wheel is the same file, so gh attestation verify vaara-<version>-py3-none-any.whl --repo vaaraio/vaara checks either download. Optional ML classifier: pip install 'vaara[ml]'.

Verify it without trusting the producer

Writing a trail is the easy half. The half that matters is letting someone who does not trust you check it, with no key, no access, and none of your code. Every Vaara record is content-addressed and fail-closed on authenticity, and ships with public conformance vectors plus a standalone checker that imports no Vaara code, so an independent party reproduces every verdict offline.

bash
vaara verify-bundle evidence-bundle.json

ok only when a signature is actually established, not merely present in a log. The same property drives the standards work behind the Vaara Receipt Internet-Draft: evidence that holds up for someone who runs none of your software. The full verifier set, the trust model for each verb, and where trust comes from in each case are in docs/verifying-evidence.md.

To check that claim yourself, without installing Vaara, run the standalone checker against the published vectors. Its only dependencies are cryptography and rfc8785:

bash
git clone https://github.com/vaaraio/vaaracd vaarapip install cryptography rfc8785        # the checker's only dependenciespython tests/vectors/external_evidence_v0/_check_independent.py

It re-derives every verdict from the receipt bytes and the public key alone. The output shows the property the trail is built for: a receipt dropped from inside a declared boundary is a provable gap from the held set, with no issuer access and no external witness.

For the whole loop in one runnable file, produce a signed record, verify it yourself, then watch a single forged byte get caught, see examples/prove-it-yourself/. The logs-versus-evidence argument behind it is in docs/logs-vs-evidence.md.

What the evidence looks like

vaara compliance report --db audit.db --format json against a real trail produces an article-level evidence record an auditor reads directly. Articles with no recorded events return evidence_insufficient, not a rubber stamp.

json
{  "system_name": "Acme HR Assistant",  "overall_status": "evidence_insufficient",  "trail_integrity": {"size": 105, "chain_intact": true},  "articles": [    {"article": "Article 12(1)", "title": "Record-Keeping (Logging)",     "status": "evidence_sufficient", "strength": "strong", "evidence_count": 105},    {"article": "Article 15(1)", "title": "Accuracy, Robustness and Cybersecurity",     "status": "evidence_insufficient", "strength": "absent", "evidence_count": 0}  ]}

Each verdict carries the threshold-versus-observed snapshot, the rationale, and the underlying records, so a reviewer traces status back to a concrete event. The same data renders as a Notified-Body PDF, a static HTML dashboard, or a Sigstore-signed handoff envelope. See docs/COMPLIANCE.md.

What you get
  • Gate every tool call you route through it against your own policy: allow, block, or escalate. Coverage is whatever you wrap; each adapter documents the surface it sees, and the Claude Code plugin states its four explicitly.
  • A tamper-evident trail an outside party verifies without trusting your stack, with the chain head anchorable to an external RFC 3161 / eIDAS timestamp so its existence is provable against a clock you do not control.
  • Article-level EU AI Act evidence, honest about the gaps instead of papering over them.
  • Governance of the model call itself, not only the tools around it: a hardware-rooted inference receipt that a second, different local model cross-checks. This is the sovereign inference harness, new in v1.0.
  • Enforcement, not only a record (v1.1.0): a credential broker mints a signed, short-lived credential bound to the attestation digest and scoped to one tool, its argument commitment, and tenant, with typed capability scopes that bound what a call may do. A gateway in front of a protected tool refuses any call without a valid, attestation-bound grant, so a bypass stops being silent. Off by default.
  • Gap-evident completeness (v1.4.0): each authorization receipt can carry a signed per-boundary sequence and running count, so a dropped receipt inside a declared boundary is a provable gap from the held receipts alone, with no issuer access and no external witness (vaara verify-contiguity). Off by default.
  • Independent re-mint (v1.14.0): a second generator in each public vector set reproduces the signed carrier byte-exact from the declared canonicalization alone, with no Vaara import. A verifier that has never run Vaara software reproduces the same bytes.
Where it plugs in

Native adapters route the major Python agent frameworks through the same pipeline, each via the framework's own hook, emitting identical audit events:

FrameworkEntry point
LangChainVaaraCallbackHandler, vaara_wrap_tool
CrewAIVaaraCrewGovernance
OpenAI Agents SDKVaaraToolGuardrail, vaara_wrap_function
MCP servervaara.integrations.mcp_server

To put Vaara in front of an MCP server, run it as a proxy. Every tools/call routes through the pipeline before reaching the upstream; allowed calls forward transparently, blocked calls return an MCP error.

bash
vaara-mcp-proxy \  --upstream npx --upstream-arg -y --upstream-arg @sap/mdk-mcp-server \  --db ./mcp_audit.db --shadow

Start with --shadow: every call is classified, scored, and recorded, nothing is blocked. After a few days, vaara trail shadow-report --db ./mcp_audit.db shows what enforcement would have done; then drop the flag and enforce, starting from a ready-made perimeter for common MCP servers in examples/policies/mcp-starters/. Point your MCP client (Claude Code, Cursor, any host) at the proxy instead of the upstream. There is also an HTTP API (pip install 'vaara[server]', vaara serve) and a first-party TypeScript client on npm (@vaara/client) for non-Python agents. Framework details, the cloud and OSS guardrail adapters (Bedrock, Azure, GCP, NeMo, Guardrails AI, LLM Guard, Rebuff), and the multi-tenant proxy are in docs/adapters.md.

In CI

A policy is code, so it belongs in the pull request that changes it. The action validates the policy, runs its cases, and fails the build on a policy that does not parse, a failing case, or a trail whose chain or signature does not hold.

yaml
- uses: vaaraio/vaara@v2  with:    policy: policies/production.yaml    cases: policies/production.cases.yaml

Point trail at a signed zip to verify one a job produced. Without a pubkey that checks the trail is internally intact; pass a key you obtained separately to bind the signer too, and the run says which of the two it did. Inputs, outputs and pinning are in docs/github-action.md.

This checks artifacts. Gating the agent is the runtime's job, at the moment of the tool call.

How it scores

Each risk score blends five expert signals and keeps adapting as outcomes come back, and it carries a confidence interval with a coverage guarantee that holds regardless of the input distribution. On a held-out adversarial corpus the classifier reaches 85.6% recall (95% Wilson [83.4, 87.6]) at a 5.1% false-positive rate, and 0.0% FPR on benign calls under live injection pressure. The hot-path rule scorer adds 140 µs mean per call on commodity CPU; the ML classifier is opt-in (vaara[ml]) and off that path. make bench reproduces the classifier figures below against the bundles that ship in the repo; it needs pip install 'vaara[ml]' and downloads the embedding model on first run.

  • 25,556-entry adversarial corpus (250 hand-curated + 25,306 LLM-generated). The v0.40 split assigns 24,619 of them leak-free by (category, generation batch) cell: 15,114 train, 2,921 val, 2,980 test, 3,604 holdout.
  • Classifier v11 (254 hand-features + 384-dim MiniLM embeddings) at threshold 0.8800 on held-out TEST n=1,827: recall 85.6% [83.4, 87.6] at FPR 5.1% [3.8, 6.9]. Recall is up 0.9 points on v9 and the false-positive rate is up 1.0. That trade is deliberate and the rest of this section is why.
  • Cross-model held-out recall 86.3% over n=5,600, against attacks written by Qwen2.5-72B, a model absent from TRAIN. v9 reads 67.4% on the same set. The previous published figure here was 66.8% [64.9, 68.7], measured on v8 against the v0.37 surface; v9 reproducing it within a point on a different attacker family and freshly generated data is the reason that number survived two releases unchanged. This is still the honest worst case, and the in-distribution number above is the easier denominator.
  • On four attack categories that the corpus had barely covered until v0.40, measured on 5,600 entries generated after v11's operating point was fixed: recall 63.1% to 87.0% and false positives 6.6% to 2.5% against v9. Credential exfiltration alone moves 45.9% to 80.3% at 10.0% to 3.9% FPR. Full record in bench/V11-CANDIDATE.md, including the earlier candidate that was rejected and why.
  • BIPIA-pressure FPR on benign tool calls 0.0% [0.0, 0.5]: none of 704 calls flagged across four agent backends (Claude Haiku 4.5, Llama-3.1-8B, Mistral-7B, Qwen-2.5-7B). v9 flags 2.7% of the same calls and v8 35.7%. scripts/eval_bipia_entries.py reproduces all three.
  • Multi-attacker PAIR robustness, measured on v0.31 and not re-run on v11: 0/25 successes per attacker across Qwen2.5-32B, Qwen2.5-72B, Llama-3.3-70B on identical seeds, Wilson upper 13.3% (bench/vaara-bench-v0.31.md).
  • Distribution-free conformal coverage on the score; MWU regret bound O(sqrt(T log N)).
  • Chain of custody: corpus, split, training commit, and bundle SHAs locked and printed by every script.

Method and per-cell breakdown: docs/architecture.md and bench/.

Standards and attestation
  • vaara.receipt/v1 is the canonical parent spec for the signed receipt format: hash-chained, canonicalized with JCS (RFC 8785), verifiable offline from a public key. The x402 settlement binding and an eIDAS qualified-timestamp profile are downstream profiles that pin to it rather than competing formats. Receipts can carry a self-hosted RFC 3161 timestamp that Vaara mints offline.
  • SEP-2828 signed execution records, carried forward as the IETF Internet-Draft draft-sirkkavaara-vaara-receipt. A second independent implementation has reproduced the SEP-2828 conformance vectors from a clean checkout with no shared code. Published corpora with independent checkers cover the fallback binding path (tests/vectors/fallback_projection_v0/) and CrewAI governance decisions (tests/vectors/governance_decision_v0/).
  • OVERT 1.0 (overt.is): Vaara is the Arbiter and emits Protocol Profile 1.0 Base Envelopes (canonical CBOR, Ed25519) alongside every record when attestation is on.
  • Post-quantum: an optional parallel ML-DSA-65 / FIPS 204 signature over the same preimage, so a stripped post-quantum signature is a detectable downgrade rather than a silent loss.
  • Root-agnostic evidence: the same Article 12 record is provable with or without a hardware TEE and re-expressible in IETF RATS EAR claims (AR4SI vector), whether rooted in a TPM 2.0 host, an AMD SEV-SNP confidential VM, or no TEE at all.
  • Sovereign inference harness (v1.0): a local model behind a signing proxy that emits a hardware-rooted inference receipt a second local model cross-checks. Developed privately, published here under AGPL-3.0.

Details and the offline checkers for each: docs/standards.md.

Surface stability

The public surface is fixed: the signed envelope (vaara.receipt/v1), capability constraints, the credential grant and gateway, and the @vaara.govern entry point. No new primitives are planned. New behavior ships as profiles that pin to vaara.receipt/v1, not as new core types, and no new format bindings will be added (the last was v1.13.0). From here the work is hardening and subtraction within this surface, so anyone building on it has a stable target.

Docs
PathContents
docs/verifying-evidence.mdEvery verifier and its trust model
docs/logs-vs-evidence.mdLogs vs evidence: proving what an agent did, and what the AI Act actually requires
docs/prove-what-an-ai-agent-did.mdThe four properties a provable record of agent actions needs
docs/eu-ai-act-article-12.mdArticle 12 record-keeping: what it requires, what it does not, what to demand from tooling
docs/tamper-evident-audit-trail.mdHow the trail works, its honest limits, and what it costs
docs/vaara-vs-observability-vs-grc.mdVaara vs Datadog/Splunk vs Vanta/Drata: three different questions
docs/dogfood/Our marketing runs under this gate; the signed trail and key to verify it
docs/capabilities.mdEverything Vaara does, by area, each entry naming its code
docs/library.mdThe capabilities with no command of their own, reached from Python, each with a block that runs
docs/architecture.mdScoring, conformal coverage, time anchor, formal properties
SPEC.mdThe canonical vaara.receipt/v1 receipt format spec
docs/standards.mdSEP-2828, SEP-2787, OVERT, the sovereign inference harness
docs/adapters.mdFramework and cloud/OSS guardrail adapters, multi-tenant proxy
docs/COMPLIANCE.mdEU AI Act and DORA article mapping, eval numbers
docs/multi-replica-deployment.mdScaling past one proxy process: per-replica chains, rotation, archive index
docs/kubernetes-rancher.mdRunning the proxy on Kubernetes with Rancher: chart, storage, enforcement, network isolation
docs/supported-platforms.mdPython, container and Kubernetes versions Vaara supports, and which have been verified
CHANGELOG.mdVersion-by-version evolution
docs/PRIOR_ART.mdWhen each concept first shipped, plus adjacent work

Vaara helps deployers assemble evidence for their own conformity work. It does not certify compliance or constitute legal advice. Deployers own their obligations under the EU AI Act and other applicable law.

Commercial license and paid pilots available: see vaara.io or contact [email protected]. Licensing terms are in LICENSING.md, and the commercial licence is described in COMMERCIAL.md.

Acknowledgements

Red Hat is a trademark of Red Hat, LLC, registered in the United States and other countries.

Citation

If you build on Vaara or its receipt format, cite the repository (see CITATION.cff) and the specification it implements:

Henri Sirkkavaara. The Vaara Receipt: A Recomputable Receipt Format for Decisions About Agent Actions. IETF Internet-Draft draft-sirkkavaara-vaara-receipt.

Every tagged release is archived by Zenodo and minted a DOI. Cite 10.5281/zenodo.22027975 for the software as a whole, which always resolves to the newest version, or the version DOI printed on a specific release for the exact bytes you ran.

License

Copyright © 2026 Henri Sirkkavaara. Licensed under AGPL-3.0-or-later. See LICENSE.

来源:README.md,提交 90311e7

工具

0
SourceWeft 曾在隔离沙箱中以无凭据方式启动该软件包一次,以列出其工具,但未能完成:服务器未能启动。

版本历史

31
  1. v2.17.0最新Oct 29, 2026
  2. v2.15.0Oct 18, 2026
  3. v2.14.0Oct 15, 2026
  4. v2.13.0Oct 14, 2026
  5. v2.12.1Oct 13, 2026
  6. v2.12.0Oct 12, 2026
  7. v2.11.0Oct 12, 2026
  8. v2.10.0Oct 11, 2026
  9. v2.9.0Oct 10, 2026
  10. v2.8.0Oct 10, 2026
  11. v2.7.1Oct 9, 2026
  12. v2.6.0Oct 2, 2026
  13. v2.5.0Oct 2, 2026
  14. v2.4.0Oct 2, 2026
  15. v2.3.2Oct 1, 2026
  16. v2.3.1Sep 29, 2026
  17. v2.2.0Sep 28, 2026
  18. v2.1.2Sep 27, 2026
  19. v2.1.0Sep 26, 2026
  20. v2.0.0Sep 26, 2026
  21. v1.99.0Sep 25, 2026
  22. v1.98.0Sep 25, 2026
  23. v1.97.1Sep 23, 2026
  24. v1.96.0Sep 23, 2026
  25. v1.94.0Sep 23, 2026
  26. v1.93.0Sep 21, 2026
  27. v1.92.0Sep 21, 2026
  28. v1.91.0Sep 20, 2026
  29. v1.89.0Sep 18, 2026
  30. v1.88.0Sep 16, 2026
  31. v1.87.0Sep 16, 2026

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分