API de Keycap do Creative Lab
Transforme uma foto em uma keycap personalizada em full-color para teclado mecânico em duas etapas. Uma tarefa de protótipo gera uma imagem da keycap finalizada a partir da foto. Uma tarefa de build transforma essa imagem em um modelo 3D de keycap com textura. Ela utiliza 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 exigem um plano pago. Uma solicitação de uma conta do plano gratuito retorna 402.
Criar uma tarefa de protótipo de Keycap
Gera uma imagem do keycap finalizado a partir de uma foto. O campo image_urls da tarefa contém a imagem, e candidate_ids contém seu ID, com uma entrada em cada. Se você 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 dessa tarefa para o endpoint de build como input_task_id, com a entrada de candidate_ids como candidate_id. Para os campos da tarefa, veja O objeto de 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 foto a ser transformada em um design de keycap, como uma URL pública ou um data URI (
data:image/jpeg;base64,<seus dados de imagem codificados em base64>).A imagem deve ser um arquivo JPG, JPEG, PNG ou WebP de 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 desses limites retorna
400.A Meshy detecta o formato a partir dos dados da imagem, não da extensão do arquivo na URL. Uma URL sem extensão funciona, e a Meshy segue redirecionamentos HTTP. A Meshy aplica a orientação EXIF, para que uma foto de celular rotacionada saia da forma como aparece.
Um data URI deve ser codificado em base64 com um tipo de imagem, como
data:image/png;base64,..., e a imagem decodificada deve ser JPEG, PNG ou WebP. O limite de 20 MB se aplica à imagem decodificada, então o texto em base64 pode ser cerca de um terço maior.
- Name
- name
- Type
- string
- Description
Um nome para a tarefa, com até 100 caracteres. Ele retorna no campo
nameda tarefa. Um nome mais longo retorna400.
- Name
- remove_background
- Type
- boolean
- padrão false
- Description
Se o fundo deve ser removido da imagem do protótipo.
trueretorna um PNG RGBA transparente, para que você possa colocar o keycap em qualquer fundo. Se a Meshy não conseguir remover o fundo, ela retorna a imagem com seu fundo, e a tarefa ainda é bem-sucedida.O design da cabeça que o build transforma em 3D mantém seu fundo de qualquer forma. O build pinta a base do keycap a partir da imagem em
image_urls, sem seu fundo se você envioutrue. O build retorna essa imagem comoprocess_image_urls.composite.
Retornos
O campo result contém o ID da nova tarefa de protótipo. Obtenha a tarefa ou transmita-a em stream até que status seja SUCCEEDED. Então, passe o ID para o endpoint de build como input_task_id, com a entrada de candidate_ids como candidate_id.
Modos de falha
- Name
400 - Bad Request- Description
A requisição não pode ser executada. Por exemplo:
image_urlestá ausente.- A imagem não é um arquivo JPG, JPEG, PNG ou WebP.
- A imagem é muito pequena, tem mais de 20 MB, ou excede a contagem máxima de pixels.
- A Meshy não consegue baixar a imagem, por exemplo porque a URL retorna
404ou expira o tempo limite. - O data URI não é um base64 válido.
- A imagem foi sinalizada como NSFW.
A mensagem de erro informa qual problema foi encontrado. Corrija a requisição e envie-a novamente.
- Name
401 - Unauthorized- Description
A chave de API está ausente ou é inválida. Verifique o cabeçalho
Authorization.
- Name
402 - Payment Required- Description
Um destes se aplica:
- A conta não tem créditos suficientes.
- A chave de API, o espaço de trabalho ou o membro atingiu seu limite de créditos.
- A conta está no plano gratuito.
Verifique seus créditos e plano, depois tente novamente.
- Name
403 - Forbidden- Description
Sua equipe tem a opção IP Filtering ativada, e a Meshy sinalizou a imagem por propriedade intelectual de terceiros. Envie uma imagem que você tenha o direito de usar.
- Name
429 - Too Many Requests- Description
Um destes limites foi atingido:
- Você enviou mais requisições do que seu limite de taxa permite. Aguarde alguns segundos e tente novamente. Veja Limites de taxa.
- Muitas das suas tarefas estão na fila ou em execução. Aguarde algumas terminarem e tente novamente.
- Em um plano ilimitado sem créditos restantes, você atingiu o número de tarefas que podem ser executadas sem créditos. Aguarde uma tarefa terminar, 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 cobrados. Tente a requisição novamente.
Criar uma tarefa de build de Keycap
Gera o keycap 3D texturizado a partir de uma tarefa de protótipo bem-sucedida e de um de seus candidatos. Para conhecer seus campos, consulte O objeto da tarefa de build de Keycap.
Uma tarefa de build executa todas as etapas. Ela gera um modelo 3D a partir do design e o colore. Em seguida, posiciona e corta o modelo na base do keycap em uma pose padrão calibrada, para que você não precise ajustá-la manualmente. Por fim, monta o keycap e exporta os arquivos. Um build normalmente leva de 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 ser construída. Deve ser uma tarefa criada pela sua conta com
POST /openapi/creative-lab/keycap/v1/prototype, com o statusSUCCEEDED.Um ID que não corresponda a uma das suas tarefas de protótipo de Keycap da API retorna
404, incluindo um protótipo criado no aplicativo web.
- Name
- candidate_id
- Type
- string
- Obrigatório
- Description
O candidato a ser construído, do array
candidate_idsda tarefa de protótipo. Um valor que não esteja nesse array retorna400.
- Name
- name
- Type
- string
- Description
Um nome para a tarefa, com até 100 caracteres. Ele é retornado no campo
nameda tarefa. Um nome mais longo retorna400.
options
Configurações opcionais de geometria. Cada campo tem um valor padrão calibrado, então envie apenas os campos que deseja alterar.
- Name
- base_model
- Type
- string
- padrã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 retorna400.
- Name
- head_size_mm
- Type
- number
- padrão 23
- Description
O tamanho da cabeça ao longo de sua maior dimensão, em milímetros, de
10a40. O Meshy escala a cabeça para que sua maior dimensão corresponda a esse valor. Um valor fora do intervalo retorna400.Para um valor acima de aproximadamente
32.9, o Meshy pode reduzir o tamanho para que a cabeça se ajuste ao limite de área de proteção da base. A cabeça pode então sair menor do que o solicitado. O objeto da tarefa não retorna o tamanho que o Meshy aplicou. Para verificá-lo, meça a caixa delimitadora da malhakeycap-headno modelo.
- Name
- vertical_offset_mm
- Type
- number
- padrão 0
- Description
O deslocamento vertical a ser aplicado à cabeça antes que o Meshy a posicione na base, em milímetros, de
-5a5. Um valor fora do intervalo retorna400.
Retornos
O campo result contém o ID da nova tarefa de build. Obtenha a tarefa ou transmita-a via streaming até que status seja SUCCEEDED. Em seguida, baixe o arquivo GLB em model_urls.glb e o pacote OBJ em model_urls.obj_zip.
O Meshy exporta o arquivo GLB e o pacote OBJ em escala real do mundo, em milímetros. Ambos usam um sistema de coordenadas Y-up, com a frente do keycap voltada para +Z.
Modos de falha
- Name
400 - Bad Request- Description
A solicitação não pode ser executada. Por exemplo:
input_task_idestá ausente ou não é um ID de tarefa válido.- O status 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 teve sucesso, mas não possui candidatos. Crie uma nova tarefa de protótipo.
candidate_idestá ausente ou não está emcandidate_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 problema foi encontrado.
- Name
401 - Unauthorized- Description
A chave de API está ausente ou é inválida. Verifique o cabeçalho
Authorization.
- Name
402 - Payment Required- Description
Uma das situações a seguir se aplica:
- A conta não tem créditos suficientes.
- A chave de API, o espaço de trabalho ou o membro atingiu seu limite de créditos.
- A conta está no plano gratuito.
Verifique seus créditos e 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 via API. Um protótipo criado no aplicativo web também retorna404. Envie o IDresultde uma resposta de criação de protótipo.
- Name
429 - Too Many Requests- Description
Um dos seguintes limites foi atingido:
- Você enviou mais solicitações do que seu limite de taxa permite. Aguarde alguns segundos e tente novamente. Consulte Limites de taxa.
- Há muitas tarefas suas na fila ou em execução. Aguarde algumas terminarem e tente novamente.
- Em um plano ilimitado sem créditos restantes, você atingiu o número de tarefas que podem ser executadas sem créditos. Aguarde uma tarefa terminar ou adicione créditos.
- Name
500 - Internal Server Error- Description
O Meshy não conseguiu criar a tarefa devido a um erro de servidor. O Meshy reembolsa quaisquer créditos cobrados. Tente a solicitação novamente.
Obter uma tarefa de Keycap
Retorna uma tarefa de protótipo ou de build. O caminho deve corresponder ao estágio da tarefa. Uma tarefa de build solicitada por meio de /prototype/:id retorna 404, e o mesmo ocorre com uma tarefa de protótipo solicitada por meio de /build/:id.
Para os campos, veja O objeto de tarefa de protótipo do Keycap e O objeto de tarefa de build do 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 retornado na resposta de criação.
Retornos
O objeto de tarefa de protótipo ou o objeto de tarefa de build, de acordo com o estágio informado no caminho.
Modos de falha
- Name
400 - Bad Request- Description
idnão é um ID de tarefa válido. Envie o IDresultretornado na resposta de criação.
- Name
403 - Forbidden- Description
Sua equipe está com a Filtragem de IP ativada, e a Meshy sinalizou a imagem da tarefa de protótipo por propriedade intelectual de terceiros. Tarefas de build e equipes no plano Enterprise não recebem esse erro. Crie uma tarefa de protótipo a partir de uma imagem sobre a qual você tenha os direitos de uso.
- Name
404 - Not Found- Description
Nenhuma tarefa de Keycap com esse ID pertence à sua conta, ou o estágio da tarefa não corresponde ao caminho. Verifique o ID e use
/prototypeou/buildde acordo com a tarefa.
- Name
500 - Internal Server Error- Description
A Meshy não conseguiu executar a verificação de propriedade intelectual. Repita a solicitação.
Excluir uma tarefa do Keycap
Cancela uma tarefa do Keycap. Cancelar uma tarefa PENDING reembolsa seus créditos. Uma tarefa IN_PROGRESS é cancelada sem reembolso, porque um worker já a iniciou. Uma tarefa com status final (SUCCEEDED, FAILED ou CANCELED) não pode ser cancelada.
O caminho deve corresponder ao estágio da tarefa. Por exemplo, DELETE em /prototype/:id com o ID de uma tarefa de build retorna 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 ser cancelada.
Retornos
204 No Content com corpo vazio.
Modos de falha
- Name
400 - Bad Request- Description
Um dos seguintes se aplica:
idnão é um ID de tarefa válido. Envie o IDresultda resposta de criação.- A tarefa já tem um status final (
SUCCEEDED,FAILEDouCANCELED), então não pode ser cancelada.
- Name
404 - Not Found- Description
Nenhuma tarefa do Keycap com este ID pertence à sua conta, ou o estágio da tarefa não corresponde ao caminho. Verifique o ID e use
/prototypeou/buildpara corresponder à tarefa.
- Name
500 - Internal Server Error- Description
O Meshy encontrou um erro de servidor ao cancelar a tarefa, então a tarefa pode ou não estar cancelada. Obtenha a tarefa para verificar seu
statusantes de tentar novamente.
Transmitir uma tarefa Keycap
Transmite as atualizações de uma tarefa Keycap como Server-Sent Events (SSE). O caminho deve corresponder ao estágio da tarefa. Se não corresponder, por exemplo, o ID de uma tarefa de build em /prototype/:id/stream, o stream envia um evento error com status_code: 404 e é encerrado.
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.
Retornos
Um stream de objetos de tarefa prototype ou build. Cada evento contém o objeto de tarefa completo, assim como Obter uma tarefa Keycap o retorna. Enquanto a tarefa estiver PENDING ou IN_PROGRESS, seus campos de saída ainda estarão vazios (null, [] ou {}), e finished_at será null.
Se a Filtragem de IP bloquear o resultado da tarefa, o stream envia, em seu lugar, um evento error com o status_code que uma requisição get retornaria.
Listar tarefas de Keycap
Retorna suas tarefas de Keycap de um estágio, uma página por vez. O caminho seleciona o estágio. /prototype retorna apenas tarefas de protótipo, e /build retorna apenas tarefas de 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"
]
}
]
Parâmetros de caminho
- Name
- stage
- Type
- path
- Obrigatório
- Description
O estágio a listar,
prototypeoubuild.
Parâmetros de consulta
- Name
- page_num
- Type
- integer
- padrão 1
- Description
A página a retornar, de
1a255.0retorna a primeira página. Um valor fora de0a255retorna400.
- Name
- page_size
- Type
- integer
- padrão 10
- Description
Número de tarefas por página, até
100. Um valor de101a255retorna 100 tarefas, e0usa o padrão. Um valor fora de0a255retorna400.
- Name
- sort_by
- Type
- string
- padrão -created_at
- Description
A ordem de classificação.
Valores disponíveis:
-created_at: mais recentes primeiro+created_at: mais antigas primeiro
Retornos
Um array de objetos de tarefa de protótipo ou objetos de tarefa de build, correspondendo ao estágio no caminho.
O objeto de tarefa de protótipo Keycap
Uma tarefa de protótipo gera uma imagem do keycap finalizado a partir de uma foto. Para transformar o design em um keycap 3D, passe o ID da tarefa para o endpoint de build como input_task_id, com 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 da tarefa, sempre
creative-lab-keycap-prototype.
- Name
- name
- Type
- string
- Description
O
nameque você enviou ao criar a tarefa, ou""se você não enviou nenhum.
- Name
- status
- Type
- string
- Description
O status da tarefa.
Valores disponíveis:
PENDING: aguardando na filaIN_PROGRESS: gerando o resultadoSUCCEEDED: final, com o resultadoFAILED: final, com o motivo emtask_errorCANCELED: final, sem resultado
- Name
- progress
- Type
- integer
- Description
Porcentagem do trabalho concluído, de
0a100. É0até a tarefa começar e100quando ela é bem-sucedida.
- Name
- created_at
- Type
- timestamp
- Description
Horário em que a tarefa foi criada, em milissegundos Unix.
- Name
- started_at
- Type
- timestamp
- Description
Horário em que um worker iniciou a tarefa, em milissegundos Unix.
nullaté então.
- Name
- finished_at
- Type
- timestamp
- Description
Horário em que a tarefa atingiu um status final, em milissegundos Unix.
nullaté então.
- Name
- expires_at
- Type
- timestamp
- Description
Horário 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. Veja Retenção de recursos.
- Name
- preceding_tasks
- Type
- integer
- Description
A posição da tarefa na fila enquanto está
PENDING.1significa que ela começa em seguida.0depois que a tarefa sai da fila, e sempre0em resultados de listagem.
- Name
- task_error
- Type
- object
- Description
Por que a tarefa falhou.
nulla menos questatussejaFAILED. Veja Erros.
- Name
- consumed_credits
- Type
- integer
- Description
Número de créditos cobrados pela tarefa, após qualquer reembolso. Uma requisição que retorna um erro não é cobrada. Uma tarefa que falha é
0, porque a Meshy a reembolsa. Cancelar reembolsa uma tarefa apenas enquanto ela estáPENDING. Se a Meshy não conseguir ler a cobrança, uma resposta de get ou stream deixa o campo de fora, e uma requisição de listagem retorna500. Nesse caso, tente a requisição novamente.
- Name
- image_urls
- Type
- array of strings
- Description
URLs de download para a imagem do keycap finalizado. O array tem uma URL depois que a tarefa é bem-sucedida, e fica vazio até então.
image_urls[i]mostra o candidato emcandidate_ids[i].Essas URLs são para exibição. O endpoint de build recebe uma entrada de
candidate_ids, não uma URL. São URLs assinadas, então busque-as sem um cabeçalhoAuthorization. Elas permanecem válidas atéexpires_at, e obter a tarefa novamente retorna as mesmas URLs.
- Name
- candidate_ids
- Type
- array of strings
- Description
IDs dos candidatos, na mesma ordem que
image_urls. Para fazer o build de um candidato, envie seu ID comocandidate_idna requisição de build. Não dependa do formato desses IDs.
O objeto de tarefa de build de Keycap
Uma tarefa de build gera o keycap 3D texturizado a partir de uma tarefa de prototype bem-sucedida e de um de seus candidatos. Ela gera o modelo 3D, colore-o, encaixa e corta-o sobre a 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 você enviou ao criar a tarefa, ou""se você não enviou nenhum.
- Name
- status
- Type
- string
- Description
O status da tarefa.
Valores disponíveis:
PENDING: aguardando na filaIN_PROGRESS: gerando o resultadoSUCCEEDED: final, com o resultadoFAILED: final, com o motivo emtask_errorCANCELED: final, sem resultado
- Name
- progress
- Type
- integer
- Description
Porcentagem do trabalho concluído, de
0a100. É0até a tarefa iniciar e100quando ela é bem-sucedida.
- Name
- created_at
- Type
- timestamp
- Description
Horário em que a tarefa foi criada, em milissegundos Unix.
- Name
- started_at
- Type
- timestamp
- Description
Horário em que um worker iniciou a tarefa, em milissegundos Unix.
nullaté então.
- Name
- finished_at
- Type
- timestamp
- Description
Horário em que a tarefa atingiu um status final, em milissegundos Unix.
nullaté então.
- Name
- expires_at
- Type
- timestamp
- Description
Horário 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 ela está
PENDING.1significa que ela começa em seguida.0depois que a tarefa sai da fila, e sempre0em resultados de listagem.
- Name
- task_error
- Type
- object
- Description
Motivo da falha da tarefa.
nulla menos questatussejaFAILED. Consulte Erros.
- Name
- consumed_credits
- Type
- integer
- Description
Número de créditos cobrados pela tarefa, após qualquer reembolso. Uma solicitação que retorna um erro não é cobrada. Uma tarefa com falha é
0, pois a Meshy a reembolsa. Cancelar reembolsa uma tarefa apenas enquanto ela estáPENDING. Se a Meshy não conseguir ler a cobrança, uma resposta de get ou stream deixa o campo de fora, e uma solicitação de listagem retorna500. Nesse caso, tente novamente a solicitação.
- Name
- model_urls
- Type
- object
- Description
URLs de download para o modelo 3D. A Meshy exporta o arquivo GLB e o pacote OBJ em escala real, em milímetros, com o eixo Y para cima e a frente do keycap voltada 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 presuma que o modelo tem exatamente duas malhas.Essas são URLs assinadas, então busque-as sem um cabeçalho
Authorization. Elas permanecem válidas atéexpires_at, e obter a tarefa novamente antes disso retorna as mesmas URLs. Uma URL expirada não pode ser renovada, então baixe e armazene os arquivos antes disso.- Name
glb- Type
- string
- Description
URL de download para o arquivo GLB texturizado,
model.glb.
- Name
obj_zip- Type
- string
- Description
URL de download para o pacote OBJ, um arquivo ZIP com
model.obj,model.mtle as texturas PNG quemodel.mtlusa. Com uma base de cor sólida, a única textura ékeycap-head.png. Com uma base padronizada, o arquivo ZIP também temkeycap-base.png.
- Name
- process_image_urls
- Type
- object
- Description
URLs de download para imagens das etapas do build, organizadas por tipo. Assim como
model_urls, são URLs assinadas, então busque-as sem um cabeçalhoAuthorization. Elas permanecem válidas atéexpires_at, e obter a tarefa novamente retorna as mesmas URLs.Pode ter estas chaves:
head_design: a imagem de design do candidato escolhido, que o build transformou em 3D. Sempre presente.composite: a imagem do keycap finalizado para o candidato escolhido, a partir da qual o build pintou a base. Pode estar ausente.base_canvas: a base pintada do keycap. Pode estar ausente.
A Meshy pode adicionar chaves, então ignore uma chave que você não reconheça.
End-to-end example
O exemplo executa o fluxo completo:
- Criar uma tarefa de prototype a partir de uma foto.
- Obter a tarefa até que seu
statussejaSUCCEEDED. - Escolher um candidato em
candidate_ids. - Criar uma tarefa de build com esse candidato.
- Obter a tarefa de build até que seu
statussejaSUCCEEDED. - Baixar o arquivo GLB e o pacote OBJ a partir de
model_urls.
O exemplo escolhe o primeiro candidato. No seu aplicativo, mostre as entradas de image_urls aos seus usuários 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"