PlawIO/veto

GitHub: PlawIO/veto

Veto 是 AI Agent 工具调用的策略运行时,通过确定性 YAML 规则在 Agent 执行工具前进行拦截、放行或升级审批,为 Agent 行为提供安全边界。

Stars: 12 | Forks: 2

# Veto Veto 是 AI agent 工具调用的策略运行时 —— 用纯英文编写拒绝(deny)规则,仅需 5 行代码即可确定性地执行它们。 ![npm veto-sdk](https://img.shields.io/npm/v/veto-sdk?label=veto-sdk&color=000000) [![PyPI](https://img.shields.io/pypi/v/veto?label=python%20veto&color=000000)](https://pypi.org/project/veto) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE) Veto 位于 agent 与其可执行的工具之间。它会根据确定性策略评估工具名称和参数,然后在你的 handler 运行之前决定允许、拒绝、警告、记录或路由至人工审批。它管控的是工具调用,而非 prompt。 ## 基准测试 已提交的 PR-mode 基准测试是在 GitHub Actions 运行器输出上测量的,而非基于本地硬件或阈值。CI 会针对 `benchmark/baselines/*.json` 监控 Veto 高于 10% 的 p99 回归;绝对阈值则单独管理。 | Runtime | Workload | Iterations | p50 | p95 | p99 | p99 threshold | Source | | ------- | ---------------------------------- | ---------: | -----------: | ------------: | ------------: | ------------: | --------------------------------------------------- | | Veto | single-rule local eval | 50,000 | 0.000260ms | 0.001092ms | 0.002594ms | 0.05ms | measured on GitHub Actions PR-mode, PR #208 CI log | | Veto | 100-rule merged packs | 50,000 | 0.027291ms | 0.037470ms | 0.057136ms | 0.5ms | measured on GitHub Actions PR-mode, PR #212 CI log | | Veto | localhost PDP server eval | 250 | 0.402051ms | 0.841651ms | 2.092263ms | 30ms | local loopback fixture baseline; not run in PR mode | | AGT | policy eval latency per rule | published | 0.012ms/rule | not published | not published | n/a | source: published, not reproduced | | AGT | throughput at 50 concurrent agents | published | 35K ops/sec | not published | not published | n/a | source: published, not reproduced | ## 入门指南 ``` import { protect } from "veto-sdk"; const safeTools = await protect(tools); ``` ``` npm install veto-sdk ``` 将 `safeTools` 传递给 LangChain、LangGraph、Vercel AI SDK、OpenAI Agents、MCP adapter、Claude SDK、Google ADK、Mastra、AutoGen、CrewAI 或你自己的工具运行器。如果存在 `./veto/veto.config.yaml` 和 `./veto/rules/*.yaml`,`protect()` 会加载它们。在没有本地策略的情况下,Veto 会在观察(observe)模式下应用 `@veto/safe-defaults`,这样可疑的 shell/文件/数据库/资金流动模式就会被记录,而不会发生意外的阻断。 未限定作用域的 `veto` npm 名称目前尚未由 Plaw 控制;在名称转移完成之前,请使用我们拥有的 `veto-cli` 包形式。 要在不到一分钟内设置阻断型本地策略: ``` npm install veto-sdk npx --package veto-cli@latest veto init npx --package veto-cli@latest veto policy generate --tool bash --prompt "block rm -rf" --save ./veto/rules/block-rm-rf.yaml node examples/60-second-denied-call/denied-call.mjs ``` 此路径仅限本地:不需要提供商的 SDK 或 API key。对于文本生成,Veto 会优先尝试已配置的云端/自托管/内核 endpoint,然后使用带有审查警告的本地确定性模板兜底;在回退模式下,不会有任何 prompt 或策略数据离开你的设备。 将 Veto 安装到开发工具和 MCP 客户端中: ``` npx --package veto-cli@latest veto install claude-code npx --package veto-cli@latest veto install cursor npx --package veto-cli@latest veto install codex veto-mcp-proxy --config ./veto/mcp.config.yaml ``` ## 运行时适配器矩阵 | Runtime | Artifact | Status | | ----------------------- | -------------------------------------------------------------------- | -------------- | | Provider-agnostic tools | `protect(tools)`,`Veto.wrap()` | 规范路径 (Canonical path) | | Vercel AI SDK | `veto-sdk/integrations/vercel-ai` 中间件 + guard 辅助函数 | 已支持 | | OpenAI Agents | `veto-sdk/integrations/openai-agents` guardrails + guard 辅助函数 | 已支持 | | LangChain / LangGraph | `veto-sdk/integrations/langchain` 中间件,ToolNode,guard 辅助函数 | 已支持 | | MCP | 提供商适配器 + `Veto.wrapMCPTools()` | 已支持 | | Browser Use | `veto-sdk/integrations/browser-use` | 已支持 | | OpenClaw | `veto-sdk/integrations/openclaw` hooks | 已支持 | | Claude SDK | `veto-sdk/integrations/claude-sdk` Anthropic 工具调用辅助函数 | 已添加 P2 | | Google ADK | `veto-sdk/integrations/google-adk` 函数声明/调用辅助函数 | 已添加 P2 | | Mastra | `veto-sdk/integrations/mastra` 工具封装 | 已添加 P2 | | AutoGen | `veto-sdk/integrations/autogen` 函数/工具封装 | 已添加 P2 | | CrewAI | `veto-sdk/integrations/crewai` 工具/函数封装 | 已添加 P2 | ## TypeScript ``` npm install veto-sdk ``` ``` import { protect } from "veto-sdk"; const safeTools = await protect(tools); const agent = createAgent({ tools: safeTools }); ``` ## Python ``` pip install veto ``` ``` from veto import protect safe = await protect(tools) agent = create_agent(tools=safe) ``` ## 添加本地拒绝规则 ``` npx --package veto-cli@latest veto init ``` `npx --package veto-cli@latest veto init` 会创建 `./veto/veto.config.yaml` 和 `./veto/rules/defaults.yaml`。默认的本地规则非常严格,包含对敏感路径和破坏性 shell 命令的确定性拒绝规则。 建议为新规则使用散文(自然语言)编写,然后再检查生成的 YAML: ``` npx --package veto-cli@latest veto policy generate --tool bash --prompt "block rm -rf" --save ./veto/rules/block-rm-rf.yaml ``` ``` rules: - id: block-large-transfers name: Block transfers over $1,000 enabled: true severity: high action: block tools: [transfer_funds] conditions: - field: arguments.amount operator: greater_than value: 1000 ``` 可用动作(Actions):`block`、`allow`、`warn`、`log`、`require_approval`。 ## 高级 API `Veto.init()` 和 `.wrap()` 仍受支持,适用于需要显式实例、`guard()` 检查、云端/自托管选项、审计导出或事件钩子的高级/面向内部的集成。 ``` import { Veto } from "veto-sdk"; const veto = await Veto.init({ configDir: "./veto", mode: "strict" }); const safeTools = veto.wrap(tools); const decision = await veto.guard("transfer_funds", { amount: 1500 }); ``` ## 包列表 | Package | 语言 | 安装 | 用途 | | ----------------------------------------------- | ----------- | ----------------------------------------- | ------------------------------------------------ | | [`packages/veto`](./packages/veto) | TypeScript | 仅限本地工作区 | 等待 npm 名称转移的保留/本地封装 | | [`veto-sdk`](./packages/sdk) | TypeScript | `npm install veto-sdk` | agent 工具调用的策略运行时 | | [`veto` (Python)](./packages/sdk-python) | Python | `pip install veto` | 具备 `protect()` 功能的 Python 对等 SDK | | [`veto-cli`](./packages/cli) | TypeScript | `npx --package veto-cli@latest veto init` | 当前发布的用于暴露 `veto` 的 CLI 包 | | [`veto-bash`](./packages/bash) | Rust + Node | `npm install --global veto-bash` | 原生 bash 工具调用强制执行路径 | | [`create-veto-app`](./packages/create-veto-app) | TypeScript | `npm create veto-app` | TypeScript 初始应用 | ## 本地自托管 ``` docker compose up curl -s http://localhost:3001/v1/validate \ -H 'content-type: application/json' \ -d '{"toolName":"bash","arguments":{"command":"echo hello"}}' ``` 有关公开的审查者路径、固定的 `localhost:3001` compose 映射、默认禁用的出站检查以及本地未经验证的验证契约,请参见 [docs/self-hosting.md](./docs/self-hosting.md)。 ## BYOC / 客户面边界 Veto BYOC 运行在客户面。公开的安装构件位于 [`helm/`](./helm)、[`terraform-modules/`](./terraform-modules)、[`cf-templates/`](./cf-templates) 和 [`cdk/`](./cdk) 中。它们仅限出站访问,绝不能授予 Plaw 跨账户 IAM 或模拟权限。客户策略、决策行、工具参数、agent ID、用户 ID、Slack 内容、prompt、环境变量和 secret 都不会传输给 Plaw。 允许的出站控制面检查仅限于许可证心跳和可选的遥测。心跳 schema 恰好包含六个字段:`instance_uuid`、`license_id`、`decision_count_30d`、`sdk_version`、`operator_version`、`timestamp`。 安装文档: - [Kubernetes](./docs/install/k8s.md) - [AWS](./docs/install/aws.md) - [GCP](./docs/install/gcp.md) - [Azure](./docs/install/azure.md) - [Air-gapped](./docs/install/air-gapped.md) - [验证镜像](./docs/verifying-images.md) ## 为什么选择 Veto - 可通过工具参数进行检查的策略规则的确定性本地评估。 - 适用于任何 agent 框架或自定义工具运行器的、与提供商无关的封装。 - 针对敏感工具调用的人工审批和成本感知治理。 - 本地优先运行,支持可选的自托管或云端策略分发。 - Apache-2.0 许可的包和公开的供应链验证构件。 ## 贡献 参见 [CONTRIBUTING.md](./CONTRIBUTING.md)。请将漏洞报告发送至 [security@plaw.io](mailto:security@plaw.io)。 ## 许可证 Apache-2.0 © [Plaw, Inc.](https://plaw.io)
标签:AI代理, AI安全, AI治理, AI防御平台, API网关, Chat Copilot, LLM回退, MITM代理, Python, Streamlit, TypeScript, YAML, 云计算, 企业安全, 可视化界面, 子域名突变, 安全中间件, 安全库, 安全插件, 工具调用管理, 授权内核, 无后门, 沙箱, 确定性执行, 策略即代码, 策略引擎, 策略评估, 网络安全挑战, 网络资产管理, 聊天机器人安全, 自动化攻击, 规则引擎, 访问控制, 请求拦截, 逆向工具