API de Keycap do Creative Lab
Transforme uma fotografia numa keycap personalizada a cores para um teclado mecânico em duas etapas. Uma tarefa de protótipo gera uma imagem da keycap final a partir da fotografia. Uma tarefa de criação transforma essa imagem num modelo 3D texturizado de keycap. Recebe o ID da tarefa de protótipo como input_task_id e o ID candidato da imagem como candidate_id.
POST /openapi/creative-lab/keycap/v1/prototypePOST /openapi/creative-lab/keycap/v1/build
Ambos os endpoints POST requerem um plano pago. Um pedido de uma conta com plano gratuito devolve 402.
Criar uma tarefa de protótipo de Keycap
Gera uma imagem do keycap finalizado a partir de uma fotografia. O campo image_urls da tarefa contém a imagem, e candidate_ids contém o seu ID, com uma entrada em cada. Se não gostar do design, crie outra tarefa de protótipo. A Meshy cobra por cada tarefa de protótipo separadamente.
Para construir o keycap em 3D, passe o ID desta tarefa para o endpoint de construção como input_task_id, com a entrada de candidate_ids como candidate_id. Para os campos da tarefa, consulte O objeto da tarefa de protótipo de 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"
}
Parâmetros
- Name
- image_url
- Type
- string
- Obrigatório
- Description
A fotografia a transformar num design de keycap, como um URL público ou um data URI (
data:image/jpeg;base64,<your base64-encoded image data>).A imagem deve ser um ficheiro JPG, JPEG, PNG ou WebP com, no máximo, 20 MB (20 000 000 bytes). Cada lado deve ter pelo menos 32 pixels, e a imagem pode ter, no máximo, 178 956 970 pixels no total. Uma imagem fora destes limites devolve
400.A Meshy deteta o formato a partir dos dados da imagem, não a partir da extensão do ficheiro no URL. Um URL sem extensão funciona, e a Meshy segue redirecionamentos HTTP. A Meshy aplica a orientação EXIF, pelo que uma fotografia de telemóvel rodada sai como aparece.
Um data URI deve estar codificado em base64 com um tipo de imagem, como
data:image/png;base64,..., e a imagem descodificada deve ser JPEG, PNG ou WebP. O limite de 20 MB aplica-se à imagem descodificada, pelo que o texto base64 pode ser cerca de um terço maior.
- Name
- name
- Type
- string
- Description
Um nome para a tarefa, com até 100 carateres. É devolvido no campo
nameda tarefa. Um nome mais longo devolve400.
- Name
- remove_background
- Type
- boolean
- predefinição false
- Description
Se deve remover o fundo da imagem do protótipo.
truedevolve um PNG RGBA transparente, para que possa colocar o keycap em qualquer fundo. Se a Meshy não conseguir remover o fundo, devolve a imagem com o seu fundo, e a tarefa continua a ser bem-sucedida.O design da cabeça que a construção transforma em 3D mantém o seu fundo em qualquer dos casos. A construção pinta a base do keycap a partir da imagem em
image_urls, sem o seu fundo se tiver enviadotrue. A construção devolve essa imagem comoprocess_image_urls.composite.
Retorna
O campo result contém o ID da nova tarefa de protótipo. Obtenha a tarefa ou transmita-a em streaming até que status seja SUCCEEDED. Depois, passe o ID para o endpoint de construção como input_task_id, com a entrada de candidate_ids como candidate_id.
Modos de falha
- Name
400 - Bad Request- Description
O pedido não pode ser executado. Por exemplo:
image_urlestá em falta.- A imagem não é um ficheiro JPG, JPEG, PNG ou WebP.
- A imagem é demasiado pequena, excede os 20 MB, ou excede o número máximo de pixels.
- A Meshy não consegue transferir a imagem, por exemplo porque o URL devolve
404ou expira o tempo de espera. - O data URI não é um base64 válido.
- A imagem foi assinalada como NSFW.
A mensagem de erro indica qual o problema encontrado. Corrija o pedido e envie-o novamente.
- Name
401 - Unauthorized- Description
A chave de API está em falta ou é inválida. Verifique o cabeçalho
Authorization.
- Name
402 - Payment Required- Description
Aplica-se uma das seguintes situações:
- A conta não tem créditos suficientes.
- A chave de API, o espaço de trabalho ou o membro atingiu o seu limite de créditos.
- A conta está no plano gratuito.
Verifique os seus créditos e o seu plano, depois tente novamente.
- Name
403 - Forbidden- Description
A sua equipa tem a Filtragem de IP ativada, e a Meshy assinalou a imagem por propriedade intelectual de terceiros. Envie uma imagem que tenha o direito de utilizar.
- Name
429 - Too Many Requests- Description
Um destes limites foi atingido:
- Enviou mais pedidos do que o seu limite de taxa permite. Aguarde alguns segundos e tente novamente. Consulte Limites de taxa.
- Há demasiadas tarefas suas em fila de espera ou em execução. Aguarde que algumas terminem e tente novamente.
- Num plano ilimitado sem créditos restantes, atingiu o número de tarefas que podem ser executadas sem créditos. Aguarde que uma tarefa termine, ou adicione créditos.
- Name
500 - Internal Server Error- Description
A Meshy encontrou um erro de servidor, por exemplo porque a moderação de conteúdo ou a verificação de propriedade intelectual não puderam ser executadas, ou a Meshy não conseguiu armazenar a imagem. A Meshy não cria a tarefa, e reembolsa quaisquer créditos que tenha cobrado. Tente novamente o pedido.
Criar uma tarefa de criação (build) de Keycap
Gera o keycap 3D texturizado a partir de uma tarefa de protótipo bem-sucedida e de um dos seus candidatos. Para conhecer os seus campos, consulte O objeto da tarefa de build de Keycap.
Uma tarefa de build executa todos os passos. Gera um modelo 3D a partir do design e aplica-lhe cor. Depois, encaixa e corta o modelo na base do keycap numa pose predefinida calibrada, para que não precise de a ajustar manualmente. Por fim, monta o keycap e exporta os ficheiros. Um build demora tipicamente entre 3 a 7 minutos.
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"
}
Parâmetros
- Name
- input_task_id
- Type
- string
- Obrigatório
- Description
O ID da tarefa de protótipo a construir. Tem de ser uma tarefa criada pela sua conta com
POST /openapi/creative-lab/keycap/v1/prototype, com o estadoSUCCEEDED.Um ID que não corresponda a uma das suas tarefas de protótipo de Keycap criadas através da API devolve
404, incluindo um protótipo criado na aplicação web.
- Name
- candidate_id
- Type
- string
- Obrigatório
- Description
O candidato a construir, do array
candidate_idsda tarefa de protótipo. Um valor que não esteja presente nesse array devolve400.
- Name
- name
- Type
- string
- Description
Um nome para a tarefa, até 100 caracteres. É devolvido no campo
nameda tarefa. Um nome mais longo devolve400.
options
Definições de geometria opcionais. Cada campo tem um valor predefinido calibrado, pelo que só precisa de enviar os campos que pretende alterar.
- Name
- base_model
- Type
- string
- predefinição cherry-mx-1x1-r1
- Description
A base de keycap sobre a qual construir. O único valor é
cherry-mx-1x1-r1, um keycap padrão de perfil Cherry MX 1u. Tamanhos personalizados não são suportados, e qualquer outro valor devolve400.
- Name
- head_size_mm
- Type
- number
- predefinição 23
- Description
O tamanho da cabeça ao longo da sua maior dimensão, em milímetros, de
10a40. A Meshy ajusta a escala da cabeça para que a sua maior dimensão corresponda a este valor. Um valor fora do intervalo devolve400.Para um valor acima de aproximadamente
32.9, a Meshy pode reduzir o tamanho para que a cabeça se ajuste ao limite de ocupação protegida da base. A cabeça pode então sair mais pequena do que o pedido. O objeto da tarefa não devolve o tamanho aplicado pela Meshy. Para o verificar, meça a caixa delimitadora da malhakeycap-headno modelo.
- Name
- vertical_offset_mm
- Type
- number
- predefinição 0
- Description
O deslocamento vertical a aplicar à cabeça antes de a Meshy a encaixar na base, em milímetros, de
-5a5. Um valor fora do intervalo devolve400.
Retorno
O campo result contém o ID da nova tarefa de build. Obtenha a tarefa ou transmita-a em fluxo até que status seja SUCCEEDED. Depois, descarregue o ficheiro GLB a partir de model_urls.glb e o pacote OBJ a partir de model_urls.obj_zip.
A Meshy exporta o ficheiro GLB e o pacote OBJ à escala real, em milímetros. Ambos utilizam um sistema de coordenadas com o eixo Y para cima, com a frente do keycap virada para +Z.
Modos de falha
- Name
400 - Bad Request- Description
O pedido não pode ser executado. Por exemplo:
input_task_idestá em falta ou não é um ID de tarefa válido.- O estado da tarefa de protótipo não é
SUCCEEDED. Se ainda estiver em execução, aguarde e tente novamente. Se tiver falhado ou sido cancelada, crie uma nova tarefa de protótipo. - A tarefa de protótipo foi bem-sucedida, mas não tem candidatos. Crie uma nova tarefa de protótipo.
candidate_idestá em falta, ou não consta nocandidate_idsda tarefa de protótipo. Envie um valor desse array.- Um campo em
optionsestá fora do intervalo, oubase_modelnão é um valor disponível.
A mensagem de erro indica qual o problema encontrado.
- Name
401 - Unauthorized- Description
A chave de API está em falta ou é inválida. Verifique o cabeçalho
Authorization.
- Name
402 - Payment Required- Description
Aplica-se uma das seguintes situações:
- A conta não tem créditos suficientes.
- A chave de API, o espaço de trabalho ou o membro atingiu o seu limite de créditos.
- A conta está no plano gratuito.
Verifique os seus créditos e o seu plano, e tente novamente.
- Name
404 - Not Found- Description
input_task_idnão corresponde a nenhuma tarefa de protótipo de Keycap criada pela sua conta através da API. Um protótipo criado na aplicação web também devolve404. Envie o IDresultde uma resposta de criação de protótipo.
- Name
429 - Too Many Requests- Description
Um destes limites foi atingido:
- Enviou mais pedidos do que o permitido pelo seu limite de taxa. Aguarde alguns segundos e tente novamente. Consulte Limites de taxa.
- Demasiadas das suas tarefas estão em fila de espera ou em execução. Aguarde que algumas terminem e tente novamente.
- Num plano ilimitado sem créditos disponíveis, atingiu o número de tarefas que podem ser executadas sem créditos. Aguarde que uma tarefa termine, ou adicione créditos.
- Name
500 - Internal Server Error- Description
A Meshy não conseguiu criar a tarefa devido a um erro do servidor. A Meshy reembolsa quaisquer créditos cobrados. Tente novamente o pedido.
Obter uma tarefa Keycap
Devolve uma tarefa de prototype ou de build. O caminho deve corresponder à fase da tarefa. Uma tarefa de build pedida através de /prototype/:id devolve 404, e o mesmo acontece com uma tarefa de prototype pedida através de /build/:id.
Para os campos, consulte O objeto de tarefa de prototype Keycap e O objeto de tarefa de build 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=***"
}
}
Parâmetros
- Name
- id
- Type
- path
- Description
O ID da tarefa a partir da resposta de criação.
Devolve
O objeto de tarefa de prototype ou o objeto de tarefa de build, consoante a fase indicada no caminho.
Modos de falha
- Name
400 - Bad Request- Description
idnão é um ID de tarefa válido. Envie o IDresulta partir da resposta de criação.
- Name
403 - Forbidden- Description
A sua equipa tem a IP Filtering ativada, e a Meshy sinalizou a imagem da tarefa de prototype por propriedade intelectual de terceiros. As tarefas de build e as equipas no plano Enterprise não recebem este erro. Crie uma tarefa de prototype a partir de uma imagem sobre a qual tem direitos de utilização.
- Name
404 - Not Found- Description
Nenhuma tarefa Keycap com este ID pertence à sua conta, ou a fase da tarefa não corresponde ao caminho. Verifique o ID e utilize
/prototypeou/buildde acordo com a tarefa.
- Name
500 - Internal Server Error- Description
A Meshy não conseguiu executar a verificação de propriedade intelectual. Tente novamente o pedido.
Eliminar uma tarefa Keycap
Cancela uma tarefa Keycap. Cancelar uma tarefa PENDING reembolsa os seus créditos. Uma tarefa IN_PROGRESS é cancelada sem reembolso, porque um worker já a iniciou. Uma tarefa com um estado final (SUCCEEDED, FAILED ou CANCELED) não pode ser cancelada.
O caminho deve corresponder à fase da tarefa. Por exemplo, DELETE em /prototype/:id com o ID de uma tarefa de build devolve 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).
Parâmetros de caminho
- Name
- id
- Type
- path
- Description
O ID da tarefa a cancelar.
Devolve
204 No Content com um corpo vazio.
Modos de falha
- Name
400 - Bad Request- Description
Aplica-se uma destas situações:
idnão é um ID de tarefa válido. Envie o IDresultda resposta de criação.- A tarefa já tem um estado final (
SUCCEEDED,FAILEDouCANCELED), pelo que não pode ser cancelada.
- Name
404 - Not Found- Description
Nenhuma tarefa Keycap com este ID pertence à sua conta, ou a fase da tarefa não corresponde ao caminho. Verifique o ID e utilize
/prototypeou/buildpara corresponder à tarefa.
- Name
500 - Internal Server Error- Description
O Meshy encontrou um erro de servidor ao cancelar a tarefa, pelo que a tarefa pode ou não estar cancelada. Obtenha a tarefa para verificar o seu
statusantes de tentar novamente.
Transmitir uma tarefa Keycap
Transmite as atualizações de uma tarefa Keycap como Server-Sent Events (SSE). O caminho tem de corresponder à fase da tarefa. Se não corresponder, por exemplo o ID de uma tarefa build em /prototype/:id/stream, o stream envia um evento error com status_code: 404 e fecha.
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=***"
}
}
Parâmetros
- Name
- id
- Type
- path
- Description
O ID da tarefa a partir da resposta de criação.
Retorna
Um stream de objetos de tarefa prototype ou build. Cada evento contém o objeto de tarefa completo, tal como Obter uma tarefa Keycap o devolve. Enquanto a tarefa está PENDING ou IN_PROGRESS, os seus campos de saída continuam vazios (null, [] ou {}), e finished_at é null.
Se a Filtragem de IP bloquear o resultado da tarefa, o stream envia um evento error em seu lugar, com o status_code que um pedido get devolveria.
Listar tarefas Keycap
Devolve as suas tarefas Keycap de uma fase, uma página de cada vez. O caminho seleciona a fase. /prototype devolve apenas tarefas de protótipo, e /build devolve apenas tarefas de construção.
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"
]
}
]
Parâmetros do caminho
- Name
- stage
- Type
- path
- Obrigatório
- Description
A fase a listar,
prototypeoubuild.
Parâmetros de consulta
- Name
- page_num
- Type
- integer
- predefinição 1
- Description
A página a devolver, de
1a255.0devolve a primeira página. Um valor fora do intervalo0a255devolve400.
- Name
- page_size
- Type
- integer
- predefinição 10
- Description
Número de tarefas por página, até
100. Um valor de101a255devolve 100 tarefas, e0utiliza o valor predefinido. Um valor fora do intervalo0a255devolve400.
- Name
- sort_by
- Type
- string
- predefinição -created_at
- Description
A ordem de ordenação.
Valores disponíveis:
-created_at: mais recentes primeiro+created_at: mais antigas primeiro
Devolve
Um array de objetos de tarefa de protótipo ou objetos de tarefa de construção, correspondentes à fase indicada no caminho.
O objeto de tarefa de protótipo Keycap
Uma tarefa de protótipo gera uma imagem do keycap acabado a partir de uma fotografia. Para transformar o design num keycap 3D, passe o ID da tarefa para o endpoint de build como input_task_id, com a sua entrada candidate_ids como candidate_id.
Propriedades
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
O ID da tarefa. Não dependa do seu formato.
- Name
- type
- Type
- string
- Description
O tipo de tarefa, sempre
creative-lab-keycap-prototype.
- Name
- name
- Type
- string
- Description
O
nameque enviou ao criar a tarefa, ou""se não tiver enviado nenhum.
- Name
- status
- Type
- string
- Description
O estado da tarefa.
Valores disponíveis:
PENDING: em espera na filaIN_PROGRESS: a gerar o resultadoSUCCEEDED: final, com o resultadoFAILED: final, com o motivo emtask_errorCANCELED: final, sem resultado
- Name
- progress
- Type
- integer
- Description
Percentagem do trabalho concluído, de
0a100. É0até a tarefa começar e100quando é bem-sucedida.
- Name
- created_at
- Type
- timestamp
- Description
Momento em que a tarefa foi criada, em milissegundos Unix.
- Name
- started_at
- Type
- timestamp
- Description
Momento em que um worker iniciou a tarefa, em milissegundos Unix.
nullaté isso acontecer.
- Name
- finished_at
- Type
- timestamp
- Description
Momento em que a tarefa atingiu um estado final, em milissegundos Unix.
nullaté isso acontecer.
- Name
- expires_at
- Type
- timestamp
- Description
Momento em que o resultado da tarefa expira, em milissegundos Unix. É 3 dias após
finished_at, ou 3 dias apóscreated_ataté a tarefa terminar. Para contas Enterprise, que mantêm os resultados da API indefinidamente, é cerca de 100 anos depois. Consulte Retenção de recursos.
- Name
- preceding_tasks
- Type
- integer
- Description
A posição da tarefa na fila enquanto está
PENDING.1significa que é a próxima a começar.0depois de a tarefa sair da fila, e sempre0em resultados de listagem.
- Name
- task_error
- Type
- object
- Description
Motivo pelo qual a tarefa falhou.
nulla menos questatussejaFAILED. Consulte Erros.
- Name
- consumed_credits
- Type
- integer
- Description
Número de créditos cobrados pela tarefa, após qualquer reembolso. Um pedido que devolve um erro não é cobrado. Uma tarefa falhada é
0, porque a Meshy a reembolsa. Cancelar só reembolsa uma tarefa enquanto esta estáPENDING. Se a Meshy não conseguir ler a cobrança, uma resposta de obtenção ou de streaming omite o campo, e um pedido de listagem devolve500. Nesse caso, tente novamente o pedido.
- Name
- image_urls
- Type
- array of strings
- Description
URLs de descarregamento para a imagem do keycap acabado. O array tem um URL depois de a tarefa ser bem-sucedida, e está vazio até lá.
image_urls[i]mostra o candidato emcandidate_ids[i].Estes URLs são para apresentação. O endpoint de build recebe uma entrada de
candidate_ids, não um URL. São URLs assinados, por isso obtenha-os sem um cabeçalhoAuthorization. Mantêm-se válidos atéexpires_at, e obter a tarefa novamente devolve os mesmos URLs.
- Name
- candidate_ids
- Type
- array of strings
- Description
IDs dos candidatos, pela mesma ordem de
image_urls. Para construir um candidato, envie o seu ID comocandidate_idno pedido de build. Não dependa do formato destes IDs.
O objeto da tarefa de construção do Keycap
Uma tarefa de construção gera o keycap 3D texturizado a partir de uma tarefa de protótipo bem-sucedida e de um dos seus candidatos. Gera o modelo 3D, colore-o, encaixa-o e corta-o na base do keycap e, em seguida, monta e exporta o keycap.
Propriedades
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
O ID da tarefa. Não dependa do seu formato.
- Name
- type
- Type
- string
- Description
O tipo da tarefa, sempre
creative-lab-keycap-build.
- Name
- name
- Type
- string
- Description
O
nameque enviou ao criar a tarefa, ou""se não tiver enviado nenhum.
- Name
- status
- Type
- string
- Description
O estado da tarefa.
Valores disponíveis:
PENDING: a aguardar na filaIN_PROGRESS: a gerar o resultadoSUCCEEDED: final, com o resultadoFAILED: final, com o motivo emtask_errorCANCELED: final, sem resultado
- Name
- progress
- Type
- integer
- Description
Percentagem do trabalho concluído, de
0a100. É0até a tarefa começar e100quando é bem-sucedida.
- Name
- created_at
- Type
- timestamp
- Description
Hora em que a tarefa foi criada, em milissegundos Unix.
- Name
- started_at
- Type
- timestamp
- Description
Hora em que um worker iniciou a tarefa, em milissegundos Unix.
nullaté isso acontecer.
- Name
- finished_at
- Type
- timestamp
- Description
Hora em que a tarefa atingiu um estado final, em milissegundos Unix.
nullaté isso acontecer.
- Name
- expires_at
- Type
- timestamp
- Description
Hora em que o resultado da tarefa expira, em milissegundos Unix. É 3 dias após
finished_at, ou 3 dias apóscreated_ataté a tarefa terminar. Para contas Enterprise, que mantêm os resultados da API indefinidamente, é cerca de 100 anos depois. Consulte Retenção de recursos.
- Name
- preceding_tasks
- Type
- integer
- Description
A posição da tarefa na fila enquanto está
PENDING.1significa que começa a seguir.0depois de a tarefa sair da fila, e sempre0em resultados de listagem.
- Name
- task_error
- Type
- object
- Description
Motivo pelo qual a tarefa falhou.
nulla menos questatussejaFAILED. Consulte Erros.
- Name
- consumed_credits
- Type
- integer
- Description
Número de créditos cobrados pela tarefa, após qualquer reembolso. Um pedido que devolve um erro não é cobrado. Uma tarefa falhada é
0, porque a Meshy reembolsa-a. Cancelar só reembolsa uma tarefa enquanto esta estáPENDING. Se a Meshy não conseguir ler a cobrança, uma resposta de obtenção ou de stream omite o campo, e um pedido de listagem devolve500. Nesse caso, tente novamente o pedido.
- Name
- model_urls
- Type
- object
- Description
URLs de transferência para o modelo 3D. A Meshy exporta o ficheiro GLB e o pacote OBJ à escala real em milímetros, com o eixo Y para cima, com a frente do keycap virada para +Z.
O modelo tem malhas chamadas
keycap-headekeycap-base. Quando a Meshy recorre a um preenchimento de padrão para a base, o modelo também tem uma malhakeycap-base-interiorpara a cavidade da haste. Não assuma que o modelo tem exatamente duas malhas.Estes são URLs assinados, pelo que deve obtê-los sem um cabeçalho
Authorization. Mantêm-se válidos atéexpires_at, e obter a tarefa novamente antes disso devolve os mesmos URLs. Um URL expirado não pode ser renovado, pelo que deve transferir e guardar os ficheiros antes disso.- Name
glb- Type
- string
- Description
URL de transferência para o ficheiro GLB texturizado,
model.glb.
- Name
obj_zip- Type
- string
- Description
URL de transferência para o pacote OBJ, um ficheiro ZIP com
model.obj,model.mtl, e as texturas PNG quemodel.mtlutiliza. Com uma base de cor sólida, a única textura ékeycap-head.png. Com uma base com padrão, o ficheiro ZIP também temkeycap-base.png.
- Name
- process_image_urls
- Type
- object
- Description
URLs de transferência para imagens das etapas da construção, indexadas por tipo. Tal como
model_urls, são URLs assinados, pelo que deve obtê-los sem um cabeçalhoAuthorization. Mantêm-se válidos atéexpires_at, e obter a tarefa novamente devolve os mesmos URLs.Pode ter estas chaves:
head_design: a imagem de design do candidato escolhido, que a construção transformou em 3D. Está sempre presente.composite: a imagem do keycap concluído para o candidato escolhido, a partir da qual a construção pintou a base. Pode estar ausente.base_canvas: a base do keycap pintada. Pode estar ausente.
A Meshy pode adicionar chaves, pelo que deve ignorar uma chave que não reconheça.
End-to-end example
O exemplo executa todo o fluxo:
- Criar uma tarefa de protótipo a partir de uma fotografia.
- Obter a tarefa até que o seu
statussejaSUCCEEDED. - Escolher um candidato a partir de
candidate_ids. - Criar uma tarefa de construção com esse candidato.
- Obter a tarefa de construção até que o seu
statussejaSUCCEEDED. - Transferir o ficheiro GLB e o pacote OBJ a partir de
model_urls.
O exemplo escolhe o primeiro candidato. Na sua aplicação, mostre as entradas de image_urls aos seus utilizadores e deixe-os escolher. O índice de uma imagem escolhida em image_urls é o índice do seu ID em 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"