English | 简体中文
AgentGuard: 面向基于 LLM 的工具使用智能体的基于属性的访问控制框架
通过声明式策略、可追溯决策与人工审核,为高风险工具调用提供安全控制。
|
🧩
无缝集成
|
🛡️
多风险覆盖
|
👁️
可视化规则配置与审计
|
Important
本项目仍处于活跃开发阶段,可能包含尚未发现的缺陷。欢迎通过 Issue 和 PR 提交反馈与贡献。
AgentGuard 是一个面向智能体工具调用的基于属性的访问控制框架,它作用于大模型规划引擎与工具之间。在每一次工具调用真正执行之前,以及工具执行结束之后,AgentGuard 会依据声明式策略评估智能体行为风险,判断当前智能体的行为是否需要强制阻断、人工审核等。
AgentGuard 可以集成到现有的智能体框架中,无需修改底层的执行逻辑。目前,它支持 LangChain、AutoGen 和 OpenAI Agents SDK 的集成,并且我们正在持续扩大对更多智能体生态系统和框架的支持。
AgentGuard 的策略不是把风险判断写死在业务代码中,而是通过独立的 DSL 描述“什么条件下允许、拒绝或转入审核”。策略可以同时引用智能体身份、工具元数据、工具参数、目标地址、会话历史和调用链上下文,适合表达智能体工具调用中常见的安全边界。
策略条件支持数值比较、集合判断、正则匹配、字符串包含以及 AND / OR / NOT 组合。例如,可以用 principal.trust_level < 2 区分低信任智能体,用 tool.recipient_domain NOT IN allowlist.email 限制外发目标,也可以通过 tool.cmd MATCHES ... 识别危险命令,而上述表达式都可以通过 AND / OR / NOT 层层组合。
AgentGuard 既可以判断单次工具调用,也可以判断跨步骤风险。通过 TRACE 和会话历史函数,策略能够表达“读取数据库后发送邮件”、“读取敏感文件后上传到外部 HTTP 端点”、“外部输入最终流入 Shell 执行”等链式行为,而不只依赖当前工具参数。
策略可以作用在工具执行前的 requested 阶段,也可以作用在工具完成后的 completed 阶段或失败时的 failed 阶段。执行前适合做阻断和审批;执行后则可用于记录结果、基于 tool.result 触发后续审计或规则判断。
规则命中后可以返回 ALLOW、DENY、HUMAN_CHECK 或 LLM_CHECK。这使策略不必只有“放行/拒绝”两种结果:明确危险的操作可以直接拒绝,风险不确定的操作可以交给人工或 LLM 审查。
策略可以基于智能体(主体)和工具(客体)属性做差异化控制。智能体侧可声明 agent_id、session_id、role、trust_level、scope 等身份信息;工具侧可声明 boundary、sensitivity、integrity、tags 等静态标签。这样可以直接写出“低信任智能体不能调用特权边界工具”、“高敏感工具结果不能流向外部边界”这类策略。同时用户也可以根据自己需要定义新的标签。
AgentGuard 位于大模型规划引擎与工具之间,不介入智能体的规划、推理及任务编排逻辑。AgentGuard 为多种主流智能体框架提供了 Adapter,用户无需改动框架内部代码,也不用对现有智能体进行大规模重构,仅需极少量代码即可通过 Adapter 快速完成集成。对于暂未支持的智能体框架,AgentGuard 也提供了方便的开发接口让用户自定义 Adapter。
目前我们支持的智能体框架有:
AgentGuard 提供前端控制台来管理智能体。通过可视化页面,用户可以采用交互式的方式配置策略,无需手写 DSL 代码;同时策略配置界面广泛采用下拉框等选择性交互元素,极大降低了用户的策略配置负担。
运行时页面会展示智能体的健康状态、近期流量、待审批请求和审计记录。对于触发策略的工具调用,可以查看命中的规则、风险分数、最终决策以及原始事件/决策 JSON,便于定位为什么某次调用被拒绝或转入审核。
AgentGuard 采用集中式中控架构,实现对分布式智能体进程的统一治理。智能体可部署于网络中的多个节点,通过中控服务即可完成策略的集中配置与运行时状态的实时监控。这一架构特别适合需要统一管理众多智能体资产的组织场景。
你需要先安装 Docker
选择一台主机作为中控服务器,然后执行以下命令下载 AgentGuard:
git clone https://github.com/WhitzardAgent/AgentGuard.git
cd AgentGuard编写一套访问控制策略:
mkdir -p rules
cat <<EOF > rules/block_email_send.rules
RULE: block_untrusted_email_send
TRACE: Retriever -> ...? -> Mailer
CONDITION: Retriever.name == "retrieve_doc"
AND Mailer.name == "send_email_to"
AND Retriever.id == 0
AND Mailer.addr != "admin@example.com"
AND principal.trust_level < 2
POLICY: DENY
Severity: high
Category: data_exfiltration
Reason: "Low-trust principal cannot send document 0 to non-admin recipients"
EOF该策略针对两个智能体工具:retrieve_doc 和 send_email_to,它们分别用于检索特定 id 的文档,以及将文档内容发送到指定的邮箱地址。这项策略描述了这么一个规则:信任级别小于 2 的智能体在执行任务时,只能将 id 为 0 的机密文件发送给 admin@example.com 邮箱,发送到其他地址一律不允许。
AgentGuard 也提供了可视化策略配置方式,并支持策略的动态热更新,详情请参考 这里。
接下来配置中控服务的环境变量:
若使用默认配置,此步骤可省略。
cp .env.example .env
vi .env启动中控服务:
./scripts/start.sh -d中控服务监听在:38080 端口
UI 界面监听在:8080 端口
你可以通过访问 http://localhost:8080 来查看 UI 界面。
切换到智能体端的主机,执行以下命令:
git clone https://github.com/WhitzardAgent/AgentGuard.git
cd AgentGuard
pip install -e .以 LangChain 为例,准备一份智能体代码:
你需要先安装包依赖:
pip install langchain==1.2.18 pip install langchain-openai==1.2.1
from langchain.agents import create_agent
from langchain.tools import tool
# 🚩 Import the AgentGuard client SDK
from agentguard import Guard, Principal
LLM_API_KEY = "<YOUR KEY>" # Fill this manually
LLM_MODEL_NAME = "gpt-5.4-mini"
@tool
def retrieve_doc(id: int) -> str:
"""Retrieve a document by integer id."""
return f"DOC#{id}: This is a mocked document body."
@tool
def send_email_to(doc: str, addr: str) -> str:
"""Send a document to an email address."""
return f"Email has sent to {addr}: {doc}"
def build_llm():
from langchain_openai import ChatOpenAI
return ChatOpenAI(
api_key=LLM_API_KEY,
model=LLM_MODEL_NAME,
temperature=0,
)
def build_agent():
return create_agent(
model=build_llm(),
tools=[retrieve_doc, send_email_to],
system_prompt=(
"You are a zero-shot ReAct style agent. Decide which tool to use, "
"observe tool results, and continue until the user's task is complete."
),
)
def run(agent, prompt):
print("===================================")
print(f"Prompt: {prompt}")
result = agent.invoke(
{
"messages": [
{
"role": "user",
"content": prompt,
}
]
}
)
print(f"Output: {result["messages"][-1].content}")
print("===================================\n")
if __name__ == "__main__":
agent = build_agent()
# 🚩 Load the guard client
guard = Guard(
remote_url="http://<Control Server IP>:38080", # Replace with your control server IP and port
mode="enforce",
fail_open=False,
)
# 🚩 Create a principal for the agent
principal = Principal(
agent_id="langchain-remote-demo",
session_id="langchain-remote-session",
role="default",
trust_level=1,
)
# 🚩 Start a session with the principal
guard.start(principal=principal, goal="langchain remote runnable host demo")
# 🚩 Attach the guard to the LangChain agent
guard.attach_langchain(agent)
try:
run(agent, "Please retrieve document id=0 and send it to admin@example.com.")
run(agent, "Please retrieve document id=0 and send it to alice@example.com.")
finally:
# 🚩 Close the guard
guard.close()标 🚩 符号的地方是 AgentGuard 客户端插入智能体代码的位置,另外请注意在代码中将 LLM API 密钥和中控服务器的地址改为你实际部署对应的值。
执行刚刚准备的 LangChain 智能体代码:
python <LANGCHAIN_AGENT_FILE>智能体执行了两项不同的任务,第一次是将 id 为 0 的文档(模拟机密文件)发送给管理员邮箱,这是访问控制策略允许的操作;第二次是将 id 为 0 的文档发送给其他用户邮箱,这是访问控制策略不允许的操作。
预期行为是,AgentGuard 会允许第一次智能体执行,拒绝第二次智能体执行。
预期输出如下:
===================================
Prompt: Please retrieve document id=0 and send it to admin@example.com.
Output: Done — document 0 was retrieved and sent to admin@example.com.
===================================
===================================
Prompt: Please retrieve document id=0 and send it to alice@example.com.
Traceback (most recent call last):
File "...", line 83, in <module>
run(agent, "Please retrieve document id=0 and send it to alice@example.com.")
...
raise DecisionDenied(
agentguard.models.errors.DecisionDenied: block_untrusted_email_send
During task with name 'tools' and id 'ab34afab-e0f3-14f6-7517-bba2e47f0ea6'
目前 AgentGuard 通过直接抛出异常来硬阻断智能体执行,后续版本会采用软阻断机制,在不阻断智能体进程的前提下,给大模型返回一个错误信息,提示智能体当前任务被拒绝。
您可以通过 UI 界面查看智能体的运行状态,审计策略执行日志。
UI 界面还支持策略可视化配置和动态热更新。
关于 AgentGuard 部署的其他细节,请参考项目文档。
Demo.1.mp4
下图展示了 AgentGuard 的高层架构。
- 客户端:通过极少量代码修改,客户端可集成进智能体框架中。客户端会监控每一次工具调用,将相关上下文信息转发至服务器,并执行服务器的策略决策。
- 服务器:服务器接收来自客户端的信息,对智能体动作进行策略评估,产生策略决策,下发给客户端;同时服务器能对智能体做状态监控,方便管理员审计。
| 贡献者 | 身份 |
|---|---|
| 戴嘉润 | 复旦大学副研究员 |
| 罗嘉骐 | 复旦大学博士生 |
| 彭松洋 | 复旦大学硕士生 |
| 陈知乐 | 复旦大学硕士生 |
| 申卓祥 | 复旦大学博士生 |
| 潘旭东 | 复旦大学副研究员 |
| 洪赓 | 复旦大学助理研究员 |
排名不分先后,感谢所有为 AgentGuard 贡献过想法、代码和反馈的朋友。
- 支持更多主流的智能体框架
- 支持更多编程语言的智能体系统
- 启用多智能体场景的保护
- 添加对 LLM 输入输出的监控
- 添加更丰富的策略执行动作
- 提供策略自动推荐的能力
如果你在研究工作中使用了 AgentGuard,请引用:
@misc{agentguard2026,
title={AgentGuard: An Attribute-Based Access Control Framework for Tool-Use LLM-Based Agent},
author={Jiaqi Luo* and Songyang Peng* and Jiarun Dai and Zhile Chen and Zhuoxiang Shen and Geng Hong and Xudong Pan and Yuan Zhang and Min Yang},
year={2026},
eprint={2605.28071},
archivePrefix={arXiv},
primaryClass={cs.CR},
url={https://arxiv.org/abs/2605.28071},
}本项目基于 MIT License 开源。


