Ultralytics YOLO27:

مرجع REST API#

توفر منصة Ultralytics REST API للوصول البرمجي إلى مجموعات البيانات والصور والمشاريع والنماذج والتدريب وعمليات التصدير وعمليات النشر.

وثائق API التفاعلية لمنصة Ultralytics

بدء سريع
# List the datasets owned by a workspace
curl -H "Authorization: Bearer YOUR_API_KEY" \
  https://platform.ultralytics.com/api/datasets/YOUR_USERNAME

يسرد كل endpoint أدناه استدعاء client.<resource>.<method>(...) الخاص به من حزمة SDK المسماة ultralytics-platform، والتي تُنشأ من العقد نفسه المستخدم في هذا المرجع.

مرجع API التفاعلي

تقدّم هذه الصفحة جولة إرشادية في API. ويقع المرجع المُنشأ والمحدّث دائمًا في platform.ultralytics.com/api/docs، كما تُنشر وثيقة OpenAPI 3.2 القابلة للقراءة آليًا والتي تشغّله في platform.ultralytics.com/openapi.json. ويُنشأ كلاهما مباشرةً من العقد الموجود على جانب الخادم، ولذلك فهما المرجع المعتمد كلما اختلفت هذه الصفحة والمخطط.

نظرة عامة على API#

تُنظَّم API حول موارد المنصة الأساسية:

graph LR
    A[API Key]:::start --> B[Datasets]:::proc
    A --> C[Projects]:::proc
    B -->|images| G[Images]:::proc
    C -->|contains| D[Models]:::proc
    B -->|train on| D
    D -->|deploy| E[Deployments]:::proc
    D -->|export| F[Exports]:::proc

    classDef start fill:#4CAF50,color:#fff
    classDef proc fill:#2196F3,color:#fff
الموردالوصفالعمليات الرئيسية
مجموعات البياناتمجموعات صور معنونةCRUD، والإدخال، والإصدارات، والفئات، والتقسيمات، والاستنساخ
الصورالصور الفردية والتسمياتالقراءة، وإضافة التعليقات التوضيحية، ونقل التقسيم، والحذف، وإضافة التعليقات التوضيحية تلقائيًا
المشاريعمساحات عمل النماذجCRUD، والاستنساخ
النماذجنقاط التحقق المدرَّبةCRUD، والتنبؤ، والتنزيل، والاستنساخ، وحالة التدريب
التدريبمهام التدريب على GPU السحابيتوافر GPU، والبدء، والتقدم، والإلغاء
عمليات التصديرمهام تحويل التنسيقالإنشاء، والسرد، والحالة، والإلغاء
عمليات النشرنقاط نهاية استدلال مخصصةالإنشاء، والبدء/الإيقاف/الاستبدال، والتنبؤ، والمقاييس، والسجلات
المهملاتالموارد المحذوفة حذفًا منطقيًاالسرد، والاستعادة، والحذف النهائي
التخزينتكاملات التخزين السحابيالاتصال، والاستكشاف، والتصفح، وقطع الاتصال
الحسابالخطة، والرصيد، والتخزين، والملف الشخصيملخص الحساب، ومفاتيح API، واستخدام التخزين، والبحث عن المستخدمين
الفوترةاستخدام الخطة ودفتر الحساباتملخص الاستخدام، والمعاملات
الاستكشافالبحث في المحتوى العامالبحث في المشاريع ومجموعات البيانات

المصادقة#

تتطلب معظم نقاط النهاية مفتاح API. كما تقبل نقاط النهاية التي تعرض محتوى عامًا — مثل قراءة مجموعة بيانات أو مشروع أو نموذج عام، وسرد صور مجموعة بيانات عامة، وتشغيل الاستدلال على نموذج عام، أو البحث في الاستكشاف — الطلبات المجهولة أيضًا، وتعيد ببساطة مزيدًا من النتائج عند توفير مفتاح.

الحصول على مفتاح API#

  1. انتقل إلى Settings > API Keys
  2. انقر على Create Key
  3. انسخ المفتاح المُنشأ

راجع مفاتيح API للحصول على تعليمات مفصلة.

رأس التفويض#

أدرِج مفتاح API الخاص بك باعتباره رمز bearer:

Authorization: Bearer YOUR_API_KEY
تنسيق مفتاح API

مفاتيح API هي البادئة الحرفية ul_ متبوعةً بـ 40 محرفًا سداسيًا عشريًا، أي 43 محرفًا إجمالًا (على سبيل المثال ul_a1b2c3d4e5f6789012345678901234567890abcd). وتُرجع الطلبات التي تفتقد الرأس، أو التي تحتوي على مفتاح غير صالح، أو التي تستخدم مفتاحًا مُلغى 401. احرص على سرية مفتاحك — ولا تُدخله أبدًا في نظام التحكم في الإصدارات أو تشاركه علنًا.

مثال#

curl -H "Authorization: Bearer YOUR_API_KEY" \
  https://platform.ultralytics.com/api/account/summary

عنوان URL الأساسي#

تستخدم جميع نقاط نهاية API ما يلي:

https://platform.ultralytics.com/api

مسارات الموارد#

تُعنون الموارد باستخدام الأسماء المقروءة بشريًا نفسها التي تظهر في عناوين URL للمنصة، وليس باستخدام معرّفات قاعدة البيانات:

الموردالمسارمثال
مجموعة البيانات/api/datasets/{owner}/{dataset}/api/datasets/acme-vision/warehouse
المشروع/api/projects/{owner}/{project}/api/projects/acme-vision/inspection
النموذج/api/models/{owner}/{project}/{model}/api/models/acme-vision/inspection/v3
النشر/api/deployments/{owner}/{deployment}/api/deployments/acme-vision/edge-1
الصورة/api/images/{imageId}/api/images/65f1c0a2b3d4e5f601234567
  • {owner} هو اسم مستخدم شخصي أو معرّف مساحة عمل لفريق: من 4 إلى 32 محرفًا، بأحرف أبجدية رقمية صغيرة مع واصلات مفردة بين المقاطع.
  • تتبع {dataset} و{project} و{model} و{deployment} النمط نفسه ذي الأحرف الصغيرة والواصلات، وبحد أقصى 128 محرفًا.
  • {imageId} و{exportId} معرّفان سداسيان عشريان بطول 24 محرفًا، وتُرجعهما API.
  • يؤدي تغيير اسم مورد من خلال PATCH إلى تغيير name المعروض واسم URL معًا، كما يعيد الرد اسم URL الحالي حتى تتمكن من مواصلة استخدامه.
اختيار مساحة العمل

لا توجد معلمة استعلام owner. تحمل المسارات المقيّدة بنطاق مساحة العمل المالك ضمن المسار، بينما تعمل نقاط النهاية المقيّدة بنطاق الحساب (/api/account/summary و/api/api-keys و/api/storage و/api/billing/* و/api/trash و/api/integrations/buckets) على مساحة العمل التي أصدرت مفتاح API. لتنفيذ إجراء على مساحة عمل فريق، استخدم مفتاح API مُنشأ في مساحة العمل تلك.

حدود معدل الطلبات#

تفرض API حدودًا ضمن نافذة منزلقة لكل مفتاح API. تندرج كل route ضمن فئة واحدة، ولكل فئة عداد مستقل، لذا لا تستهلك 20 طلبات تنبؤ حصتك الافتراضية.

الفئةالحدينطبق على
الافتراضي100 طلب/دقيقةكل route غير مُدرج أدناه
التدريب10 طلبات/دقيقةPOST /api/training/start
التحميل10 طلبات/دقيقةعناوين URL الموقعة للرفع، وإتمام الرفع، وإدخال مجموعة البيانات
تنبؤ20 طلبًا/دقيقةاستدلال النموذج والنشر من خلال مسارات Platform API
التصدير20 طلبًا/دقيقةمسارات تصدير النماذج ومسارات تصدير وإصدار مجموعة البيانات، باستثناء قراءة تصدير مجموعة البيانات (GET)، والتي تستخدم الحد الافتراضي
التنزيل30 طلبًا/دقيقةتنزيلات ملفات النماذج
التعديل10 طلبات/دقيقةسرد مفاتيح API، والاتصال بالتخزين السحابي أو استكشافه، وإجراءات PATCH الخاصة بالنشر
التهيئة20 طلبًا/دقيقةPOST /api/datasets/{owner}/{dataset}/images (جلب مجموعة مختارة من الصور) وGET /api/images/{imageId}/similar
التجميع10 طلبات/دقيقةGET /api/datasets/{owner}/{dataset}/images/clustering و GET /api/models/{owner}/{project}/{model}/similar-images

لدى مسارات Platform المخصصة للمتصفح فقط، مثل الدفع عند إتمام الفوترة وإدارة الفريق، حدودها الخاصة التي لا تنطبق على حركة المرور باستخدام مفاتيح API.

عند تقييد المعدل، تُرجع API 429 مع الرأسين ونص JSON:

Retry-After: 12
X-RateLimit-Reset: 2026-02-21T12:34:56.000Z
{
    "error": "Rate limit exceeded",
    "retryAfter": 12,
    "resetAt": "2026-02-21T12:34:56.000Z"
}

نقاط النهاية المخصصة (غير محدودة)#

لا تخضع نقاط النهاية المخصصة لحدود معدل مفاتيح API للمنصة عند استدعاء serviceUrl الخاص بالنشر مباشرةً (على سبيل المثال، https://predict-abc123.run.app/predict). ويعتمد معدل النقل حينها على إعدادات الخدمة المنشورة.

التعامل مع حدود المعدل

عند تلقي 429، انتظر Retry-After ثانية (أو حتى X-RateLimit-Reset) قبل إعادة المحاولة. راجع الأسئلة الشائعة حول حدود المعدل للحصول على تطبيق للتراجع الأسي.

تنسيق الاستجابة#

الاستجابات الناجحة#

الاستجابات عبارة عن كائنات JSON تحتوي على حقول خاصة بالموارد. ولا يوجد غلاف عام: إذ تعيد نقاط النهاية الخاصة بالسرد مجموعة مسماة إلى جانب أعدادها، بينما تعيد عمليات التعديل المعرّفات التي تغيّرت.

{
    "datasets": [{ "id": "65f1c0a2b3d4e5f601234567", "owner": "acme-vision", "dataset": "warehouse" }],
    "total": 1,
    "region": "us"
}

تتضمن الاستجابات الحاملة للبيانات أيضًا region (us أو eu أو ap)، وهي منطقة التخزين الخاصة بمساحة العمل.

استجابات الأخطاء#

كل استجابة خطأ هي كائن JSON يحتوي على رسالة error:

{
    "error": "Dataset not found"
}
حالة HTTPالمعنى
200نجاح
201أُنشئ في
202تم القبول، ويستمر العمل بشكل غير متزامن
400المسار أو الاستعلام أو نص الطلب غير صالح
401المصادقة مفقودة أو غير صالحة
402أرصدة غير كافية (التدريب)
403أذونات أو خطة أو حصة غير كافية
404المورد غير موجود
409تعارض مع الحالة الحالية (اسم مكرر، مهمة قيد التنفيذ)
413حجم إدخال التنبؤ كبير جدًا
422فئات النموذج لا تتطابق مع مجموعة البيانات (التعليق التلقائي)
429تم تجاوز حد المعدل
500خطأ في الخادم
502فشل موفر الخدمة أو استدعاء الخدمة التابعة
503الخدمة التابعة غير متاحة مؤقتًا

التقسيم إلى صفحات#

يعتمد نمط ترقيم الصفحات على المجموعة:

النمطنقاط النهايةالمعلمات
الحد فقطقوائم مجموعات البيانات والمشاريع والنماذج وعمليات التصدير وعمليات النشرlimit
الإزاحة والحدصور مجموعات البيانات، وتجميع الصور، والبحث في Exploreoffset وlimit، بالإضافة إلى hasMore في الاستجابة
المؤشرصور مجموعات البيانات (مجموعات البيانات الكبيرة)cursor وincludeTotal، بالإضافة إلى nextCursor
رقم الصفحةالمهملاتpage وlimit، بالإضافة إلى totalPages
رمز صفحة غير شفافسجلات النشرpageToken، بالإضافة إلى nextPageToken

واجهة برمجة تطبيقات مجموعات البيانات#

أنشئ مجموعات بيانات صور معنونة لتدريب نماذج YOLO، وتصفحها وأدرها. راجع وثائق مجموعات البيانات.

سرد مجموعات البيانات#

GET /api/datasets/{owner}

Python SDK: client.datasets.list(owner)

يعرض مجموعات البيانات العامة للمالك، بالإضافة إلى مجموعات البيانات الخاصة عندما يتيح مفتاحك عرض مساحة العمل تلك.

معلمات الاستعلام:

المعلمةالنوعالوصف
limitintالحد الأقصى لمجموعات البيانات المراد إرجاعها (الافتراضي: 1000، الحد الأقصى: 1000)
includeSamplesمنطقيتضمين معاينات لصور العينات (الافتراضي: true)
includeImageUrlsمنطقيتضمين عناوين URL البديلة لصور العينات بالحجم الكامل (الافتراضي: false)
curl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://platform.ultralytics.com/api/datasets/acme-vision?limit=10&includeSamples=false"

الاستجابة:

{
    "datasets": [
        {
            "id": "65f1c0a2b3d4e5f601234567",
            "owner": "acme-vision",
            "dataset": "warehouse",
            "name": "Warehouse",
            "task": "detect",
            "visibility": "private",
            "imageCount": 1000,
            "classCount": 2,
            "classNames": ["person", "forklift"],
            "splits": { "train": 800, "val": 200, "test": 0, "labeled": 1000 },
            "annotationCount": 5400,
            "starCount": 3,
            "isStarred": false,
            "status": "ready",
            "createdAt": "2026-01-15T10:00:00Z",
            "updatedAt": "2026-01-16T08:30:00Z"
        }
    ],
    "total": 1,
    "region": "us"
}

الحصول على مجموعة بيانات#

GET /api/datasets/{owner}/{dataset}

Python SDK: client.datasets.retrieve(owner, dataset)

يعيد كائن مجموعة البيانات الكامل ضمن مفتاح dataset، بما في ذلك classNames وsplits وversions وsource وكائن metadata المحدد من قِبل المستخدم.

إنشاء مجموعة بيانات#

POST /api/datasets

Python SDK: client.datasets.create(dataset=..., name=...)

النص:

{
    "dataset": "warehouse",
    "name": "Warehouse",
    "task": "detect",
    "description": "Forklift and pedestrian safety dataset",
    "classNames": ["person", "forklift"],
    "visibility": "private",
    "metadata": { "location": "factory-1", "reviewed": true },
    "owner": "acme-vision"
}
الحقلالنوعمطلوبالوصف
datasetstringنعماسم مجموعة البيانات المستخدم في عناوين URL للمنصة (أحرف صغيرة، واصلات، بحد أقصى 128 محرفًا)
namestringنعماسم العرض (بحد أقصى 100 محرف)
descriptionstringلاالوصف (بحد أقصى 1000 محرف)
taskstringلانوع المهمة (الافتراضي: detect)
classNamesمصفوفةلاأسماء الفئات بترتيب الفهرس (بحد أقصى 25,000)
formatstringلاتنسيق التعليقات التوضيحية: yolo (افتراضي)، coco، raw، ndjson
visibilitystringلاpublic أو private
tagsمصفوفةلاما يصل إلى 50 وسمًا، يتكون كل منها من 50 محرفًا
licensestringلامعرّف ترخيص مجموعة البيانات
metadataكائنلابيانات وصفية مخصصة بتنسيق JSON
ownerstringلامُعرّف مساحة عمل الفريق؛ ويُعيّن افتراضيًا إلى مساحة العمل الشخصية
requireExactSlugمنطقيلاإرجاع 409 عند حجز dataset مسبقاً بدلاً من إنشاء اسم لاحق مثل warehouse-2 (الافتراضي false)

ترجع الاستجابة الـ slug الخاص بـ dataset الذي تم إنشاؤه بالفعل، لذا اقرأه مرة أخرى قبل التحميل ما لم تقم بتعيين requireExactSlug.

المهام المدعومة

القيم الصالحة لـ task عند إنشاء مجموعة بيانات أو تحديثها: detect وsegment وsemantic وdepth وclassify وpose وobb. لا تحتوي مجموعات بيانات العمق على فئات.

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

{
    "id": "65f1c0a2b3d4e5f601234567",
    "owner": "acme-vision",
    "dataset": "warehouse",
    "region": "us"
}

تحديث مجموعة بيانات#

PATCH /api/datasets/{owner}/{dataset}

Python SDK: client.datasets.update(owner, dataset)

النص (تحديث جزئي):

{
    "name": "Warehouse Safety",
    "description": "New description",
    "visibility": "public",
    "metadata": { "location": "factory-2", "reviewed": true }
}

الحقول المقبولة: name وdescription وvisibility وmetadata وtags وclassNames وclassColors وformat وtask وlicense وiconColor وiconLetter وstarred. أرسل كائن metadata فارغًا ({}) لمسح البيانات الوصفية المخصصة. يقتصر طول مفاتيح البيانات الوصفية على 128 محرفًا، ويقتصر الكائن المتسلسل على 500,000 محرف.

الاستجابة:

{
    "success": true,
    "dataset": "warehouse-safety"
}

يؤدي تغيير الاسم إلى تغيير اسم عنوان URL، لذا استخدم قيمة dataset المُعادة في الطلبات اللاحقة.

حذف مجموعة البيانات#

DELETE /api/datasets/{owner}/{dataset}

Python SDK: client.datasets.delete(owner, dataset)

ينقل مجموعة البيانات إلى المهملات، حيث يمكن استردادها لمدة 30 يومًا.

استنساخ مجموعة البيانات#

POST /api/datasets/{owner}/{dataset}/clone

Python SDK: client.datasets.clone(owner, dataset)

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

النص الاختياري (جميع الحقول اختيارية):

{
    "dataset": "warehouse-copy",
    "name": "Warehouse Copy",
    "description": "Cloned for experimentation",
    "visibility": "private",
    "license": "CC-BY-4.0",
    "owner": "acme-vision"
}

الاستجابة (201): id وowner وdataset وname وimageCount وclassCount وregion. تُعيد مجموعات البيانات المدعومة بمصدر تخزين متصل 409 لأن ملفاتها لا تُنسخ.

تنزيل تصدير مجموعة بيانات#

GET /api/datasets/{owner}/{dataset}/export

Python SDK: client.datasets.export(owner, dataset)

يعيد عنوان URL موقّعًا لتنزيل NDJSON. احذف v لتصدير الحالة الحالية لمجموعة البيانات، مع إعادة استخدام التصدير المخزّن مؤقتًا عندما لا يكون قد حدث أي تغيير منذ إنشائه.

معلمات الاستعلام:

المعلمةالنوعالوصف
vعدد صحيحرقم الإصدار المحفوظ (يبدأ الفهرس من 1). احذفه للإصدار الحالي لمجموعة البيانات.

الاستجابة:

{
    "downloadUrl": "https://storage.googleapis.com/...&signature=...",
    "cached": true
}

يؤدي طلب إصدار محدد إلى إعادة downloadUrl وversion بدلًا من cached.

إنشاء إصدار مجموعة بيانات#

POST /api/datasets/{owner}/{dataset}/export

Python SDK: client.datasets.create_export(owner, dataset)

ينشئ لقطة مرقمة غير قابلة للتغيير من مجموعة البيانات ويخزّن تصدير NDJSON الخاص بها. يتطلب صلاحية المحرر.

النص (اختياري):

{
    "description": "Added 500 training images"
}

الاستجابة:

{
    "version": 3,
    "downloadUrl": "https://storage.googleapis.com/...&signature=...",
    "reused": false
}

تكون قيمة reused هي true عندما لا تتغير مجموعة البيانات منذ الإصدار السابق وتُعاد تلك اللقطة بدلًا منه.

تحديث وصف الإصدار#

PATCH /api/datasets/{owner}/{dataset}/export

Python SDK: client.datasets.update_export(owner, dataset, version=..., description=...)

النص:

{
    "version": 2,
    "description": "Fixed mislabeled classes"
}

الاستجابة: {"ok": true}

استعادة إصدار مجموعة البيانات#

POST /api/datasets/{owner}/{dataset}/restore

Python SDK: client.datasets.restore(owner, dataset, version=...)

يعيد إنشاء الصور والتعليقات التوضيحية والفئات من إصدار محفوظ دون نسخ وحدات بايت الصور.

النص:

{
    "version": 2
}

الاستجابة: {"version": 2, "imageCount": 1000}

الحصول على إحصائيات مجموعة البيانات#

GET /api/datasets/{owner}/{dataset}/class-stats

Python SDK: client.datasets.class_stats(owner, dataset)

يعيد أعداد التعليقات التوضيحية لكل فئة، ومدرجات الصور والتعليقات التوضيحية، وخرائط التمثيل الحراري. تُؤخذ عينة من مجموعات البيانات الكبيرة، وفي هذه الحالة يوضح sampleSize عدد الصور التي ساهمت.

الاستجابة (مختصرة):

{
    "classes": [{ "classId": 0, "count": 1500, "imageCount": 450 }],
    "imageStats": {
        "widthHistogram": [{ "bin": 640, "count": 120, "size": 1 }],
        "heightHistogram": [{ "bin": 480, "count": 95, "size": 1 }],
        "pointsHistogram": [{ "bin": 4, "count": 200, "size": 1 }],
        "formatDistribution": { "jpg": 900, "png": 100 },
        "fileSizeHistogram": [{ "bin": 250000, "count": 300, "size": 50000 }],
        "objectsPerImageHistogram": [{ "bin": 5, "count": 210, "size": 1 }],
        "bboxWidthHistogram": [{ "bin": 120, "count": 340, "size": 20 }],
        "bboxHeightHistogram": [{ "bin": 90, "count": 300, "size": 20 }]
    },
    "locationHeatmap": {
        "bins": [
            [5, 10],
            [8, 3]
        ],
        "maxCount": 50
    },
    "dimensionHeatmap": {
        "bins": [
            [2, 5],
            [3, 1]
        ],
        "maxCount": 12,
        "minWidth": 10,
        "maxWidth": 1920,
        "minHeight": 10,
        "maxHeight": 1080
    },
    "classNames": ["person", "forklift"],
    "cached": true,
    "sampleSize": null
}

إدارة الفئات#

دمج الفئات (إعادة تعيين التعليقات التوضيحية إلى فئة مستهدفة، ثم إزالة الفئات المصدرية):

POST /api/datasets/{owner}/{dataset}/classes/merge

Python SDK: client.datasets.merge_classes(owner, dataset, source_class_ids=..., target_class_id=...)

{
    "sourceClassIds": [2, 4],
    "targetClassId": 1
}

حذف الفئات (تُحذف تعليقاتها التوضيحية وتتحرك معرّفات الفئات المتبقية إلى الأسفل):

POST /api/datasets/{owner}/{dataset}/classes/delete

Python SDK: client.datasets.delete_classes(owner, dataset, class_ids=...)

{
    "classIds": [2, 4]
}

تعيد العمليتان success، وclassNames وclassColors المحدّثتين، وملخصًا للتغييرات التي حدثت (mergedClassIds وtargetClassId، أو deletedClassIds وdeletedAnnotations).

معرّفات الفئات موضعية

نظرًا إلى أن المعرّفات المتبقية تتحرك بعد الدمج أو الحذف، فإن هذه العمليات غير متطابقة النتائج عند التكرار. أعد جلب مجموعة البيانات للحصول على فهارس الفئات الحالية قبل إصدار عملية أخرى للفئات.

إعادة توزيع التقسيمات#

POST /api/datasets/{owner}/{dataset}/splits/redistribute

Python SDK: client.datasets.redistribute_splits(owner, dataset, train=..., val=..., test=...)

يعيد تعيين الصور عشوائيًا عبر التقسيمات. يجب أن يبلغ مجموع النسب المئوية الثلاث 100.

{
    "train": 80,
    "val": 20,
    "test": 0
}

الاستجابة: success، وأعداد splits الناتجة، وmodified (عدد الصور المنقولة).

تضمينات مجموعة البيانات#

GET /api/datasets/{owner}/{dataset}/embeddings
POST /api/datasets/{owner}/{dataset}/embeddings
DELETE /api/datasets/{owner}/{dataset}/embeddings

Python SDK: client.datasets.embeddings(owner, dataset) وclient.datasets.create_embeddings(owner, dataset) وclient.datasets.delete_embeddings(owner, dataset)

يعيد GET ملخص التحليل (analyzedAt وembeddingsCount وlatestImageAt وactiveJob). يضع POST تحليل التضمينات في قائمة الانتظار ويعيد 202 مع jobId. يلغي DELETE المهمة النشطة ويعيد معرّف المهمة الملغاة أو null.

تجميع الصور#

GET /api/datasets/{owner}/{dataset}/images/clustering

Python SDK: client.datasets.clustering(owner, dataset)

يعيد تخطيط UMAP ثنائي الأبعاد من تحليل مكتمل، مع ترقيم الصفحات باستخدام offset وlimit (الافتراضي والحد الأقصى 50,000). يحتوي كل إدخال على id وumapX وumapY وsplit وclassIds وwidth وheight وbytes وlabelCount وmissing.

سرد النماذج المدرّبة على مجموعة بيانات#

GET /api/datasets/{owner}/{dataset}/models

Python SDK: client.datasets.models(owner, dataset)

الاستجابة:

{
    "models": [
        {
            "id": "65f1c0a2b3d4e5f601234599",
            "owner": "acme-vision",
            "project": "inspection",
            "model": "v3",
            "name": "v3",
            "status": "completed",
            "task": "detect",
            "epochs": 100,
            "bestEpoch": 87,
            "metrics": { "mAP50": 0.85, "mAP50-95": 0.72, "precision": 0.88, "recall": 0.81 },
            "startedAt": "2026-01-14T22:00:00Z",
            "completedAt": "2026-01-15T10:00:00Z",
            "createdAt": "2026-01-14T21:55:00Z"
        }
    ],
    "count": 1
}

سرد صور مجموعة البيانات#

GET /api/datasets/{owner}/{dataset}/images

Python SDK: client.datasets.images(owner, dataset)

معلمات الاستعلام:

المعلمةالنوعالوصف
limitintالحد الأقصى للصور المراد إرجاعها (الافتراضي: 50، الحد الأقصى: 5000)
offsetintالصور المطلوب تخطيها (الافتراضي: 0)
cursorstringآخر معرّف صورة من الصفحة السابقة، لترقيم الصفحات باستخدام المؤشر
includeTotalمنطقيتضمين العدد الإجمالي المتطابق (الافتراضي: true)
splitstringالتصفية حسب التقسيم: train وval وtest
hasLabelمنطقيالتصفية حسب حالة التعليقات التوضيحية
hasErrorمنطقيالتصفية حسب حالة خطأ المعالجة
classIdsstringمعرّفات الفئات مفصولة بفواصل؛ يعيد الصور التي تحتوي على أيٍّ منها
searchstringمطابقة السلسلة الجزئية لاسم الملف والبيانات الوصفية المخصصة (بحد أقصى 200 محرف)
sortstringnewest (افتراضي)، oldest، name-asc، name-desc، height-asc، height-desc، width-asc، width-desc، size-asc، size-desc، labels-asc، labels-desc
includeThumbnailsمنطقيتضمين عناوين URL موقعة للصور المصغّرة (الافتراضي: true)
includeImageUrlsمنطقيتضمين عناوين URL موقعة للصور بالحجم الكامل (الافتراضي: false)
includeLabelsمنطقيتضمين تعليقات توضيحية للمعاينة محدودة العدد (الافتراضي: false)

الاستجابة:

{
    "images": [
        {
            "id": "65f1c0a2b3d4e5f601234567",
            "hash": "9f2c1d4b6a8e0f3c5d7b9a1e2f4c6d8b",
            "ext": "jpg",
            "name": "aisle-04.jpg",
            "thumbnailUrl": "https://storage.googleapis.com/...&signature=...",
            "width": 1920,
            "height": 1080,
            "split": "train",
            "labelCount": 6,
            "bytes": 284213,
            "error": null
        }
    ],
    "total": 1000,
    "hasMore": true,
    "classes": ["person", "forklift"],
    "errorCount": 0,
    "nextCursor": "65f1c0a2b3d4e5f601234567"
}

الحصول على الصور المحددة#

POST /api/datasets/{owner}/{dataset}/images

Python SDK: client.datasets.selected_images(owner, dataset, image_ids=...)

يعيد شكل الصورة نفسه لما يصل إلى 1,000 من معرّفات الصور المقدّمة، ويقبل معاملات الاستعلام نفسها الخاصة بالتصفية وعنوان URL مثل عملية القائمة.

{
    "imageIds": ["65f1c0a2b3d4e5f601234567", "65f1c0a2b3d4e5f601234568"]
}

إدخال بيانات مجموعة البيانات#

POST /api/datasets/{owner}/{dataset}/ingest

Python SDK: client.datasets.ingest(owner, dataset, body=...)

يعالج عملية رفع مكتملة، أو أرشيفًا بعيدًا، أو مصدر تخزين متصلًا، في مجموعة بيانات موجودة. قدّم مصدرًا واحدًا بالضبط:

الحقلالنوعالوصف
sessionIdstringجلسة رفع من POST /api/upload/signed-url، مكتملة مسبقًا
sourceUrlstringعنوان URL عام عبر HTTP أو HTTPS لملف ZIP أو TAR أو TAR.GZ أو TGZ أو NDJSON (بحد أقصى 4096 محرفًا)
referenceكائنمصدر متصل: تخزين سحابي (provider: "cloud"، integrationId، target، prefix) أو محلي (On Premise) (provider: "local"، keyId، root، prefix)
targetSplitstringtrain أو val أو test؛ يتجاوز بنية التقسيم في الأرشيف
conflictPolicystringskip أو keep_both أو replace لتعارضات أسماء الملفات أو المحتوى
classMappingكائنيربط أسماء الفئات الواردة بفهرس فئة، أو باسم فئة موجود أو جديد، أو null لتخطيها
imageMetadataكائنبيانات وصفية مخصصة مفهرسة بمسار كل صورة النسبي إلى الأرشيف أو بقيمة file في NDJSON

ترتبط جلسات الرفع بمجموعة بيانات بواسطة assetId المُمرَّر إلى POST /api/upload/signed-url، ويرفض الإدخال جلسة تنتمي إلى مجموعة بيانات مختلفة.

النص (الأرشيف المُرفَع):

{
    "sessionId": "session_abc123",
    "targetSplit": "train"
}

النص (الأرشيف البعيد أو NDJSON):

{
    "sourceUrl": "https://example.com/my-dataset.zip"
}

النص (استيراد التسميات أثناء إدخال لاحق):

{
    "sessionId": "session_abc123",
    "classMapping": { "person": 0, "automobile": "forklift", "background": null }
}

النص (إرفاق البيانات الوصفية لكل صورة):

{
    "sessionId": "session_abc123",
    "imageMetadata": {
        "airbus-wing.jpg": { "aircraft": { "family": "A350" }, "inspectionStatus": "reviewed" },
        "images/tail.jpg": { "aircraft": { "family": "A320" }, "inspectionSeverity": 2 }
    }
}

يجب أن تتطابق مفاتيح البيانات الوصفية مع المسار المُطبَّع داخل الأرشيف، بما في ذلك المجلدات. في عمليات استيراد NDJSON، يمكن لكل سجل أن يحمل كائن metadata خاصًا به، وله الأولوية على إدخال imageMetadata المطابق. تقتصر مسارات الأرشيف على 1,024 محرفًا، ومفاتيح البيانات الوصفية ذات المستوى الأعلى على 128 محرفًا، وكل كائن بيانات وصفية — وكذلك خريطة imageMetadata بأكملها — على 500,000 محرف مُسلسل.

تعيين الفئات

ينشئ الإدخال الأول الفئات من الأرشيف تلقائيًا. في عمليات الإدخال اللاحقة، تعود فئات الأرشيف المحذوفة من classMapping إلى مطابقة غير حساسة لحالة الأحرف مع فئات مجموعة البيانات الموجودة. لا تُتخطى التسميات إلا للفئات المعيّنة صراحةً إلى null أو التي لا تملك فئة موجودة مطابقة.

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

{
    "jobId": "65f1c0a2b3d4e5f6012345aa",
    "status": "queued"
}
graph LR
    A[POST /api/datasets]:::start --> B[POST /api/upload/signed-url]:::proc
    B --> C[PUT archive to signed URL]:::proc
    C --> D[POST /api/upload/complete]:::proc
    D --> E["POST /api/datasets/{owner}/{dataset}/ingest"]:::proc
    E --> F[Process archive]:::proc
    F --> G[Dataset ready]:::out

    classDef start fill:#4CAF50,color:#fff
    classDef proc fill:#2196F3,color:#fff
    classDef out fill:#9C27B0,color:#fff
رفع صورة واحدة مع بيانات وصفية باستخدام Python

يتعامل الكود نفسه مع مجموعة من الصور: أضف المزيد من الملفات إلى ZIP والإدخالات المطابقة إلى imageMetadata.

import io
import zipfile
from pathlib import Path

import requests

api = "https://platform.ultralytics.com/api"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
owner, dataset = "acme-vision", "warehouse"
dataset_id = "65f1c0a2b3d4e5f601234567"  # id returned by POST /api/datasets
image_path = Path("airbus-wing.jpg")

archive = io.BytesIO()
with zipfile.ZipFile(archive, "w", zipfile.ZIP_DEFLATED) as zf:
    zf.write(image_path, image_path.name)
data = archive.getvalue()

signed = requests.post(
    f"{api}/upload/signed-url",
    headers=headers,
    json={
        "assetType": "datasets",
        "assetId": dataset_id,
        "filename": "images.zip",
        "contentType": "application/zip",
        "totalBytes": len(data),
    },
)
signed.raise_for_status()
upload = signed.json()

requests.put(upload["uploadUrl"], headers={"Content-Type": "application/zip"}, data=data).raise_for_status()
requests.post(
    f"{api}/upload/complete",
    headers=headers,
    json={"sessionId": upload["sessionId"]},
).raise_for_status()

ingest = requests.post(
    f"{api}/datasets/{owner}/{dataset}/ingest",
    headers=headers,
    json={
        "sessionId": upload["sessionId"],
        "imageMetadata": {
            "airbus-wing.jpg": {
                "aircraft": {"family": "A350", "section": "wing"},
                "inspectionStatus": "reviewed",
            }
        },
    },
)
ingest.raise_for_status()
print(ingest.json())

واجهة برمجة تطبيقات الصور#

افحص صور مجموعة البيانات وعلّق عليها وانقلها واحذفها باستخدام معرّف الصورة المكوّن من 24 محرفًا. راجع وثائق التعليقات التوضيحية.

الحصول على صورة#

GET /api/images/{imageId}

Python SDK: client.images.retrieve(image_id)

يعيد كائن metadata (مخصص، يحدده المستخدم)، ومصفوفة properties (اسم الملف، التجزئة، الأبعاد، التقسيم، الأعداد، الطوابع الزمنية)، وlabels، وclassNames الخاصة بمجموعة البيانات.

تحديث صورة#

PATCH /api/images/{imageId}

Python SDK: client.images.update(image_id, body=...)

يستبدل إما التعليقات التوضيحية أو البيانات الوصفية المخصصة — أرسل أحد الشكلين، وليس كليهما.

النص (التعليقات التوضيحية):

{
    "labels": [
        { "classId": 0, "bbox": [0.5, 0.5, 0.2, 0.3] },
        { "classId": 1, "segments": [0.1, 0.2, 0.3, 0.2, 0.2, 0.4] }
    ]
}

النص (البيانات الوصفية):

{
    "metadata": { "location": "strasbourg", "reviewed": true }
}
تنسيق الإحداثيات

تستخدم إحداثيات التسميات قيم YOLO مُطبَّعة بين 0 و1. تستخدم مربعات الإحاطة [x_center, y_center, width, height]. وتستخدم تسميات التجزئة segments، وهي قائمة مسطحة من رؤوس المضلع [x1, y1, x2, y2, ...]. وتستخدم تسميات الوضعية keypoints في شكل مسطح متسق: أزواج [x1, y1, x2, y2, ...] أو ثلاثيات [x1, y1, v1, x2, y2, v2, ...]، حيث تستخدم الرؤية تقليديًا القيم 0 أو 1 أو 2. وتستخدم المربعات الموجّهة زوايا obb. تُقرَّب الإحداثيات المحفوظة إلى 5 منازل عشرية، وتقبل الصورة بحد أقصى 10,000 تعليق توضيحي.

حذف صورة#

DELETE /api/images/{imageId}

Python SDK: client.images.delete(image_id)

يحذف صورة واحدة وتعليقاتها التوضيحية نهائيًا.

إضافة تعليقات توضيحية تلقائية إلى صورة#

POST /api/images/{imageId}/predict

Python SDK: client.images.predict(image_id, model_id=...)

يشغّل استدلال YOLO على الصورة ويعيد التعليقات التوضيحية المتوقعة. لا يحفظها — اكتب النتائج مرة أخرى باستخدام PATCH /api/images/{imageId} عندما تقتنع بها.

الحقلالنوعمطلوبالوصف
modelIdstringنعممعرّف URI مؤهل بالكامل للنموذج، ul://{owner}/{project}/{model}
confidencefloatلاعتبة الثقة، 0.01 – 1.0 (الافتراضي: 0.25)
ioufloatلاعتبة IoU لكبت القيمة العظمى غير الكلي، 0.0 – 0.95 (الافتراضي: 0.7)

الاستجابة: success، وpredictions (كائنات التعليقات التوضيحية)، وmodelUsed، وinferenceTime. يعيد النموذج الذي لا تتطابق فئاته مع مجموعة البيانات 422.

التسمية التلقائية لمجموعة بيانات#

POST /api/datasets/{owner}/{dataset}/predict/batch

Python SDK: client.datasets.create_batch(owner, dataset, model_id=...)

يحفظ إصدار مجموعة بيانات، ثم يُدرج تشغيلاً في قائمة الانتظار يقوم بتسمية الصور غير المسمّاة في مجموعة البيانات باستخدام النموذج ويُرجع 202. يقبل جسم الطلب نفس حقول modelId وconfidence وiou الخاصة بنقطة نهاية الصورة الواحدة، بالإضافة إلى includeAnnotated (الافتراضي هو false) لتسمية الصور التي تحتوي بالفعل على تسميات أيضاً، ومصفوفة اختيارية classMapping تُحدد فهرس فئة مجموعة البيانات لكل فئة من فئات النموذج، أو null لتخطي ذلك. لا تُغيَّر التسميات الموجودة أبداً، ويتم فوترة التشغيل ل مقابل الصور التي يُعالجها بالفعل. يعني 402 أن الرصيد لا يغطي التقدير، ويعني 409 أن مجموعة البيانات ليست جاهزة، أو ليس لديها صور متبقية للتسمية، أو لديها بالفعل تشغيل قيد التنفيذ، ويعني 422 أن مجموعة البيانات ليس لها فئات: أنشئ الفئات باستخدام نقطة نهاية الفئات قبل استدعاء نقطة النهاية هذه، وهو ما تقوم به خطوة تعيين الفئات في التطبيق قبل بدء التشغيل.

يُرجع GET على نفس المسار (client.datasets.batch(owner, dataset)) التشغيل قيد التنفيذ وتقدمه، أو آخر تشغيل مُكتمل حتى يتم تجاهله؛ يُلغي DELETE (client.datasets.delete_batch(owner, dataset)) تشغيلاً قيد التنفيذ أو يُسوي الفواتير ويتجاهل الملخص المُكتمل.

نقل الصور دفعة واحدة#

PATCH /api/images/bulk

Python SDK: client.images.update_bulk(image_ids=..., split=...)

ينقل ما يصل إلى 1,000 صورة من مجموعة بيانات إلى تقسيم مختلف.

{
    "imageIds": ["65f1c0a2b3d4e5f601234567"],
    "split": "val",
    "conflictPolicy": "skip"
}

تعيد تعارضات أسماء الملفات أو المحتوى 409 إلى أن تختار conflictPolicy موحّدًا على مستوى الدفعة من skip أو keep_both أو replace. وتُبلغ الاستجابة عن modifiedCount وskippedCount وtargetSplit.

حذف الصور دفعة واحدة#

DELETE /api/images/bulk

Python SDK: client.images.delete_bulk(image_ids=...)

{
    "imageIds": ["65f1c0a2b3d4e5f601234567", "65f1c0a2b3d4e5f601234568"]
}

يحذف ما يصل إلى 1,000 صورة من مجموعة بيانات واحدة ويعيد deletedCount وdeletedImageIds.

الحصول على عناوين URL موقعة للصور#

POST /api/images/urls

Python SDK: client.images.urls(image_ids=...)

يعيد عناوين URL موقعة مؤقتة لما يصل إلى 100 معرّف صورة من مجموعة بيانات واحدة.

{
    "imageIds": ["65f1c0a2b3d4e5f601234567"]
}

الاستجابة: urls وthumbnails، وكلاهما مفهرس بمعرّف الصورة.


واجهة برمجة تطبيقات المشاريع#

نظّم نماذجك في مشاريع. ينتمي كل نموذج إلى مشروع واحد. راجع وثائق المشاريع.

سرد المشاريع#

GET /api/projects/{owner}

Python SDK: client.projects.list(owner)

معلمات الاستعلام:

المعلمةالنوعالوصف
limitintالحد الأقصى للمشاريع المراد إعادتها (الافتراضي: 20، الحد الأقصى: 500)

الحصول على مشروع#

GET /api/projects/{owner}/{project}

Python SDK: client.projects.retrieve(owner, project)

يعيد كائن project، ومصفوفة models من الملخصات الخاصة بكل نموذج (الحالة، المقاييس، العصور التدريبية، الأوزان، وسيطات التدريب)، وisOwner.

إنشاء مشروع#

POST /api/projects

Python SDK: client.projects.create(project=..., name=...)

الحقلالنوعمطلوبالوصف
projectstringنعماسم المشروع المستخدم في عناوين URL للمنصة
namestringنعماسم العرض (بحد أقصى 100 محرف)
descriptionstringلاالوصف (بحد أقصى 1000 محرف)
visibilitystringلاpublic أو private
tagsمصفوفةلاما يصل إلى 50 وسمًا
licensestringلامعرّف ترخيص المشروع
metadataكائنلابيانات وصفية مخصصة بتنسيق JSON
ownerstringلامُعرّف مساحة عمل الفريق؛ ويُعيّن افتراضيًا إلى مساحة العمل الشخصية
curl -X POST \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "project": "inspection",
    "name": "Inspection",
    "description": "Detection experiments",
    "metadata": {"department": "manufacturing", "cost_center": "cv-01"}
  }' \
  https://platform.ultralytics.com/api/projects

الاستجابة (201): id وowner وproject وregion.

تحديث مشروع#

PATCH /api/projects/{owner}/{project}

Python SDK: client.projects.update(owner, project)

الحقول المقبولة: name وdescription وvisibility وmetadata وtags وlicense وarchived وiconColor، وiconLetter وviewPreferences وstarred.

{
    "metadata": { "department": "research", "program": "inspection" }
}

أرسل كائن metadata فارغًا ({}) لمسحه. تستخدم البيانات الوصفية للمشروع حدَّ المفتاح نفسه البالغ 128 محرفًا وحدَّ الكائن المُسلسل البالغ 500,000 محرف كما في البيانات الوصفية لمجموعة البيانات.

حذف المشروع#

DELETE /api/projects/{owner}/{project}

Python SDK: client.projects.delete(owner, project)

ينقل المشروع ونماذجه إلى سلة المهملات، مع إعادة cascadedModels.

استنساخ المشروع#

POST /api/projects/{owner}/{project}/clone

Python SDK: client.projects.clone(owner, project)

ينسخ مشروعًا يمكن الوصول إليه ونماذجه المكتملة. يقبل النص الاختياري project وname وdescription، وvisibility وlicense ووجهة owner.


واجهة برمجة تطبيقات النماذج#

أدِر نماذج YOLO المدرَّبة — اعرض المقاييس، ونزّل الأوزان، وشغّل الاستدلال، وراقب التدريب. راجع وثائق النماذج.

سرد النماذج في مشروع#

GET /api/models/{owner}/{project}

Python SDK: client.models.list(owner, project)

معلمات الاستعلام:

المعلمةالنوعالوصف
limitintالحد الأقصى للنماذج المراد إعادتها (الافتراضي: 20، الحد الأقصى: 100)

الحصول على نموذج#

GET /api/models/{owner}/{project}/{model}

Python SDK: client.models.retrieve(owner, project, model)

معلمات الاستعلام:

المعلمةالنوعالوصف
analysisintاضبطه على 1 لإعادة تحليل التحقق لكل صورة بدلًا من النموذج

تتضمن الاستجابة الافتراضية كائن model — الحالة، والمهمة، والمقاييس، وtrainArgs، وtrainResults، وclassNames، وcomputeCost، وmetadata، وغير ذلك — بالإضافة إلى isOwner.

إنشاء نموذج#

POST /api/models

Python SDK: client.models.create(body=...)

ينشئ سجلًا لنموذج غير مدرَّب يمكنك إرفاق أوزان به أو تدريبه.

الحقلالنوعمطلوبالوصف
projectstringنعماسم المشروع الوجهة
ownerstringلامعرّف مساحة العمل؛ يُضبط افتراضيًا على مساحة عملك الشخصية
modelstringلااسم النموذج المستخدم في عناوين URL للمنصة؛ يُولَّد عند حذفه
namestringلااسم العرض (يُقبل فقط بالاقتران مع model)
descriptionstringلاالوصف (بحد أقصى 1000 محرف)
taskstringلاdetect أو segment أو semantic أو depth أو classify أو pose أو obb
metadataكائنلابيانات وصفية مخصصة بتنسيق JSON
trainArgsكائنلاوسيطات التدريب المراد تسجيلها
metricsكائنلامقاييس مثل mAP50 وmAP50-95 وprecision وrecall
epochsرقملاعدد العصور التدريبية لنموذج مدرَّب مسبقًا
versionstringلاتسمية الإصدار (بحد أقصى 50 محرفًا)

الاستجابة (201): id وowner وproject وmodel وregion.

رفع ملف النموذج

لإرفاق أوزان .pt، اطلب عنوان URL موقّعًا للرفع باستخدام assetType: "models" ومعرّف id لهذا النموذج بوصفه assetId، وارفع PUT إلى عنوان URL المُعاد، ثم استدعِ POST /api/upload/complete باستخدام sessionId المُعاد.

تحديث نموذج#

PATCH /api/models/{owner}/{project}/{model}

Python SDK: client.models.update(owner, project, model)

تشمل الحقول المقبولة name، وdescription، وcolor، وmetadata، وstatus، وlicense، وdatasetSlug، وtrainArgs، وtrainResults، وepochs، وbestEpoch، وbestFitness، وversion، وtrainingError، وstarred. تمرير projectId بمفرده ينقل النموذج إلى مشروع آخر لنفس المالك؛ وترجع الاستجابة slug الخاص بالنموذج في الوجهة، وrenamed: true عندما يكون هذا الـ slug محجوزاً هناك بالفعل، و409 بينما لا يزال النموذج قيد التدريب.

{
    "metadata": { "release": "candidate-3", "reviewed": true }
}

إن metadata المخصص منفصل عن الحقول المملوكة للتدريب مثل trainArgs وenvironment وtrainResults، ويستخدم حدود الحجم نفسها الخاصة بالبيانات الوصفية لمجموعة البيانات.

حذف النموذج#

DELETE /api/models/{owner}/{project}/{model}

Python SDK: client.models.delete(owner, project, model)

ينقل النموذج إلى سلة المهملات لمدة 30 يومًا.

تنزيل ملفات النموذج#

GET /api/models/{owner}/{project}/{model}/files

Python SDK: client.models.files(owner, project, model)

يعيد عناوين URL موقّعة قصيرة الأجل لأوزان النموذج.

{
    "files": [
        {
            "name": "best.pt",
            "size": 6534127,
            "downloadUrl": "https://storage.googleapis.com/...&signature=..."
        }
    ]
}

استنساخ النموذج#

POST /api/models/{owner}/{project}/{model}/clone

Python SDK: client.models.clone(owner, project, model, project_body=...)

ينسخ نموذجًا يمكن الوصول إليه إلى مشروع موجود.

{
    "owner": "acme-vision",
    "project": "inspection",
    "model": "v3-copy",
    "name": "V3 Copy",
    "description": "Cloned from a public model"
}
الحقلالنوعمطلوبالوصف
projectstringنعماسم المشروع الوجهة
ownerstringلامساحة العمل الوجهة؛ تُضبط افتراضيًا على مساحتك الشخصية
modelstringلااسم النموذج الوجهة
namestringلااسم العرض الوجهة
descriptionstringلاوصف النسخة المستنسخة

تشغيل الاستدلال#

POST /api/models/{owner}/{project}/{model}/predict

Python SDK: client.models.predict(owner, project, model, body=...)

يمكن إجراء التنبؤ باستخدام النماذج العامة دون مصادقة. تتطلب النماذج الخاصة والمشتركة مفتاح API يتيح الوصول إلى المشروع الأصلي.

نموذج متعدد الأجزاء:

المعلمةالنوعالافتراضيالنطاقالوصف
filefile--ملف صورة أو فيديو (مطلوب ما لم يتم تعيين source)
conffloat0.250.01 – 1.0الحد الأدنى لعتبة الثقة
ioufloat0.70.0 – 0.95عتبة IoU الخاصة بـ NMS
imgszint64032 – 1280حجم صورة الإدخال بالبكسل
normalizeboolfalse-إرجاع إحداثيات المربع المحيط ضمن النطاق 0 – 1
decimalsint50 – 10الدقة العشرية لقيم الإحداثيات
bitsint88, 12, 16تكميم خريطة العمق، لنماذج العمق فقط
sourcestring--عنوان URL للصورة أو سلسلة base64 (بديل عن file)

وفّر إما file أو source. تقبل نماذج العمق أيضًا bits (8 أو 12 أو 16) لتحديد تكميم خريطة العمق بصيغة PNG. تُرجع الطلبات التي تتجاوز حدود الإدخال للخدمة 413.

curl -X POST \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "file=@image.jpg" \
  -F "conf=0.5" \
  https://platform.ultralytics.com/api/models/acme-vision/inspection/v3/predict

الاستجابة:

يحمل كل إدخال في images كلًا من shape وspeed وresults، بالإضافة إلى حمولة PNG في semantic_mask أو depth لمهام التنبؤ الكثيف (قيم العمق هي pixel × max / divisor، مع قاسم قدره 255 للخريطة الافتراضية ذات 8 بت و65535 عندما تكون قيمة bits هي 12 أو 16). يُبلغ الكائن metadata عن عدد الصور، وأزمنة تنفيذ الدوال، والمهمة، وإصدارات الخدمة. لا تُعاد مسارات النماذج الداخلية مطلقًا.

{
    "images": [
        {
            "shape": [1080, 1920],
            "speed": { "preprocess": 2.1, "inference": 12.4, "postprocess": 1.3 },
            "results": [
                {
                    "class": 0,
                    "name": "person",
                    "confidence": 0.92,
                    "box": { "x1": 100, "y1": 50, "x2": 300, "y2": 400 }
                }
            ]
        }
    ],
    "metadata": {
        "imageCount": 1,
        "functionTimeAlive": 184.2,
        "functionTimeCall": 0.31,
        "task": "detect",
        "version": { "ultralytics": "8.4.120" }
    }
}

التحقق من تقدم التدريب#

GET /api/models/{owner}/{project}/{model}/training

Python SDK: client.models.training(owner, project, model)

تُرجع job التي تتضمن الحالة، وتقدم الحِقبة، والتوقيت، وتفاصيل الحوسبة، ووسائط التدريب، ومقاييس الحِقب، وتفاصيل الأخطاء الآمنة، أو null عندما لا يكون النموذج قد دُرّب قط. يمكن قراءة النماذج في المشاريع العامة دون مصادقة.

إلغاء التدريب#

DELETE /api/models/{owner}/{project}/{model}/training

Python SDK: client.models.delete_training(owner, project, model)

ينهي مثيل الحوسبة قيد التشغيل ويضع علامة على المهمة باعتبارها ملغاة. تُرجع 409 عندما لا يعود التدريب نشطًا.


واجهة برمجة تطبيقات التدريب#

شغّل تدريب YOLO على وحدات GPU السحابية وراقب التقدم في الوقت الفعلي. راجع وثائق التدريب السحابي.

graph LR
    A[POST /api/training/start]:::start --> B[Job Created]:::proc
    B --> C{Training}:::decide
    C -->|progress| D[GET .../training]:::proc
    C -->|cancel| E[DELETE .../training]:::error
    C -->|complete| F[Model Ready]:::out
    F --> G[Deploy or Export]:::proc

    classDef start fill:#4CAF50,color:#fff
    classDef proc fill:#2196F3,color:#fff
    classDef decide fill:#FF9800,color:#fff
    classDef out fill:#9C27B0,color:#fff
    classDef error fill:#F44336,color:#fff

الحصول على مدى توفر GPU#

GET /api/training/gpu-availability

Python SDK: client.training.gpu_availability()

تُرجع حالة المخزون الحالية مرتبة حسب معرّف GPU. وهي عامة ولا تتطلب مصادقة؛ مرّر managed=true لتضمين سعة التدريب المُدارة، التي تتطلب مفتاح API.

بدء التدريب#

POST /api/training/start

Python SDK: client.training.start(model_id=..., train_args=...)

الحقلالنوعمطلوبالوصف
modelIdstringنعممعرّف النموذج المراد تدريبه
trainArgsكائننعموسائط تدريب YOLO؛ يلزم توفير model وdata وepochs
gpuTypestringلاوحدة GPU السحابية المطلوب استخدامها (الافتراضي: rtx-4090)
captureDatasetVersionمنطقيلااحفظ إصدارًا غير قابل للتغيير من مجموعة البيانات لهذا التشغيل (الافتراضي: false)
curl -X POST \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "modelId": "65f1c0a2b3d4e5f601234599",
    "gpuType": "rtx-4090",
    "trainArgs": {
      "model": "yolo26n.pt",
      "data": "ul://acme-vision/datasets/warehouse",
      "epochs": 100,
      "imgsz": 640,
      "batch": 16
    }
  }' \
  https://platform.ultralytics.com/api/training/start

الاستجابة:

{
    "modelId": "65f1c0a2b3d4e5f601234599",
    "status": "starting",
    "gpuType": "rtx-4090",
    "estimatedCost": { "pricePerHour": 0.69, "gpuMemoryGb": 24 },
    "billing": {
        "estimatedCostCents": 138,
        "estimatedCostDisplay": "$1.38",
        "balanceCents": 2500
    }
}

يُرجع التدريب 402 عندما يكون رصيدك من الاعتمادات منخفضًا جدًا، و503 عندما لا تتوفر سعة لوحدة GPU المطلوبة.

أنواع GPU

يتوفر 26 نوعًا من وحدات GPU، بدءًا من rtx-2000-ada وحتى b300، بما في ذلك rtx-4090 وl40s وa100-80gb-pcie وa100-80gb-sxm وrtx-pro-6000 وh100-sxm وh200-sxm وb200. راجع التدريب السحابي للاطلاع على القائمة الكاملة مع الأسعار.


واجهة برمجة تطبيقات التصدير#

حوّل النماذج إلى تنسيقات محسّنة مثل ONNX وTensorRT وCoreML وLiteRT للنشر على الأجهزة الطرفية. راجع وثائق النشر.

سرد عمليات التصدير#

GET /api/models/{owner}/{project}/{model}/exports

Python SDK: client.exports.list(owner, project, model)

معلمات الاستعلام:

المعلمةالنوعالوصف
statusstringالتصفية حسب queued أو starting أو running أو completed أو failed أو cancelled
limitintالحد الأقصى لعمليات التصدير المراد إرجاعها (الافتراضي: 20، الحد الأقصى: 100)

إنشاء عملية تصدير#

POST /api/models/{owner}/{project}/{model}/exports

Python SDK: client.exports.create(owner, project, model, format=...)

الحقلالنوعمطلوبالوصف
formatstringنعمتنسيق التصدير المستهدف (راجع الجدول أدناه)
gpuTypestringمشروطمطلوب عندما تكون قيمة format هي engine؛ استخدم هدف GPU أو Jetson مدعومًا
argsكائنلاخيارات التصدير: imgsz، quantize، dynamic، simplify، opset، conf، iou، batch، workspace، nms، optimize، keras، و name (الهدف الخاص بالجهاز لصيغ RKNN، QNN، Hailo، و Ascend)
curl -X POST \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"format": "onnx", "args": {"imgsz": 640, "quantize": 16}}' \
  https://platform.ultralytics.com/api/models/acme-vision/inspection/v3/exports

الاستجابة (201): id وformat وstatus (queued أو running) وgpuType وregion. تُرجع عملية تصدير مكافئة قيد التنفيذ بالفعل 409.

التنسيقات المدعومة:

استخدم الوسيط format من جدول التصدير المشترك أدناه. يُعد PyTorch تنسيق المصدر، وليس هدفًا لتصدير API.

التنسيقوسيط formatالنموذجالبيانات الوصفيةالوسائط
PyTorch-yolo26n.pt-
TorchScripttorchscriptyolo26n.torchscriptimgsz، quantize، dynamic، nms، batch، device
ONNXonnxyolo26n.onnximgsz، quantize، dynamic، simplify، opset، nms، batch، data، fraction، device
OpenVINOopenvinoyolo26n_openvino_model/imgsz، quantize، dynamic، nms، batch، data، fraction، device
TensorRTengineyolo26n.engineimgsz، quantize، dynamic، simplify، opset، workspace، nms، batch، data، fraction، device
CoreMLcoremlyolo26n.mlpackageimgsz، dynamic، quantize، nms، batch، device
TF SavedModelsaved_modelyolo26n_saved_model/imgsz، keras، quantize، opset، nms، batch، data، fraction، device
TF GraphDefpbyolo26n.pbimgsz، opset، batch، device
TF Edge TPUedgetpuyolo26n_edgetpu.tfliteimgsz، quantize، opset، data، fraction، device
PaddlePaddlepaddleyolo26n_paddle_model/imgsz، batch، device
MNNmnnyolo26n.mnnimgsz، batch، dynamic، quantize، simplify، opset، nms، device
NCNNncnnyolo26n_ncnn_model/imgsz، quantize، batch، device
IMX500imxyolo26n_imx_model/imgsz، quantize، data، fraction، nms، device
RKNNrknnyolo26n_rknn_model/imgsz، batch، name، quantize، simplify، opset، data، fraction، device
ExecuTorchexecutorchyolo26n_executorch_model/imgsz، batch، device
Axeleraaxelerayolo26n_axelera_model/imgsz، batch، quantize، data، fraction، device
DEEPXdeepxyolo26n_deepx_model/imgsz، quantize، simplify، opset، data، optimize، device
Qualcomm QNNqnnyolo26n_qnn.onnximgsz، batch، name، quantize، simplify، opset، data، fraction، device
LiteRTlitertyolo26n.tfliteimgsz، quantize، batch، data، fraction، device
Hailohailoyolo26n_hailo_model/imgsz، name، quantize، data، fraction، simplify، conf، iou
Huawei Ascendascendyolo26n_ascend_model/imgsz، batch، name، quantize، opset، simplify، nms
Apple Core AIcoreaiyolo26n.aimodelimgsz، batch، quantize

يفترض nms=None المخرجات الخام لـ NMS الخارجي. قم بتعيين nms=False لتحديد رأس متاح خالٍ من NMS؛ وتتراجع التنسيقات غير المدعومة إلى مسار إخراجها الأصلي. وتحدد مُدخلات nms أعلاه التنسيقات التي يمكنها تضمين NMS باستخدام nms=True.

الحصول على حالة التصدير#

GET /api/models/{owner}/{project}/{model}/exports/{exportId}

Python SDK: client.exports.retrieve(owner, project, model, export_id)

تُرجع الكائن export الذي يتضمن status وformat وargs وgpuType والطوابع الزمنية، وبمجرد الاكتمال، كائن file الذي يتضمن size وdownloadUrl وdownloadFilename.

إلغاء عملية التصدير أو حذفها#

DELETE /api/models/{owner}/{project}/{model}/exports/{exportId}

Python SDK: client.exports.delete(owner, project, model, export_id)

يلغي عملية تصدير نشطة أو يحذف عملية مكتملة وملفها. تُبلغ الاستجابة بما حدث:

{
    "success": true,
    "action": "cancelled"
}

واجهة برمجة تطبيقات عمليات النشر#

انشر النماذج إلى نقاط نهاية استدلال مخصصة مع فحوصات السلامة والمراقبة. راجع وثائق نقاط النهاية.

graph LR
    A[Create]:::start --> B[Deploying]:::proc
    B --> C[Ready]:::out
    C -->|action stop| D[Stopped]:::extern
    C -->|action replace| B
    D -->|action start| C
    C -->|delete| E[Deleted]:::error
    D -->|delete| E
    C -->|predict| F[Inference Results]:::out

    classDef start fill:#4CAF50,color:#fff
    classDef proc fill:#2196F3,color:#fff
    classDef out fill:#9C27B0,color:#fff
    classDef error fill:#F44336,color:#fff
    classDef extern fill:#607D8B,color:#fff

سرد عمليات النشر#

GET /api/deployments/{owner}

Python SDK: client.deployments.list(owner)

معلمات الاستعلام:

المعلمةالنوعالوصف
statusstringcreating أو deploying أو ready أو stopping أو stopped أو failed
modelstringالتصفية حسب {project}/{model}، مثلًا inspection/v3
limitintالحد الأقصى لعمليات النشر المراد إرجاعها (الافتراضي: 20، الحد الأقصى: 100)

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

إنشاء عملية نشر#

POST /api/deployments/{owner}

Python SDK: client.deployments.create(owner, project=..., model=..., deployment=..., name=..., region=...)

النص:

{
    "project": "inspection",
    "model": "v3",
    "deployment": "edge-1",
    "name": "Edge 1",
    "region": "us-central1"
}
الحقلالنوعمطلوبالوصف
projectstringنعمالمشروع الذي يحتوي على النموذج
modelstringنعمالنموذج المراد نشره
deploymentstringنعماسم النشر المستخدم في عناوين URL للمنصة
namestringنعماسم العرض
regionstringنعمإحدى مناطق النشر المدعومة وعددها 42

الاستجابة (201): id وdeployment وstatus (creating) وmessage وregion.

تحديد حجم الموارد

تُدار وحدة CPU والذاكرة وتوسعة المثيلات بواسطة المنصة وفقًا لحدود خطتك، ولا يقبل طلب الإنشاء إعدادًا للموارد. تُعاد القيم الحالية في الكائن resources عند كل قراءة لعملية نشر.

اختيار المنطقة

اختر منطقة قريبة من المستخدمين للحصول على أقل زمن استجابة. تعرض واجهة مستخدم المنصة تقديرات زمن الاستجابة لجميع المناطق الـ42 المتاحة.

الحصول على عملية نشر#

GET /api/deployments/{owner}/{deployment}

Python SDK: client.deployments.retrieve(owner, deployment)

تُرجع الكائن deployment الذي يتضمن status وstatusMessage وregion وserviceUrl وresources.

بدء عملية نشر أو إيقافها أو استبدالها#

PATCH /api/deployments/{owner}/{deployment}

Python SDK: client.deployments.update(owner, deployment, body=...)

يحدد حقل action واحد العملية:

{ "action": "start" }

يؤدي الاستبدال إلى نشر مراجعة جديدة مع الحفاظ على معرّف النشر والمنطقة وعنوان URL لنقطة النهاية؛ وتظل المراجعة الحالية قيد التشغيل إذا فشل النشر. يجب أن يكون النموذج البديل نموذجًا مكتملًا بأوزان يمكن لمفتاحك الوصول إليها. تُرجع العمليات المكتملة 200 مع status وready أو stopped؛ أما العمليات التي لا تزال قيد النشر فتُرجع 202 مع deploying أو stopping.

حذف عملية نشر#

DELETE /api/deployments/{owner}/{deployment}

Python SDK: client.deployments.delete(owner, deployment)

يزيل نقطة نهاية الاستدلال نهائيًا.

فحص الحالة#

GET /api/deployments/{owner}/{deployment}/health

Python SDK: client.deployments.health(owner, deployment)

يرسل إشارات اختبارية إلى نقطة النهاية ويهيئها، ويُرجع healthy وlatencyMs ورمز status من المنبع.

تشغيل الاستدلال على عملية نشر#

POST /api/deployments/{owner}/{deployment}/predict

Python SDK: client.deployments.predict(owner, deployment, body=...)

يوجّه صورة أو فيديو عبر نقطة النهاية المخصصة. تتطابق عقود الطلب والاستجابة مع استدلال النموذج.

نموذج متعدد الأجزاء:

المعلمةالنوعالافتراضيالنطاقالوصف
filefile--ملف صورة أو فيديو (مطلوب ما لم يتم تعيين source)
conffloat0.250.01 – 1.0الحد الأدنى لعتبة الثقة
ioufloat0.70.0 – 0.95عتبة IoU الخاصة بـ NMS
imgszint64032 – 1280حجم صورة الإدخال بالبكسل
normalizeboolfalse-إرجاع إحداثيات المربع المحيط ضمن النطاق 0 – 1
decimalsint50 – 10الدقة العشرية لقيم الإحداثيات
bitsint88, 12, 16تكميم خريطة العمق، لنماذج العمق فقط
sourcestring--عنوان URL للصورة أو سلسلة base64 (بديل عن file)

الحصول على المقاييس#

GET /api/deployments/{owner}/{deployment}/metrics

Python SDK: client.deployments.metrics(owner, deployment)

معلمات الاستعلام:

المعلمةالنوعالوصف
rangestring1h أو 6h أو 24h (الافتراضي) أو 7d أو 30d
sparklineمنطقيإرجاع ملخص لوحة المعلومات الموجز بدلًا من السلسلة الكاملة (الافتراضي: false)

تتضمن الاستجابة الكاملة summary (إجماليات الطلبات، ومعدل الأخطاء، ومتوسط زمن الاستجابة وp50/p95/p99) وtimeSeries (الطلبات، والأخطاء، وزمن الاستجابة، ووحدة CPU، والذاكرة، وعدد المثيلات). وتُرجع استجابة المخطط المصغر requests24h وtotalRequests وerrorRate وavgLatencyMs.

الحصول على السجلات#

GET /api/deployments/{owner}/{deployment}/logs

Python SDK: client.deployments.logs(owner, deployment)

معلمات الاستعلام:

المعلمةالنوعالوصف
severitystringمفصولة بفواصل: DEBUG وINFO وNOTICE وWARNING وERROR وCRITICAL وALERT وEMERGENCY
limitintعدد الإدخالات المراد إرجاعها (الافتراضي: 50، الحد الأقصى: 200)
pageTokenstringرمز ترقيم الصفحات من استجابة سابقة

واجهة برمجة تطبيقات سلة المحذوفات#

اعرض المشاريع ومجموعات البيانات والنماذج المحذوفة حذفًا غير نهائي، واستعدها، واحذفها نهائيًا. تُحذف العناصر تلقائيًا بعد 30 يومًا. راجع وثائق سلة المحذوفات.

سرد محتويات سلة المهملات#

GET /api/trash

Python SDK: client.lifecycle.trash()

معلمات الاستعلام:

المعلمةالنوعالوصف
typestringall (الافتراضي) أو project أو dataset أو model
pageintرقم الصفحة (الافتراضي: 1)
limitintالعناصر في كل صفحة (الافتراضي: 50، الحد الأقصى: 200)

تتضمن الاستجابة items (وكل منها يتضمن daysRemaining) وtotal وpage وlimit وtotalPages، بالإضافة إلى summary الذي يتضمن الإجماليات حسب النوع.

استعادة العنصر#

POST /api/trash

Python SDK: client.lifecycle.restore(id=..., type=...)

{
    "id": "65f1c0a2b3d4e5f601234567",
    "type": "dataset"
}

تؤدي استعادة مشروع أيضًا إلى استعادة النماذج التي نُقلت إلى سلة المحذوفات معه، ويُبلغ عنها باعتبارها restoredModels.

الحذف النهائي#

DELETE /api/trash

Python SDK: client.lifecycle.delete_trash(body=...)

احذف عنصرًا واحدًا:

{
    "id": "65f1c0a2b3d4e5f601234567",
    "type": "dataset"
}

أو أفرغ سلة المحذوفات بأكملها:

{
    "all": true
}

تُبلغ الاستجابة عن deletedCount، بالإضافة إلى cascadedModels وsurvivingDeployments عند الاقتضاء.

غير قابل للعكس

لا يمكن التراجع عن الحذف النهائي. تتم إزالة المورد وجميع البيانات المرتبطة به.


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

حمّل الملفات مباشرةً إلى التخزين السحابي باستخدام عناوين URL موقعة. يؤدي إكمال تحميل نموذج إلى إرفاق أوزانه؛ أما إكمال تحميل أرشيف مجموعة بيانات فيسجل الجلسة، ثم تمررها إلى إدخال مجموعة البيانات. راجع وثائق البيانات.

الحصول على عنوان URL موقّع للتحميل#

POST /api/upload/signed-url

Python SDK: client.upload.signed_url(body=...)

النص:

{
    "assetType": "datasets",
    "assetId": "65f1c0a2b3d4e5f601234567",
    "filename": "warehouse.zip",
    "contentType": "application/zip",
    "totalBytes": 52428800
}
الحقلالنوعمطلوبالوصف
assetTypestringنعمdatasets أو models أو images أو videos
assetIdstringنعممعرّف مجموعة البيانات أو النموذج المستهدف
filenamestringنعماسم الملف الأصلي (بحد أقصى 256 محرفًا)
contentTypestringنعمنوع MIME
totalBytesرقمنعمحجم الملف بالبايت
أسماء ملفات أرشيف مجموعة البيانات

عندما تكون قيمة assetType هي datasets، يجب أن ينتهي filename بـ .zip أو .tar أو .tar.gz أو .tgz أو .ndjson. اجمع الصور المنفصلة في أرشيف قبل تحميلها.

الاستجابة:

{
    "sessionId": "session_abc123",
    "uploadUrl": "https://storage.googleapis.com/...&signature=...",
    "expiresAt": "2026-02-22T12:00:00Z",
    "headers": { "x-goog-if-generation-match": "0" }
}

قم بتحميل الملف بطلب PUT إلى uploadUrl، باستخدام نفس Content-Type الذي أعلنته وكل ترويسة يتم إرجاعها في headers. عناوين URL لتحميل مجموعة البيانات صالحة لمدة 12 ساعة ومخصصة للإنشاء فقط: طلب PUT ثانٍ إلى نفس عنوان URL يرجع 412، وطلب PUT بدون الترويسات المُرجَعة يرجع 400.

إكمال التحميل#

POST /api/upload/complete

Python SDK: client.upload.complete(session_id=...)

{
    "sessionId": "session_abc123",
    "md5": "<optional md5 hex>"
}

الاستجابة: success وكائن file مع size وcontentType. بالنسبة إلى النماذج، يؤدي ذلك إلى إرفاق الأوزان؛ وبالنسبة إلى أرشيفات مجموعات البيانات، استدعِ ingest بعد ذلك لبدء المعالجة.

عند توفير md5، يتم التحقق منه مقابل الكائن المخزن. عدم التطابق يرجع 400؛ في جلسة لم تكتمل بعد، يؤدي ذلك أيضاً إلى حذف الملف المُحمَّل وترك الجلسة غير مكتملة، لذا اطلب عنوان URL موقّعاً جديداً وقم بالتحميل مرة أخرى. يمكن إكمال جلسة مجموعة البيانات المكتملة مرة أخرى طالما أن أرشيفها موجود، لكن عمليات الإكمال المتنافسة ذات الملخصات المختلفة ترجع 409؛ تتم إزالة جلسات النماذج عند الاكتمال. يتم تخزين checksum كبيانات وصفية لملف النموذج ولا يتم التحقق منه.


واجهة برمجة تطبيقات تكاملات التخزين#

اربط حسابات Google Cloud Storage أو Amazon S3 أو Azure Blob Storage للقراءة فقط، وتصفّحها باعتبارها مصادر لمجموعات البيانات. راجع وثائق التكاملات.

سرد عمليات التكامل#

GET /api/integrations/buckets

Python SDK: client.storage_integrations.list()

يعيد integrations، ويحتوي كل عنصر منها على id وprovider وcredentialIdentity وtargets وcreatedAt. لا تُعاد بيانات الاعتماد مطلقًا.

اكتشاف المواقع#

POST /api/integrations/buckets/discover

Python SDK: client.storage_integrations.discover(body=...)

يسرد الحاويات أو المستودعات القابلة للقراءة باستخدام بيانات الاعتماد المقدمة، من دون حفظها.

{
    "provider": "gcs",
    "credentials": {
        "client_email": "svc@project.iam.gserviceaccount.com",
        "private_key": "-----BEGIN PRIVATE KEY-----\n...",
        "project_id": "my-project"
    }
}

الاستجابة: {"targets": ["my-bucket", "another-bucket"]}

توصيل وحدة التخزين#

POST /api/integrations/buckets

Python SDK: client.storage_integrations.create(body=...)

نفس أشكال بيانات الاعتماد المستخدمة في الاكتشاف، بالإضافة إلى مصفوفة targets مطلوبة تضم من 1 إلى 50 اسمًا للمستودعات أو الحاويات. يعيد 201 مع التكامل المحفوظ. تُرفض بيانات اعتماد S3 المؤقتة (مفاتيح الوصول ASIA).

استعراض العناصر#

GET /api/integrations/buckets/{id}/objects

Python SDK: client.storage_integrations.objects(id, target=...)

معلمات الاستعلام:

المعلمةالنوعمطلوبالوصف
targetstringنعماسم المستودع أو الحاوية
prefixstringلابادئة المجلد (بحد أقصى 1024 حرفًا)
cursorstringلامؤشر ترقيم صفحات الموفر من صفحة سابقة

يعيد entries (كل kind هو folder أو file) وcursor اختياريًا للصفحة التالية.

فصل وحدة التخزين#

DELETE /api/integrations/buckets/{id}

Python SDK: client.storage_integrations.delete(id)

يزيل بيانات الاعتماد المحفوظة من دون حذف بيانات الموفر. تظل مجموعات البيانات المتصلة ظاهرة، لكن تظل ملفاتها غير متاحة حتى إعادة توصيل حساب التخزين نفسه. يتطلب الوصول بصفة مسؤول مساحة العمل.


واجهة برمجة تطبيقات استيراد مجموعات البيانات#

استورد مجموعات البيانات من خدمات خارجية. راجع تكامل Roboflow.

معاينة استيراد Roboflow#

POST /api/integrations/roboflow/preview

Python SDK: client.datasets.preview_roboflow(api_key=...)

تحوّل مفتاح API الخاص بـ Roboflow إلى خطة استيراد تتضمن تفاصيل مساحة العمل، وnewDatasets التي ستُستورد، وأعداد المشاريع التي جرى تخطيها أو عدم دعمها أو تعذر حلها، وbytesTotal، والسعة المتبقية storage. يُقرأ مفتاح API الخاص بـ Roboflow من النص ولا يُحفظ.

{
    "apiKey": "ROBOFLOW_API_KEY"
}

الاستيراد من Roboflow#

POST /api/integrations/roboflow/import

Python SDK: client.datasets.import_roboflow(api_key=..., items=...)

يضع مهام الإدخال في قائمة الانتظار لما يصل إلى 500 إصدارًا محددًا من إصدارات مشاريع Roboflow، باستخدام العناصر التي أعادتها المعاينة.

{
    "apiKey": "ROBOFLOW_API_KEY",
    "items": [
        {
            "workspace": "my-workspace",
            "projectId": "warehouse-safety",
            "projectName": "Warehouse Safety",
            "projectType": "object-detection",
            "latestVersion": 4
        }
    ]
}

الاستجابة (201): مصفوفتا imported وfailed ومصفوفة skipped. تتطلب عمليات الاستيراد سعة تخزين كافية، ويجب أن تلتزم كل مجموعة بيانات بحد حجم الاستيراد لكل عملية وفق خطتك.


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

افحص حسابك في Platform ومفاتيحك ووحدة التخزين وملفاتك الشخصية العامة. راجع وثائق الإعدادات.

ملخص الحساب#

GET /api/account/summary

Python SDK: client.account.summary()

يعيد الخطة ورصيد الائتمان وأعداد الموارد لمساحة العمل التي أصدرت المفتاح.

{
    "username": "acme-vision",
    "name": "Acme Vision",
    "accountType": "team",
    "plan": "pro",
    "creditsCents": 2500,
    "counts": { "projects": 4, "datasets": 7, "models": 21 },
    "teams": []
}
قائمة الفريق

تُملأ teams لجلسات المتصفح. تعيد استجابات مفاتيح API قائمة فارغة، لأن المفتاح محدد النطاق مسبقًا لمساحة عمل واحدة.

سرد مفاتيح API#

GET /api/api-keys

Python SDK: client.account.api_keys()

يعيد keys مع keyId وname وkeyPrefix وcreatedAt لمساحة عمل المفتاح. تتلقى الطلبات الموثقة بمفتاح API البيانات الوصفية فقط؛ وتظهر قيم المفاتيح الكاملة لمالك مساحة العمل في الإعدادات > مفاتيح API في واجهة Platform، وهي المكان الذي تُنشأ فيه المفاتيح وتُلغى أيضًا.

التحقق من استخدام التخزين#

GET /api/storage

Python SDK: client.account.storage()

معلمات الاستعلام:

المعلمةالنوعالوصف
detailsمنطقيضمّن أكبر عشرة مستهلكين للتخزين (الافتراضي: false)

الاستجابة:

{
    "tier": "pro",
    "usage": {
        "storage": { "current": 1073741824, "limit": 107374182400, "percent": 1.0 },
        "datasets": { "current": 536870912, "limit": 107374182400, "percent": 0.5 }
    },
    "breakdown": {
        "byCategory": {
            "datasets": { "bytes": 536870912, "count": 2 },
            "models": { "bytes": 268435456, "count": 4 },
            "exports": { "bytes": 268435456, "count": 3 }
        },
        "topItems": [
            {
                "_id": "65f1c0a2b3d4e5f601234567",
                "name": "Warehouse",
                "slug": "warehouse",
                "sizeBytes": 536870912,
                "type": "dataset"
            }
        ]
    },
    "region": "us",
    "username": "acme-vision",
    "updatedAt": "2026-01-15T10:00:00Z"
}

الحصول على ملف مستخدم عام#

GET /api/users

Python SDK: client.account.profile(username=...)

معلمات الاستعلام:

المعلمةالنوعمطلوبالوصف
usernamestringنعماسم المستخدم المطلوب البحث عنه

يعيد ملف المستخدم العام user مع followerCount، وللمتصلين الذين تمت مصادقتهم، isFollowed.

متابعة مستخدم أو إلغاء متابعته#

PATCH /api/users

Python SDK: client.account.follow(username=..., followed=...)

{
    "username": "target-user",
    "followed": true
}

الاستجابة: followed وfollowerCount المحدّث.


واجهة برمجة تطبيقات الفوترة#

تحقق من استخدام الخطة ودفتر أرصدة الائتمان. راجع وثائق الفوترة.

وحدات العملة

تكون مبالغ الفوترة أعدادًا صحيحة بالسنتات الأمريكية، حيث 100 = $1.00.

عرض الخطة والاستخدام#

GET /api/billing/usage-summary

Python SDK: client.billing.usage_summary()

يعيد plan (المعرّف والحالة ودورة الفوترة ونهاية الفترة)، وmetrics (حد التخزين والاستخدام)، وtrainingCredit وfeatures وcreditsCents، وأعداد المقاعد.

عرض المعاملات#

GET /api/billing/transactions

Python SDK: client.billing.transactions()

معلمات الاستعلام:

المعلمةالنوعالوصف
fromstringالطابع الزمني لأقدم معاملة (ISO 8601)
tostringالطابع الزمني لأحدث معاملة (ISO 8601)

تتضمن كل معاملة id وtype (مثل purchase أو training أو monthly_grant أو refund) وamountCents وbalanceAfter وcreatedAt، وreceiptUrl اختياريًا، وسياق النموذج لرسوم التدريب. لا تُعاد تفاصيل الفوترة الداخلية مطلقًا.


استكشاف API#

ابحث عن المشاريع ومجموعات البيانات العامة التي يشاركها المجتمع. راجع وثائق الاستكشاف.

البحث في المحتوى العام#

GET /api/explore/search

Python SDK: client.explore.search()

معلمات الاستعلام:

المعلمةالنوعالوصف
qstringمصطلح البحث (بحد أقصى 200 حرف)
typestringall (الافتراضي) أو projects أو datasets
sortstringnewest (الافتراضي) أو oldest أو stars أو name-asc أو name-desc أو count-desc أو count-asc
offsetintالنتائج المطلوب تخطيها (الافتراضي: 0)
limitintالحد الأقصى للنتائج لكل نوع من الموارد (الافتراضي: 20، والحد الأقصى: 100)
taskstringعوامل تصفية المهام مفصولة بفواصل: detect وsegment وsemantic وdepth وclassify وpose وobb
authorstringعامل تصفية اسم مستخدم المالك
starredمنطقيأعد المحتوى الذي أضافه المتصل الذي تمت مصادقته إلى المفضلة فقط؛ يتطلب مفتاح API

الاستجابة: projects وdatasets وhasMore.

curl "https://platform.ultralytics.com/api/explore/search?type=datasets&task=detect&sort=stars&limit=20"

Python SDK#

ultralytics-platform هو عميل Python مكتوب الأنواع ومولّد من عقد OpenAPI، مع طريقة واحدة لكل نقطة نهاية (client.datasets.list وclient.models.predict وclient.exports.create ...). تقبل كل طريقة معلمات المسار موضعيًا، والمدخلات الأخرى كوسائط مسماة، وtimeout وextra_headers اختياريًا لكل طلب.

pip install "ultralytics-platform>=0.1.32" # Python 3.11+
from ultralytics_platform import Platform

with Platform() as client:  # reads ULTRALYTICS_API_KEY or the key saved by yolo login
    dataset = client.datasets.retrieve("acme-vision", "warehouse")
    images = client.datasets.images("acme-vision", "warehouse", limit=10)
    export = client.exports.create("acme-vision", "inspection", "v3", format="onnx")

يتيح AsyncPlatform شجرة الموارد نفسها لرمز async/await، وترفع الاستجابات غير الناجحة استثناء APIError مع status_code وbody وjson المحلّل، بينما ترفع حالات فشل الاتصال APIConnectionError. راجع مستودع SDK للاطلاع على README الكامل.

تكامل Python#

بالنسبة إلى عمليات التدريب والاستدلال، استخدم حزمة Python من Ultralytics، التي تتولى المصادقة والتحميل وبث المقاييس في الوقت الفعلي تلقائيًا.

التثبيت والإعداد#

تستلزم تكامل المنصة استخدام Python>=3.11 و ultralytics>=8.4.120:

pip install "ultralytics>=8.4.120"

تحقق من التثبيت:

yolo check

المصادقة#

yolo login YOUR_API_KEY

استخدام مجموعات بيانات المنصة#

أشر إلى مجموعات البيانات باستخدام معرّفات URI ul://:

from ultralytics import YOLO

model = YOLO("yolo26n.pt")

# Train on your Platform dataset
model.train(
    data="ul://your-username/datasets/your-dataset",
    epochs=100,
    imgsz=640,
)

تنسيق URI:

النمطالوصف
ul://username/datasets/slugمجموعة البيانات
ul://username/project-nameالمشروع
ul://username/project/model-nameنموذج محدد
ul://ultralytics/yolo26/yolo26nنموذج رسمي

الدفع إلى Platform#

أرسل النتائج إلى مشروع في Platform:

from ultralytics import YOLO

model = YOLO("yolo26n.pt")

# Results automatically sync to Platform
model.train(
    data="coco8.yaml",
    epochs=100,
    project="your-username/my-project",
    name="experiment-1",
)

ما تتم مزامنته:

  • مقاييس التدريب (في الوقت الفعلي)
  • أوزان النموذج النهائية
  • مخططات التحقق
  • مخرجات وحدة التحكّم
  • مقاييس النظام

أمثلة API#

تحميل نموذج من Platform:

# Your own model
model = YOLO("ul://username/project/model-name")

# Official model
model = YOLO("ul://ultralytics/yolo26/yolo26n")

تشغيل الاستدلال:

results = model("image.jpg")

# Access results
for r in results:
    boxes = r.boxes  # Detection boxes
    masks = r.masks  # Segmentation masks
    keypoints = r.keypoints  # Pose keypoints
    probs = r.probs  # Classification probabilities

تصدير النموذج:

# Export to ONNX
model.export(format="onnx", imgsz=640, quantize=16)

# Export to TensorRT
model.export(format="engine", imgsz=640, quantize=16)

# Export to CoreML
model.export(format="coreml", imgsz=640)  # use imgsz=224 for classification

التحقق:

metrics = model.val(data="ul://username/datasets/my-dataset")

print(f"mAP50: {metrics.box.map50}")
print(f"mAP50-95: {metrics.box.map}")

الأسئلة الشائعة#

  • استخدم مقاطع المالك والاسم نفسها الظاهرة في عنوان URL الخاص بـ Platform. النموذج الموجود في https://platform.ultralytics.com/acme-vision/inspection/v3 هو GET /api/models/acme-vision/inspection/v3. تظل معرّفات قاعدة البيانات معادةً في الاستجابات (باسم id)، وتتطلب بعض المسارات هذه المعرّفات مباشرةً — إذ تتطلب مسارات الصور imageId، وتتطلب عمليات التحميل assetId، بينما يتطلب POST /api/training/start قيمة modelId.

  • يعتمد ذلك على المجموعة. تقبل معظم نقاط نهاية القوائم limit:

    curl -H "Authorization: Bearer YOUR_API_KEY" \
      "https://platform.ultralytics.com/api/datasets/acme-vision?limit=50"

    تستخدم صور مجموعات البيانات والتجميع والبحث في Explore offset مع limit، وتُبلغ عن hasMore:

    curl "https://platform.ultralytics.com/api/explore/search?type=datasets&offset=20&limit=20&sort=stars"

    من الأفضل استعراض مجموعات الصور الكبيرة جدًا باستخدام المؤشر المعاد باسم nextCursor:

    curl -H "Authorization: Bearer YOUR_API_KEY" \
      "https://platform.ultralytics.com/api/datasets/acme-vision/warehouse/images?limit=1000&includeTotal=false&cursor=LAST_IMAGE_ID"

    تستخدم المهملات page، بينما تستخدم سجلات النشر pageToken غير الشفاف، والمعاد باسم nextPageToken.

  • نعم. كل عملية في هذه الصفحة هي طلب HTTPS عادي، ويُنشر العقد الكامل بصيغة OpenAPI 3.2 في platform.ultralytics.com/openapi.json، ويمكنك تمريره إلى مولّد عميل بأي لغة. حزمة ultralytics-platform هي ذلك تحديدًا: عميل مكتوب الأنواع ومولّد من العقد، بينما تضيف حزمة ultralytics بث المقاييس في الوقت الفعلي وعمليات تحميل النماذج تلقائيًا فوق التدريب والاستدلال. تظل تدفقات الحساب المتاحة لجلسات المتصفح فقط، مثل إتمام الدفع وإدارة الفريق، ضمن واجهة Platform.

  • استخدم الترويسة Retry-After من استجابة 429 للانتظار المدة المناسبة:

    import time
    
    import requests
    
    def api_request_with_retry(url, headers, max_retries=3):
        for attempt in range(max_retries):
            response = requests.get(url, headers=headers)
            if response.status_code != 429:
                return response
            wait = int(response.headers.get("Retry-After", 2**attempt))
            time.sleep(wait)
        raise RuntimeError("Rate limit exceeded")
  • يعني 404 أن المورد غير موجود أو غير مرئي لمفتاحك على الإطلاق. ويعني 403 أن المورد عُثر عليه، لكن الإجراء يتطلب وصولًا أكبر مما يملكه مفتاحك — وصول المحرر لتعديل مجموعة بيانات، أو وصول المالك لحذف عملية نشر، أو وصول المسؤول لفصل وحدة التخزين، أو خطة أو حصة أعلى لعمليات التصدير والنشر.

  • قراءة مجموعات البيانات والمشاريع والنماذج العامة، بما في ذلك صورها وعناوين URL الموقعة للصور وإحصاءات الفئات وحالة التضمين وتخطيط التجميع وقائمة التصدير؛ والتحقق من تقدم التدريب على نموذج عام؛ وتنزيل ملفات نموذج عام؛ وتشغيل الاستدلال على نموذج عام؛ والبحث عن ملف مستخدم عام؛ وسرد عمليات النشر التي تمت تصفيتها حسب نموذج عام واحد؛ والبحث في Explore. يكون GET /api/training/gpu-availability عامًا بالكامل ما لم تطلب سعة مُدارة. وكل ما عدا ذلك يتطلب مفتاحًا، كما أن تقديم مفتاح إلى نقطة نهاية عامة يكشف مواردك الخاصة أيضًا.

التعليقات