使用声明性权限规则控制代理可以读取或写入的文件和目录。将规则列表传递给 permissions=,代理的内置文件系统工具会遵守这些规则。 权限仅适用于内置文件系统工具(lsread_fileglobgrepwrite_fileedit_file)。不涵盖访问文件系统的自定义工具和 MCP 工具。权限也不适用于沙盒后端,沙盒通过 execute 工具支持任意命令执行。
当您需要对内置文件系统工具使用基于路径的允许/拒绝规则时使用 permissions。当您需要自定义验证逻辑(速率限制、审计日志、内容检查)或需要控制自定义工具时,请使用后端策略钩子

基本用法

FilesystemPermission 规则列表传递给 create_deep_agent。规则按声明顺序评估。第一个匹配的规则胜出。如果没有匹配的规则,操作被允许。
from deepagents import create_deep_agent, FilesystemPermission

# 只读代理:拒绝所有写入
agent = create_deep_agent(
    model=model,
    backend=backend,
    permissions=[
        FilesystemPermission(
            operations=["write"],
            paths=["/**"],
            mode="deny",
        ),
    ],
)

规则结构

每个 FilesystemPermission 有三个字段:
字段类型描述
operationslist["read" | "write"]此规则适用的操作。"read" 涵盖 lsread_fileglobgrep"write" 涵盖 write_fileedit_file
pathslist[str]用于匹配文件路径的 glob 模式(例如 ["/workspace/**"])。支持 ** 进行递归匹配,{a,b} 进行交替。
mode"allow" | "deny"是允许还是拒绝匹配的操作。默认为 "allow"
规则使用第一个匹配胜出的评估:首先评估其 operationspaths 与当前调用匹配的规则,确定结果。如果没有匹配的规则,调用是允许的(宽松默认)。

示例

隔离到工作目录

只允许在 /workspace/ 下读写,拒绝其他所有:
agent = create_deep_agent(
    model=model,
    backend=backend,
    permissions=[
        FilesystemPermission(
            operations=["read", "write"],
            paths=["/workspace/**"],
            mode="allow",
        ),
        FilesystemPermission(
            operations=["read", "write"],
            paths=["/**"],
            mode="deny",
        ),
    ],
)

保护特定文件

agent = create_deep_agent(
    model=model,
    backend=backend,
    permissions=[
        FilesystemPermission(
            operations=["read", "write"],
            paths=["/workspace/.env", "/workspace/examples/**"],
            mode="deny",
        ),
        FilesystemPermission(
            operations=["read", "write"],
            paths=["/workspace/**"],
            mode="allow",
        ),
        FilesystemPermission(
            operations=["read", "write"],
            paths=["/**"],
            mode="deny",
        ),
    ],
)

只读记忆

允许代理读取记忆文件但阻止修改。这对于应该只由应用程序代码更新的组织范围策略或共享知识库很有用。请参阅只读与可写记忆了解更多上下文。
agent = create_deep_agent(
    model=model,
    backend=CompositeBackend(
        default=StateBackend(),
        routes={
            "/memories/": StoreBackend(
                namespace=lambda rt: (rt.server_info.user.identity,),
            ),
            "/policies/": StoreBackend(
                namespace=lambda rt: (rt.context.org_id,),
            ),
        },
    ),
    permissions=[
        FilesystemPermission(
            operations=["write"],
            paths=["/memories/**", "/policies/**"],
            mode="deny",
        ),
    ],
)

拒绝所有访问

阻止所有读写。这是一个限制性的基线,您可以在其上分层更具体的允许规则:
agent = create_deep_agent(
    model=model,
    backend=backend,
    permissions=[
        FilesystemPermission(
            operations=["read", "write"],
            paths=["/**"],
            mode="deny",
        ),
    ],
)

规则顺序

由于第一个匹配胜出,规则顺序很重要。将更具体的规则放在更广泛的规则之前:
# 正确:拒绝 .env,允许 workspace,拒绝其他所有
permissions=[
    FilesystemPermission(
        operations=["read", "write"],
        paths=["/workspace/.env"],
        mode="deny",
    ),
    FilesystemPermission(
        operations=["read", "write"],
        paths=["/workspace/**"],
        mode="allow",
    ),
    FilesystemPermission(
        operations=["read", "write"],
        paths=["/**"],
        mode="deny",
    ),
]

# 错误:/workspace/** 首先匹配 .env,因此拒绝永远不会触发
permissions=[
    FilesystemPermission(
        operations=["read", "write"],
        paths=["/workspace/**"],
        mode="allow",
    ),
    FilesystemPermission(
        operations=["read", "write"],
        paths=["/workspace/.env"],
        mode="deny",  # 永远不会到达
    ),
    FilesystemPermission(
        operations=["read", "write"],
        paths=["/**"],
        mode="deny",
    ),
]

子代理权限

子代理默认继承父代理的权限。要给子代理不同的权限,请在规范中设置 permissions 字段。这完全替换父级的规则。
agent = create_deep_agent(
    model=model,
    backend=backend,
    permissions=[
        FilesystemPermission(
            operations=["read", "write"],
            paths=["/workspace/**"],
            mode="allow",
        ),
        FilesystemPermission(
            operations=["read", "write"],
            paths=["/**"],
            mode="deny",
        ),
    ],
    subagents=[
        {
            "name": "auditor",
            "description": "只读代码审查员",
            "system_prompt": "审查代码中的问题。",
            "permissions": [
                FilesystemPermission(
                    operations=["write"],
                    paths=["/**"],
                    mode="deny",
                ),
                FilesystemPermission(
                    operations=["read"],
                    paths=["/workspace/**"],
                    mode="allow",
                ),
                FilesystemPermission(
                    operations=["read"],
                    paths=["/**"],
                    mode="deny",
                ),
            ],
        }
    ],
)

复合后端

当使用带有沙盒默认值的 CompositeBackend 时,每个权限路径必须限定在已知路由前缀下。沙盒支持任意命令执行,因此仅基于路径的限制无法通过 shell 命令防止文件系统访问。将权限限定为特定路由的后端可避免此冲突。
from deepagents.backends import CompositeBackend

composite = CompositeBackend(
    default=sandbox,
    routes={"/memories/": memories_backend},
)

# 有效:权限限定在 /memories/ 路由
agent = create_deep_agent(
    model=model,
    backend=composite,
    permissions=[
        FilesystemPermission(
            operations=["write"],
            paths=["/memories/**"],
            mode="deny",
        ),
    ],
)
包含在任何路由之外的路径的权限会引发 NotImplementedError
# 引发 NotImplementedError:/workspace/** 命中沙盒默认值
agent = create_deep_agent(
    model=model,
    backend=composite,
    permissions=[
        FilesystemPermission(
            operations=["write"],
            paths=["/workspace/**"],
            mode="deny",
        ),
    ],
)

# 也会引发:/** 覆盖路由和默认值
agent = create_deep_agent(
    model=model,
    backend=composite,
    permissions=[
        FilesystemPermission(
            operations=["read"],
            paths=["/**"],
            mode="deny",
        ),
    ],
)