Creative Lab Fidget Pixel API
Превратите фотографию в многоцветную, пригодную для 3D-печати пиксель-арт фиджет-доску в два этапа. Задача прототипа превращает фотографию в изображение в стиле пиксель-арт. Задача сборки превращает это изображение в соединяющиеся друг с другом детали в едином файле 3MF, принимая в качестве input_task_id идентификатор задачи прототипа.
POST /openapi/creative-lab/fidget-pixel/v1/prototypePOST /openapi/creative-lab/fidget-pixel/v1/build
Оба endpoint'а POST требуют платного тарифного плана. Запрос с бесплатного аккаунта возвращает 402.
Создание задачи прототипа Fidget Pixel
Создаёт одно изображение в стиле пиксель-арт из фотографии. Чтобы собрать части, передайте ID этой задачи в эндпоинт сборки в качестве input_task_id. Описание полей задачи см. в разделе Объект задачи прототипа Fidget Pixel.
Если изображение вам не понравилось, создайте ещё одну задачу прототипа. Каждая задача оплачивается отдельно.
Request
# Stage 1: pixelize the source photo
curl https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/prototype \
-X POST \
-H "Authorization: Bearer ${YOUR_API_KEY}" \
-H 'Content-Type: application/json' \
-d '{
"image_url": "<your publicly accessible image url or base64-encoded data URI>",
"type": "person"
}'
Response
{
"result": "019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7"
}
Параметры
- Name
- image_url
- Type
- string
- Обязательный
- Description
Фотография для преобразования в пиксель-арт — в виде публичного URL или Data URI (
data:image/jpeg;base64,<ваши данные изображения в кодировке base64>).Изображение должно быть файлом JPG, JPEG, PNG или WebP размером не более 20 МБ. Meshy определяет формат по данным изображения, а не по расширению файла в URL. URL без расширения тоже подходит, и Meshy следует по перенаправлениям (redirects).
- Name
- type
- Type
- string
- Обязательный
- Description
Что изображено на фотографии — определяет стиль пиксель-арта. Эти два стиля заметно отличаются друг от друга. Любое другое значение вернёт
400.Допустимые значения:
person: человек на портретном или полноростовом фото. Meshy рисует пиксельный спрайт в стиле чиби.other: любой другой объект, например питомец, предмет, маскот, логотип или пейзаж. Meshy рисует пиксельную иконку в стиле бисерной мозаики.
- Name
- name
- Type
- string
- Description
Название задачи, до 100 символов. Оно возвращается в поле
nameзадачи. При превышении длины возвращается400.
Возвращаемое значение
Поле result содержит ID новой задачи прототипа. Получите задачу или получайте её поток обновлений, пока status не станет SUCCEEDED. Затем передайте ID в эндпоинт сборки в качестве input_task_id.
Возможные ошибки
- Name
400 - Bad Request- Description
Запрос не может быть выполнен. Например:
- Отсутствует
image_urlилиtype. typeне равенpersonилиother.- Изображение не является файлом JPG, JPEG, PNG или WebP.
- Изображение слишком маленькое, превышает 20 МБ или превышает максимальное количество пикселей.
- Meshy не может загрузить изображение, например потому что URL возвращает
404или истекло время ожидания. - Data URI не является корректным base64.
- Изображение было помечено как NSFW.
В сообщении об ошибке указано, в чём проблема. Исправьте запрос и отправьте его снова.
- Отсутствует
- Name
401 - Unauthorized- Description
API-ключ отсутствует или недействителен. Проверьте заголовок
Authorization.
- Name
402 - Payment Required- Description
Применимо одно из следующего:
- На счёте недостаточно кредитов.
- API-ключ, рабочая область или участник достигли лимита кредитов.
- Аккаунт использует бесплатный тарифный план.
Проверьте количество кредитов и тарифный план, затем повторите попытку.
- Name
403 - Forbidden- Description
В вашей команде включена функция IP Filtering, и Meshy пометила изображение как содержащее стороннюю интеллектуальную собственность. Отправьте изображение, на использование которого у вас есть права.
- Name
429 - Too Many Requests- Description
Достигнут один из следующих лимитов:
- Вы отправили больше запросов, чем допускает ограничение частоты. Подождите несколько секунд и повторите попытку. См. Ограничения частоты.
- Слишком много ваших задач находятся в очереди или выполняются. Дождитесь завершения части из них, затем повторите попытку.
- На безлимитном тарифном плане без оставшихся кредитов вы достигли количества задач, которые могут выполняться без кредитов. Дождитесь завершения задачи или пополните баланс кредитов.
- Name
500 - Internal Server Error- Description
Meshy столкнулась с серверной ошибкой, например из-за невозможности выполнить проверку изображения на интеллектуальную собственность. Meshy не создаёт задачу и возвращает все списанные кредиты. Повторите запрос.
Создание задачи сборки Fidget Pixel
Создаёт детали для 3D-печати на основе успешно выполненной задачи создания прототипа. Meshy сэмплирует изображение в пиксель-арт стиле на сетку и сокращает его до не более чем color_count цветов. Каждая ячейка объекта становится отдельной соединяемой деталью, а фон не печатается.
Результатом является один многоцветный файл 3MF, готовый к цветной печати. У каждой детали серый корпус и верхняя часть в цвете её пикселя. Описание полей см. в разделе Объект задачи сборки Fidget Pixel.
Request
# Stage 2: chain build off a succeeded prototype task
curl https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/build \
-X POST \
-H "Authorization: Bearer ${YOUR_API_KEY}" \
-H 'Content-Type: application/json' \
-d '{
"input_task_id": "019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7",
"options": {
"shape": "square",
"grid_size": 32,
"piece_size_mm": 8,
"color_count": 8,
"piece_height_mm": 15
},
"output": {
"format": "3mf"
}
}'
Response
{
"result": "019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98"
}
Параметры
- Name
- input_task_id
- Type
- string
- Обязательный
- Description
ID задачи создания прототипа, которую нужно собрать. Это должна быть задача, созданная вашим аккаунтом с помощью
POST /openapi/creative-lab/fidget-pixel/v1/prototype, со статусомSUCCEEDED.ID, не являющийся одной из ваших задач создания прототипа Fidget Pixel через API, возвращает
404, включая прототип, созданный в веб-приложении.
- Name
- name
- Type
- string
- Description
Название задачи, до 100 символов. Оно возвращается в поле
nameзадачи. Более длинное название возвращает400.
options
Настройки формы и размера деталей. У каждого поля есть значение по умолчанию, поэтому отправляйте только те поля, которые хотите изменить. 0 использует значение по умолчанию для поля. Это те же настройки, что и в веб-приложении Creative Lab. Остальные настройки формы зафиксированы, и Meshy устанавливает их на основе shape и piece_size_mm.
- Name
- shape
- Type
- string
- по умолчанию square
- Description
Форма основания каждой детали. Любое другое значение возвращает
400.Доступные значения:
square: квадратные детали на квадратной сеткеhex: шестиугольные детали на шестиугольной сетке, со значениемpiece_size_mm, равным6или8
- Name
- grid_size
- Type
- integer
- по умолчанию 32
- Description
Количество ячеек сетки вдоль каждой стороны доски,
16или32. Любое другое значение возвращает400. Сетка32сохраняет больше деталей. Сетка16даёт меньше деталей того же размера, поэтому доска получается примерно вдвое уже.
- Name
- piece_size_mm
- Type
- integer
- по умолчанию 8
- Description
Длина стороны каждой детали в миллиметрах:
6,8или10. Любое другое значение возвращает400. Вместе сgrid_sizeопределяет размер печатаемой доски. Например, сетка32из деталей 8 мм имеет размер около 26,5 см с каждой стороны.10не работает сhexи возвращает400, поскольку наклонная грань шестиугольника создаёт нависание на большинстве потребительских FDM-принтеров.
- Name
- color_count
- Type
- integer
- по умолчанию 8
- Description
Максимальное количество цветов в палитре пиксель-арта, от
1до8. Значение вне диапазона возвращает400. Для печати вам потребуется доcolor_countплюс один филамент: по одному на цвет и один для серых корпусов.
- Name
- piece_height_mm
- Type
- integer
- по умолчанию 15
- Description
Высота каждой детали в миллиметрах, от
10до80. Значение вне диапазона возвращает400.
output
Настройки для результирующего файла.
- Name
- format
- Type
- string
- по умолчанию 3mf
- Description
Формат файла результата. Любое другое значение возвращает
400.Доступные значения:
3mf: один многоцветный файлmodel.3mf, возвращаемый вmodel_urls.3mf
Возвращаемые значения
Поле result содержит ID новой задачи сборки. Получите задачу или получайте её поток, пока status не станет SUCCEEDED. Затем загрузите файл 3MF из model_urls.3mf.
Режимы сбоя
- Name
400 - Bad Request- Description
Запрос не может быть выполнен. Например:
input_task_idотсутствует или не является допустимым ID задачи.- Статус задачи создания прототипа не
SUCCEEDED. Если она ещё выполняется, подождите и повторите попытку. Если она завершилась неудачей или была отменена, создайте новую задачу создания прототипа. - Задача создания прототипа завершилась успешно, но не содержит изображения. Создайте новую задачу создания прототипа.
- Поле
optionsвыходит за пределы допустимых значений, напримерgrid_size, отличное от16или32. piece_size_mmравно10, аshape—hex. Шестиугольные детали бывают только 6 и 8 мм.output.formatне равно3mf.
Сообщение об ошибке указывает, в чём именно проблема.
- Name
401 - Unauthorized- Description
API-ключ отсутствует или недействителен. Проверьте заголовок
Authorization.
- Name
402 - Payment Required- Description
Применимо одно из следующего:
- На аккаунте недостаточно кредитов.
- API-ключ, рабочая область или участник достигли лимита кредитов.
- Аккаунт находится на бесплатном плане.
Проверьте количество кредитов и план, затем повторите попытку.
- Name
403 - Forbidden- Description
В вашей команде включена функция IP Filtering, и Meshy пометила изображение задачи создания прототипа как содержащее стороннюю интеллектуальную собственность. Создайте задачу создания прототипа из изображения, на использование которого у вас есть права.
- Name
404 - Not Found- Description
input_task_idне соответствует ни одной задаче создания прототипа Fidget Pixel, созданной вашим аккаунтом через API. Прототип, созданный в веб-приложении, также возвращает404. Отправьте ID из поляresultответа на создание прототипа.
- Name
429 - Too Many Requests- Description
Достигнуто одно из следующих ограничений:
- Вы отправили больше запросов, чем допускает ваше ограничение частоты. Подождите несколько секунд и повторите попытку. См. Ограничения частоты.
- Слишком много ваших задач находится в очереди или выполняется. Дождитесь завершения части из них и повторите попытку.
- На безлимитном плане без оставшихся кредитов вы достигли количества задач, которые могут выполняться без кредитов. Дождитесь завершения задачи или пополните кредиты.
- Name
500 - Internal Server Error- Description
В Meshy произошла ошибка сервера, например из-за невозможности выполнить проверку на интеллектуальную собственность для изображения задачи создания прототипа. Meshy не создаёт задачу и возвращает все списанные кредиты. Повторите запрос.
Получить задачу Fidget Pixel
Возвращает задачу прототипа или сборки. Путь должен соответствовать этапу задачи. Задача сборки, запрошенная через /prototype/:id, вернёт 404, как и задача прототипа, запрошенная через /build/:id.
Описание полей см. в разделах Объект задачи прототипа Fidget Pixel и Объект задачи сборки Fidget Pixel.
Request
# Prototype
curl https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/prototype/019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7 \
-H "Authorization: Bearer ${YOUR_API_KEY}"
# Build
curl https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/build/019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98 \
-H "Authorization: Bearer ${YOUR_API_KEY}"
Prototype Response
{
"id": "019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7",
"type": "creative-lab-fidget-pixel-prototype",
"name": "",
"status": "SUCCEEDED",
"progress": 100,
"created_at": 1757001000000,
"started_at": 1757001005000,
"finished_at": 1757001178000,
"expires_at": 1757260378000,
"preceding_tasks": 0,
"task_error": null,
"consumed_credits": 6,
"image_urls": [
"https://assets.meshy.ai/***/pixel-art.jpg?Expires=***"
]
}
Build Response
{
"id": "019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98",
"type": "creative-lab-fidget-pixel-build",
"name": "",
"status": "SUCCEEDED",
"progress": 100,
"created_at": 1757001300000,
"started_at": 1757001304000,
"finished_at": 1757001309000,
"expires_at": 1757260509000,
"preceding_tasks": 0,
"task_error": null,
"consumed_credits": 30,
"model_urls": {
"3mf": "https://assets.meshy.ai/***/tasks/019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98/output/model.3mf?Expires=***"
}
}
Параметры
- Name
- id
- Type
- path
- Description
ID задачи из ответа на создание.
Возвращает
Объект задачи прототипа или объект задачи сборки, в зависимости от этапа, указанного в пути.
Варианты ошибок
- Name
400 - Bad Request- Description
idне является допустимым ID задачи. Отправьте IDresultиз ответа на создание.
- Name
403 - Forbidden- Description
В вашей команде включена функция IP Filtering, и Meshy пометил изображение задачи прототипа как нарушающее права интеллектуальной собственности третьих лиц. Для задач сборки и команд на плане Enterprise эта ошибка не возникает. Создайте задачу прототипа на основе изображения, на использование которого у вас есть права.
- Name
404 - Not Found- Description
Задача Fidget Pixel с таким ID не принадлежит вашему аккаунту, либо этап задачи не соответствует пути. Проверьте ID и используйте
/prototypeили/buildв соответствии с задачей.
- Name
500 - Internal Server Error- Description
Meshy не удалось выполнить проверку интеллектуальной собственности. Повторите запрос.
Удалить задачу Fidget Pixel
Отменяет задачу Fidget Pixel. Отмена задачи со статусом PENDING возвращает её кредиты. Задача со статусом IN_PROGRESS отменяется без возврата средств, поскольку воркер уже приступил к её выполнению. Задачу с окончательным статусом (SUCCEEDED, FAILED или CANCELED) отменить нельзя.
Путь должен соответствовать стадии задачи. Например, DELETE на /prototype/:id с ID задачи сборки вернёт 404.
Request
curl --request DELETE \
--url https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/prototype/019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7 \
-H "Authorization: Bearer ${YOUR_API_KEY}"
Response
// Returns 204 No Content on success (empty body).
Параметры пути
- Name
- id
- Type
- path
- Description
ID задачи, которую нужно отменить.
Возвращает
204 No Content с пустым телом ответа.
Варианты ошибок
- Name
400 - Bad Request- Description
Применимо одно из следующего:
idне является допустимым ID задачи. Отправьте IDresultиз ответа на создание.- Задача уже имеет окончательный статус (
SUCCEEDED,FAILEDилиCANCELED), поэтому её нельзя отменить.
- Name
404 - Not Found- Description
Задача Fidget Pixel с таким ID не принадлежит вашему аккаунту, либо стадия задачи не соответствует пути. Проверьте ID и используйте
/prototypeили/buildв соответствии с задачей.
Потоковая передача задачи Fidget Pixel
Передаёт обновления задачи Fidget Pixel в виде событий Server-Sent Events (SSE). Путь должен соответствовать стадии задачи. Если это не так, например, если ID задачи сборки (build) используется в /prototype/:id/stream, поток отправляет одно событие error со status_code: 404 и закрывается. Если id не является допустимым ID задачи, происходит то же самое, но со status_code: 400.
Request
curl -N https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/build/019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98/stream \
-H "Authorization: Bearer ${YOUR_API_KEY}"
Response Stream
// Error event example (wrong stage or task not found)
event: error
data: {
"status_code": 404,
"message": "Task not found"
}
// Message event examples illustrate task progress.
// Every frame is the full task object for the stage; fields not yet populated are null / empty.
event: message
data: {
"id": "019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98",
"type": "creative-lab-fidget-pixel-build",
"name": "",
"status": "PENDING",
"progress": 0,
"created_at": 1757001300000,
"started_at": null,
"finished_at": null,
"expires_at": 1757260500000,
"preceding_tasks": 2,
"task_error": null,
"consumed_credits": 30,
"model_urls": {}
}
event: message
data: {
"id": "019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98",
"type": "creative-lab-fidget-pixel-build",
"status": "SUCCEEDED",
"progress": 100,
"created_at": 1757001300000,
"started_at": 1757001304000,
"finished_at": 1757001309000,
"expires_at": 1757260509000,
"task_error": null,
"consumed_credits": 30,
"model_urls": {
"3mf": "https://assets.meshy.ai/***/tasks/019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98/output/model.3mf?Expires=***"
}
}
Параметры
- Name
- id
- Type
- path
- Description
ID задачи из ответа на создание.
Возвращает
Поток объектов задачи prototype или build. Каждое событие содержит полный объект задачи, в таком же виде, в каком его возвращает Получение задачи Fidget Pixel. Пока задача находится в состоянии PENDING или IN_PROGRESS, её выходные поля всё ещё пусты (null, [] или {}), а finished_at равно null.
Если IP Filtering блокирует результат задачи, поток отправляет вместо него одно событие error с тем же status_code, который вернул бы запрос get.
Получение списка задач Fidget Pixel
Возвращает ваши задачи Fidget Pixel одного этапа, по одной странице за раз. Путь определяет этап. /prototype возвращает только задачи прототипирования, а /build возвращает только задачи сборки.
Request
# List prototype tasks
curl https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/prototype?page_size=10 \
-H "Authorization: Bearer ${YOUR_API_KEY}"
# List build tasks
curl https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/build?page_size=10 \
-H "Authorization: Bearer ${YOUR_API_KEY}"
Response (List Prototype Tasks)
[
{
"id": "019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7",
"type": "creative-lab-fidget-pixel-prototype",
"name": "",
"status": "SUCCEEDED",
"progress": 100,
"created_at": 1757001000000,
"started_at": 1757001005000,
"finished_at": 1757001178000,
"expires_at": 1757260378000,
"preceding_tasks": 0,
"task_error": null,
"consumed_credits": 6,
"image_urls": [
"https://assets.meshy.ai/***/pixel-art.jpg?Expires=***"
]
}
]
Параметры пути
- Name
- stage
- Type
- path
- Обязательный
- Description
Этап для вывода списка:
prototypeилиbuild.
Параметры запроса
- Name
- page_num
- Type
- integer
- по умолчанию 1
- Description
Возвращаемая страница, от
1до255.0возвращает первую страницу. Значение за пределами диапазона0–255приводит к ошибке400.
- Name
- page_size
- Type
- integer
- по умолчанию 10
- Description
Количество задач на странице, до
100. Значение от101до255возвращает 100 задач, а0использует значение по умолчанию. Значение за пределами диапазона0–255приводит к ошибке400.
- Name
- sort_by
- Type
- string
- по умолчанию -created_at
- Description
Порядок сортировки.
Доступные значения:
-created_at: сначала новые+created_at: сначала старые
Возвращает
Массив объектов задачи прототипирования или объектов задачи сборки, в соответствии с этапом, указанным в пути.
Объект задачи прототипа Fidget Pixel
Задача прототипа превращает фото в изображение в стиле пиксель-арт. Чтобы превратить изображение в детали для 3D-печати, передайте ID задачи в эндпоинт сборки как input_task_id.
Свойства
Example Fidget Pixel Prototype Task Object
{
"id": "019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7",
"type": "creative-lab-fidget-pixel-prototype",
"name": "",
"status": "SUCCEEDED",
"progress": 100,
"created_at": 1757001000000,
"started_at": 1757001005000,
"finished_at": 1757001178000,
"expires_at": 1757260378000,
"preceding_tasks": 0,
"task_error": null,
"consumed_credits": 6,
"image_urls": [
"https://assets.meshy.ai/***/pixel-art.jpg?Expires=***"
]
}
- Name
- id
- Type
- string
- Description
ID задачи. Не полагайтесь на его формат.
- Name
- type
- Type
- string
- Description
Тип задачи, всегда
creative-lab-fidget-pixel-prototype.
- Name
- name
- Type
- string
- Description
Значение
name, отправленное при создании задачи, или"", если вы его не отправляли.
- Name
- status
- Type
- string
- Description
Статус задачи.
Доступные значения:
PENDING: ожидание в очередиIN_PROGRESS: генерация результатаSUCCEEDED: финальный статус, с результатомFAILED: финальный статус, с причиной вtask_errorCANCELED: финальный статус, без результата
- Name
- progress
- Type
- integer
- Description
Процент выполненной работы, от
0до100. Равен0до начала выполнения задачи и100, когда она завершается успешно.
- Name
- created_at
- Type
- timestamp
- Description
Время создания задачи, в миллисекундах Unix.
- Name
- started_at
- Type
- timestamp
- Description
Время, когда обработчик начал выполнение задачи, в миллисекундах Unix. До этого момента —
null.
- Name
- finished_at
- Type
- timestamp
- Description
Время, когда задача достигла финального статуса, в миллисекундах Unix. До этого момента —
null.
- Name
- expires_at
- Type
- timestamp
- Description
Время истечения срока действия результата задачи, в миллисекундах Unix. Это 3 дня после
finished_at, либо 3 дня послеcreated_at, пока задача не завершена. Для аккаунтов Enterprise, которые хранят результаты API бессрочно, это значение указывает примерно на 100 лет вперёд. См. Хранение ресурсов.
- Name
- preceding_tasks
- Type
- integer
- Description
Позиция задачи в очереди, пока она находится в статусе
PENDING.1означает, что она будет обработана следующей. После выхода задачи из очереди —0, и в результатах списка всегда0.
- Name
- task_error
- Type
- object
- Description
Причина сбоя задачи.
null, еслиstatusне равенFAILED. См. Ошибки.
- Name
- consumed_credits
- Type
- integer
- Description
Количество кредитов, списанных за задачу, с учётом любого возврата. За запрос, вернувший ошибку, плата не взимается. Для неудавшейся задачи значение равно
0, так как Meshy возвращает средства. Отмена задачи возвращает средства только пока она находится в статусеPENDING. Если Meshy не может определить сумму списания, поле отсутствует в ответе get или stream, а запрос списка возвращает500. В этом случае повторите запрос.
- Name
- image_urls
- Type
- array of strings
- Description
URL-адреса для скачивания изображения в стиле пиксель-арт. Массив содержит один URL после успешного завершения задачи, а до этого он пуст.
URL-адреса подписаны, поэтому запрашивайте их без заголовка
Authorization. Они остаются действительными доexpires_at. Повторное получение задачи до этого момента возвращает те же URL-адреса, а не заново подписанные. Срок действия истёкшего URL нельзя продлить, поэтому скачайте и сохраните файлы заранее.
Объект задачи сборки Fidget Pixel
Задача сборки генерирует детали для 3D-печати из успешно выполненной задачи прототипа. Meshy отображает пиксель-арт изображение на сетку и возвращает детали в виде единого многоцветного файла 3MF.
Свойства
Example Fidget Pixel Build Task Object
{
"id": "019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98",
"type": "creative-lab-fidget-pixel-build",
"name": "",
"status": "SUCCEEDED",
"progress": 100,
"created_at": 1757001300000,
"started_at": 1757001304000,
"finished_at": 1757001309000,
"expires_at": 1757260509000,
"preceding_tasks": 0,
"task_error": null,
"consumed_credits": 30,
"model_urls": {
"3mf": "https://assets.meshy.ai/***/tasks/019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98/output/model.3mf?Expires=***"
}
}
- Name
- id
- Type
- string
- Description
ID задачи. Не полагайтесь на его формат.
- Name
- type
- Type
- string
- Description
Тип задачи, всегда
creative-lab-fidget-pixel-build.
- Name
- name
- Type
- string
- Description
Значение
name, которое вы отправили при создании задачи, или"", если вы его не отправляли.
- Name
- status
- Type
- string
- Description
Статус задачи.
Доступные значения:
PENDING: ожидание в очередиIN_PROGRESS: генерация результатаSUCCEEDED: завершено, с результатомFAILED: завершено, с причиной вtask_errorCANCELED: завершено, без результата
- Name
- progress
- Type
- integer
- Description
Процент выполненной работы, от
0до100. Равен0, пока задача не начата, и100, когда она успешно завершена.
- Name
- created_at
- Type
- timestamp
- Description
Время создания задачи, в миллисекундах Unix.
- Name
- started_at
- Type
- timestamp
- Description
Время, когда воркер начал выполнение задачи, в миллисекундах Unix. До этого момента —
null.
- Name
- finished_at
- Type
- timestamp
- Description
Время, когда задача достигла финального статуса, в миллисекундах Unix. До этого момента —
null.
- Name
- expires_at
- Type
- timestamp
- Description
Время истечения срока действия результата задачи, в миллисекундах Unix. Это 3 дня после
finished_at, либо 3 дня послеcreated_at, пока задача не завершена. Для корпоративных аккаунтов (Enterprise), которые хранят результаты API бессрочно, это значение указывает примерно на 100 лет вперёд. См. Хранение ресурсов.
- Name
- preceding_tasks
- Type
- integer
- Description
Позиция задачи в очереди, пока она находится в статусе
PENDING.1означает, что она начнётся следующей.0после того, как задача покидает очередь, и всегда0в результатах списка.
- Name
- task_error
- Type
- object
- Description
Причина сбоя задачи.
null, еслиstatusне равенFAILED. См. Ошибки.
- Name
- consumed_credits
- Type
- integer
- Description
Количество кредитов, списанных за задачу, с учётом возможного возврата. Запрос, вернувший ошибку, не оплачивается. Для неудавшейся задачи значение равно
0, так как Meshy возвращает кредиты. Отмена возвращает кредиты за задачу только пока она находится в статусеPENDING. Если Meshy не может определить сумму списания, в ответе на get-запрос или поток это поле отсутствует, а запрос списка возвращает500. В этом случае повторите запрос.
- Name
- model_urls
- Type
- object
- Description
URL-адреса для скачивания результата, с ключами по формату файла. Объект содержит одну запись — для формата
output.format, который вы отправили, и остаётся пустым до завершения задачи.URL-адреса подписаны, поэтому запрашивайте их без заголовка
Authorization. Они остаются действительными доexpires_at. Повторное получение задачи до этого момента возвращает те же URL-адреса, а не вновь подписанные. Истёкший URL-адрес нельзя обновить, поэтому скачивайте и сохраняйте файлы до истечения срока.- Name
3mf- Type
- string
- Description
URL для скачивания многоцветного файла 3MF. Каждая деталь имеет серое тело и верхнюю часть цвета своего пикселя. Присутствует, когда
output.formatравен3mf, что является значением по умолчанию.
Полный пример
Следующие скрипты на cURL и Python выполняют весь процесс. Каждый скрипт создаёт задачу прототипа из фотографии и ожидает её успешного завершения. Затем он создаёт задачу сборки, ожидает её завершения и скачивает файл 3MF из model_urls.3mf.
Для скрипта cURL требуются curl и jq, а для скрипта Python — пакет requests. Чтобы запустить скрипт, выполните следующие шаги:
- Установите
MESHY_API_KEYравным вашему API-ключу. - Установите
IMAGE_PATHравным пути к локальной фотографии, либоIMAGE_URLравным публичному URL изображения. - Необязательно: чтобы пикселизировать объект, отличный от человека, установите
PIXEL_TYPEравнымother. - Запустите скрипт.
Обычно задача прототипа завершается в течение нескольких минут. Задача сборки обычно завершается значительно быстрее минуты.
В своём приложении показывайте пользователю изображение из image_urls перед созданием задачи сборки. Если оно ему не понравится, создайте вместо этого ещё одну задачу прототипа. Таким образом вы тратите кредиты на сборку только на то изображение, которое он одобрил.
Complete flow
#!/usr/bin/env bash
set -euo pipefail
# Requires curl and jq. Point IMAGE_PATH at a local photo, or IMAGE_URL at a public one:
# export MESHY_API_KEY=msy_...
# export IMAGE_PATH=./portrait.jpg # or: export IMAGE_URL=https://...
# export PIXEL_TYPE=person # or: other
: "${MESHY_API_KEY:?export MESHY_API_KEY first}"
if [[ -z "${IMAGE_PATH:-}" && -z "${IMAGE_URL:-}" ]]; then
echo "export IMAGE_PATH (local file) or IMAGE_URL (public url) first" >&2
exit 1
fi
PIXEL_TYPE=${PIXEL_TYPE:-person}
BASE="https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1"
AUTH="Authorization: Bearer $MESHY_API_KEY"
# api METHOD URL [curl args...] -> prints the response body, non-zero on failure.
# Note we do not use -f/--fail: it discards the body, and the body is the only
# place the reason appears.
api() {
local method=$1 url=$2 out http_code body
shift 2
out=$(curl --silent --show-error --max-time 60 --write-out $'\n%{http_code}' \
-X "$method" "$url" -H "$AUTH" "$@") || return 1
http_code=${out##*$'\n'}
body=${out%$'\n'*}
if ((http_code >= 400)); then
echo "HTTP $http_code for $url: $body" >&2
return 1
fi
printf '%s' "$body"
}
# Each task gets its own 40-minute budget.
poll() {
local kind=$1 id=$2 delay=5 task_status deadline
deadline=$(($(date +%s) + 2400))
while :; do
if (($(date +%s) >= deadline)); then
echo "gave up waiting for $kind $id" >&2
return 1
fi
task_status=$(api GET "$BASE/$kind/$id" | jq -r '.status')
echo "$kind: $task_status"
case "$task_status" in
SUCCEEDED) return 0 ;;
FAILED | CANCELED) return 1 ;;
esac
sleep "$delay"
delay=$((delay * 2 > 30 ? 30 : delay * 2))
done
}
# Build the request body in a file. A base64 data URI must never go on the
# command line or into an exported variable - a photo of any real size will
# exceed the OS argument limit.
BODY=$(mktemp)
trap 'rm -f "$BODY"' EXIT
if [[ -n "${IMAGE_PATH:-}" ]]; then
# Declare the real type: the API accepts JPEG, PNG and WebP.
case "$(printf '%s' "${IMAGE_PATH##*.}" | tr 'A-Z' 'a-z')" in
png) MIME=image/png ;;
webp) MIME=image/webp ;;
*) MIME=image/jpeg ;;
esac
{
printf '{"type":"%s","image_url":"data:%s;base64,' "$PIXEL_TYPE" "$MIME"
base64 <"$IMAGE_PATH" | tr -d '\n'
printf '"}'
} >"$BODY"
else
jq -n --arg t "$PIXEL_TYPE" --arg u "$IMAGE_URL" \
'{type: $t, image_url: $u}' >"$BODY"
fi
# 1. Create the prototype task
PROTO_ID=$(api POST "$BASE/prototype" \
-H 'Content-Type: application/json' --data-binary @"$BODY" | jq -r '.result')
# 2. Wait for the pixel-art image (show image_urls[0] to a user in production)
poll prototype "$PROTO_ID"
# 3. Create the build task (defaults: square pieces, 32x32 grid, 8 mm, 8 colors, 15 mm tall)
jq -n --arg p "$PROTO_ID" \
'{input_task_id: $p, options: {shape: "square", grid_size: 32, piece_size_mm: 8, color_count: 8, piece_height_mm: 15}, output: {format: "3mf"}}' >"$BODY"
BUILD_ID=$(api POST "$BASE/build" \
-H 'Content-Type: application/json' --data-binary @"$BODY" | jq -r '.result')
# 4. Wait for the pieces
poll build "$BUILD_ID"
# 5. Download the 3MF. This is a signed URL: no Authorization header,
# and it stays valid for 3 days after the task finishes.
TASK=$(api GET "$BASE/build/$BUILD_ID")
curl --silent --show-error --fail --max-time 900 \
-o fidget-pixel.3mf "$(jq -r '.model_urls["3mf"]' <<<"$TASK")"
echo "Done: fidget-pixel.3mf"