
فرض تفويض بأقل صلاحية ممكنة لوكلاء الذكاء الاصطناعي باستخدام بيانات اعتماد موقّعة ومحدودة النطاق. امنح الوكلاء الفرعيين قدرات وموارد ضيقة، وتحقق من الإجراءات قبل تنفيذها، وامنع تصعيد الامتيازات.
وكيلك أنشأ وكيلًا فرعيًا وسلّمه نفس مفتاح API. يمكن لذلك الوكيل الفرعي الآن النشر إلى الإنتاج، وقراءة قاعدة بيانات المدفوعات، والدمج إلى الفرع الرئيسي.
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(...) ولا تُشغّل الأداة إذا تم رفضها.أبقِ السر الحقيقي على المُنفّذ (runner). الطفل يحمل الـ 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/ (بنية تحتية، بيانات، كود، ثم مدفوعات)