Magisterium AI

البدء

يرشدك هذا الدليل خلال تقديم أول طلب لك إلى نقطة نهاية A2A للماجستير، واسترداد المهمة الناتجة، وقراءة الاستجابة المنظمة.

المتطلبات الأساسية

  1. خطة مدفوعة من الماجستير (Pro أو Organization أو Enterprise). ستتلقى الحسابات المجانية خطأ PLAN_REQUIRED من A2A.
  2. رمز وصول OAuth 2.0 مرتبط بحسابك على magisterium.com. يستخدم A2A نفس تدفق OAuth الخاص بـ خادم MCP للماجستير؛ اكتشف نقاط نهاية التفويض والرمز المميز والتسجيل الديناميكي من بيانات OAuth الوصفية على https://www.magisterium.com/.well-known/oauth-authorization-server.
  3. المهارات التي ترغب في استدعائها — راجع المهارات للحصول على القائمة الكاملة.

تنبيه: مفاتيح API طويلة العمر التي يتم إنشاؤها في وحدة تحكم API تعمل مع Chat Completions وSearch وNews، لكنها ليست صالحة لـ A2A — يقبل A2A فقط رموز المستخدم الصادرة عن OAuth.

قم بتصدير رمز الوصول الخاص بك كمتغير بيئة حتى تلتقطه الأمثلة أدناه تلقائياً:

bash
export MAGISTERIUM_TOKEN=<your-access-token-here>

الخطوة 1: اكتشف الوكيل

قبل استدعاء نقطة النهاية، يمكنك جلب بطاقة الوكيل العامة لمعرفة المهارات المتاحة وتأكيد إصدار البروتوكول:

bash
curl https://www.magisterium.com/.well-known/agent.json

لا تتطلب البطاقة أي مصادقة. يمكن للمنسقين تخزينها مؤقتاً لمدة ساعة — تعيّن نقطة النهاية Cache-Control: public, max-age=3600.

الخطوة 2: أرسل أول رسالة لك

تمر جميع عمليات A2A عبر نقطة نهاية JSON-RPC واحدة: POST https://www.magisterium.com/api/v1/a2a. يستدعي المثال أدناه message/send على مهارة catholic_qa.

bash
curl -X POST https://www.magisterium.com/api/v1/a2a \
    -H "Authorization: Bearer $MAGISTERIUM_TOKEN" \
    -H "Content-Type: application/json" \
    -d '{
      "jsonrpc": "2.0",
      "id": 1,
      "method": "message/send",
      "params": {
        "message": {
          "role": "user",
          "messageId": "msg-001",
          "kind": "message",
          "parts": [{ "kind": "text", "text": "What does the Church teach about the Real Presence?" }],
          "metadata": { "skillId": "catholic_qa" }
        }
      }
    }'
typescript
const accessToken = process.env.MAGISTERIUM_TOKEN!;

const response = await fetch("https://www.magisterium.com/api/v1/a2a", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${accessToken}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    jsonrpc: "2.0",
    id: 1,
    method: "message/send",
    params: {
      message: {
        role: "user",
        messageId: crypto.randomUUID(),
        kind: "message",
        parts: [
          { kind: "text", text: "What does the Church teach about the Real Presence?" },
        ],
        metadata: { skillId: "catholic_qa" },
      },
    },
  }),
});

const { result: task } = await response.json();
console.log(task.id, task.status.state);
for (const artifact of task.artifacts ?? []) {
  for (const part of artifact.parts) {
    if (part.kind === "text") console.log(part.text);
  }
}
python
import os
import uuid
import httpx

access_token = os.environ["MAGISTERIUM_TOKEN"]

payload = {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "message/send",
    "params": {
        "message": {
            "role": "user",
            "messageId": str(uuid.uuid4()),
            "kind": "message",
            "parts": [
                {"kind": "text", "text": "What does the Church teach about the Real Presence?"}
            ],
            "metadata": {"skillId": "catholic_qa"},
        }
    },
}

response = httpx.post(
    "https://www.magisterium.com/api/v1/a2a",
    headers={
        "Authorization": f"Bearer {access_token}",
        "Content-Type": "application/json",
    },
    json=payload,
    timeout=60,
)
task = response.json()["result"]
print(task["id"], task["status"]["state"])
for artifact in task.get("artifacts", []):
    for part in artifact["parts"]:
        if part["kind"] == "text":
            print(part["text"])

الخطوة 3: اقرأ الاستجابة

تُرجع message/send كائن Task مع kind: "task". ينتهي استدعاء المهارة المتزامن دائماً في إحدى حالتين نهائيتين:

  • status.state == "completed" — توجد النتائج في result.artifacts. يحتوي كل عنصر على artifactId، واسم name اختياري، وواحد أو أكثر من parts (text أو data أو file).
  • status.state == "failed" — سبب الفشل موجود في status.message.parts[0].text.
json
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "id": "task_abc123",
    "contextId": "ctx_def456",
    "kind": "task",
    "status": { "state": "completed", "timestamp": "2026-04-20T12:00:00.000Z" },
    "artifacts": [
      {
        "artifactId": "art_ghi789",
        "name": "catholic_qa_response",
        "parts": [
          { "kind": "text", "text": "The Catholic Church teaches..." },
          { "kind": "data", "data": { "citations": [] } }
        ]
      }
    ]
  }
}

الخطوة 4: استرداد أو إلغاء مهمة

يتم تخزين المهام لمدة 24 ساعة ويمكن إعادة جلبها بواسطة المعرف باستخدام tasks/get:

bash
curl -X POST https://www.magisterium.com/api/v1/a2a \
    -H "Authorization: Bearer $MAGISTERIUM_TOKEN" \
    -H "Content-Type: application/json" \
    -d '{
      "jsonrpc": "2.0",
      "id": 2,
      "method": "tasks/get",
      "params": { "id": "task_abc123" }
    }'

إذا كنت بحاجة إلى إحباط مهمة، فاستدع tasks/cancel بنفس المعرف. لأن جميع مهارات الماجستير تُحل بشكل متزامن، فإن الإلغاء مفيد فقط في سيناريوهات إعادة المحاولة النادرة — لا يمكن إلغاء مهمة completed أو failed بالفعل وستُرجع INVALID_PARAMS.

الأخطاء الشائعة

الرمزالمعنىالحل
-32004غير مصرحتحقق من رأس Authorization ومن أن رمز الوصول صالح وغير منتهي الصلاحية.
-32005مطلوبة خطة مدفوعةقم بترقية حسابك على magisterium.com/plan.
-32002المهارة غير موجودةتأكد من أن metadata.skillId يطابق معرفاً مدرجاً في بطاقة الوكيل.
-32003تم تجاوز حد المعدلانتظر retryAfter ثانية (موجود في data الخطأ) قبل إعادة المحاولة.

راجع مرجع API الكامل لكل طريقة ورمز خطأ.