
Обеспечьте делегирование с минимальными привилегиями для ИИ-агентов с помощью подписанных учётных данных с ограниченной областью действия. Предоставляйте субагентам узкие возможности и ресурсы, проверяйте действия перед выполнением и предотвращайте повышение привилегий.
Ваш агент породил субагента и передал ему тот же API-ключ. Теперь этот субагент может разворачивать код в продакшене, читать базу данных платежей и делать merge в main.
Pigeon это предотвращает. Вы выдаёте дочернему агенту Pigeon Pass — суженные, подписанные учётные данные для того, что ему разрешено делать, а не копию всего, что можете делать вы.
Python 3.12 или новее.
git clone https://github.com/pigeonlabsHQ/pigeon.git
cd pigeon
pip install .
from pigeon import grant, verify
authority = grant(
subject="agent:deployer",
capabilities=["deploy"],
resources=["environment:staging"],
)
allowed = verify(authority, action="deploy", resource="environment:staging")
assert allowed.allowed
denied = verify(authority, action="deploy", resource="environment:production")
assert not denied.allowed
assert denied.reason_code == "RESOURCE_NOT_ALLOWED"
print(denied.reason_code, denied.message, denied.details)
verify никогда не возвращает простое булево значение. Отказ включает код причины, сообщение и сравнение, которое не прошло (requested против allowed).
Попробуйте, не написав это самостоятельно:
python examples/01_infrastructure.py
python demo/agent.py
Не существует сервера Pigeon, к которому нужно подключаться. Вы меняете два места, которые у вас уже есть:
delegate(...) и выдайте дочернему агенту Pass.verify(...) и не запускайте инструмент, если доступ запрещён.Храните настоящий секрет на раннере. Дочерний агент несёт Pass.
from pigeon import delegate, grant, verify, DelegationError
parent = grant(
subject="agent:orchestrator",
capabilities=["deploy", "open_pr"],
resources=["environment:staging", "repo:acme/api"],
constraints={"max_deploys_per_hour": 3},
)
worker = delegate(
parent,
subject="agent:pr-bot",
capabilities=["open_pr"],
resources=["repo:acme/api"],
constraints={"max_deploys_per_hour": 3}, # cannot drop a parent constraint
)
result = verify(worker, action="open_pr", resource="repo:acme/api")
assert result.allowed
denied = verify(worker, action="deploy", resource="environment:staging")
assert denied.reason_code == "CAPABILITY_NOT_GRANTED"
try:
delegate(worker, "agent:rogue", ["open_pr", "deploy"], ["repo:acme/api"])
except DelegationError as exc:
assert exc.reason_code == "PRIVILEGE_ESCALATION"
Дочерний агент не может добавлять возможности, расширять ресурсы, повышать лимиты или сбрасывать ограничения родителя. Если Pigeon не может доказать, что дочерний агент уже, он отклоняет запрос.
Если раннер никогда не вызывает verify, Pass — просто украшение.
Это точка принудительного контроля, а не часть протокола. Клиент создаёт более узкий Pass для каждого вызова инструмента. Сервер проверяет его перед запуском инструмента.
from pigeon import grant
from pigeon.integrations.mcp import execute_tool, pass_for_tool
parent = grant(
subject="agent:github",
capabilities=["create_issue", "merge_pr"],
resources=["mcp:github"],
)
tool_pass = pass_for_tool(parent, "create_issue", "mcp:github")
def create_issue(*, title, body):
return {"created": True, "title": title}
ok = execute_tool(tool_pass, "create_issue", "mcp:github",
{"title": "bump deps", "body": "automated"}, create_issue)
assert ok["allowed"]
no = execute_tool(tool_pass, "merge_pr", "mcp:github",
{"title": "nope", "body": "nope"}, create_issue)
assert no["reason_code"] == "CAPABILITY_NOT_GRANTED"
Идентичность говорит вам, кто такой агент. Полномочия говорят вам, что ему разрешено делать.
pigeon keygen
pigeon inspect pass.json
Pigeon — это маленький примитив. Это не платформа, не механизм политик, не поставщик идентичности и не хранитель ключей. Он не останавливает prompt injection. Он ограничивает радиус поражения по тем измерениям, которые вы указали в Pass, и только по ним.
SPEC.mdSECURITY.mdexamples/ (инфраструктура, данные, код, затем платежи)