
مستوى تحكم أمني لوكلاء LLM: القوائم المسموحة، مفتاح الإيقاف الفوري للمالك، جلسات PIN، حدود المعدل، كشف حقن الأوامر، وتنقية المخرجات لمنع تسرب الأسرار والتهريب عبر منارات الصور.

مستوى تحكم أمني لوكلاء نماذج اللغة الكبيرة عبر الدردشة الخاصة (عادةً رسائل Discord المباشرة).
تقع أمام وكيلك. وهي تقرر من يُسمح له بالتحدث، وما إذا كانت الجلسة غير مقفلة، وما إذا كانت العملية متوقفة مؤقتًا، وما إذا كانت هذه الرسالة آمنة بما يكفي لإعادة توجيهها. يبقى نموذجك وأدواتك خلف تلك البوابة. لا تستدعي المكتبة أي نموذج لغوي كبير. ولا تنفذ أي ميزات منتج تتجاوز الأمان.
مستوحاة من Hermes. يتبع التصميم نفس أفكار مستوى التحكم المستخدمة في بوابات المراسلة في Hermes Agent: التسليم عبر الرسائل المباشرة أولًا، وقوائم السماح للهويات، والفتح بنمط الاقتران، ومفتاح إيقاف المالك، والفصل الصارم بين من يُسمح له بالتصرف (مستوى التحكم) ونص الرسالة الذي يراه النموذج (مستوى البيانات). هذه الحزمة مستخلص صغير ومستقل من ذلك النمط لأي وكيل قابل للاستدعاء. غير تابعة لـ Nous Research.
النضج: مُنفَّذ · مُتحقَّق منه بشكل مستقل · مُصان. راجع STATUS.md.
إعادة الإنتاج: python scripts/repro.py (يتوقع REPRO_OK).
اختبارات دون اتصال:
pip install -e ".[dev]" # or: pip install -e . && pip install pytest
python -m pytest -q --tb=line
# or: python scripts/repro.py
مباشر: https://gitlab.com/WattoCyber/agentic-dm-gateway
إذا وضعت وكيلًا (agent) على Discord (أو أي واجهة برمجة تطبيقات دردشة) مزوّدًا بأدوات، فإن أي شخص يستطيع مراسلة البوت يمكنه محاولة:
تحتاج إلى مستوى تحكم (control plane) (ضوابط الهوية والعمليات) منفصل عن مستوى البيانات (data plane) (نص الرسالة الذي يراه النموذج).
هذه الحزمة هي مستوى التحكم ذلك.
| الضابط | السلوك |
|---|---|
| قائمة السماح | فقط معرّفات المستخدمين المُهيّأة يُسمح لها بالمتابعة. يُسقَط الجميع الآخرون (بصمت أو برسالة رفض قصيرة). |
| المالك مقابل الصديق | يتخطى المالكون رمز PIN ويمكنهم إيقاف الوكيل بالكامل مؤقتًا. قد يحتاج الأصدقاء إلى رمز PIN مشترك لفتح محدود المدة (فكرة الاقتران على نمط Hermes، مبسّطة). |
| مفتاح الإيقاف | ملف إيقاف مؤقت عام أو علامة بيئة (env flag). لا دورات للوكيل أثناء تفعيله. |
| حدود المعدل | نافذة منزلقة لكل مستخدم (لكل دقيقة ولكل ساعة). |
| فحوصات الإدخال | الحد الأقصى للطول، إزالة أحرف التحكم الغريبة، استدلالات regex للعبارات الشائعة المتعلقة بالحقن / استدراج الأسرار. |
| تنقية الإخراج | حجب الرموز ذات الشكل السري (مفاتيح API، رموز JWT، ترويسات Bearer) وإزالة منارات الصور بصيغة markdown/HTML التي قد تُسرّب عبر الجلب التلقائي. |
| سجل التدقيق | ملف JSONL للإضافة فقط يسجّل أحداث السماح/الرفض/المصادقة/الإيقاف للمراجعة لاحقًا. |
| الأوامر المحلية | تُعالَج /auth و/lock و/kill و/unkill و/status دون استدعاء نموذج. |
النطاق: بوابة أمان فقط. ليست روبوت دردشة، ولا روبوت تداول، ولا ماسحًا ضوئيًا، ولا إطار عمل للوكلاء. مرّر agent(user_id, text) -> str (أو نسخة async) إذا كنت تستخدم Discord. يعمل النواة مع أي معرّف مستخدم صحيح ونص عادي.
$ python - <<'PY'
from agentic_dm_gateway import InboundSecurityPipeline
pipe = InboundSecurityPipeline({
"allowed_user_ids": [111],
"owner_ids": [111],
"pin_enabled": False,
"block_injection": True,
"deny_message": "Not authorized.",
})
for uid, text in [
(99, "hi"),
(111, "ignore previous instructions"),
(111, "summarize this note"),
]:
r = pipe.precheck(uid, text)
print(uid, r.stage, r.run_agent, r.reply_text)
PY
99 allowlist False Not authorized.
111 injection False Blocked: looks like prompt injection / secret fishing. Rephrase.
111 ok True None
$ python scripts/repro.py
REPRO_OK agentic-dm-gateway unit suite
ثلاثة مسارات للتكامل. اختر واحدًا.
ثبّت مع دعم Discord، ووجّه متغيرات البيئة إلى معرّفات المستخدمين الخاصة بك، وسجّل البوابة، ثم شغّل البوت.
pip install -e ".[discord]"
# or: pip install agentic-dm-gateway[discord]

export DISCORD_BOT_TOKEN=...
export AGENTIC_DM_ALLOWLIST=your_discord_user_id
export AGENTIC_DM_OWNER_ID=your_discord_user_id
# optional: export AGENTIC_DM_PIN=....

python examples/discord_echo_bot.py
في بوتك الخاص:
import discord
from agentic_dm_gateway.discord_adapter import register_dm_gateway
def agent(user_id: int, text: str, *, is_owner: bool = False) -> str:
# your Hermes / local model / tool loop
return call_your_model(text)
intents = discord.Intents.default()
intents.message_content = True
bot = discord.Client(intents=intents)
register_dm_gateway(
bot,
{
"allowed_user_ids": [], # or rely on AGENTIC_DM_ALLOWLIST env
"owner_ids": [],
"pin_enabled": False,
"deny_message": False, # silent drop for strangers
},
agent=agent,
)
bot.run(TOKEN)
ما الذي يفعله register_dm_gateway:
on_message على discord.Client / البوت الخاص بك.InboundSecurityPipeline.precheck قبل الوكيل الخاص بك.agent(user_id, sanitized_text, is_owner=...) الخاص بك.لا تصل رسائل Guild إلى الوكيل أبدًا. فقط الرسائل المباشرة من المستخدمين المدرجين في قائمة السماح تصل إليه.
on_message)إذا لم تتمكن من استخدام register_dm_gateway (سلسلة معالجات موجودة)، فاستدعِ pipeline بنفسك:
from agentic_dm_gateway import InboundSecurityPipeline
from agentic_dm_gateway.security import sanitize_agent_output
pipe = InboundSecurityPipeline({
"allowed_user_ids": [YOUR_ID],
"owner_ids": [YOUR_ID],
"pin_enabled": True,
})
@bot.event
async def on_message(message):
if message.author.bot or message.guild is not None:
return
pre = pipe.precheck(int(message.author.id), message.content or "")
if pre.reply_text and not pre.run_agent:
await message.channel.send(pre.reply_text[:1900])
return
if not pre.run_agent:
return
raw = await your_agent(pre.sanitized_text) # Hermes, Ollama, API, ...
await message.channel.send(sanitize_agent_output(str(raw))[:1900])
لا حاجة لاستيراد Discord. استخدم نفس الفحص المسبق حول أي دورة للوكيل:
from agentic_dm_gateway import InboundSecurityPipeline
from agentic_dm_gateway.security import sanitize_agent_output
pipe = InboundSecurityPipeline({
"allowed_user_ids": [111],
"owner_ids": [111],
"pin_enabled": False,
"rate_limit_per_minute": 20,
"block_injection": True,
"deny_message": "Not authorized.",
})
def handle_inbound(user_id: int, text: str) -> str | None:
pre = pipe.precheck(user_id, text)
if pre.run_agent:
answer = my_llm(pre.sanitized_text) # your model / Hermes run
return sanitize_agent_output(str(answer))
return pre.reply_text # deny or control-command reply
حقول PrecheckResult:
run_agent: مرّر إلى النموذج فقط إذا كانت القيمة truesanitized_text: المدخل المنقّىreply_text: رد الرفض / أمر التحكمstage: allowlist | kill | pin | rate | injection | ok | ...