Creative Lab Keycap API
Trasforma una foto in un keycap personalizzato a colori completi per una tastiera meccanica in due fasi. Un task di prototipazione genera un'immagine del keycap finito a partire dalla foto. Un task di build trasforma quell'immagine in un modello 3D di keycap con texture. Prende l'ID del task di prototipazione come input_task_id e l'ID candidato dell'immagine come candidate_id.
POST /openapi/creative-lab/keycap/v1/prototypePOST /openapi/creative-lab/keycap/v1/build
Entrambi gli endpoint POST richiedono un piano a pagamento. Una richiesta da un account con piano gratuito restituisce 402.
Creare un'attività di prototipo Keycap
Genera un'immagine del keycap finito a partire da una foto. Il campo image_urls dell'attività contiene l'immagine, e candidate_ids contiene il suo ID, con una voce in ciascuno. Se il design non ti piace, crea un'altra attività di prototipo. Meshy addebita ogni attività di prototipo separatamente.
Per creare il keycap 3D, passa l'ID di questa attività all'endpoint di build come input_task_id, con la voce di candidate_ids come candidate_id. Per i campi dell'attività, vedi L'oggetto attività di prototipo 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"
}
Parametri
- Name
- image_url
- Type
- string
- Obbligatorio
- Description
La foto da trasformare in un design di keycap, come URL pubblico o data URI (
data:image/jpeg;base64,<i tuoi dati immagine codificati in base64>).L'immagine deve essere un file JPG, JPEG, PNG o WebP di al massimo 20 MB (20.000.000 byte). Ogni lato deve essere di almeno 32 pixel, e l'immagine può avere al massimo 178.956.970 pixel in totale. Un'immagine al di fuori di questi limiti restituisce
400.Meshy rileva il formato dai dati dell'immagine, non dall'estensione del file nell'URL. Un URL senza estensione funziona, e Meshy segue i reindirizzamenti HTTP. Meshy applica l'orientamento EXIF, quindi una foto scattata da telefono e ruotata viene visualizzata nel modo in cui appare.
Un data URI deve essere codificato in base64 con un tipo di immagine, come
data:image/png;base64,..., e l'immagine decodificata deve essere JPEG, PNG o WebP. Il limite di 20 MB si applica all'immagine decodificata, quindi il testo base64 può essere circa un terzo più grande.
- Name
- name
- Type
- string
- Description
Un nome per l'attività, fino a 100 caratteri. Viene restituito nel campo
namedell'attività. Un nome più lungo restituisce400.
- Name
- remove_background
- Type
- boolean
- predefinito false
- Description
Se rimuovere lo sfondo dall'immagine del prototipo.
truerestituisce un PNG RGBA trasparente, così puoi posizionare il keycap su qualsiasi sfondo. Se Meshy non riesce a rimuovere lo sfondo, restituisce l'immagine con il suo sfondo, e l'attività comunque riesce.Il design della testa che la build trasforma in 3D mantiene il suo sfondo in entrambi i casi. La build dipinge la base del keycap a partire dall'immagine in
image_urls, senza il suo sfondo se hai inviatotrue. La build restituisce questa immagine comeprocess_image_urls.composite.
Valori restituiti
Il campo result contiene l'ID della nuova attività di prototipo. Recupera l'attività o trasmettila in streaming finché status non è SUCCEEDED. Quindi passa l'ID all'endpoint di build come input_task_id, con la voce di candidate_ids come candidate_id.
Modalità di errore
- Name
400 - Bad Request- Description
La richiesta non può essere eseguita. Ad esempio:
image_urlè mancante.- L'immagine non è un file JPG, JPEG, PNG o WebP.
- L'immagine è troppo piccola, supera i 20 MB, o supera il numero massimo di pixel.
- Meshy non riesce a scaricare l'immagine, ad esempio perché l'URL restituisce
404o va in timeout. - Il data URI non è un base64 valido.
- L'immagine è stata segnalata come NSFW.
Il messaggio di errore indica quale problema è stato trovato. Correggi la richiesta, quindi inviala di nuovo.
- Name
401 - Unauthorized- Description
La chiave API è mancante o non valida. Controlla l'header
Authorization.
- Name
402 - Payment Required- Description
Si applica una delle seguenti condizioni:
- L'account non ha crediti sufficienti.
- La chiave API, lo spazio di lavoro o il membro ha raggiunto il proprio limite di crediti.
- L'account è nel piano gratuito.
Controlla i tuoi crediti e il tuo piano, poi riprova.
- Name
403 - Forbidden- Description
Il tuo team ha attivato il filtraggio IP, e Meshy ha segnalato l'immagine per proprietà intellettuale di terzi. Invia un'immagine di cui hai i diritti d'uso.
- Name
429 - Too Many Requests- Description
È stato raggiunto uno dei seguenti limiti:
- Hai inviato più richieste di quante ne consenta il tuo limite di frequenza. Attendi qualche secondo, poi riprova. Vedi Limiti di frequenza.
- Troppe delle tue attività sono in coda o in esecuzione. Attendi che alcune terminino, poi riprova.
- Su un piano illimitato senza crediti residui, hai raggiunto il numero di attività che possono essere eseguite senza crediti. Attendi che un'attività termini, oppure aggiungi crediti.
- Name
500 - Internal Server Error- Description
Meshy ha riscontrato un errore del server, ad esempio perché la moderazione dei contenuti o il controllo della proprietà intellettuale non è riuscito a essere eseguito, oppure Meshy non è riuscito a memorizzare l'immagine. Meshy non crea l'attività, e rimborsa eventuali crediti addebitati. Riprova la richiesta.
Creare un'attività di build Keycap
Genera il keycap 3D texturizzato a partire da un'attività di prototipo riuscita e da uno dei suoi candidati. Per i suoi campi, vedi L'oggetto attività di build Keycap.
Un'attività di build esegue ogni passaggio. Genera un modello 3D dal design e lo colora. Quindi posiziona e taglia il modello sulla base del keycap in una posa predefinita calibrata, così non è necessario regolarla manualmente. Infine, assembla il keycap ed esporta i file. Una build richiede in genere da 3 a 7 minuti.
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"
}
Parametri
- Name
- input_task_id
- Type
- string
- Obbligatorio
- Description
L'ID dell'attività di prototipo da costruire. Deve essere un'attività creata dal tuo account con
POST /openapi/creative-lab/keycap/v1/prototype, con statoSUCCEEDED.Un ID che non corrisponde a una delle tue attività di prototipo Keycap create tramite l'API restituisce
404, incluso un prototipo creato nell'app web.
- Name
- candidate_id
- Type
- string
- Obbligatorio
- Description
Il candidato da costruire, dall'array
candidate_idsdell'attività di prototipo. Un valore che non è presente in quell'array restituisce400.
- Name
- name
- Type
- string
- Description
Un nome per l'attività, fino a 100 caratteri. Viene restituito nel campo
namedell'attività. Un nome più lungo restituisce400.
options
Impostazioni geometriche opzionali. Ogni campo ha un valore predefinito calibrato, quindi invia solo i campi che vuoi modificare.
- Name
- base_model
- Type
- string
- predefinito cherry-mx-1x1-r1
- Description
La base del keycap su cui costruire. L'unico valore è
cherry-mx-1x1-r1, un keycap standard con profilo Cherry MX 1u. Le dimensioni personalizzate non sono supportate, e qualsiasi altro valore restituisce400.
- Name
- head_size_mm
- Type
- number
- predefinito 23
- Description
La dimensione della testa lungo la sua dimensione più lunga, in millimetri, da
10a40. Meshy ridimensiona la testa in modo che la sua dimensione più lunga corrisponda a questo valore. Un valore fuori dall'intervallo restituisce400.Per un valore superiore a circa
32.9, Meshy potrebbe ridurre la dimensione affinché la testa rientri nel limite dell'ingombro protettivo della base. In tal caso la testa potrebbe risultare più piccola di quanto richiesto. L'oggetto attività non restituisce la dimensione applicata da Meshy. Per verificarla, misura la bounding box della meshkeycap-headnel modello.
- Name
- vertical_offset_mm
- Type
- number
- predefinito 0
- Description
Lo spostamento verticale da applicare alla testa prima che Meshy la posizioni sulla base, in millimetri, da
-5a5. Un valore fuori dall'intervallo restituisce400.
Restituisce
Il campo result contiene l'ID della nuova attività di build. Recupera l'attività o trasmettila in streaming finché status non è SUCCEEDED. Quindi scarica il file GLB da model_urls.glb e il pacchetto OBJ da model_urls.obj_zip.
Meshy esporta il file GLB e il pacchetto OBJ in scala reale in millimetri. Entrambi utilizzano un sistema di coordinate Y-up, con la parte anteriore del keycap rivolta verso +Z.
Modalità di errore
- Name
400 - Bad Request- Description
La richiesta non può essere eseguita. Ad esempio:
input_task_idè mancante o non è un ID attività valido.- Lo stato dell'attività di prototipo non è
SUCCEEDED. Se è ancora in esecuzione, attendi e riprova. Se è fallita o è stata annullata, crea una nuova attività di prototipo. - L'attività di prototipo è riuscita ma non ha candidati. Crea una nuova attività di prototipo.
candidate_idè mancante, oppure non è presente incandidate_idsdell'attività di prototipo. Invia un valore da quell'array.- Un campo in
optionsè fuori dall'intervallo consentito, oppurebase_modelnon è un valore disponibile.
Il messaggio di errore indica quale problema ha riscontrato.
- Name
401 - Unauthorized- Description
La chiave API è mancante o non valida. Controlla l'header
Authorization.
- Name
402 - Payment Required- Description
Si applica una di queste condizioni:
- L'account non ha crediti sufficienti.
- La chiave API, lo spazio di lavoro o il membro ha raggiunto il proprio limite di crediti.
- L'account è nel piano gratuito.
Controlla i tuoi crediti e il tuo piano, poi riprova.
- Name
404 - Not Found- Description
input_task_idnon corrisponde a nessuna attività di prototipo Keycap creata dal tuo account tramite l'API. Anche un prototipo creato nell'app web restituisce404. Invia l'IDresultottenuto dalla risposta di creazione del prototipo.
- Name
429 - Too Many Requests- Description
È stato raggiunto uno di questi limiti:
- Hai inviato più richieste di quante ne consenta il tuo limite di frequenza. Attendi qualche secondo, poi riprova. Vedi Limiti di frequenza.
- Troppe delle tue attività sono in coda o in esecuzione. Attendi che alcune si completino, poi riprova.
- Con un piano illimitato senza crediti residui, hai raggiunto il numero di attività eseguibili senza crediti. Attendi che un'attività si completi, oppure aggiungi crediti.
- Name
500 - Internal Server Error- Description
Meshy non è riuscita a creare l'attività a causa di un errore del server. Meshy rimborsa eventuali crediti addebitati. Riprova la richiesta.
Recupera un task Keycap
Restituisce un task di prototipo o di build. Il percorso deve corrispondere allo stage del task. Un task di build richiesto tramite /prototype/:id restituisce 404, e lo stesso vale per un task di prototipo richiesto tramite /build/:id.
Per i campi, vedi The Keycap prototype task object e The Keycap build task object.
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=***"
}
}
Parametri
- Name
- id
- Type
- path
- Description
L'ID del task dalla risposta di creazione.
Restituisce
L'oggetto task di prototipo o l'oggetto task di build, a seconda dello stage indicato nel percorso.
Modalità di errore
- Name
400 - Bad Request- Description
idnon è un ID di task valido. Invia l'IDresultdalla risposta di creazione.
- Name
403 - Forbidden- Description
Il tuo team ha il Filtraggio IP attivato, e Meshy ha segnalato l'immagine del task di prototipo per proprietà intellettuale di terzi. I task di build e i team con piano Enterprise non ricevono questo errore. Crea un task di prototipo a partire da un'immagine di cui hai i diritti d'uso.
- Name
404 - Not Found- Description
Nessun task Keycap con questo ID appartiene al tuo account, oppure lo stage del task non corrisponde al percorso. Controlla l'ID e usa
/prototypeo/buildin base al task.
- Name
500 - Internal Server Error- Description
Meshy non è riuscito a eseguire il controllo sulla proprietà intellettuale. Riprova la richiesta.
Elimina un task Keycap
Annulla un task Keycap. Annullare un task PENDING rimborsa i suoi crediti. Un task IN_PROGRESS viene annullato senza rimborso, perché un worker lo ha già avviato. Un task con uno stato finale (SUCCEEDED, FAILED o CANCELED) non può essere annullato.
Il percorso deve corrispondere alla fase del task. Ad esempio, DELETE su /prototype/:id con l'ID di un task di build restituisce 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).
Parametri del percorso
- Name
- id
- Type
- path
- Description
L'ID del task da annullare.
Restituisce
204 No Content con un corpo vuoto.
Modalità di errore
- Name
400 - Bad Request- Description
Si applica uno dei seguenti casi:
idnon è un ID di task valido. Invia l'IDresultrestituito dalla risposta di creazione.- Il task ha già uno stato finale (
SUCCEEDED,FAILEDoCANCELED), quindi non può essere annullato.
- Name
404 - Not Found- Description
Nessun task Keycap con questo ID appartiene al tuo account, oppure la fase del task non corrisponde al percorso. Controlla l'ID e usa
/prototypeo/buildper far corrispondere il task.
- Name
500 - Internal Server Error- Description
Meshy ha riscontrato un errore del server durante l'annullamento del task, quindi il task potrebbe essere stato annullato oppure no. Recupera il task per controllare il suo
statusprima di riprovare.
Esegui lo streaming di un task Keycap
Trasmette in streaming gli aggiornamenti di un task Keycap come Server-Sent Events (SSE). Il percorso deve corrispondere alla fase del task. In caso contrario, ad esempio l'ID di un task di build su /prototype/:id/stream, lo stream invia un evento error con status_code: 404 e si chiude.
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=***"
}
}
Parametri
- Name
- id
- Type
- path
- Description
L'ID del task dalla risposta di creazione.
Valori restituiti
Uno stream di oggetti task di tipo prototype o build. Ogni evento contiene l'oggetto task completo, così come viene restituito da Recupera un task Keycap. Mentre il task è PENDING o IN_PROGRESS, i suoi campi di output sono ancora vuoti (null, [] o {}), e finished_at è null.
Se il Filtraggio IP blocca il risultato del task, lo stream invia al suo posto un evento error, con lo status_code che una richiesta get restituirebbe.
Elenca i task Keycap
Restituisce i tuoi task Keycap relativi a una fase, una pagina alla volta. Il percorso seleziona la fase. /prototype restituisce solo i task di prototipo, mentre /build restituisce solo i task di build.
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"
]
}
]
Parametri del percorso
- Name
- stage
- Type
- path
- Obbligatorio
- Description
La fase da elencare,
prototypeobuild.
Parametri della query
- Name
- page_num
- Type
- integer
- predefinito 1
- Description
La pagina da restituire, da
1a255.0restituisce la prima pagina. Un valore al di fuori dell'intervallo0-255restituisce400.
- Name
- page_size
- Type
- integer
- predefinito 10
- Description
Numero di task per pagina, fino a
100. Un valore da101a255restituisce 100 task, mentre0utilizza il valore predefinito. Un valore al di fuori dell'intervallo0-255restituisce400.
- Name
- sort_by
- Type
- string
- predefinito -created_at
- Description
L'ordine di ordinamento.
Valori disponibili:
-created_at: prima i più recenti+created_at: prima i più vecchi
Restituisce
Un array di oggetti task di prototipo o di oggetti task di build, corrispondenti alla fase specificata nel percorso.
L'oggetto task di prototipo Keycap
Un task di prototipo genera un'immagine del keycap finito a partire da una foto. Per trasformare il design in un keycap 3D, passa l'ID del task all'endpoint di build come input_task_id, con la sua voce candidate_ids come candidate_id.
Proprietà
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
L'ID del task. Non fare affidamento sul suo formato.
- Name
- type
- Type
- string
- Description
Il tipo di task, sempre
creative-lab-keycap-prototype.
- Name
- name
- Type
- string
- Description
Il
nameinviato durante la creazione del task, oppure""se non ne è stato inviato uno.
- Name
- status
- Type
- string
- Description
Lo stato del task.
Valori disponibili:
PENDING: in attesa nella codaIN_PROGRESS: generazione del risultato in corsoSUCCEEDED: finale, con il risultatoFAILED: finale, con il motivo intask_errorCANCELED: finale, senza risultato
- Name
- progress
- Type
- integer
- Description
Percentuale del lavoro completato, da
0a100. È0finché il task non inizia e100quando ha successo.
- Name
- created_at
- Type
- timestamp
- Description
Momento in cui il task è stato creato, in millisecondi Unix.
- Name
- started_at
- Type
- timestamp
- Description
Momento in cui un worker ha avviato il task, in millisecondi Unix.
nullfino ad allora.
- Name
- finished_at
- Type
- timestamp
- Description
Momento in cui il task ha raggiunto uno stato finale, in millisecondi Unix.
nullfino ad allora.
- Name
- expires_at
- Type
- timestamp
- Description
Momento in cui il risultato del task scade, in millisecondi Unix. Corrisponde a 3 giorni dopo
finished_at, oppure a 3 giorni dopocreated_atfinché il task non termina. Per gli account Enterprise, che conservano i risultati API a tempo indeterminato, corrisponde a circa 100 anni dopo. Vedi Conservazione degli asset.
- Name
- preceding_tasks
- Type
- integer
- Description
La posizione del task nella coda mentre è
PENDING.1significa che inizierà come prossimo.0dopo che il task esce dalla coda, e sempre0nei risultati di elenco.
- Name
- task_error
- Type
- object
- Description
Il motivo per cui il task è fallito.
nulla meno chestatusnon siaFAILED. Vedi Errori.
- Name
- consumed_credits
- Type
- integer
- Description
Numero di crediti addebitati per il task, dopo eventuali rimborsi. Una richiesta che restituisce un errore non viene addebitata. Un task fallito è
0, perché Meshy lo rimborsa. L'annullamento rimborsa un task solo mentre èPENDING. Se Meshy non riesce a leggere l'addebito, una risposta get o stream omette il campo, e una richiesta di elenco restituisce500. In tal caso, riprova la richiesta.
- Name
- image_urls
- Type
- array of strings
- Description
URL di download per l'immagine del keycap finito. L'array contiene un URL dopo che il task ha successo, ed è vuoto fino ad allora.
image_urls[i]mostra il candidato incandidate_ids[i].Questi URL sono destinati alla visualizzazione. L'endpoint di build accetta una voce da
candidate_ids, non un URL. Sono URL firmati, quindi recuperali senza un headerAuthorization. Restano validi fino aexpires_at, e recuperare nuovamente il task restituisce gli stessi URL.
- Name
- candidate_ids
- Type
- array of strings
- Description
ID dei candidati, nello stesso ordine di
image_urls. Per generare un candidato, invia il suo ID comecandidate_idnella richiesta di build. Non fare affidamento sul formato di questi ID.
L'oggetto task di build del keycap
Un task di build genera il keycap 3D con texture a partire da un task di prototipo riuscito e da uno dei suoi candidati. Genera il modello 3D, lo colora, lo posiziona e lo taglia sulla base del keycap, quindi assembla ed esporta il keycap.
Proprietà
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
L'ID del task. Non fare affidamento sul suo formato.
- Name
- type
- Type
- string
- Description
Il tipo di task, sempre
creative-lab-keycap-build.
- Name
- name
- Type
- string
- Description
Il
nameche hai inviato quando hai creato il task, oppure""se non ne hai inviato uno.
- Name
- status
- Type
- string
- Description
Lo stato del task.
Valori disponibili:
PENDING: in attesa nella codaIN_PROGRESS: generazione del risultato in corsoSUCCEEDED: definitivo, con il risultatoFAILED: definitivo, con il motivo intask_errorCANCELED: definitivo, senza risultato
- Name
- progress
- Type
- integer
- Description
Percentuale di lavoro completato, da
0a100. È0finché il task non inizia e100quando ha esito positivo.
- Name
- created_at
- Type
- timestamp
- Description
Momento in cui il task è stato creato, in millisecondi Unix.
- Name
- started_at
- Type
- timestamp
- Description
Momento in cui un worker ha avviato il task, in millisecondi Unix.
nullfino ad allora.
- Name
- finished_at
- Type
- timestamp
- Description
Momento in cui il task ha raggiunto uno stato definitivo, in millisecondi Unix.
nullfino ad allora.
- Name
- expires_at
- Type
- timestamp
- Description
Momento in cui il risultato del task scade, in millisecondi Unix. È 3 giorni dopo
finished_at, oppure 3 giorni dopocreated_atfinché il task non termina. Per gli account Enterprise, che conservano i risultati delle API a tempo indeterminato, è circa 100 anni dopo. Consulta Conservazione degli asset.
- Name
- preceding_tasks
- Type
- integer
- Description
La posizione del task nella coda mentre è
PENDING.1significa che inizierà come prossimo.0dopo che il task lascia la coda, e sempre0nei risultati degli elenchi.
- Name
- task_error
- Type
- object
- Description
Il motivo per cui il task è fallito.
nulla meno chestatusnon siaFAILED. Consulta Errori.
- Name
- consumed_credits
- Type
- integer
- Description
Numero di crediti addebitati per il task, dopo eventuali rimborsi. Una richiesta che restituisce un errore non viene addebitata. Un task fallito è
0, perché Meshy lo rimborsa. L'annullamento rimborsa un task solo mentre èPENDING. Se Meshy non riesce a leggere l'addebito, una risposta get o stream omette il campo, e una richiesta di elenco restituisce500. In quel caso, ripeti la richiesta.
- Name
- model_urls
- Type
- object
- Description
URL di download per il modello 3D. Meshy esporta il file GLB e il pacchetto OBJ in scala reale in millimetri, con Y verso l'alto, con la parte anteriore del keycap rivolta verso +Z.
Il modello ha mesh denominate
keycap-headekeycap-base. Quando Meshy ricorre a un riempimento a pattern per la base, il modello include anche una meshkeycap-base-interiorper la cavità dello stelo. Non dare per scontato che il modello abbia esattamente due mesh.Questi sono URL firmati, quindi recuperali senza un header
Authorization. Restano validi fino aexpires_at, e richiedere di nuovo il task prima di allora restituisce gli stessi URL. Un URL scaduto non può essere rinnovato, quindi scarica e salva i file prima di allora.- Name
glb- Type
- string
- Description
URL di download per il file GLB con texture,
model.glb.
- Name
obj_zip- Type
- string
- Description
URL di download per il pacchetto OBJ, un file ZIP con
model.obj,model.mtle le texture PNG utilizzate damodel.mtl. Con una base a colore pieno, l'unica texture èkeycap-head.png. Con una base a pattern, il file ZIP include anchekeycap-base.png.
- Name
- process_image_urls
- Type
- object
- Description
URL di download per le immagini delle fasi di build, organizzate per tipo. Come
model_urls, sono URL firmati, quindi recuperali senza un headerAuthorization. Restano validi fino aexpires_at, e richiedere di nuovo il task restituisce gli stessi URL.Può avere queste chiavi:
head_design: l'immagine di design del candidato scelto, che la build ha trasformato in 3D. Sempre presente.composite: l'immagine del keycap finito per il candidato scelto, da cui la build ha dipinto la base. Può essere assente.base_canvas: la base del keycap dipinta. Può essere assente.
Meshy potrebbe aggiungere delle chiavi, quindi ignora una chiave che non riconosci.
Esempio end-to-end
L'esempio esegue l'intero flusso:
- Crea un task di prototipo da una foto.
- Recupera il task finché il suo
statusèSUCCEEDED. - Scegli un candidato da
candidate_ids. - Crea un task di build con quel candidato.
- Recupera il task di build finché il suo
statusèSUCCEEDED. - Scarica il file GLB e il bundle OBJ da
model_urls.
L'esempio sceglie il primo candidato. Nella tua app, mostra le voci di image_urls ai tuoi utenti e lasciali scegliere. L'indice di un'immagine scelta in image_urls è l'indice del suo ID in 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"