Справочник REST API#
Ultralytics Platform предоставляет REST API для программного доступа к наборам данных, изображениям, проектам, моделям, обучению, экспорту и развёртываниям.

# List the datasets owned by a workspace
curl -H "Authorization: Bearer YOUR_API_KEY" \
https://platform.ultralytics.com/api/datasets/YOUR_USERNAMEДля каждой конечной точки ниже указан вызов client.<resource>.<method>(...) из SDK ultralytics-platform, созданного на основе того же контракта, что и этот справочник.
Эта страница представляет собой обзор API. Сгенерированный и всегда актуальный справочник доступен по адресу platform.ultralytics.com/api/docs, а машиночитаемый документ OpenAPI 3.2, на котором он основан, опубликован по адресу platform.ultralytics.com/openapi.json. Оба документа генерируются непосредственно из серверного контракта, поэтому именно они являются источником истины, если эта страница и схема расходятся.
Обзор API#
API организован вокруг основных ресурсов Platform:
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#
- Перейди в
Settings>API Keys - Нажми
Create Key - Скопируй сгенерированный ключ
Подробные инструкции см. в разделе Ключи API.
Заголовок авторизации#
Передавай ключ API в виде токена bearer:
Authorization: Bearer YOUR_API_KEYКлючи 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 Platform, а не идентификаторы базы данных:
| Ресурс | Путь | Пример |
|---|---|---|
| Датасет | /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. Каждый маршрут относится к одной категории, и у каждой категории есть отдельный счётчик, поэтому 20 запросов на предсказание не расходуют лимит по умолчанию.
| Категория | Ограничение | Применяется к |
|---|---|---|
| По умолчанию | 100 запросов/мин | Каждый маршрут, не указанный ниже |
| Обучение | 10 запросов/мин | POST /api/training/start |
| Загрузка | 10 запросов/мин | Подписанные URL для загрузки, завершение загрузки и импорт набора данных |
| Predict | 20 запросов/мин | Инференс моделей и развёртываний через маршруты API Platform |
| Экспорт | 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"
}Выделенные конечные точки (без ограничений)#
Выделенные конечные точки не подпадают под ограничения частоты запросов Platform для ключей 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 |
| Смещение и лимит | Изображения датасета, кластеризация изображений, поиск Explore | offset, limit, а также hasMore в ответе |
| Курсор | Изображения датасета (большие датасеты) | cursor, includeTotal, а также nextCursor |
| Номер страницы | Корзина | page, limit, а также totalPages |
| Непрозрачный токен страницы | Журналы развёртывания | pageToken, а также nextPageToken |
Datasets API#
Создавай, просматривай и управляй размеченными датасетами изображений для обучения моделей YOLO. См. документацию по датасетам.
Список датасетов#
GET /api/datasets/{owner}Python SDK: client.datasets.list(owner)
Возвращает общедоступные датасеты владельца, а также приватные датасеты, если твой ключ позволяет просматривать это рабочее пространство.
Параметры запроса:
| Параметр | Тип | Описание |
|---|---|---|
limit | int | Максимальное количество возвращаемых датасетов (по умолчанию: 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/datasetsPython 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"
}| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
dataset | string | Да | Имя датасета, используемое в URL Platform (строчные буквы, дефисы, максимум 128 символов) |
name | string | Да | Отображаемое имя (максимум 100 символов) |
description | string | Нет | Описание (максимум 1000 символов) |
task | string | Нет | Тип задачи (по умолчанию: detect) |
classNames | массив | Нет | Имена классов в порядке индексов (максимум 25 000) |
format | string | Нет | Формат разметки: yolo (по умолчанию), coco, raw, ndjson |
visibility | string | Нет | public или private |
tags | массив | Нет | До 50 тегов длиной до 50 символов каждый |
license | string | Нет | Идентификатор лицензии датасета |
metadata | объект | Нет | Пользовательские метаданные JSON |
owner | string | Нет | Идентификатор рабочего пространства команды; по умолчанию используется твоё личное рабочее пространство |
requireExactSlug | логическое значение | Нет | Возвращает 409, когда dataset уже занят, вместо создания имени с суффиксом, таким как warehouse-2 (по умолчанию false) |
В ответе возвращается фактически созданный идентификатор 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}/clonePython 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}/exportPython 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}/exportPython 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}/exportPython SDK: client.datasets.update_export(owner, dataset, version=..., description=...)
Тело:
{
"version": 2,
"description": "Fixed mislabeled classes"
}Ответ: {"ok": true}
Восстановить версию датасета#
POST /api/datasets/{owner}/{dataset}/restorePython SDK: client.datasets.restore(owner, dataset, version=...)
Восстанавливает изображения, аннотации и классы из сохранённой версии без копирования байтов изображений.
Тело:
{
"version": 2
}Ответ: {"version": 2, "imageCount": 1000}
Получить статистику датасета#
GET /api/datasets/{owner}/{dataset}/class-statsPython 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/mergePython SDK: client.datasets.merge_classes(owner, dataset, source_class_ids=..., target_class_id=...)
{
"sourceClassIds": [2, 4],
"targetClassId": 1
}Удаление классов (их аннотации удаляются, а идентификаторы оставшихся классов сдвигаются вниз):
POST /api/datasets/{owner}/{dataset}/classes/deletePython 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/redistributePython 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}/embeddingsPython 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/clusteringPython 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}/modelsPython 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}/imagesPython SDK: client.datasets.images(owner, dataset)
Параметры запроса:
| Параметр | Тип | Описание |
|---|---|---|
limit | int | Максимальное количество возвращаемых изображений (по умолчанию: 50, максимум: 5000) |
offset | int | Количество пропускаемых изображений (по умолчанию: 0) |
cursor | string | Идентификатор последнего изображения с предыдущей страницы для пагинации по курсору |
includeTotal | логическое значение | Включать общее количество совпадений (по умолчанию: true) |
split | string | Фильтровать по разбиению: train, val, test |
hasLabel | логическое значение | Фильтровать по состоянию разметки |
hasError | логическое значение | Фильтровать по состоянию ошибки обработки |
classIds | string | Идентификаторы классов через запятую; возвращает изображения, содержащие любой из них |
search | string | Поиск подстроки в имени файла и пользовательских метаданных (максимум 200 символов) |
sort | string | newest (по умолчанию), 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}/imagesPython SDK: client.datasets.selected_images(owner, dataset, image_ids=...)
Возвращает изображения в том же формате для не более чем 1 000 переданных идентификаторов изображений и принимает те же параметры фильтрации и URL-запроса, что и операция перечисления.
{
"imageIds": ["65f1c0a2b3d4e5f601234567", "65f1c0a2b3d4e5f601234568"]
}Импортировать данные датасета#
POST /api/datasets/{owner}/{dataset}/ingestPython SDK: client.datasets.ingest(owner, dataset, body=...)
Обрабатывает завершённую загрузку, удалённый архив или подключённое хранилище и добавляет данные в существующий датасет. Укажи ровно один источник:
| Поле | Тип | Описание |
|---|---|---|
sessionId | string | Сеанс загрузки из POST /api/upload/signed-url, уже завершённый |
sourceUrl | string | Общедоступный HTTP- или HTTPS-URL ZIP-, TAR-, TAR.GZ-, TGZ- или NDJSON-файла (не более 4096 символов) |
reference | объект | Подключённый источник: облачное хранилище (provider: "cloud", integrationId, target, prefix) или локальная инфраструктура (provider: "local", keyId, root, prefix) |
targetSplit | string | train, val или test; переопределяет структуру разбиения архива |
conflictPolicy | string | skip, 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())API изображений#
Просматривай, аннотируй, перемещай и удаляй изображения датасета по их 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}/predictPython SDK: client.images.predict(image_id, model_id=...)
Запускает инференс YOLO для изображения и возвращает предсказанные аннотации. Они не сохраняются — запиши результаты обратно с помощью PATCH /api/images/{imageId}, когда убедишься, что они подходят.
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
modelId | string | Да | Полностью квалифицированный URI модели, ul://{owner}/{project}/{model} |
confidence | float | Нет | Порог уверенности, 0.01–1.0 (по умолчанию: 0.25) |
iou | float | Нет | Порог IoU для подавления немаксимумов, 0.0–0.95 (по умолчанию: 0.7) |
Ответ: success, predictions (объекты аннотаций), modelUsed и inferenceTime. Модель, классы которой не совпадают с классами датасета, возвращает 422.
Авторазметка набора данных#
POST /api/datasets/{owner}/{dataset}/predict/batchPython 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/bulkPython 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/bulkPython SDK: client.images.delete_bulk(image_ids=...)
{
"imageIds": ["65f1c0a2b3d4e5f601234567", "65f1c0a2b3d4e5f601234568"]
}Удаляет до 1 000 изображений из одного датасета и возвращает deletedCount и deletedImageIds.
Получить подписанные URL изображений#
POST /api/images/urlsPython SDK: client.images.urls(image_ids=...)
Возвращает временные подписанные URL для не более чем 100 идентификаторов изображений из одного датасета.
{
"imageIds": ["65f1c0a2b3d4e5f601234567"]
}Ответ: urls и thumbnails, оба индексированные идентификатором изображения.
API проектов#
Организуй свои модели по проектам. Каждая модель принадлежит одному проекту. См. документацию по проектам.
Перечислить проекты#
GET /api/projects/{owner}Python SDK: client.projects.list(owner)
Параметры запроса:
| Параметр | Тип | Описание |
|---|---|---|
limit | int | Максимальное количество возвращаемых проектов (по умолчанию: 20, максимум: 500) |
Получить проект#
GET /api/projects/{owner}/{project}Python SDK: client.projects.retrieve(owner, project)
Возвращает объект project, массив models со сводками по каждой модели (статус, метрики, эпохи, веса, аргументы обучения) и isOwner.
Создание проекта#
POST /api/projectsPython SDK: client.projects.create(project=..., name=...)
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
project | string | Да | Имя проекта, используемое в URL Platform |
name | string | Да | Отображаемое имя (максимум 100 символов) |
description | string | Нет | Описание (максимум 1000 символов) |
visibility | string | Нет | public или private |
tags | массив | Нет | До 50 тегов |
license | string | Нет | Идентификатор лицензии проекта |
metadata | объект | Нет | Пользовательские метаданные JSON |
owner | string | Нет | Идентификатор рабочего пространства команды; по умолчанию используется твоё личное рабочее пространство |
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}/clonePython SDK: client.projects.clone(owner, project)
Клонирует доступный проект и его завершённые модели. Необязательное тело принимает project, name, description, visibility, license и целевой owner.
API моделей#
Управляй обученными моделями YOLO: просматривай метрики, скачивай веса, запускай инференс и отслеживай обучение. См. документацию по моделям.
Перечислить модели в проекте#
GET /api/models/{owner}/{project}Python SDK: client.models.list(owner, project)
Параметры запроса:
| Параметр | Тип | Описание |
|---|---|---|
limit | int | Максимальное количество возвращаемых моделей (по умолчанию: 20, максимум: 100) |
Получить модель#
GET /api/models/{owner}/{project}/{model}Python SDK: client.models.retrieve(owner, project, model)
Параметры запроса:
| Параметр | Тип | Описание |
|---|---|---|
analysis | int | Установи 1, чтобы вместо модели вернуть анализ валидации для каждого изображения |
Ответ по умолчанию содержит объект model — статус, задачу, метрики, trainArgs, trainResults, classNames, computeCost, metadata и другие поля — а также isOwner.
Создать модель#
POST /api/modelsPython SDK: client.models.create(body=...)
Создаёт запись необученной модели, к которой можно прикрепить веса или запустить обучение.
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
project | string | Да | Имя целевого проекта |
owner | string | Нет | Идентификатор рабочего пространства; по умолчанию используется твоё личное рабочее пространство |
model | string | Нет | Имя модели, используемое в URL Platform; создаётся автоматически, если не указано |
name | string | Нет | Отображаемое имя (принимается только вместе с model) |
description | string | Нет | Описание (максимум 1000 символов) |
task | string | Нет | detect, segment, semantic, depth, classify, pose или obb |
metadata | объект | Нет | Пользовательские метаданные JSON |
trainArgs | объект | Нет | Аргументы обучения для сохранения |
metrics | объект | Нет | Метрики, такие как mAP50, mAP50-95, precision, recall |
epochs | число | Нет | Количество эпох для уже обученной модели |
version | string | Нет | Метка версии (не более 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, если этот идентификатор там уже занят, и 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}/filesPython 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}/clonePython 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"
}| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
project | string | Да | Имя целевого проекта |
owner | string | Нет | Целевое рабочее пространство; по умолчанию используется твоё личное рабочее пространство |
model | string | Нет | Имя целевой модели |
name | string | Нет | Отображаемое имя целевой модели |
description | string | Нет | Описание клона |
Запусти инференс#
POST /api/models/{owner}/{project}/{model}/predictPython SDK: client.models.predict(owner, project, model, body=...)
Для общедоступных моделей можно выполнять предсказания без аутентификации. Для частных моделей и моделей с общим доступом требуется ключ API с доступом к родительскому проекту.
Составная форма:
| Параметр | Тип | По умолчанию | Диапазон | Описание |
|---|---|---|---|---|
file | file | - | - | Файл изображения или видео (обязателен, если не задан source) |
conf | float | 0.25 | 0.01 – 1.0 | Минимальный порог уверенности |
iou | float | 0.7 | 0.0 – 0.95 | Порог IoU для NMS |
imgsz | int | 640 | 32 – 1280 | Размер входного изображения в пикселях |
normalize | bool | false | - | Возвращать координаты ограничивающих рамок в диапазоне 0 – 1 |
decimals | int | 5 | 0 – 10 | Точность координатных значений после запятой |
bits | int | 8 | 8, 12, 16 | Квантизация карты глубины, только для моделей глубины |
source | string | - | - | 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}/trainingPython SDK: client.models.training(owner, project, model)
Возвращает job, содержащий статус, прогресс по эпохам, время выполнения, сведения о вычислениях, аргументы обучения, метрики эпох и безопасные сведения об ошибке, или null, если модель ещё ни разу не обучалась. Модели в публичных проектах доступны для чтения без аутентификации.
Отмена обучения#
DELETE /api/models/{owner}/{project}/{model}/trainingPython SDK: client.models.delete_training(owner, project, model)
Завершает работу выполняющегося вычислительного экземпляра и помечает задачу как отменённую. Возвращает 409, если обучение больше не выполняется.
API обучения#
Запускай обучение 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-availabilityPython SDK: client.training.gpu_availability()
Возвращает текущий статус доступности, сгруппированный по идентификатору GPU. Доступно публично и без аутентификации; передай managed=true, чтобы включить управляемые мощности обучения — для этого требуется API-ключ.
Начать обучение#
POST /api/training/startPython SDK: client.training.start(model_id=..., train_args=...)
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
modelId | string | Да | Идентификатор модели для обучения |
trainArgs | объект | Да | Аргументы обучения YOLO; model, data и epochs обязательны |
gpuType | string | Нет | Используемый облачный 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 нет доступных мощностей.
Доступно 26 типов GPU — от rtx-2000-ada до b300, включая rtx-4090, l40s, a100-80gb-pcie, a100-80gb-sxm, rtx-pro-6000, h100-sxm, h200-sxm и b200. Полный список с ценами см. в разделе Облачное обучение.
API экспорта#
Преобразуй модели в оптимизированные форматы, такие как ONNX, TensorRT, CoreML и LiteRT, для развёртывания на периферийных устройствах. См. документацию по развёртыванию.
Список экспортов#
GET /api/models/{owner}/{project}/{model}/exportsPython SDK: client.exports.list(owner, project, model)
Параметры запроса:
| Параметр | Тип | Описание |
|---|---|---|
status | string | Фильтровать по queued, starting, running, completed, failed или cancelled |
limit | int | Максимальное число возвращаемых экспортов (по умолчанию: 20, максимум: 100) |
Создать экспорт#
POST /api/models/{owner}/{project}/{model}/exportsPython SDK: client.exports.create(owner, project, model, format=...)
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
format | string | Да | Целевой формат экспорта (см. таблицу ниже) |
gpuType | string | Условный | Обязателен, если 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 | ✅ | - |
| TorchScript | torchscript | yolo26n.torchscript | ✅ | imgsz, quantize, dynamic, nms, batch, device |
| ONNX | onnx | yolo26n.onnx | ✅ | imgsz, quantize, dynamic, simplify, opset, nms, batch, data, fraction, device |
| OpenVINO | openvino | yolo26n_openvino_model/ | ✅ | imgsz, quantize, dynamic, nms, batch, data, fraction, device |
| TensorRT | engine | yolo26n.engine | ✅ | imgsz, quantize, dynamic, simplify, opset, workspace, nms, batch, data, fraction, device |
| CoreML | coreml | yolo26n.mlpackage | ✅ | imgsz, dynamic, quantize, nms, batch, device |
| TF SavedModel | saved_model | yolo26n_saved_model/ | ✅ | imgsz, keras, quantize, opset, nms, batch, data, fraction, device |
| TF GraphDef | pb | yolo26n.pb | ❌ | imgsz, opset, batch, device |
| TF Edge TPU | edgetpu | yolo26n_edgetpu.tflite | ✅ | imgsz, quantize, opset, data, fraction, device |
| PaddlePaddle | paddle | yolo26n_paddle_model/ | ✅ | imgsz, batch, device |
| MNN | mnn | yolo26n.mnn | ✅ | imgsz, batch, dynamic, quantize, simplify, opset, nms, device |
| NCNN | ncnn | yolo26n_ncnn_model/ | ✅ | imgsz, quantize, batch, device |
| IMX500 | imx | yolo26n_imx_model/ | ✅ | imgsz, quantize, data, fraction, nms, device |
| RKNN | rknn | yolo26n_rknn_model/ | ✅ | imgsz, batch, name, quantize, simplify, opset, data, fraction, device |
| ExecuTorch | executorch | yolo26n_executorch_model/ | ✅ | imgsz, batch, device |
| Axelera | axelera | yolo26n_axelera_model/ | ✅ | imgsz, batch, quantize, data, fraction, device |
| DEEPX | deepx | yolo26n_deepx_model/ | ✅ | imgsz, quantize, simplify, opset, data, optimize, device |
| Qualcomm QNN | qnn | yolo26n_qnn.onnx | ✅ | imgsz, batch, name, quantize, simplify, opset, data, fraction, device |
| LiteRT | litert | yolo26n.tflite | ✅ | imgsz, quantize, batch, data, fraction, device |
| Hailo | hailo | yolo26n_hailo_model/ | ✅ | imgsz, name, quantize, data, fraction, simplify, conf, iou |
| Huawei Ascend | ascend | yolo26n_ascend_model/ | ✅ | imgsz, batch, name, quantize, opset, simplify, nms |
| Apple Core AI | coreai | yolo26n.aimodel | ✅ | imgsz, 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"
}API развёртываний#
Разворачивай модели на выделенных конечных точках инференса с проверками состояния и мониторингом. См. документацию по конечным точкам.
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)
Параметры запроса:
| Параметр | Тип | Описание |
|---|---|---|
status | string | creating, deploying, ready, stopping, stopped или failed |
model | string | Фильтровать по {project}/{model}, например по inspection/v3 |
limit | int | Максимальное число возвращаемых развёртываний (по умолчанию: 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"
}| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
project | string | Да | Проект, содержащий модель |
model | string | Да | Модель для развёртывания |
deployment | string | Да | Имя развёртывания, используемое в URL Platform |
name | string | Да | Отображаемое имя |
region | string | Да | Один из 42 поддерживаемых регионов развёртывания |
Ответ (201): id, deployment, status (creating), message и region.
Масштабирование CPU, памяти и экземпляров управляется Platform в соответствии с ограничениями твоего тарифного плана, а запрос на создание не принимает конфигурацию ресурсов. Текущие значения возвращаются в объекте resources при каждом чтении развёртывания.
Выбирай регион, расположенный ближе к пользователям, чтобы минимизировать задержку. В интерфейсе Platform отображаются оценки задержки для всех 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}/healthPython SDK: client.deployments.health(owner, deployment)
Проверяет доступность и прогревает конечную точку, возвращая healthy, latencyMs и код вышестоящего сервиса status.
Запустить инференс в развёртывании#
POST /api/deployments/{owner}/{deployment}/predictPython SDK: client.deployments.predict(owner, deployment, body=...)
Направляет изображение или видео через выделенную конечную точку. Контракты запроса и ответа соответствуют инференсу модели.
Составная форма:
| Параметр | Тип | По умолчанию | Диапазон | Описание |
|---|---|---|---|---|
file | file | - | - | Файл изображения или видео (обязателен, если не задан source) |
conf | float | 0.25 | 0.01 – 1.0 | Минимальный порог уверенности |
iou | float | 0.7 | 0.0 – 0.95 | Порог IoU для NMS |
imgsz | int | 640 | 32 – 1280 | Размер входного изображения в пикселях |
normalize | bool | false | - | Возвращать координаты ограничивающих рамок в диапазоне 0 – 1 |
decimals | int | 5 | 0 – 10 | Точность координатных значений после запятой |
bits | int | 8 | 8, 12, 16 | Квантизация карты глубины, только для моделей глубины |
source | string | - | - | URL изображения или строка base64 (альтернатива file) |
Получить метрики#
GET /api/deployments/{owner}/{deployment}/metricsPython SDK: client.deployments.metrics(owner, deployment)
Параметры запроса:
| Параметр | Тип | Описание |
|---|---|---|
range | string | 1h, 6h, 24h (по умолчанию), 7d или 30d |
sparkline | логическое значение | Вернуть компактную сводку панели вместо полного ряда данных (по умолчанию: false) |
Полный ответ содержит summary (общее количество запросов, долю ошибок, среднюю задержку и задержку p50/p95/p99) и timeSeries (запросы, ошибки, задержку, CPU, память, количество экземпляров). Ответ со спарклайном возвращает requests24h, totalRequests, errorRate и avgLatencyMs.
Получить логи#
GET /api/deployments/{owner}/{deployment}/logsPython SDK: client.deployments.logs(owner, deployment)
Параметры запроса:
| Параметр | Тип | Описание |
|---|---|---|
severity | string | Через запятую: DEBUG, INFO, NOTICE, WARNING, ERROR, CRITICAL, ALERT, EMERGENCY |
limit | int | Количество возвращаемых записей (по умолчанию: 50, максимум: 200) |
pageToken | string | Токен пагинации из предыдущего ответа |
API корзины#
Просматривай, восстанавливай и безвозвратно удаляй проекты, датасеты и модели, удалённые программно. Элементы автоматически очищаются через 30 дней. См. документацию по корзине.
Список элементов корзины#
GET /api/trashPython SDK: client.lifecycle.trash()
Параметры запроса:
| Параметр | Тип | Описание |
|---|---|---|
type | string | all (по умолчанию), project, dataset или model |
page | int | Номер страницы (по умолчанию: 1) |
limit | int | Количество элементов на странице (по умолчанию: 50, максимум: 200) |
Ответ содержит items (каждый элемент с daysRemaining), total, page, limit, totalPages и summary с итоговыми значениями по типам.
Восстановление элемента#
POST /api/trashPython SDK: client.lifecycle.restore(id=..., type=...)
{
"id": "65f1c0a2b3d4e5f601234567",
"type": "dataset"
}Восстановление проекта также восстанавливает модели, удалённые вместе с ним; они указываются как restoredModels.
Удалить безвозвратно#
DELETE /api/trashPython SDK: client.lifecycle.delete_trash(body=...)
Удалить один элемент:
{
"id": "65f1c0a2b3d4e5f601234567",
"type": "dataset"
}Или очистить всю корзину:
{
"all": true
}В ответе указываются deletedCount, а также cascadedModels и survivingDeployments, если применимо.
Безвозвратное удаление невозможно отменить. Ресурс и все связанные с ним данные удаляются.
API загрузки#
Загружай файлы напрямую в облачное хранилище, используя подписанные URL. Завершение загрузки модели связывает с ней веса; завершение загрузки архива датасета сохраняет сеанс, который затем передаётся в приём датасета. См. документацию по данным.
Получить подписанный URL для загрузки#
POST /api/upload/signed-urlPython SDK: client.upload.signed_url(body=...)
Тело:
{
"assetType": "datasets",
"assetId": "65f1c0a2b3d4e5f601234567",
"filename": "warehouse.zip",
"contentType": "application/zip",
"totalBytes": 52428800
}| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
assetType | string | Да | datasets, models, images или videos |
assetId | string | Да | Идентификатор целевого датасета или модели |
filename | string | Да | Исходное имя файла (максимум 256 символов) |
contentType | string | Да | Тип 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/completePython SDK: client.upload.complete(session_id=...)
{
"sessionId": "session_abc123",
"md5": "<optional md5 hex>"
}Ответ: success и объект file с полями size и contentType. Для моделей это связывает веса с моделью; для архивов датасетов далее вызови приём, чтобы начать обработку.
Когда указан md5, он сверяется с сохраненным объектом. Несоответствие возвращает 400; для сеанса, который еще не
завершен, оно также удаляет загруженный файл и оставляет сеанс незавершенным, поэтому запроси новый подписанный URL-адрес и загрузи
снова. Завершенный сеанс датасета можно завершить повторно, пока существует его архив, но конкурирующие завершения с
различными дайджестами возвращают 409; сеансы моделей удаляются при завершении. checksum сохраняется как метаданные файла модели
и не проверяется.
API интеграций хранилищ#
Подключай доступные только для чтения аккаунты Google Cloud Storage, Amazon S3 или Azure Blob Storage и просматривай их как источники датасетов. См. документацию по интеграциям.
Список интеграций#
GET /api/integrations/bucketsPython SDK: client.storage_integrations.list()
Возвращает integrations, каждый из которых содержит id, provider, credentialIdentity, targets и createdAt. Учетные данные никогда не возвращаются.
Обнаружение расположений#
POST /api/integrations/buckets/discoverPython 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/bucketsPython SDK: client.storage_integrations.create(body=...)
Используются те же формы учетных данных, что и для обнаружения, а также обязательный массив targets из 1–50 имен бакетов или контейнеров. Возвращает 201 с сохраненной интеграцией. Временные учетные данные S3 (ключи доступа ASIA) отклоняются.
Просмотр объектов#
GET /api/integrations/buckets/{id}/objectsPython SDK: client.storage_integrations.objects(id, target=...)
Параметры запроса:
| Параметр | Тип | Обязательное | Описание |
|---|---|---|---|
target | string | Да | Имя бакета или контейнера |
prefix | string | Нет | Префикс папки (не более 1024 символов) |
cursor | string | Нет | Курсор пагинации провайдера с предыдущей страницы |
Возвращает entries (каждый kind — это folder или file) и необязательный cursor для следующей страницы.
Отключение хранилища#
DELETE /api/integrations/buckets/{id}Python SDK: client.storage_integrations.delete(id)
Удаляет сохраненные учетные данные, не удаляя данные у провайдера. Подключенные наборы данных остаются видимыми, но их файлы становятся недоступны, пока та же учетная запись хранилища не будет подключена повторно. Требуется доступ администратора рабочего пространства.
API импорта наборов данных#
Импортируй наборы данных из сторонних сервисов. См. интеграцию с Roboflow.
Предварительный просмотр импорта из Roboflow#
POST /api/integrations/roboflow/previewPython SDK: client.datasets.preview_roboflow(api_key=...)
Преобразует ключ API Roboflow в план импорта: сведения о рабочем пространстве, newDatasets, которые будут импортированы, количество пропущенных, неподдерживаемых и неразрешенных проектов, bytesTotal и доступный объем storage. Ключ API Roboflow считывается из тела запроса и не сохраняется.
{
"apiKey": "ROBOFLOW_API_KEY"
}Импорт из Roboflow#
POST /api/integrations/roboflow/importPython 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. Для импорта требуется свободное место в хранилище, а каждый набор данных должен соответствовать ограничению размера отдельного импорта в твоем тарифном плане.
API учетной записи#
Просматривай учетную запись Platform, ключи, хранилище и общедоступные профили. См. документацию по настройкам.
Сводка учетной записи#
GET /api/account/summaryPython 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-keysPython SDK: client.account.api_keys()
Возвращает keys с keyId, name, keyPrefix и createdAt для рабочего пространства ключа. Запросы, аутентифицированные с помощью API-ключа, получают только метаданные; полные значения ключей отображаются владельцу рабочего пространства в разделе Настройки > API-ключи пользовательского интерфейса Platform — там же ключи создаются и отзываются.
Проверка использования хранилища#
GET /api/storagePython 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/usersPython SDK: client.account.profile(username=...)
Параметры запроса:
| Параметр | Тип | Обязательное | Описание |
|---|---|---|---|
username | string | Да | Имя пользователя для поиска |
Возвращает общедоступный профиль user с followerCount и, для аутентифицированных вызывающих сторон, isFollowed.
Подписка на пользователя или отмена подписки#
PATCH /api/usersPython SDK: client.account.follow(username=..., followed=...)
{
"username": "target-user",
"followed": true
}Ответ: followed и обновленный followerCount.
API биллинга#
Проверяй использование тарифного плана и реестр кредитов. См. документацию по биллингу.
Суммы биллинга — это целые числа в центах США, где 100 = $1.00.
Просмотр тарифного плана и использования#
GET /api/billing/usage-summaryPython SDK: client.billing.usage_summary()
Возвращает plan (идентификатор, статус, расчетный цикл, конец периода), metrics (лимит и использование хранилища), trainingCredit, features, creditsCents и количество мест.
Просмотр транзакций#
GET /api/billing/transactionsPython SDK: client.billing.transactions()
Параметры запроса:
| Параметр | Тип | Описание |
|---|---|---|
from | string | Самая ранняя временная отметка транзакции (ISO 8601) |
to | string | Самая поздняя временная отметка транзакции (ISO 8601) |
Каждая транзакция содержит id, type (например, purchase, training, monthly_grant или refund), amountCents, balanceAfter, createdAt, необязательный receiptUrl и контекст модели для расходов на обучение. Внутренние сведения о биллинге никогда не возвращаются.
Обзор API#
Ищи общедоступные проекты и наборы данных, которыми поделилось сообщество. См. документацию по разделу «Обзор».
Поиск общедоступного содержимого#
GET /api/explore/searchPython SDK: client.explore.search()
Параметры запроса:
| Параметр | Тип | Описание |
|---|---|---|
q | string | Поисковый запрос (не более 200 символов) |
type | string | all (по умолчанию), projects или datasets |
sort | string | newest (по умолчанию), oldest, stars, name-asc, name-desc, count-desc, count-asc |
offset | int | Количество пропускаемых результатов (по умолчанию: 0) |
limit | int | Максимальное количество результатов для каждого типа ресурса (по умолчанию: 20, максимум: 100) |
task | string | Фильтры задач через запятую: detect, segment, semantic, depth, classify, pose, obb |
author | string | Фильтр по имени пользователя-владельца |
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. Полный README см. в репозитории SDK.
Интеграция с Python#
Для рабочих процессов обучения и инференса используй пакет Ultralytics для Python: он автоматически обрабатывает аутентификацию, загрузку файлов и потоковую передачу метрик в реальном времени.
Установка и настройка#
Для интеграции с платформой требуются 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"Изображения наборов данных, кластеризация и поиск в разделе «Обзор» используют
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 изображений, статистику классов, состояние эмбеддингов, структуру кластеризации и список экспортов; проверка прогресса обучения общедоступной модели; скачивание файлов общедоступной модели; запуск инференса на общедоступной модели; поиск общедоступного профиля пользователя; просмотр развертываний с фильтрацией по одной общедоступной модели; и поиск в разделе «Обзор».
GET /api/training/gpu-availabilityполностью общедоступен, если только ты не запрашиваешь управляемые вычислительные ресурсы. Для всего остального требуется ключ, а его передача в общедоступной конечной точке также открывает доступ к твоим частным ресурсам.