Creative Lab Keycap API
Zamień zdjęcie w pełnokolorowy, niestandardowy klawisz (keycap) do klawiatury mechanicznej w dwóch etapach. Zadanie prototypu generuje na podstawie zdjęcia obraz gotowego klawisza. Zadanie budowy zamienia ten obraz w teksturowany model 3D klawisza. Pobiera ono identyfikator zadania prototypu jako input_task_id oraz identyfikator kandydata obrazu jako candidate_id.
POST /openapi/creative-lab/keycap/v1/prototypePOST /openapi/creative-lab/keycap/v1/build
Oba endpointy POST wymagają płatnego planu. Żądanie z konta na planie bezpłatnym zwraca 402.
Utwórz zadanie prototypu Keycap
Generuje jeden obraz gotowej nasadki klawisza (keycap) na podstawie zdjęcia. Pole image_urls zadania zawiera obraz, a candidate_ids zawiera jego ID, po jednym wpisie w każdym. Jeśli projekt Ci się nie podoba, utwórz kolejne zadanie prototypu. Meshy nalicza opłatę za każde zadanie prototypu osobno.
Aby zbudować nasadkę klawisza 3D, przekaż ID tego zadania do punktu końcowego budowania jako input_task_id, a wpis candidate_ids jako candidate_id. Informacje o polach zadania znajdziesz w sekcji Obiekt zadania prototypu Keycap.
Request
# Stage 1: generate a finished-keycap design render
curl https://api.meshy.ai/openapi/creative-lab/keycap/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>"
}'
Response
{
"result": "019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef"
}
Parametry
- Name
- image_url
- Type
- string
- Wymagane
- Description
Zdjęcie, które ma zostać przekształcone w projekt nasadki klawisza, jako publicznie dostępny URL lub Data URI (
data:image/jpeg;base64,<Twoje dane obrazu zakodowane w base64>).Obraz musi być plikiem JPG, JPEG, PNG lub WebP o rozmiarze maksymalnie 20 MB (20 000 000 bajtów). Każdy bok musi mieć co najmniej 32 piksele, a obraz może mieć łącznie maksymalnie 178 956 970 pikseli. Obraz przekraczający te limity zwraca
400.Meshy wykrywa format na podstawie danych obrazu, a nie na podstawie rozszerzenia pliku w adresie URL. Adres URL bez rozszerzenia również działa, a Meshy podąża za przekierowaniami HTTP. Meshy stosuje orientację EXIF, więc obrócone zdjęcie z telefonu wychodzi tak, jak powinno wyglądać.
Data URI musi być zakodowane w base64 z typem obrazu, np.
data:image/png;base64,..., a zdekodowany obraz musi być w formacie JPEG, PNG lub WebP. Limit 20 MB dotyczy zdekodowanego obrazu, więc tekst base64 może być o około jedną trzecią większy.
- Name
- name
- Type
- string
- Description
Nazwa zadania, maksymalnie 100 znaków. Jest zwracana w polu
namezadania. Dłuższa nazwa zwraca400.
- Name
- remove_background
- Type
- boolean
- domyślne false
- Description
Określa, czy usunąć tło z obrazu prototypu.
truezwraca przezroczysty obraz PNG w formacie RGBA, dzięki czemu możesz umieścić nasadkę klawisza na dowolnym tle. Jeśli Meshy nie może usunąć tła, zwraca obraz z jego tłem, a zadanie nadal kończy się sukcesem.Projekt wierzchniej części, który podczas budowania zostaje przekształcony w 3D, zachowuje swoje tło niezależnie od tego ustawienia. Proces budowania maluje podstawę nasadki klawisza na podstawie obrazu w
image_urls, bez jego tła, jeśli wysłanotrue. Proces budowania zwraca ten obraz jakoprocess_image_urls.composite.
Zwracane wartości
Pole result zawiera ID nowego zadania prototypu. Pobierz zadanie lub przesyłaj je strumieniowo, aż status przyjmie wartość SUCCEEDED. Następnie przekaż ID do punktu końcowego budowania jako input_task_id, a wpis z candidate_ids jako candidate_id.
Tryby niepowodzenia
- Name
400 - Bad Request- Description
Żądanie nie może zostać wykonane. Na przykład:
- Brakuje
image_url. - Obraz nie jest plikiem JPG, JPEG, PNG ani WebP.
- Obraz jest zbyt mały, przekracza 20 MB lub przekracza maksymalną liczbę pikseli.
- Meshy nie może pobrać obrazu, na przykład ponieważ adres URL zwraca
404lub upłynął limit czasu. - Data URI nie jest prawidłowo zakodowane w base64.
- Obraz został oznaczony jako NSFW.
Komunikat o błędzie wskazuje, jaki problem został wykryty. Popraw żądanie i wyślij je ponownie.
- Brakuje
- Name
401 - Unauthorized- Description
Brakuje klucza API lub jest on nieprawidłowy. Sprawdź nagłówek
Authorization.
- Name
402 - Payment Required- Description
Zastosowanie ma jedna z poniższych sytuacji:
- Konto nie ma wystarczającej liczby kredytów.
- Klucz API, obszar roboczy lub członek osiągnął swój limit kredytów.
- Konto korzysta z planu darmowego.
Sprawdź swoje kredyty i plan, a następnie spróbuj ponownie.
- Name
403 - Forbidden- Description
Twój zespół ma włączone filtrowanie adresów IP, a Meshy oznaczyło obraz jako naruszający prawa własności intelektualnej osób trzecich. Wyślij obraz, do którego masz prawa użytkowania.
- Name
429 - Too Many Requests- Description
Osiągnięto jeden z poniższych limitów:
- Wysłano więcej żądań, niż pozwala na to Twój limit szybkości. Odczekaj kilka sekund, a następnie spróbuj ponownie. Zobacz Limity szybkości.
- Zbyt wiele Twoich zadań znajduje się w kolejce lub jest w trakcie wykonywania. Poczekaj, aż część z nich się zakończy, a następnie spróbuj ponownie.
- W przypadku planu nielimitowanego bez pozostałych kredytów osiągnięto liczbę zadań, które mogą być uruchamiane bez kredytów. Poczekaj na zakończenie zadania lub dodaj kredyty.
- Name
500 - Internal Server Error- Description
Wystąpił błąd serwera Meshy, na przykład dlatego, że nie udało się przeprowadzić moderacji treści lub sprawdzenia praw własności intelektualnej, albo Meshy nie mogło zapisać obrazu. Meshy nie tworzy zadania i zwraca wszelkie naliczone kredyty. Spróbuj wysłać żądanie ponownie.
Utwórz zadanie budowy Keycap
Generuje teksturowany model 3D keycapa na podstawie zakończonego powodzeniem zadania prototypu i jednego z jego kandydatów. Opis pól znajdziesz w sekcji Obiekt zadania budowy Keycap.
Jedno zadanie budowy wykonuje każdy krok. Generuje model 3D na podstawie projektu i nadaje mu kolory. Następnie osadza i przycina model na podstawie keycapa w skalibrowanej pozycji domyślnej, dzięki czemu nie musisz dostosowywać jej ręcznie. Na koniec składa keycap i eksportuje pliki. Budowa trwa zazwyczaj od 3 do 7 minut.
Request
# Stage 2: build the chosen candidate into a 3D keycap
curl https://api.meshy.ai/openapi/creative-lab/keycap/v1/build \
-X POST \
-H "Authorization: Bearer ${YOUR_API_KEY}" \
-H 'Content-Type: application/json' \
-d '{
"input_task_id": "019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef",
"candidate_id": "0198c1b2-33f5-7d21-a4b7-8e9d0c1f2a3b",
"options": {
"base_model": "cherry-mx-1x1-r1",
"head_size_mm": 23,
"vertical_offset_mm": 0
}
}'
Response
{
"result": "019c9a52-7d18-7e2b-9f01-6e3b98c4d2af"
}
Parametry
- Name
- input_task_id
- Type
- string
- Wymagane
- Description
ID zadania prototypu do zbudowania. Musi to być zadanie utworzone przez Twoje konto za pomocą
POST /openapi/creative-lab/keycap/v1/prototype, ze statusemSUCCEEDED.ID, które nie jest zadaniem prototypu Keycap z API utworzonym przez Twoje konto, zwraca
404, w tym również prototyp utworzony w aplikacji webowej.
- Name
- candidate_id
- Type
- string
- Wymagane
- Description
Kandydat do zbudowania, pochodzący z tablicy
candidate_idszadania prototypu. Wartość spoza tej tablicy zwraca400.
- Name
- name
- Type
- string
- Description
Nazwa zadania, do 100 znaków. Jest zwracana w polu
namezadania. Dłuższa nazwa zwraca400.
options
Opcjonalne ustawienia geometrii. Każde pole ma skalibrowaną wartość domyślną, więc wysyłaj tylko te pola, które chcesz zmienić.
- Name
- base_model
- Type
- string
- domyślne cherry-mx-1x1-r1
- Description
Podstawa keycapa, na której następuje budowa. Jedyną wartością jest
cherry-mx-1x1-r1, standardowy keycap o profilu Cherry MX 1u. Niestandardowe rozmiary nie są obsługiwane, a każda inna wartość zwraca400.
- Name
- head_size_mm
- Type
- number
- domyślne 23
- Description
Rozmiar główki wzdłuż jej najdłuższego wymiaru, w milimetrach, od
10do40. Meshy skaluje główkę tak, aby jej najdłuższy wymiar odpowiadał tej wartości. Wartość spoza tego zakresu zwraca400.Dla wartości powyżej około
32.9Meshy może zmniejszyć rozmiar, aby główka zmieściła się w granicach ochronnego obszaru podstawy. Główka może wtedy wyjść mniejsza, niż zażądano. Obiekt zadania nie zwraca rozmiaru zastosowanego przez Meshy. Aby go sprawdzić, zmierz prostopadłościan ograniczający siatkikeycap-headw modelu.
- Name
- vertical_offset_mm
- Type
- number
- domyślne 0
- Description
Przesunięcie pionowe stosowane do główki, zanim Meshy osadzi ją na podstawie, w milimetrach, od
-5do5. Wartość spoza tego zakresu zwraca400.
Zwracane dane
Pole result zawiera ID nowego zadania budowy. Pobierz zadanie lub przesyłaj je strumieniowo, dopóki status nie będzie miał wartości SUCCEEDED. Następnie pobierz plik GLB z model_urls.glb oraz pakiet OBJ z model_urls.obj_zip.
Meshy eksportuje plik GLB i pakiet OBJ w rzeczywistej skali, w milimetrach. Oba korzystają z układu współrzędnych z osią Y skierowaną w górę, przy czym przód keycapa jest zwrócony w kierunku +Z.
Tryby niepowodzenia
- Name
400 - Bad Request- Description
Żądanie nie może zostać wykonane. Na przykład:
input_task_idjest nieobecne lub nie jest prawidłowym ID zadania.- Status zadania prototypu nie jest
SUCCEEDED. Jeśli nadal trwa, poczekaj i spróbuj ponownie. Jeśli zakończyło się niepowodzeniem lub zostało anulowane, utwórz nowe zadanie prototypu. - Zadanie prototypu zakończyło się powodzeniem, ale nie ma kandydatów. Utwórz nowe zadanie prototypu.
candidate_idjest nieobecne lub nie znajduje się wcandidate_idszadania prototypu. Wyślij wartość z tej tablicy.- Pole w
optionsjest poza dozwolonym zakresem lubbase_modelnie jest dostępną wartością.
Komunikat błędu wskazuje, jaki problem wystąpił.
- Name
401 - Unauthorized- Description
Brak klucza API lub klucz API jest nieprawidłowy. Sprawdź nagłówek
Authorization.
- Name
402 - Payment Required- Description
Zastosowanie ma jedno z poniższych:
- Konto nie ma wystarczającej liczby kredytów.
- Klucz API, obszar roboczy lub członek osiągnął limit kredytów.
- Konto korzysta z planu darmowego.
Sprawdź swoje kredyty i plan, a następnie spróbuj ponownie.
- Name
404 - Not Found- Description
input_task_idnie pasuje do żadnego zadania prototypu Keycap utworzonego przez Twoje konto za pomocą API. Prototyp utworzony w aplikacji webowej również zwraca404. Wyślij IDresultz odpowiedzi na utworzenie prototypu.
- Name
429 - Too Many Requests- Description
Osiągnięto jeden z poniższych limitów:
- Wysłano więcej żądań, niż pozwala na to limit szybkości. Poczekaj kilka sekund, a następnie spróbuj ponownie. Zobacz Limity szybkości.
- Zbyt wiele Twoich zadań jest w kolejce lub trwa. Poczekaj, aż część z nich się zakończy, a następnie spróbuj ponownie.
- W przypadku planu nielimitowanego bez pozostałych kredytów, osiągnięto liczbę zadań, które mogą być uruchomione bez kredytów. Poczekaj na zakończenie zadania lub dodaj kredyty.
- Name
500 - Internal Server Error- Description
Meshy nie mogło utworzyć zadania z powodu błędu serwera. Meshy zwraca wszelkie pobrane kredyty. Spróbuj ponownie wysłać żądanie.
Pobierz zadanie Keycap
Zwraca zadanie prototypu lub builda. Ścieżka musi odpowiadać etapowi zadania. Zadanie builda zażądane przez /prototype/:id zwraca 404, podobnie jak zadanie prototypu zażądane przez /build/:id.
Pola opisano w Obiekt zadania prototypu Keycap oraz Obiekt zadania builda Keycap.
Request
# Prototype
curl https://api.meshy.ai/openapi/creative-lab/keycap/v1/prototype/019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef \
-H "Authorization: Bearer ${YOUR_API_KEY}"
# Build
curl https://api.meshy.ai/openapi/creative-lab/keycap/v1/build/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af \
-H "Authorization: Bearer ${YOUR_API_KEY}"
Prototype Response
{
"id": "019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef",
"type": "creative-lab-keycap-prototype",
"name": "",
"status": "SUCCEEDED",
"progress": 100,
"created_at": 1753142456000,
"started_at": 1753142460000,
"finished_at": 1753142516000,
"expires_at": 1753401716000,
"preceding_tasks": 0,
"task_error": null,
"consumed_credits": 12,
"image_urls": [
"https://assets.meshy.ai/***/design-1.png?Expires=***"
],
"candidate_ids": [
"0198c1b2-33f5-7d21-a4b7-8e9d0c1f2a3b"
]
}
Build Response
{
"id": "019c9a52-7d18-7e2b-9f01-6e3b98c4d2af",
"type": "creative-lab-keycap-build",
"name": "",
"status": "SUCCEEDED",
"progress": 100,
"created_at": 1753142600000,
"started_at": 1753142610000,
"finished_at": 1753143050000,
"expires_at": 1753402250000,
"preceding_tasks": 0,
"task_error": null,
"consumed_credits": 50,
"model_urls": {
"glb": "https://assets.meshy.ai/***/tasks/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af/output/model.glb?Expires=***",
"obj_zip": "https://assets.meshy.ai/***/tasks/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af/output/model-obj.zip?Expires=***"
},
"process_image_urls": {
"head_design": "https://assets.meshy.ai/***/head-design.png?Expires=***",
"composite": "https://assets.meshy.ai/***/composite.png?Expires=***",
"base_canvas": "https://assets.meshy.ai/***/base-canvas.png?Expires=***"
}
}
Parametry
- Name
- id
- Type
- path
- Description
ID zadania z odpowiedzi tworzenia.
Zwraca
Obiekt zadania prototypu lub obiekt zadania builda, zgodnie z etapem wskazanym w ścieżce.
Tryby błędów
- Name
400 - Bad Request- Description
idnie jest prawidłowym ID zadania. Wyślij IDresultz odpowiedzi tworzenia.
- Name
403 - Forbidden- Description
Twój zespół ma włączone Filtrowanie IP, a Meshy oznaczyło obraz zadania prototypu jako naruszający prawa własności intelektualnej osób trzecich. Zadania builda oraz zespoły w planie Enterprise nie otrzymują tego błędu. Utwórz zadanie prototypu na podstawie obrazu, do którego posiadasz prawa.
- Name
404 - Not Found- Description
Żadne zadanie Keycap o tym ID nie należy do Twojego konta, lub etap zadania nie zgadza się ze ścieżką. Sprawdź ID i użyj
/prototypelub/buildzgodnie z zadaniem.
- Name
500 - Internal Server Error- Description
Meshy nie mogło przeprowadzić kontroli własności intelektualnej. Ponów żądanie.
Usuwanie zadania Keycap
Anuluje zadanie Keycap. Anulowanie zadania o statusie PENDING powoduje zwrot kredytów. Zadanie o statusie IN_PROGRESS jest anulowane bez zwrotu kredytów, ponieważ worker już rozpoczął jego przetwarzanie. Zadania ze statusem końcowym (SUCCEEDED, FAILED lub CANCELED) nie można anulować.
Ścieżka musi odpowiadać etapowi zadania. Na przykład DELETE na /prototype/:id z ID zadania typu build zwróci 404.
Request
curl --request DELETE \
--url https://api.meshy.ai/openapi/creative-lab/keycap/v1/prototype/019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef \
-H "Authorization: Bearer ${YOUR_API_KEY}"
Response
// Returns 204 No Content on success (empty body).
Parametry ścieżki
- Name
- id
- Type
- path
- Description
ID zadania do anulowania.
Zwraca
204 No Content z pustą treścią.
Tryby błędów
- Name
400 - Bad Request- Description
Zastosowanie ma jedno z poniższych:
idnie jest prawidłowym ID zadania. Wyślij IDresultz odpowiedzi tworzenia zadania.- Zadanie ma już status końcowy (
SUCCEEDED,FAILEDlubCANCELED), więc nie można go anulować.
- Name
404 - Not Found- Description
Żadne zadanie Keycap o tym ID nie należy do Twojego konta lub etap zadania nie odpowiada ścieżce. Sprawdź ID i użyj
/prototypelub/build, aby dopasować zadanie.
- Name
500 - Internal Server Error- Description
Meshy napotkało błąd serwera podczas anulowania zadania, więc zadanie może, ale nie musi zostać anulowane. Pobierz zadanie, aby sprawdzić jego
statusprzed ponowną próbą.
Przesyłaj strumieniowo zadanie Keycap
Przesyła strumieniowo aktualizacje zadania Keycap jako zdarzenia Server-Sent Events (SSE). Ścieżka musi odpowiadać etapowi zadania. Jeśli tak nie jest, na przykład identyfikator zadania build pod adresem /prototype/:id/stream, strumień wysyła jedno zdarzenie error z status_code: 404 i zamyka się.
Request
curl -N https://api.meshy.ai/openapi/creative-lab/keycap/v1/build/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af/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; fields not yet populated are null / empty.
// The following PENDING frame is shortened to the fields that change.
event: message
data: {
"id": "019c9a52-7d18-7e2b-9f01-6e3b98c4d2af",
"progress": 0,
"status": "PENDING"
}
event: message
data: {
"id": "019c9a52-7d18-7e2b-9f01-6e3b98c4d2af",
"type": "creative-lab-keycap-build",
"status": "SUCCEEDED",
"progress": 100,
"created_at": 1753142600000,
"started_at": 1753142610000,
"finished_at": 1753143050000,
"expires_at": 1753402250000,
"task_error": null,
"consumed_credits": 50,
"model_urls": {
"glb": "https://assets.meshy.ai/***/tasks/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af/output/model.glb?Expires=***",
"obj_zip": "https://assets.meshy.ai/***/tasks/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af/output/model-obj.zip?Expires=***"
},
"process_image_urls": {
"head_design": "https://assets.meshy.ai/***/head-design.png?Expires=***"
}
}
Parametry
- Name
- id
- Type
- path
- Description
Identyfikator zadania z odpowiedzi na żądanie utworzenia.
Zwraca
Strumień obiektów zadania prototype lub build. Każde zdarzenie zawiera pełny obiekt zadania, taki jak zwraca go Pobierz zadanie Keycap. Gdy zadanie ma status PENDING lub IN_PROGRESS, jego pola wyjściowe są nadal puste (null, [] lub {}), a finished_at ma wartość null.
Jeśli IP Filtering blokuje wynik zadania, strumień wysyła w jego miejsce jedno zdarzenie error, z status_code, który zwróciłoby żądanie get.
Lista zadań Keycap
Zwraca Twoje zadania Keycap z jednego etapu, po jednej stronie na raz. Ścieżka określa etap. /prototype zwraca tylko zadania prototypowe, a /build zwraca tylko zadania budowania.
Request
# List prototype tasks
curl https://api.meshy.ai/openapi/creative-lab/keycap/v1/prototype?page_size=10 \
-H "Authorization: Bearer ${YOUR_API_KEY}"
# List build tasks
curl https://api.meshy.ai/openapi/creative-lab/keycap/v1/build?page_size=10 \
-H "Authorization: Bearer ${YOUR_API_KEY}"
Response (List Prototype Tasks)
[
{
"id": "019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef",
"type": "creative-lab-keycap-prototype",
"name": "",
"status": "SUCCEEDED",
"progress": 100,
"created_at": 1753142456000,
"started_at": 1753142460000,
"finished_at": 1753142516000,
"expires_at": 1753401716000,
"preceding_tasks": 0,
"task_error": null,
"consumed_credits": 12,
"image_urls": [
"https://assets.meshy.ai/***/design-1.png?Expires=***"
],
"candidate_ids": [
"0198c1b2-33f5-7d21-a4b7-8e9d0c1f2a3b"
]
}
]
Parametry ścieżki
- Name
- stage
- Type
- path
- Wymagane
- Description
Etap do wylistowania,
prototypelubbuild.
Parametry zapytania
- Name
- page_num
- Type
- integer
- domyślne 1
- Description
Strona do zwrócenia, od
1do255.0zwraca pierwszą stronę. Wartość spoza zakresu0do255zwraca400.
- Name
- page_size
- Type
- integer
- domyślne 10
- Description
Liczba zadań na stronę, maksymalnie
100. Wartość od101do255zwraca 100 zadań, a0używa wartości domyślnej. Wartość spoza zakresu0do255zwraca400.
- Name
- sort_by
- Type
- string
- domyślne -created_at
- Description
Kolejność sortowania.
Dostępne wartości:
-created_at: od najnowszych+created_at: od najstarszych
Zwraca
Tablicę obiektów zadań prototypowych lub obiektów zadań budowania, odpowiadających etapowi podanemu w ścieżce.
Obiekt zadania prototypu Keycap
Zadanie prototypu generuje jeden obraz gotowego keycapa na podstawie zdjęcia. Aby przekształcić projekt w trójwymiarowy keycap, przekaż identyfikator zadania do punktu końcowego build jako input_task_id, wraz z odpowiednim wpisem candidate_ids jako candidate_id.
Właściwości
Example Keycap Prototype Task Object
{
"id": "019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef",
"type": "creative-lab-keycap-prototype",
"name": "",
"status": "SUCCEEDED",
"progress": 100,
"created_at": 1753142456000,
"started_at": 1753142460000,
"finished_at": 1753142516000,
"expires_at": 1753401716000,
"preceding_tasks": 0,
"task_error": null,
"consumed_credits": 12,
"image_urls": [
"https://assets.meshy.ai/***/design-1.png?Expires=***"
],
"candidate_ids": [
"0198c1b2-33f5-7d21-a4b7-8e9d0c1f2a3b"
]
}
- Name
- id
- Type
- string
- Description
Identyfikator zadania. Nie polegaj na jego formacie.
- Name
- type
- Type
- string
- Description
Typ zadania, zawsze
creative-lab-keycap-prototype.
- Name
- name
- Type
- string
- Description
Wartość
namewysłana podczas tworzenia zadania lub"", jeśli jej nie wysłano.
- Name
- status
- Type
- string
- Description
Status zadania.
Dostępne wartości:
PENDING: oczekuje w kolejceIN_PROGRESS: generowanie wynikuSUCCEEDED: zakończone, z wynikiemFAILED: zakończone, z powodem wtask_errorCANCELED: zakończone, bez wyniku
- Name
- progress
- Type
- integer
- Description
Procent wykonanej pracy, od
0do100. Wynosi0do momentu rozpoczęcia zadania i100, gdy zakończy się powodzeniem.
- Name
- created_at
- Type
- timestamp
- Description
Czas utworzenia zadania, w milisekundach Unix.
- Name
- started_at
- Type
- timestamp
- Description
Czas, w którym pracownik rozpoczął zadanie, w milisekundach Unix. Do tego momentu
null.
- Name
- finished_at
- Type
- timestamp
- Description
Czas, w którym zadanie osiągnęło status końcowy, w milisekundach Unix. Do tego momentu
null.
- Name
- expires_at
- Type
- timestamp
- Description
Czas wygaśnięcia wyniku zadania, w milisekundach Unix. Wynosi 3 dni po
finished_at, lub 3 dni pocreated_at, dopóki zadanie się nie zakończy. W przypadku kont Enterprise, które przechowują wyniki API bezterminowo, jest to około 100 lat później. Zobacz Przechowywanie zasobów.
- Name
- preceding_tasks
- Type
- integer
- Description
Pozycja zadania w kolejce, gdy ma status
PENDING.1oznacza, że zostanie uruchomione jako następne.0po opuszczeniu kolejki przez zadanie, i zawsze0w wynikach list.
- Name
- task_error
- Type
- object
- Description
Powód niepowodzenia zadania.
null, chyba żestatustoFAILED. Zobacz Błędy.
- Name
- consumed_credits
- Type
- integer
- Description
Liczba kredytów naliczonych za zadanie, po uwzględnieniu ewentualnego zwrotu. Żądanie zwracające błąd nie jest obciążane opłatą. Nieudane zadanie ma wartość
0, ponieważ Meshy zwraca za nie kredyty. Anulowanie powoduje zwrot kredytów tylko wtedy, gdy zadanie ma statusPENDING. Jeśli Meshy nie może odczytać naliczonej opłaty, odpowiedź typu get lub stream pomija to pole, a żądanie listy zwraca500. W takim przypadku ponów żądanie.
- Name
- image_urls
- Type
- array of strings
- Description
Adresy URL do pobrania obrazu gotowego keycapa. Tablica zawiera jeden adres URL po pomyślnym zakończeniu zadania, a do tego momentu jest pusta.
image_urls[i]pokazuje kandydata zcandidate_ids[i].Te adresy URL służą do wyświetlania. Punkt końcowy build przyjmuje wpis z
candidate_ids, a nie adres URL. Są to podpisane adresy URL, więc pobieraj je bez nagłówkaAuthorization. Pozostają ważne doexpires_at, a ponowne pobranie zadania zwraca te same adresy URL.
- Name
- candidate_ids
- Type
- array of strings
- Description
Identyfikatory kandydatów, w tej samej kolejności co
image_urls. Aby zbudować kandydata, wyślij jego identyfikator jakocandidate_idw żądaniu build. Nie polegaj na formacie tych identyfikatorów.
Obiekt zadania budowy Keycap
Zadanie budowy generuje teksturowany model 3D keycapa na podstawie zakończonego powodzeniem zadania prototypu i jednego z jego kandydatów. Generuje model 3D, koloruje go, osadza i wycina otwór na trzpień w podstawie keycapa, a następnie składa i eksportuje keycap.
Właściwości
Example Keycap Build Task Object
{
"id": "019c9a52-7d18-7e2b-9f01-6e3b98c4d2af",
"type": "creative-lab-keycap-build",
"name": "",
"status": "SUCCEEDED",
"progress": 100,
"created_at": 1753142600000,
"started_at": 1753142610000,
"finished_at": 1753143050000,
"expires_at": 1753402250000,
"preceding_tasks": 0,
"task_error": null,
"consumed_credits": 50,
"model_urls": {
"glb": "https://assets.meshy.ai/***/tasks/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af/output/model.glb?Expires=***",
"obj_zip": "https://assets.meshy.ai/***/tasks/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af/output/model-obj.zip?Expires=***"
},
"process_image_urls": {
"head_design": "https://assets.meshy.ai/***/head-design.png?Expires=***",
"composite": "https://assets.meshy.ai/***/composite.png?Expires=***",
"base_canvas": "https://assets.meshy.ai/***/base-canvas.png?Expires=***"
}
}
- Name
- id
- Type
- string
- Description
ID zadania. Nie polegaj na jego formacie.
- Name
- type
- Type
- string
- Description
Typ zadania, zawsze
creative-lab-keycap-build.
- Name
- name
- Type
- string
- Description
Wartość
namewysłana podczas tworzenia zadania lub"", jeśli jej nie wysłano.
- Name
- status
- Type
- string
- Description
Status zadania.
Dostępne wartości:
PENDING: oczekiwanie w kolejceIN_PROGRESS: generowanie wynikuSUCCEEDED: wynik końcowy, z rezultatemFAILED: wynik końcowy, z powodem wtask_errorCANCELED: wynik końcowy, bez rezultatu
- Name
- progress
- Type
- integer
- Description
Procent wykonanej pracy, od
0do100. Wynosi0do czasu rozpoczęcia zadania i100, gdy zakończy się powodzeniem.
- Name
- created_at
- Type
- timestamp
- Description
Czas utworzenia zadania, w milisekundach Unix.
- Name
- started_at
- Type
- timestamp
- Description
Czas rozpoczęcia zadania przez workera, w milisekundach Unix. Do tego czasu wartość to
null.
- Name
- finished_at
- Type
- timestamp
- Description
Czas osiągnięcia przez zadanie statusu końcowego, w milisekundach Unix. Do tego czasu wartość to
null.
- Name
- expires_at
- Type
- timestamp
- Description
Czas wygaśnięcia wyniku zadania, w milisekundach Unix. Przypada 3 dni po
finished_atlub 3 dni pocreated_at, dopóki zadanie się nie zakończy. W przypadku kont Enterprise, które przechowują wyniki API bezterminowo, jest to około 100 lat później. Zobacz Przechowywanie zasobów.
- Name
- preceding_tasks
- Type
- integer
- Description
Pozycja zadania w kolejce, gdy ma status
PENDING.1oznacza, że zostanie uruchomione jako następne.0po opuszczeniu kolejki przez zadanie i zawsze0w wynikach listy.
- Name
- task_error
- Type
- object
- Description
Powód niepowodzenia zadania.
null, chyba żestatustoFAILED. Zobacz Błędy.
- Name
- consumed_credits
- Type
- integer
- Description
Liczba kredytów naliczonych za zadanie, po uwzględnieniu ewentualnego zwrotu. Żądanie zwracające błąd nie jest obciążane opłatą. Nieudane zadanie ma wartość
0, ponieważ Meshy zwraca za nie kredyty. Anulowanie powoduje zwrot kredytów za zadanie tylko wtedy, gdy ma ono statusPENDING. Jeśli Meshy nie może odczytać opłaty, odpowiedź typu get lub stream pomija to pole, a żądanie listy zwraca500. W takim przypadku ponów żądanie.
- Name
- model_urls
- Type
- object
- Description
Adresy URL do pobrania modelu 3D. Meshy eksportuje plik GLB oraz pakiet OBJ w rzeczywistej skali w milimetrach, z osią Y skierowaną w górę, przy czym przód keycapa jest skierowany w stronę +Z.
Model zawiera siatki o nazwach
keycap-headikeycap-base. Gdy Meshy stosuje zastępcze wypełnienie wzorem dla podstawy, model zawiera również siatkękeycap-base-interiordla wnęki trzpienia. Nie zakładaj, że model ma dokładnie dwie siatki.Są to podpisane adresy URL, więc pobieraj je bez nagłówka
Authorization. Pozostają ważne doexpires_at, a ponowne pobranie zadania przed tym czasem zwraca te same adresy URL. Wygasłego adresu URL nie można odnowić, więc pobierz i zapisz pliki przed tym terminem.- Name
glb- Type
- string
- Description
Adres URL do pobrania teksturowanego pliku GLB,
model.glb.
- Name
obj_zip- Type
- string
- Description
Adres URL do pobrania pakietu OBJ, pliku ZIP zawierającego
model.obj,model.mtloraz tekstury PNG używane przezmodel.mtl. Przy jednolitej kolorystycznie podstawie jedyną teksturą jestkeycap-head.png. Przy podstawie z wzorem plik ZIP zawiera równieżkeycap-base.png.
- Name
- process_image_urls
- Type
- object
- Description
Adresy URL do pobrania obrazów z poszczególnych etapów budowy, indeksowane według rodzaju. Podobnie jak
model_urls, są to podpisane adresy URL, więc pobieraj je bez nagłówkaAuthorization. Pozostają ważne doexpires_at, a ponowne pobranie zadania zwraca te same adresy URL.Może zawierać następujące klucze:
head_design: obraz projektu wybranego kandydata, który budowa przekształciła w model 3D. Zawsze obecny.composite: obraz gotowego keycapa dla wybranego kandydata, na podstawie którego budowa pomalowała podstawę. Może być nieobecny.base_canvas: pomalowana podstawa keycapa. Może być nieobecna.
Meshy może dodawać kolejne klucze, więc ignoruj klucze, których nie rozpoznajesz.
Kompletny przykład end-to-end
Przykład realizuje cały przepływ:
- Utworzenie zadania prototypu ze zdjęcia.
- Pobieranie zadania do momentu, gdy jego
statusosiągnie wartośćSUCCEEDED. - Wybór kandydata z
candidate_ids. - Utworzenie zadania budowy z tym kandydatem.
- Pobieranie zadania budowy do momentu, gdy jego
statusosiągnie wartośćSUCCEEDED. - Pobranie pliku GLB oraz paczki OBJ z
model_urls.
Przykład wybiera pierwszego kandydata. W swojej aplikacji wyświetl pozycje image_urls użytkownikom i pozwól im dokonać wyboru. Indeks wybranego obrazu w image_urls jest indeksem jego identyfikatora w candidate_ids.
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://...
: "${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
BASE="https://api.meshy.ai/openapi/creative-lab/keycap/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 '{"image_url":"data:%s;base64,' "$MIME"
base64 <"$IMAGE_PATH" | tr -d '\n'
printf '"}'
} >"$BODY"
else
printf '{"image_url":"%s"}' "$IMAGE_URL" >"$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 design render
poll prototype "$PROTO_ID"
# 3. Pick a candidate (first one here; show image_urls to a user in production)
CANDIDATE_ID=$(api GET "$BASE/prototype/$PROTO_ID" | jq -r '.candidate_ids[0]')
# 4. Create the build task
jq -n --arg p "$PROTO_ID" --arg c "$CANDIDATE_ID" \
'{input_task_id: $p, candidate_id: $c}' >"$BODY"
BUILD_ID=$(api POST "$BASE/build" \
-H 'Content-Type: application/json' --data-binary @"$BODY" | jq -r '.result')
# 5. Wait for the model (a build usually takes 3-7 minutes)
poll build "$BUILD_ID"
# 6. Download the artifacts. These are signed URLs: no Authorization header,
# and they stay valid for 3 days after the task finishes.
TASK=$(api GET "$BASE/build/$BUILD_ID")
curl --silent --show-error --fail --max-time 900 \
-o keycap.glb "$(jq -r '.model_urls.glb' <<<"$TASK")"
curl --silent --show-error --fail --max-time 900 \
-o keycap-obj.zip "$(jq -r '.model_urls.obj_zip' <<<"$TASK")"
echo "Done: keycap.glb + keycap-obj.zip"