
AI एजेंटों के लिए हस्ताक्षरित, स्कोप्ड क्रेडेंशियल्स के साथ न्यूनतम-विशेषाधिकार प्रत्यायोजन लागू करें। उप-एजेंटों को सीमित क्षमताएं और संसाधन प्रदान करें, निष्पादन से पहले कार्यों को सत्यापित करें, और विशेषाधिकार वृद्धि को रोकें।
आपके एजेंट ने एक सब-एजेंट बनाया और उसे वही API कुंजी सौंप दी। वह सब-एजेंट अब प्रोडक्शन में डिप्लॉय कर सकता है, पेमेंट्स डेटाबेस पढ़ सकता है, और मुख्य शाखा में मर्ज कर सकता है।
पिजन उसे रोकता है। आप बच्चे को एक पिजन पास देते हैं: एक संकुचित, हस्ताक्षरित क्रेडेंशियल जो बताता है कि वह क्या कर सकता है, न कि आप जो कुछ भी कर सकते हैं उसकी एक प्रति।
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
कनेक्ट करने के लिए कोई पिजन सर्वर नहीं है। आप दो स्थान बदलते हैं जो आपके पास पहले से हैं:
delegate(...) को कॉल करें और बच्चे को एक पास दें।verify(...) को कॉल करें और यदि अस्वीकृत हो तो टूल न चलाएँ।असली रहस्य रनर पर रखें। बच्चा पास ले जाता है।
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"
एक बच्चा क्षमताएँ नहीं जोड़ सकता, संसाधनों को विस्तृत नहीं कर सकता, सीमा नहीं बढ़ा सकता, या माता-पिता की बाधा को हटा नहीं सकता। यदि पिजन यह साबित नहीं कर सकता कि बच्चा संकुचित है, तो वह अस्वीकार कर देता है।
यदि रनर कभी verify को कॉल नहीं करता, तो पास केवल सजावट है।
यह एक प्रवर्तन बिंदु है, प्रोटोकॉल का हिस्सा नहीं। क्लाइंट प्रति टूल कॉल के लिए एक संकुचित पास बनाता है। सर्वर टूल चलने से पहले उसे सत्यापित करता है।
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
पिजन एक छोटा प्रिमिटिव है। यह एक प्लेटफ़ॉर्म, पॉलिसी इंजन, पहचान प्रदाता, या कुंजी संरक्षक नहीं है। यह प्रॉम्प्ट इंजेक्शन को नहीं रोकता। यह विस्फोट की त्रिज्या को उन आयामों तक सीमित करता है जिन्हें आप पास पर रखते हैं, और केवल उन्हीं तक।
SPEC.mdSECURITY.mdexamples/ (इन्फ्रास्ट्रक्चर, डेटा, कोड, फिर पेमेंट्स)