تخطَّ إلى المحتوى

واجهة برمجة تطبيقات حاسوب الوكيل

جربها في ملعب واجهة برمجة التطبيقات (API Playground).

https://api.rebyte.ai/v1

يتطلب كل طلب رأس API_KEY. احصل على مفتاحك من الإعدادات > مفاتيح API.

Terminal window
curl https://api.rebyte.ai/v1/tasks \
-H "API_KEY: rbk_your_key_here"

اسم الرأس غير حساس لحالة الأحرف. تعمل كل من API_KEY وapi-key وx-api-key.


الطريقةالمسارالوصف
POST/tasksإنشاء مهمة
GET/tasksسرد المهام
GET/tasks/:idالحصول على مهمة مع الحالة وسجل المطالبات
POST/tasks/:id/promptsإرسال مطالبة متابعة
PATCH/tasks/:id/visibilityتغيير رؤية المهمة
DELETE/tasks/:idحذف مهمة بشكل ناعم
GET/tasks/:id/eventsتدفق SSE لأحداث التنفيذ
POST/filesالحصول على عنوان URL موقع لرفع الملفات
POST/webhooksتسجيل webhook
GET/webhooksسرد الـ webhooks
GET/webhooks/:idالحصول على تفاصيل webhook
DELETE/webhooks/:idحذف webhook
جميع المسارات نسبية لعنوان URL الأساسي (https://api.rebyte.ai/v1).

POST /tasks

ينشئ مهمة جديدة. بشكل افتراضي، يوفر جهازًا افتراضيًا جديدًا (حاسوب وكيل). مرر workspaceId لتشغيل المهمة على مساحة عمل موجودة بدلاً من ذلك — هذا يتخطى عملية التوفير ويكون أسرع بكثير.

تتوقف المكالمة حتى يتم توفير الجهاز الافتراضي وتقديم المطالبة الأولى.

جسم الطلب:

الحقلالنوعمطلوبالوصف
promptstringنعموصف المهمة (100,000 حرف كحد أقصى)
executorstringلاclaude (افتراضي)، gemini، codex، opencode
modelstringلامستوى النموذج للمنفذ. انظر النماذج.
workspaceIdstringلاUUID لمساحة عمل موجودة لإعادة استخدامها
filesobject[]لاالملفات من POST /files. كل منها: {"id": "...", "filename": "..."}
skillsstring[]لامعرفات المهارات (مثل: ["deep-research", "pdf"])
githubUrlstringلامستودع GitHub بتنسيق owner/repo
branchNamestringلااسم الفرع (افتراضي: main)
Terminal window
curl -X POST https://api.rebyte.ai/v1/tasks \
-H "API_KEY: rbk_xxx" \
-H "Content-Type: application/json" \
-d '{
"prompt": "Build a REST API with Express and add tests",
"executor": "claude",
"skills": ["deep-research"],
"githubUrl": "your-org/your-repo"
}'

الاستجابة (201):

{
"id": "550e8400-e29b-41d4-a716-446655440000",
"workspaceId": "660e8400-e29b-41d4-a716-446655440001",
"url": "https://app.rebyte.ai/run/550e8400-e29b-41d4-a716-446655440000",
"status": "running",
"createdAt": "2026-01-28T12:00:00.000Z"
}

احفظ workspaceId من الاستجابة لإنشاء مهام متابعة على نفس حاسوب الوكيل:

Terminal window
# المهمة الأولى -- توفير جهاز افتراضي جديد
RESP=$(curl -s -X POST https://api.rebyte.ai/v1/tasks \
-H "API_KEY: rbk_xxx" -H "Content-Type: application/json" \
-d '{"prompt": "Set up the project"}')
WS_ID=$(echo $RESP | jq -r '.workspaceId')
# المهمة الثانية -- إعادة استخدام نفس الجهاز الافتراضي (أسرع بكثير)
curl -s -X POST https://api.rebyte.ai/v1/tasks \
-H "API_KEY: rbk_xxx" -H "Content-Type: application/json" \
-d "{\"prompt\": \"Now add tests\", \"workspaceId\": \"$WS_ID\"}"

تعتمد النماذج المتاحة على المنفذ:

المنفذالنماذج المتاحةالافتراضي
claudeclaude-sonnet-4.6, claude-opus-4.6, gemini-3.1-pro, gpt-5.3-codex, gpt-5.4, minimax-m2.7, kimi-k2.5, glm-5, gemini-3-flashclaude-sonnet-4.6
codexgpt-5.4, gpt-5.3-codexgpt-5.4
geminiauto-gemini-3 (توجيه تلقائي بين flash و pro)auto-gemini-3
opencodeنفس claudegemini-3.1-pro

مع BYOK (أحضر مفتاح API الخاص بك)، تتوفر فقط نماذج المزود الأصلي للمنفذ (على سبيل المثال، منفذ claude مع BYOK يحصل فقط على claude-sonnet-4.6 وclaude-opus-4.6).

GET /tasks?limit=50&offset=0

يعيد المهام التي تم إنشاؤها عبر واجهة برمجة التطبيقات، مرتبة حسب وقت الإنشاء (الأحدث أولاً).

المعلمةالنوعالافتراضيالوصف
limitnumber50النتائج لكل صفحة (100 كحد أقصى)
offsetnumber0إزاحة ترقيم الصفحات
Terminal window
curl "https://api.rebyte.ai/v1/tasks?limit=10" \
-H "API_KEY: rbk_xxx"

الاستجابة:

{
"data": [
{
"id": "550e8400-...",
"url": "https://app.rebyte.ai/run/550e8400-...",
"title": "Build REST API with Express",
"executor": "claude",
"model": "claude-sonnet-4.6",
"createdAt": "2026-01-28T12:00:00.000000+00:00",
"completedAt": "2026-01-28T12:05:00.000000+00:00"
}
],
"total": 42,
"limit": 10,
"offset": 0
}
GET /tasks/:id

يعيد تفاصيل المهمة الكاملة بما في ذلك سجل المطالبات والحالة المشتقة.

Terminal window
curl https://api.rebyte.ai/v1/tasks/550e8400-... \
-H "API_KEY: rbk_xxx"

الاستجابة:

{
"id": "550e8400-...",
"url": "https://app.rebyte.ai/run/550e8400-...",
"status": "running",
"title": "Build REST API with Express",
"executor": "claude",
"model": "claude-sonnet-4.6",
"createdAt": "2026-01-28T12:00:00.000000+00:00",
"completedAt": null,
"prompts": [
{
"id": "660e8400-...",
"status": "running",
"submittedAt": "2026-01-28T12:05:00.000000+00:00",
"completedAt": null
},
{
"id": "550e8400-...",
"status": "succeeded",
"submittedAt": "2026-01-28T12:00:01.000000+00:00",
"completedAt": "2026-01-28T12:03:00.000000+00:00"
}
]
}

حالة المهمة مشتقة من حالات المطالبات:

الحالةالشرط
runningأي مطالبة تكون pending أو running
completedجميع المطالبات نهائية، الأحدث هي succeeded
failedجميع المطالبات نهائية، الأحدث هي failed
canceledجميع المطالبات نهائية، الأحدث هي canceled
POST /tasks/:id/prompts

أرسل مطالبة متابعة إلى مهمة قيد التشغيل أو مكتملة. إذا تم إيقاف الجهاز الافتراضي، فإنه يستأنف تلقائيًا.

الحقلالنوعمطلوبالوصف
promptstringنعممطالبة المتابعة (100,000 حرف كحد أقصى)
skillsstring[]لامعرفات المهارات الإضافية لهذه المطالبة
Terminal window
curl -X POST https://api.rebyte.ai/v1/tasks/550e8400-.../prompts \
-H "API_KEY: rbk_xxx" \
-H "Content-Type: application/json" \
-d '{"prompt": "Now add authentication with JWT"}'

الاستجابة (201):

{
"promptId": "770f9500-..."
}
GET /tasks/:id/events

يفتح تدفق أحداث مرسلة من الخادم (Server-Sent Events) لأحدث مطالبة للمهمة. تتضمن الأحداث مخرجات الوكيل (stdout, stderr)، استدعاءات الأدوات، وإشارات الإكمال.

Terminal window
curl -N https://api.rebyte.ai/v1/tasks/550e8400-.../events \
-H "API_KEY: rbk_xxx"

يبث التدفق نوعين من الأحداث:

  • event — أحداث التنفيذ (مخرجات الوكيل، استدعاءات الأدوات)
  • done — الحدث النهائي مع حالة الإكمال، ثم يغلق التدفق
PATCH /tasks/:id/visibility
الحقلالنوعمطلوبالوصف
visibilitystringنعمprivate، shared، أو public
المستوىمن يمكنه العرض
privateمالك مفتاح API فقط
sharedجميع أعضاء المنظمة (افتراضي)
publicأي شخص لديه الرابط (للقراءة فقط)
Terminal window
curl -X PATCH https://api.rebyte.ai/v1/tasks/550e8400-.../visibility \
-H "API_KEY: rbk_xxx" \
-H "Content-Type: application/json" \
-d '{"visibility": "public"}'

عند التعيين على public، تتضمن الاستجابة shareUrl للوصول غير المصادق عليه.

DELETE /tasks/:id

يحذف المهمة بشكل ناعم. يعيد 204 No Content.

Terminal window
curl -X DELETE https://api.rebyte.ai/v1/tasks/550e8400-... \
-H "API_KEY: rbk_xxx"

رفع الملفات لإرفاقها بالمهام. يستخدم تدفق URL موقع من خطوتين.

الخطوة 1: الحصول على عنوان URL للرفع

Section titled “الخطوة 1: الحصول على عنوان URL للرفع”
POST /files
الحقلالنوعمطلوبالوصف
filenamestringنعماسم الملف (255 حرف كحد أقصى)
contentTypestringلانوع MIME (افتراضي: application/octet-stream)

الاستجابة (201):

{
"id": "550e8400-...",
"filename": "data.csv",
"uploadUrl": "https://storage.googleapis.com/...",
"maxFileSize": 52428800
}

ينتهي صلاحية عنوان URL للرفع في ساعة واحدة.

Terminal window
curl -X PUT "UPLOAD_URL_FROM_STEP_1" \
-H "Content-Type: application/octet-stream" \
--data-binary @data.csv

مرر id وfilename من الخطوة 1 عند إنشاء مهمة:

{
"prompt": "Analyze the uploaded data",
"files": [
{"id": "550e8400-...", "filename": "data.csv"}
]
}

يتم نسخ الملفات تلقائيًا إلى الجهاز الافتراضي للمهمة عند بدء التنفيذ.


تلقي إشعارات HTTP POST عند حدوث أحداث المهمة. الـ Webhooks عالمية — يتم تشغيلها لجميع المهام في مؤسستك، سواء تم إنشاؤها عبر API أو واجهة المستخدم أو أي قناة أخرى.

الحدثيتم تشغيله عندما
task.createdيتم إنشاء مهمة جديدة
task.runningيبدأ الوكيل في التنفيذ
task.completedتكتمل المهمة بنجاح
task.failedتفشل المهمة
task.canceledيتم إلغاء المهمة من قبل المستخدم
POST /webhooks
الحقلالنوعمطلوبالوصف
urlstringنعمعنوان URL لنقطة نهاية HTTPS
eventsstring[]نعمالأحداث للاشتراك فيها
descriptionstringلاتسمية قابلة للقراءة البشرية (500 حرف كحد أقصى)
secretstringلاسر مشترك مسبقًا (500 حرف كحد أقصى). عند التعيين، يتم تضمينه كرأس X-Webhook-Secret في كل تسليم.
Terminal window
# Webhook بدون سر
curl -X POST https://api.rebyte.ai/v1/webhooks \
-H "API_KEY: rbk_xxx" \
-H "Content-Type: application/json" \
-d '{
"url": "https://your-server.com/webhook",
"events": ["task.completed", "task.failed"]
}'
# Webhook بسر مشترك مسبقًا
curl -X POST https://api.rebyte.ai/v1/webhooks \
-H "API_KEY: rbk_xxx" \
-H "Content-Type: application/json" \
-d '{
"url": "https://your-server.com/webhook",
"events": ["task.completed", "task.failed"],
"secret": "my-shared-secret-value"
}'

الاستجابة (201):

{
"id": "880e8400-...",
"url": "https://your-server.com/webhook",
"events": ["task.completed", "task.failed"],
"description": null,
"hasSecret": true,
"isActive": true,
"createdAt": "2026-01-28T12:00:00.000Z",
"lastTriggeredAt": null,
"failureCount": 0
}

ملاحظات السلوك:

  • عناوين URL المكررة: تسجيل نفس عنوان URL مرتين يعيد الـ webhook الموجود (متطابق)
  • الحد الأقصى: 3 webhooks كحد أقصى لكل مؤسسة. الرابع يعيد limit_exceeded.
  • تخزين السر: لا يتم إرجاع قيمة السر أبدًا في أي استجابة. يتم الكشف عن hasSecret: true/false فقط.
GET /webhooks

يعيد جميع الـ webhooks لمؤسستك مع معلومات الحالة (lastTriggeredAt، failureCount، isActive). لا يتم الكشف عن الأسرار أبدًا.

GET /webhooks/:id
DELETE /webhooks/:id

يعيد 204 No Content. تتوقف الـ webhooks المحذوفة فورًا عن تلقي التسليمات.

عندما يتطابق حدث مهمة مع الأحداث المشترك فيها لـ webhook، يرسل Rebyte طلب HTTP POST إلى عنوان URL الخاص بالـ webhook.

الحمولة:

{
"event": "task.completed",
"taskId": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": 1706443200,
"data": {
"status": "succeeded",
"taskUrl": "https://app.rebyte.ai/run/550e8400-...",
"result": "Created CSV file with 10 Hacker News posts..."
}
}
  • status — حالة المطالبة: pending (task.createdrunning (task.runningsucceeded (task.completedfailed (task.failedcanceled (task.canceled)
  • taskUrl — رابط مباشر للمهمة في واجهة مستخدم Rebyte (موجود دائمًا)
  • result — نص الإخراج النهائي للذكاء الاصطناعي (موجود في الأحداث النهائية: task.completed، task.failed، task.canceled؛ غائب في task.created وtask.running)

استدعِ GET /tasks/:id للحصول على تفاصيل المهمة الكاملة بما في ذلك سجل المطالبات.

رؤوس التسليم:

الرأسموجود دائمًاالوصف
Content-Typeنعمapplication/json
X-Webhook-Signatureنعمتوقيع RSA-SHA256 مشفر بـ Base64
X-Webhook-Timestampنعمطابع زمني Unix (بالثواني)
X-Webhook-Secretفقط إذا تم تكوين السرقيمة السر المشترك مسبقًا التي قمت بتعيينها عند الإنشاء

مهلة: تنتهي مهلة التسليمات بعد 10 ثوانٍ.

معالجة الفشل:

  • التسليم هو إرسال ونسيان — لا توجد إعادة محاولة تلقائية عند الفشل
  • الاستجابات غير 2xx تزيد failureCount
  • بعد 10 إخفاقات متتالية، يتم تعطيل الـ webhook تلقائيًا (isActive: false)
  • التسليمات الناجحة تعيد تعيين failureCount إلى 0

يتم توقيع كل تسليم بزوج مفاتيح RSA-2048 الخاص بمؤسستك، بغض النظر عما إذا كان قد تم تكوين سر مشترك مسبقًا.

كيف يعمل:

  1. يقوم Rebyte بدمج {timestamp}.{body} (على سبيل المثال، 1706443200.{"event":"task.completed",...})
  2. يوقع السلسلة باستخدام RSA-SHA256 باستخدام المفتاح الخاص لمؤسستك
  3. يرسل التوقيع المشفر بـ base64 في X-Webhook-Signature

احصل على مفتاحك العام: اتصل بالدعم أو استرجعه من لوحة تحكم Rebyte. يتم إنشاء زوج مفاتيح RSA-2048 تلقائيًا عند إنشاء أول webhook ويستمر للمؤسسة.

مثال التحقق (Node.js):

const crypto = require('crypto');
function verifyWebhook(rawBody, timestamp, signature, publicKey) {
const payload = `${timestamp}.${rawBody}`;
const verifier = crypto.createVerify('RSA-SHA256');
verifier.update(payload);
return verifier.verify(publicKey, signature, 'base64');
}
// في معالج الـ webhook الخاص بك:
app.post('/webhook', (req, res) => {
const rawBody = req.body; // يجب أن تكون سلسلة نصية خام، وليست JSON محللة
const timestamp = req.headers['x-webhook-timestamp'];
const signature = req.headers['x-webhook-signature'];
if (!verifyWebhook(rawBody, timestamp, signature, PUBLIC_KEY)) {
return res.status(401).send('Invalid signature');
}
const event = JSON.parse(rawBody);
console.log(`Task ${event.taskId}: ${event.event}`);
res.status(200).send('OK');
});

مثال التحقق (Python):

from cryptography.hazmat.primitives import hashes, serialization
from cryptography.hazmat.primitives.asymmetric import padding
import base64
def verify_webhook(raw_body: str, timestamp: str, signature: str, public_key_pem: str) -> bool:
public_key = serialization.load_pem_public_key(public_key_pem.encode())
payload = f"{timestamp}.{raw_body}".encode()
try:
public_key.verify(
base64.b64decode(signature),
payload,
padding.PKCS1v15(),
hashes.SHA256()
)
return True
except Exception:
return False

تدعم الـ Webhooks طريقتين مستقلتين للتحقق يمكن استخدامهما معًا:

الطريقةالرأسكيف يعملحالة الاستخدام
توقيع RSAX-Webhook-Signatureإثبات تشفيري بأن الحمولة جاءت من Rebyteتحقق مقاوم للتلاعب
سر مشترك مسبقًاX-Webhook-Secretسلسلة نصية ثابتة تحددها عند الإنشاء، يتم إرجاعها في كل تسليمفحص بسيط للسر المشترك

توقيعات RSA موجودة دائمًا. السر المشترك مسبقًا اختياري — قم بتعيينه عند إنشاء الـ webhook إذا كنت تريد مسار تحقق أبسط.


مثال كامل: إنشاء مهمة، استقصاء حتى الاكتمال، ثم إرسال متابعة.

Terminal window
# إنشاء مهمة
TASK_ID=$(curl -s -X POST https://api.rebyte.ai/v1/tasks \
-H "API_KEY: rbk_xxx" \
-H "Content-Type: application/json" \
-d '{"prompt": "Write a Python CLI that converts CSV to JSON"}' | jq -r '.id')
echo "Task: https://app.rebyte.ai/run/$TASK_ID"
# استقصاء حتى الانتهاء
while true; do
STATUS=$(curl -s https://api.rebyte.ai/v1/tasks/$TASK_ID \
-H "API_KEY: rbk_xxx" | jq -r '.status')
echo "Status: $STATUS"
[[ "$STATUS" == "completed" || "$STATUS" == "failed" ]] && break
sleep 5
done
# إرسال متابعة
curl -s -X POST https://api.rebyte.ai/v1/tasks/$TASK_ID/prompts \
-H "API_KEY: rbk_xxx" \
-H "Content-Type: application/json" \
-d '{"prompt": "Now add support for nested JSON objects"}'

تتبع جميع الأخطاء هذا الهيكل:

{
"error": {
"code": "validation_error",
"message": "Invalid request body"
}
}
الرمزحالة HTTPالوصف
missing_api_key401لم يتم توفير رأس API_KEY
invalid_api_key401مفتاح API غير صالح أو منتهي الصلاحية
validation_error400فشل جسم الطلب في التحقق
not_found404المورد غير موجود أو غير قابل للوصول
limit_exceeded400تم الوصول إلى حد المؤسسة (على سبيل المثال، الحد الأقصى للـ webhooks)
agent_disabled403المنفذ المطلوب معطل لهذه المؤسسة
internal_error500فشل من جانب الخادم

لا تفرض واجهة برمجة التطبيقات حاليًا حدودًا للمعدل لكل مفتاح. كل POST /tasks يوفر جهازًا افتراضيًا حقيقيًا، لذا تتناسب التكاليف مع الاستخدام. استخدم الـ webhooks بدلاً من الاستقصاء المكثف لتقليل الطلبات غير الضرورية.