AgentRadio — الوعي السلبي لوكلاء البرمجة

📻 AgentRadio

الوعي السلبي للتعاون متعدد الوكلاء في المهام طويلة الأمد — أربعة وكلاء برمجة يواصلون العمل بينما يستمعون

Coral Code البحث GitHub الرخصة: Apache 2.0

المعيار Harbor Modal

Discord Coral Protocol

English | 简体中文 | Español | 日本語 | 한국어 | العربية

امنح أربعة وكلاء برمجة قناة راديو مشتركة. يقتسمون العمل، ويتفاوضون على الخطة، ويواصلون بثّ اكتشافاتهم أثناء عملهم — لأن الاستماع يعمل كمهمة في الخلفية بدلاً من أن يسرق دورًا كاملاً.

يحتوي هذا المستودع على الشيفرة والبيانات اللازمة لإعادة إنتاج تجارب البحث AgentRadio: Passive Awareness for Long-Horizon Multi-Agent Collaboration (arXiv:2607.28430).

☁️ تفضّل النسخة المنتَج؟ ← Coral Code

Coral Code هي النسخة المنتَج من AgentRadio. يحصل المستخدمون الجدد على رصيد مجاني بقيمة 30 دولارًا.

### 🏆 بروتوكول واحد، أربعة وكلاء — بزيادة 29.8 نقطة على الوكيل المفرد | التهيئة | ما الذي تضيفه | الدقة (Opus 4.6) | الدقة (DeepSeek V4 Pro) | |---|---|:---:|:---:| | **B0** وكيل مفرد | — | 32.3 % | 29.0 % | | **B1** أفضل ستة تشغيلات مفردة | ميزانية 6× بلا تنسيق | 37.9 % | 31.4 % | | **L1** أربعة وكلاء + تقسيم | تقسيم العمل | 39.5 % | 31.4 % | | **L2** + تفاوض | تخطيط مشترك + مراجعة متبادلة (استقبال حاجب) | 51.6 % | 39.5 % | | **L3** + وعي سلبي (**AgentRadio**) | ‏`wait_for_mention` في الخلفية | **62.1 %** | **50.8 %** |
الانتقال من L2 إلى L3 يغيّر فقط نمط التواصل. فهو يربح 15 مهمة ويخسر 2 مع Opus 4.6 (اختبار مكنمار الدقيق، p = 0.0023)، ويربح 17 ويخسر 3 مع DeepSeek (‏p = 0.0026). أربعة وكلاء من Opus 4.6 تحت AgentRadio (‏62.1 %) يتفوقون على أقوى نتيجة لوكيل مفرد في لوحة الصدارة، وهي Claude Code مع الإصدار الأحدث Opus 4.8 (‏57.2 %).
النتائج الكاملة · البحث · شغّلها بنفسك ## 📣 الأخبار
## 💡 لماذا AgentRadio
## 🧩 كيف يعمل ### العمليات الأولية الثلاث
يوفّر AgentRadio ثلاث عمليات لكل وكيل:
| العملية الأولية | السلوك | |---|---| | `create_thread(name, participants)` | يفتح محادثة مسمّاة على خادم الرسائل ويعيد معرّفها. | | `send_message(thread, content, mentions)` | يضيف رسالة إلى خيط ويعود فورًا، سواء أكان أحد يستمع أم لا. ويمكنه الإشارة إلى وكلاء بعينهم بعلامة @. | | `wait_for_mention(timeout)` | يحجب التنفيذ حتى تصل رسالة تُشير إلى المُستدعي، ثم يعيدها مع لقطة كاملة لكل الخيوط، فلا يحتاج المُستدعي إلى قراءة ثانية لإعادة بناء السياق. |
لا تتخذ هذه الطبقة موقفًا بشأن متى يستمع الوكيل. فموضع تشغيل wait_for_mention هو درجة الحرية الوحيدة التي تفصل بين نمطي التواصل: كل ما عدا ذلك — العمليات الأولية والخيوط والبروتوكول — يبقى ثابتًا. وهذا الفارق بمقدار «بِت واحد» هو تحديدًا ما تعزله التجارب.
### بروتوكول المراحل الخمس
ينفّذ أربعة وكلاء بروتوكولًا ثابتًا لتقسيم العمل والتفاوض. ويؤدي agent-1 دورًا إضافيًا بوصفه المُجمِّع: فهو يفتح خيوط التخطيط وسجل العمل والإجابة النهائية، ويتحكم بكل انتقال — إذ لا تنتهي أي مرحلة إلا بعد أن يجمع موافقة صريحة من كل وكيل.
  1. P1 · الاستكشاف — يبدأ كل وكيل مراقِبه في الخلفية، ويستكشف المستودع باستقلالية، ويصوغ الأسئلة الفرعية التي يراها. ولا يُرسَل شيء في هذه المرحلة.
  2. P2 · التقسيم — يفتح المُجمِّع خيط تخطيط. يجمع الوكلاء اكتشافاتهم، ويتفاوضون على تقسيم الأسئلة الفرعية، ويراجعونه حتى يوافق الجميع.
  3. P3 · التنفيذ — يعمل كل وكيل على أسئلته الفرعية. ويؤدي أي اكتشاف إلى نشر فوري في سجل العمل: اكتشاف يمسّ زميلًا، أو تناقض مع الخطة المتفق عليها، أو عقبة، أو طريق مسدود تم التخلي عنه.
  4. P4 · المراجعة — يبثّ كل وكيل اكتشافاته مع الأدلة في خيط نتائجه الخاص. وينشر المراجعون التعارضات الواقعية والأدلة الضعيفة والملاحظات غير المذكورة، ويمكنهم إعادة سؤال فرعي إلى P3.
  5. P5 · التسليم — يؤلّف المُجمِّع الإجابة النهائية من النتائج المعتمدة، ويبثّ المسودة لجولة موافقات أخيرة، ثم يسلّمها.
في الاستقبال الحاجب تُنفَّذ المراحل الخمس نفسها دون تغيير، لكن التشارك الحي في P3 يختفي: فسماع رسالة يكلّف انتظارًا في المقدمة، فيصمت الوكلاء أثناء العمل، ولا يمكن لاكتشاف أن يصل إلى زميل قبل P4.
## 🗂️ بنية المستودع ``` data/qa/ 124 SWE-Atlas QnA tasks (harbor dataset scale-ai/swe-atlas-qna) multi_agent/ coral_multi_agent.py L2 adapter: division + negotiation (blocking receive) coral_multi_agent_ablation.py L1 adapter: division only coral_multi_agent_passive.py L3 adapter: full AgentRadio (passive awareness) startup.sh / startup_ablation.sh / startup_passive.sh per-agent bootstrap + protocol prompts (CLAUDE.md) coral-agent*.toml message-server agent definitions passive_scripts/ MCP-over-HTTP shell primitives (create_thread / send_message / wait_for_mention / read_resource) coral-server.jar message server (download from Releases, see below) monitor_coral_log.sh live thread/message monitor for running containers run_config/qa/ claude-token OAuth token helper full_run.sh B0 baseline batch runner (all 124 tasks) run_passive_multi_agent.sh L3 batch runner verify_local.py rubric verifier (LLM judge), run locally on a trial dir ```
يحتوي كل مجلد مهمة تحت data/qa/ على التعليمات، وبيئة التنفيذ المثبّتة، ومجموعة معايير التقييم التي يستخدمها المدقّق.
--- ## 📦 الإعداد
تُنفَّذ التشغيلات داخل حاويات Docker على Modal، بتنسيق من Harbor. مهمة واحدة = حاوية واحدة تُشغّل خادم الرسائل بالإضافة إلى أربعة وكلاء Claude Code.
### 1. Docker Desktop
ثبّته من https://www.docker.com/products/docker-desktop/ وتحقّق منه بالأمر docker run hello-world.
### 2. uv ```bash curl -LsSf https://astral.sh/uv/install.sh | sh ``` ### 3. Harbor (مثبّت على 0.6.4)
إصدارات Harbor الأحدث (‏0.7 فما فوق) تتضمّن تغييرات كاسرة في الواجهة البرمجية تجعل هذه المحوِّلات تفشل. ثبّت الإصدارات:
| المكوّن | الإصدار الصالح | |-----------|-----------------| | harbor | **0.6.4** | | modal | **1.4.2** | ```bash uv tool uninstall harbor 2>/dev/null || true uv tool install 'harbor[modal]==0.6.4' harbor --version # must show 0.6.4 ``` ### 4. Modal ```bash pip install 'modal==1.4.2' modal --version # must show 1.4.2 modal setup # opens browser to log in ``` ### 5. Claude Code ```bash curl -fsSL https://claude.ai/install.sh | sh claude --version ```
تحتاج إلى اشتراك Claude Max للوكلاء. ويحتاج المدقّق إضافةً إلى مفتاح واجهة برمجة من Anthropic.
### 6. ملف JAR الخاص بخادم الرسائل
يُستضاف ملف JAR بحجم 106 ميغابايت بوصفه أثرًا مجهول المصدر (فهو أكبر من أن يوضع في مستودع git). المعامل confirm=t يتخطى صفحة فحص الملفات الكبيرة كي يحصل curl على الملف الثنائي مباشرة:
```bash curl -L -o multi_agent/coral-server.jar \ "https://drive.usercontent.google.com/download?id=17b40_1kXFrAC0pnN8w_7PPY13O7pYVke&export=download&confirm=t" ```
ترفع المحوِّلات هذا الملف إلى كل حاوية مهمة. ولا يلزم تشغيل أي شيء محليًا، ومن ثمّ لا حاجة إلى JDK محلي.
### 7. مساعد الرمز المميّز وملف ‎.env ```bash cp run_config/qa/claude-token ~/.local/bin/claude-token chmod +x ~/.local/bin/claude-token cp .env.example .env # then fill in your Anthropic API key ``` ### قبل كل تشغيل: جدّد رمز OAuth
يتناوب رمز OAuth الخاص بـ Claude Code. وتحصل كل حاوية على لقطة ثابتة عند الإقلاع، والرمز المنتهي يُنهي الوكلاء الأربعة جميعًا بخطأ 401 في منتصف التشغيل. جدّده قبل كل جلسة:
```bash claude /login # opens browser security find-generic-password -s "Claude Code-credentials" -w | python3 -c " import json, sys, os data = json.loads(sys.stdin.read()) oauth = data.get('claudeAiOauth', {}) with open(os.path.expanduser('~/.claude/.credentials.json'), 'w') as f: json.dump({'claudeAiOauth': oauth}, f, indent=2) print(f'Token refreshed. Expires at: {oauth.get(\"expiresAt\")}') " ~/.local/bin/claude-token --check source .env ``` --- ## ⚡ تشغيل التهيئات الأربع
تُنفَّذ كل الأوامر من جذر المستودع بعد source .env. ومعرّفات المهام هي أسماء المجلدات تحت data/qa/ (كرّر -i للتجميع، أو احذفه كليًا لتشغيل المهام الـ 124 جميعها). والمعامل -n هو عدد المهام المتزامنة (مهمة واحدة = أربعة وكلاء في L1–L3).
### B0 — وكيل مفرد (خط الأساس) ```bash source .env harbor run \ -p ./data/qa \ -a claude-code \ -m "anthropic/claude-opus-4-6" \ -e modal -k 1 -n 1 \ -i "task-6905333b74f22949d97ba998" \ --ak reasoning_effort=high \ -o results/qa/ \ --job-name "baseline-ba998" \ -y ``` ### L1 — أربعة وكلاء + تقسيم العمل
يستكشف agent-1 لفترة وجيزة، ثم يقسّم السؤال، ويحلّ كل وكيل نصيبه باستقلالية. وتُدمج الإجابات دون مراجعة.
```bash source .env export PYTHONPATH="$(pwd):${PYTHONPATH:-}" harbor run \ -p ./data/qa \ --agent-import-path='multi_agent.coral_multi_agent_ablation:CoralMultiAgentAblation' \ -m "anthropic/claude-opus-4-6" \ -e modal -k 1 -n 1 \ -i "task-6905333b74f22949d97ba998" \ --ak reasoning_effort=high \ -o results/qa/ \ --job-name "division-ba998" \ -y ``` ### L2 — + تفاوض (استقبال حاجب)
البروتوكول الكامل بمراحله الخمس — استكشاف مشترك، وتقسيم متفاوض عليه حتى الإجماع، وتنفيذ حيّ، ومراجعة متبادلة، وتسليم مُجمَّع — لكن مع تشغيل wait_for_mention في المقدمة، فيتوقف الوكلاء عن العمل كي يستمعوا.
```bash source .env export PYTHONPATH="$(pwd):${PYTHONPATH:-}" harbor run \ -p ./data/qa \ --agent-import-path='multi_agent.coral_multi_agent:CoralMultiAgent' \ -m "anthropic/claude-opus-4-6" \ -e modal -k 1 -n 1 \ -i "task-6905333b74f22949d97ba998" \ --ak reasoning_effort=high \ -o results/qa/ \ --job-name "divneg-ba998" \ -y ``` ### L3 — + وعي سلبي (AgentRadio الكامل)
البروتوكول نفسه، لكن wait_for_mention يعمل بوصفه مهمة في الخلفية: يواصل الوكلاء العمل وتظهر الرسائل بين الخطوات. ولا يحصل Claude Code على أي إعداد MCP — إذ يمرّ كل التواصل عبر أغلفة الصدفة الخفيفة في passive_scripts/.
```bash source .env export PYTHONPATH="$(pwd):${PYTHONPATH:-}" harbor run \ -p ./data/qa \ --agent-import-path='multi_agent.coral_multi_agent_passive:CoralMultiAgentPassive' \ -m "anthropic/claude-opus-4-6" \ -e modal -k 1 -n 1 \ -i "task-6905333b74f22949d97ba998" \ --ak reasoning_effort=high \ -o results/qa/ \ --job-name "passive-ba998" \ -y ```
يغلّف run_config/qa/run_passive_multi_agent.sh الأمر نفسه بوصفه مشغّلًا دفعيًا، بوظيفة harbor واحدة لكل معرّف مهمة.
--- ## 🔀 التشغيل باستخدام DeepSeek-V4-Pro
يمكن تشغيل التهيئات متعددة الوكلاء (‏L1–L3) بوكلاء DeepSeek-V4-Pro بدلاً من Opus 4.6، بما يعيد إنتاج عمود DeepSeek في جدول النتائج. البروتوكول والموجّهات وسكربتات الإقلاع وحارس الاستئناف كلها متطابقة، ولا يتغيّر سوى الواجهة الخلفية للنموذج. لا يتحدث Claude Code سوى واجهة Anthropic Messages، بينما يُقدَّم DeepSeek عبر OpenRouter (المتوافقة مع OpenAI فقط). ونجسر بينهما بـوسيط ترجمة LiteLLM مُستضاف مرة واحدة على Modal. ولا تثبّت حاويات المهام أي شيء — إذ توجّه ANTHROPIC_BASE_URL فقط إلى العنوان العام للوسيط. أما مدقّق معايير التقييم فلم يتغيّر: فهو ما زال يستخدم حَكَم Anthropic لديك (OPENAI_API_KEY / EVAL_MODEL). و DeepSeek هو الواجهة الخلفية للوكيل فقط.
### إعداد الوسيط لمرة واحدة ```bash # 1. An OpenRouter API key with deepseek-v4-pro access (https://openrouter.ai/keys) # is stored as a Modal secret — it never leaves your Modal account. modal secret create openrouter-deepseek OPENROUTER_API_KEY=sk-or-... # 2. Deploy the proxy. This prints your personal URL. modal deploy multi_agent/deepseek_litellm_modal.py # -> https://--deepseek-litellm-proxy-serve.modal.run # 3. Put that URL in .env so the adapters can find it: echo 'export AGENTRADIO_PROXY_URL=https://--deepseek-litellm-proxy-serve.modal.run' >> .env source .env ```
يبقى الوسيط دافئًا (min_containers=1)؛ ولا تُعِد نشره إلا بعد تعديله. ولإيقاف الفوترة عند الخمول: modal app stop deepseek-litellm-proxy (ويعيده أمر modal deploy لاحقًا).
### L1 / L2 / L3 مع DeepSeek
مطابقة لأوامر Opus أعلاه، لكن مسار الاستيراد يشير إلى محوِّل DeepSeek، ويوجّه -m "deepseek-v4-pro" الطلبات عبر الوسيط. ويجب أن يكون source .env قد صدّر AGENTRADIO_PROXY_URL. أما معرّفات المهام والتجميع بـ -i فيعملان تمامًا كما سبق.
#### DeepSeek B0 — وكيل مفرد (خط الأساس)
يستخدم خط أساس DeepSeek صنفًا فرعيًا خفيفًا من وكيل claude-code المدمج (يفرض نقطة نهاية الوسيط ويتخلّص من رمز OAuth الذي كان الوكيل المدمج سيعيد إصداره)، ولذلك يأخذ --agent-import-path بدلاً من -a claude-code.
```bash source .env export PYTHONPATH="$(pwd):${PYTHONPATH:-}" harbor run \ -p ./data/qa \ --agent-import-path='multi_agent.claude_code_deepseek:ClaudeCodeDeepseek' \ -m "deepseek-v4-pro" \ -e modal -k 1 -n 1 \ -i "task-6905333b74f22949d97ba998" \ --ak reasoning_effort=high \ -o results/qa/ \ --job-name "deepseek-baseline-ba998" \ -y ``` #### DeepSeek L1 — تقسيم فقط ```bash source .env export PYTHONPATH="$(pwd):${PYTHONPATH:-}" harbor run \ -p ./data/qa \ --agent-import-path='multi_agent.coral_multi_agent_ablation_deepseek:CoralMultiAgentAblationDeepseek' \ -m "deepseek-v4-pro" \ -e modal -k 1 -n 1 \ -i "task-6905333b74f22949d97ba998" \ --ak reasoning_effort=high \ -o results/qa/ \ --job-name "deepseek-division-ba998" \ -y ``` #### DeepSeek L2 — + تفاوض ```bash source .env export PYTHONPATH="$(pwd):${PYTHONPATH:-}" harbor run \ -p ./data/qa \ --agent-import-path='multi_agent.coral_multi_agent_deepseek:CoralMultiAgentDeepseek' \ -m "deepseek-v4-pro" \ -e modal -k 1 -n 1 \ -i "task-6905333b74f22949d97ba998" \ --ak reasoning_effort=high \ -o results/qa/ \ --job-name "deepseek-divneg-ba998" \ -y ``` #### DeepSeek L3 — + وعي سلبي ```bash source .env export PYTHONPATH="$(pwd):${PYTHONPATH:-}" harbor run \ -p ./data/qa \ --agent-import-path='multi_agent.coral_multi_agent_passive_deepseek:CoralMultiAgentPassiveDeepseek' \ -m "deepseek-v4-pro" \ -e modal -k 1 -n 1 \ -i "task-6905333b74f22949d97ba998" \ --ak reasoning_effort=high \ -o results/qa/ \ --job-name "deepseek-passive-ba998" \ -y ```
يوجد حَقن الوسيط المشترك (الذي يبدّل الواجهة الخلفية للنموذج مع وراثة كل منطق تعدّد الوكلاء وسكربتات الإقلاع وحارس الاستئناف) في multi_agent/deepseek_proxy.py؛ أما الصنف الفرعي لخط الأساس B0 فهو multi_agent/claude_code_deepseek.py.
### استئناف وظيفة أُلغيت أو أخفقت ```bash source .env export PYTHONPATH="$(pwd):${PYTHONPATH:-}" harbor job resume -p results/qa/ -f CancelledError -f RuntimeError ``` ### المراقبة الحيّة (اختياري، في طرفية منفصلة) ```bash bash multi_agent/monitor_coral_log.sh # renders coral://state from the running container ``` --- ## 🧪 التقييم
تكتب كل تجربة إجابة الفريق في <trial>/agent/answer.txt. قيّمها بحَكَم النموذج اللغوي الخاص بالمعيار:
```bash source .env python3 verify_local.py # e.g. python3 verify_local.py task-6905333b74f22949d97ba998 \ results/qa/divneg-ba998/task-6905333b74f22949d97ba998__XXXXX ```
يكتب هذا الأمر <trial>/verifier/reward.txt (ويكون 1 فقط عندما تجتاز كل المعايير) وevaluation_results.json (الدرجات لكل معيار). ونفّذ pip install openai إن لم تكن مثبتة.
### بنية مخرجات التجربة ``` task-xxx__randomId/ ├── config.json / result.json / trial.log ├── agent/ │ ├── answer.txt # final answer (written by agent-1) │ ├── coral-server.log # threads and messages │ └── agent-{1..4}-claude-code.txt └── verifier/ ├── reward.txt └── evaluation_results.json ``` --- ## 📊 النتائج
النتائج الكاملة على SWE-Atlas QnA (‏124 مهمة، 1,306 معايير تقييم). تعطي صفوف الفئات عدد المهام المحلولة، مع حجم الفئة بين قوسين. وداخل كل عمود نموذج، تستخدم جميع التهيئات الـ harness والإعدادات نفسها. B0 = وكيل Claude Code مفرد · L1 = ‏4× Claude Code + تقسيم العمل · L2 = ‏L1 + تفاوض · L3 = ‏L2 + وعي سلبي (AgentRadio).
**Opus 4.6** | | B0 | L1 | L2 | L3 | |---|:---:|:---:|:---:|:---:| | البنية وتصميم الأنظمة (44) | 15 | 13 | 24 | **30** | | تحليل السبب الجذري (37) | 9 | 16 | 18 | **20** | | التعرّف على قاعدة الشيفرة (28) | 11 | 12 | 14 | **18** | | الأمن (11) | 4 | **7** | **7** | **7** | | تكامل الواجهات والمكتبات (4) | 1 | 1 | 1 | **2** | | **المهام المحلولة (124)** | 40 | 49 | 64 | **77** | | **دقة المهام (%)** | 32.3 | 39.5 | 51.6 | **62.1** | | **معدل اجتياز المعايير (%)** | 84.2 | 86.1 | 91.3 | **93.1** | **DeepSeek V4 Pro** | | B0 | L1 | L2 | L3 | |---|:---:|:---:|:---:|:---:| | البنية وتصميم الأنظمة (44) | 14 | 13 | 17 | **24** | | تحليل السبب الجذري (37) | 11 | 13 | 15 | **18** | | التعرّف على قاعدة الشيفرة (28) | 7 | 8 | 10 | **13** | | الأمن (11) | 4 | 4 | 6 | **7** | | تكامل الواجهات والمكتبات (4) | 0 | 0 | 1 | **1** | | **المهام المحلولة (124)** | 36 | 39 | 49 | **63** | | **دقة المهام (%)** | 29.0 | 31.4 | 39.5 | **50.8** | | **معدل اجتياز المعايير (%)** | 81.2 | 83.7 | 85.9 | **90.2** |
L3 مقابل L2، اختبار مكنمار الدقيق على نتائج المهام المزدوجة — ‏Opus 4.6: يربح 15 ويخسر 2، ‏p = 0.0023. و DeepSeek V4 Pro: يربح 17 ويخسر 3، ‏p = 0.0026. يُظهر التحليل على مستوى معايير التقييم أن مكسب الوعي السلبي يتزايد مع صعوبة المهمة، وهو ما يتسق مع كون التصحيح في منتصف الطريق هو الآلية الكامنة وراءه.
--- ## 🛠️ حلّ المشكلات
  • أخطاء 401 في منتصف التشغيل — انتهت صلاحية لقطة رمز OAuth. جدّدها (انظر أعلاه) ثم نفّذ harbor job resume -p results/qa/<job-name> -f NonZeroAgentExitCodeError.
  • claude: not found في coral-server.log — تصدّر سكربتات الإقلاع PATH="$HOME/.local/bin:$PATH"؛ تحقّق من أن Claude Code قد ثُبّت داخل الحاوية.
  • المهام المبنية على Alpine — تستخدم بعض المهام صور Alpine؛ وتكتشف المحوِّلات ذلك تلقائيًا وتثبّت JDK متوافقًا مع Alpine.
  • فحص التواصلgrep "sent message\|created thread" <trial>/agent/coral-server.log | sed 's/\x1b\[[0-9;]*m//g'
--- ## 🙏 شكر وتقدير
بيانات المهام مأخوذة من معيار SWE-Atlas QnA (مجموعة بيانات harbor باسم scale-ai/swe-atlas-qna) من Scale AI. وتُنسَّق التشغيلات بواسطة Harbor على Modal.
--- ## 📚 الاستشهاد ```bibtex @misc{ren2026agentradio, title = {AgentRadio: Passive Awareness for Long-Horizon Multi-Agent Collaboration}, author = {Xinxing Ren and Qianbo Zang and Ziyan Wang and Caelum Forder and Suman Deb and Peter Carroll and Zekun Guo}, year = {2026}, eprint = {2607.28430}, archivePrefix = {arXiv}, url = {https://arxiv.org/abs/2607.28430} } ``` --- ## 📄 الرخصة
يُنشر بموجب رخصة Apache 2.0.
---
طُوِّر في Coral AI Labs، و SnT — جامعة لوكسمبورغ، وكينغز كوليدج لندن، وجامعة هَل.