Ginagawang isang buong-kolor na custom na keycap ng mechanical keyboard ang isang source photo sa
dalawang yugto: ang prototype ay gumagawa ng render ng disenyo ng "tapos na keycap"
mula sa iyong input photo. Kapag nakumpirma na ang render na iyon, ang build ay ginagawa itong
textured 3D keycap model sa isang tumatakbong proseso — white-model generation, automatic
seating at cutting sa isang calibrated na default pose, buong-modelong pangkulay, at
ang panghuling assembly ay lahat nagaganap sa loob ng isang build task. Ang dalawang yugto ay konektado
sa pamamagitan ng input_task_id kasama ang candidate_id.
POST /openapi/creative-lab/keycap/v1/prototype
POST /openapi/creative-lab/keycap/v1/build
Kinakailangan ng parehong POST endpoints ang isang bayad na subscription plan. Ang mga
request mula sa mga account na free-plan ay tatanggihan nang may 402 Payment Required.
Bumuo ng isang finished-keycap na disenyong render mula sa pinagmulang larawan. Ang resulta ng task ay may dalang image_urls array (ang display render ng natapos na keycap) at katumbas na candidate_ids array; parehong may iisang entry lang. Tawagin muli ang endpoint na ito para sa ibang render kung hindi ito ang gusto mo — bawat tawag ay singil nang hiwalay. Ipasa ang candidate_id kasama ng prototype task ID papunta sa build endpoint. Sumangguni sa The Keycap Prototype Task Object para sa hugis ng response.
Mga Parameter
Name
image_url
Type
string
Kinakailangan
Description
Ang pinagmulang larawan na gagamitin ng Meshy para gawing mga imahe ng disenyo ng keycap. Sinusuportahan namin sa kasalukuyan ang mga format na .jpg, .jpeg, .png, at .webp.
Ang format ay tinutukoy sa pamamagitan ng pag-decode sa datos ng larawan, hindi mula sa file extension ng URL — isang URL na walang extension, o isa na nagre-redirect, ay gagana hangga't ang mga byte ay nade-decode sa isang suportadong format. Sinusunod ang mga HTTP redirect. Ang EXIF orientation ay pinapantay, kaya ang isang naikot na larawan mula sa telepono ay ginagamit sa paraang tama ang pagkakalapat nito.
Mga limitasyon: hindi bababa sa 32 pixels sa bawat gilid, hindi hihigit sa 178,956,970 pixels sa kabuuan, at hindi hihigit sa 20,000,000 bytes kapag na-download na. Para sa isang data URI, ang limitasyon ay nalalapat sa mga na-decode na byte, kaya maaaring umabot ang mismong source file sa laking iyon — ang base64 text ang mas malaki nang halos isang-katlo, na mahalaga para sa iyong request body, hindi para sa limitasyong ito. Ang isang data URI ay dapat magdeklara ng image/* content type at ;base64.
May dalawang paraan para maglagay ng larawan:
Publicly accessible URL: Isang URL na naaabot mula sa pampublikong internet.
Data URI: Isang base64-encoded na data URI ng larawan. Halimbawa ng data URI: data:image/jpeg;base64,<your base64-encoded image data>.
Name
name
Type
string
Description
Opsyonal na pangalan ng task para sa layuning display. Pinakamataas na 100 karakter.
Name
remove_background
Type
boolean
default false
Description
Kapag naka-set sa true, ang display render na ibinabalik sa image_urls ay isang transparent RGBA PNG na inalis ang background, kaya maaari mo itong i-composite sa anumang background.
Nalalapat lamang ito sa display render. Ang candidate na ginagamit ng build endpoint ay hindi apektado, kaya magkapareho ang 3D na resulta sa alinmang paraan.
Mga Ibinabalik
Ang result property ng response ay naglalaman ng task id ng bagong ginawang keycap prototype task. I-poll ang Get a Task na endpoint o mag-subscribe sa stream hanggang maabot ng task ang SUCCEEDED, pagkatapos ay kunin ang entry mula sa candidate_ids at ipasa ito, kasama ng task ID, papunta sa build endpoint.
Mga Paraan ng Pagkabigo
Name
400 - Bad Request
Description
Hindi katanggap-tanggap ang request. Mga karaniwang dahilan:
Missing parameter: Kinakailangan ang image_url.
Invalid image format: Ang ibinigay na image_url ay hindi isang suportadong format (.jpg, .jpeg, .png, .webp).
Image dimensions out of range: Masyadong maliit ang larawan, lumalampas sa pinakamataas na sukat ng file, o lumalampas sa pinakamataas na bilang ng pixel.
Unreachable URL: Hindi ma-download ang image_url (404 o timeout).
Invalid Data URI: Malformed ang base64 string.
Content flagged: Na-flag ang input na larawan ng NSFW moderation.
Name
401 - Unauthorized
Description
Nabigo ang authentication. Pakisuri ang iyong API key.
Name
402 - Payment Required
Description
Nasa free plan ang account (kinakailangan ang paid plan para makagawa ng mga task) o kulang ang credits.
Name
403 - Forbidden
Description
Na-flag ang input na larawan ng intellectual property moderation.
Name
429 - Too Many Requests
Description
Lumampas ka sa iyong rate limit.
Name
500 - Internal Server Error
Description
Nagkaroon ng hindi inaasahang error sa panig ng server — halimbawa, hindi available ang serbisyo ng content-moderation, nabigo ang pag-stage ng input na larawan, o hindi nagawa ang task. Walang task na nagawa sa kasong ito, kaya ligtas ang pag-retry.
Request
POST
/openapi/creative-lab/keycap/v1/prototype
# Stage 1: generate a finished-keycap design rendercurlhttps://api.meshy.ai/openapi/creative-lab/keycap/v1/prototype \-XPOST \-H"Authorization: Bearer ${YOUR_API_KEY}" \-H'Content-Type: application/json' \-d'{ "image_url": "<your publicly accessible image url or base64-encoded data URI>" }'
Bumuo ng huling textured na 3D keycap model mula sa isang matagumpay na prototype task at isa sa mga candidate nito. Ang isang build task ay nagpapatakbo ng buong pipeline mula simula hanggang katapusan — white-model generation mula sa napiling disenyo, awtomatikong pag-upo at pag-cut sa keycap base gamit ang isang na-calibrate na default pose (walang kinakailangang interactive na pagsasaayos), full-model coloring, at panghuling assembly at export. Karaniwang tumatagal ang isang build ng 3–7 minuto, papalapit sa mas mataas na hangganan kapag maraming build ang sabay-sabay na tumatakbo.
Sumangguni sa The Keycap Build Task Object
para sa hugis ng response.
Mga Parameter
Name
input_task_id
Type
string
Kinakailangan
Description
Ang task ID ng isang prototype task na ginawa sa parehong OpenAPI endpoint na ito. Ang prototype ay dapat nagawa ng parehong Meshy account, dapat naabot na ang SUCCEEDED, at dapat nakagawa ng kahit isang candidate.
Ang mga prototype task na ginawa sa pamamagitan ng webapp ay hindi tinatanggap — ang build endpoint ay tumatanggap lamang ng mga prototype task na ginawa ng POST /openapi/creative-lab/keycap/v1/prototype at tinatanggihan ang anumang ibang pinagmulan gamit ang 404.
Name
candidate_id
Type
string
Kinakailangan
Description
Ang candidate na bubuuin, kinuha mula sa candidate_ids array ng matagumpay na prototype task. Dapat kabilang ito sa task na iyon; anumang ibang halaga ay tatanggihan gamit ang 400.
Name
name
Type
string
Description
Opsyonal na pangalan ng task para sa layuning pagpapakita. Maximum na 100 na character.
options
Opsyonal na pagsasaayos ng heometriya. Bawat field ay may na-calibrate na default — ipadala lamang ang mga gusto mong i-override.
Name
base_model
Type
string
default cherry-mx-1x1-r1
Description
Ang keycap base na pagbabatayan ng build. Sa kasalukuyan, ang tanging magagamit na halaga ay
cherry-mx-1x1-r1 — isang standard na Cherry MX profile 1u keycap. May balak na 3–5
karagdagang mainstream na standard na sukat; hindi suportado ang mga custom na sukat.
Name
head_size_mm
Type
number
default 23
Description
Target na sukat ng inukit na ulo, sa milimetro: ang pinakamahabang dimensyon nito ay isinasukat sa halagang ito. Saklaw: [10, 40]. Ang mga halagang mas mataas sa humigit-kumulang 32.9 ay maaaring bawasan upang umangkop pa rin ang ulo sa hangganan ng protective footprint ng base, kaya maaaring mas maliit ang naihatid na pinakamahabang dimensyon kaysa sa hiniling. Ang inilapat na halaga ay hindi pa nirereflect ngayon sa task object — kung kailangan mong kumpirmahin ang aktwal na natanggap na sukat, sukatin ang bounding box ng keycap-head mesh sa na-download na modelo.
Name
vertical_offset_mm
Type
number
default 0
Description
Vertical offset na inilalapat sa ulo bago ito iupo sa base, sa milimetro. Saklaw: [-5, 5].
Mga Ibinabalik
Ang result property ng response ay naglalaman ng task id ng bagong nagawang keycap build task. I-poll ang Get a Task endpoint o mag-subscribe sa stream hanggang maabot ng task ang SUCCEEDED, pagkatapos ay i-download ang mga artifact mula sa model_urls.glb at model_urls.obj_zip.
Ang GLB at ang OBJ bundle ay parehong na-export sa real-world
millimeter scale, gamit ang Y-up na coordinate system at ang harap ng
keycap ay nakaharap sa +Z.
Mga Paraan ng Pagkabigo
Name
400 - Bad Request
Description
Hindi katanggap-tanggap ang request. Karaniwang sanhi:
Kulang na parameter: kinakailangan ang input_task_id at candidate_id.
Di-wastong UUID: Ang input_task_id ay hindi isang wastong UUID.
Hindi pa matagumpay ang parent: Ang tinutukoy na prototype task ay hindi pa naabot ang SUCCEEDED.
Walang candidate: Nagtagumpay ang prototype task ngunit walang nagawang candidate.
Hindi kilalang candidate: Ang candidate_id ay hindi isa sa mga candidate ng input task.
Options na labas sa saklaw: Isa sa mga field ng options ay lumabas sa pinapayagang saklaw o enum set nito.
Name
401 - Unauthorized
Description
Nabigo ang authentication. Pakisuri ang iyong API key.
Name
402 - Payment Required
Description
Nasa free plan ang account (kinakailangan ng paid plan upang makagawa ng mga task) o kulang ang credits.
Name
404 - Not Found
Description
Ang tinutukoy na prototype task ay hindi umiiral, pag-aari ng ibang user, o ginawa sa pamamagitan ng webapp (mga prototype task lamang na nasa API mode ang maaaring kumonekta sa build).
Name
429 - Too Many Requests
Description
Lumampas ka na sa iyong rate limit.
Name
500 - Internal Server Error
Description
May naganap na hindi inaasahang error sa panig ng server — halimbawa, hindi available ang content-moderation service, nabigo ang pag-stage ng input image, o hindi nagawa ang task. Walang task na nagawa sa kasong ito, kaya ligtas ang muling pagsubok.
Request
POST
/openapi/creative-lab/keycap/v1/build
# Stage 2: build the chosen candidate into a 3D keycapcurlhttps://api.meshy.ai/openapi/creative-lab/keycap/v1/build \-XPOST \-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 } }'
Kunin ang isang prototype o build task gamit ang wastong task id. Ang URL path
ay dapat tumugma sa stage ng task — ang isang build task na kinuha gamit ang
/prototype/:id ay magbabalik ng 404, at vice versa.
Kanselahin ang isang keycap task. Kung ang task ay PENDING pa rin, ang mga
credits na nagamit noong oras ng paggawa nito ay ire-refund. Ang mga task
na IN_PROGRESS na ay kinakansela nang walang refund (maaaring nagsi-
consume na ng resources ang worker). Ang mga task na nasa terminal state na
(SUCCEEDED, FAILED, CANCELED) ay hindi na maaaring kanselahin.
Ang URL path ay dapat tumugma sa stage ng task — ang DELETE sa
/prototype/:buildId ay magbabalik ng 404.
Path Parameters
Name
id
Type
path
Description
Natatanging identifier para sa keycap task na kakanselahin.
Returns
Nagbabalik ng 204 No Content kapag matagumpay, na may walang laman na body.
Failure Modes
Name
400 - Bad Request
Description
Nasa terminal state na ang task at hindi na ito maaaring kanselahin.
Name
404 - Not Found
Description
Hindi umiiral ang task, pag-aari ito ng ibang user, o hindi tumutugma ang stage nito sa URL path.
Name
500 - Internal Server Error
Description
May naganap na hindi inaasahang server-side na error habang kinakansela. Maaaring nakansela na o hindi pa ang task — basahin muli ito upang kumpirmahin bago mag-retry.
Nag-stream ng mga real-time update para sa isang keycap task gamit ang Server-Sent Events (SSE).
Ang URL path ay dapat tumugma sa yugto (stage) ng task — ang pagbukas ng isang stream sa
/prototype/:buildId/stream ay maglalabas ng isang solong event: error na payload na may
status_code: 404 at isasara ang stream.
Mga Parameter
Name
id
Type
path
Description
Natatanging identifier para sa keycap task na i-stream.
Ibinabalik
Nagbabalik ng stream ng Keycap Prototype
o Keycap Build na task object bilang
Server-Sent Events. Dala ng bawat frame ang buong task object para sa yugto — ang parehong hugis na
ibinabalik ng Get endpoint — kaya habang ang task ay PENDING o IN_PROGRESS, ang
mga output field ay hindi pa lamang napopulate (null, [] o {}) at
ang finished_at ay null.
// Error event example (wrong stage or task not found)event: errordata: {"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 PENDING frame below is abbreviated to the fields that change.event: messagedata: {"id": "019c9a52-7d18-7e2b-9f01-6e3b98c4d2af","progress": 0,"status": "PENDING"}event: messagedata: {"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=***" }}
Kunin ang isang paginated na listahan ng iyong mga keycap task para sa isang solong stage. Ang URL
path ang pumipili ng stage — ang /prototype ay nagbabalik ng mga prototype task; ang /build
ay nagbabalik ng mga build task. Ang mga task mula sa kabilang stage ay hindi kasama sa alinmang
tugon.
Path Parameters
Name
stage
Type
path
Kinakailangan
Description
prototype o build. Ang collection ay nagbabalik lamang ng mga task
na ang stage ay tumutugma sa URL — ang pagkuha ng /prototype ay hinding-hindi
nagbabalik ng mga build task at vice versa.
Query Parameters
Name
page_num
Type
integer
default 1
Description
Numero ng page para sa pagination.
Name
page_size
Type
integer
default 10
Description
Limitasyon sa laki ng page. Ang pinakamataas na pinapayagan ay 100 items.
Name
sort_by
Type
string
default -created_at
Description
Field na gagamiting batayan sa pag-sort. Mga available na value:
+created_at: Isaayos ayon sa oras ng paglikha nang ascending order.
-created_at: Isaayos ayon sa oras ng paglikha nang descending order.
Ang Keycap Prototype Task object ay isang yunit ng trabaho na sinusubaybayan ng Meshy upang makabuo ng isang finished-keycap design image mula sa isang source photo. Ang output ng yugtong ito ay ikinakabit sa the build stage
sa pamamagitan ng input_task_id kasama ang candidate_id.
Mga Property
Name
id
Type
string
Description
Natatanging identifier para sa task. Bagaman gumagamit kami ng k-sortable UUID para sa mga task id bilang detalye ng implementasyon, hindi ka dapat gumawa ng anumang palagay tungkol sa format ng id.
Name
type
Type
string
Description
Uri ng task. Ang value ay creative-lab-keycap-prototype.
Name
name
Type
string
Description
Ang pangalan ng task na ibinigay noong likhain ang task. Empty string kung walang pangalang ibinigay.
Name
status
Type
string
Description
Status ng task. Ang mga posibleng value ay isa sa PENDING, IN_PROGRESS, SUCCEEDED, FAILED, CANCELED.
Name
progress
Type
integer
Description
Progress ng task. Kung hindi pa nasisimulan ang task, ang property na ito ay magiging 0. Kapag nagtagumpay na ang task, ito ay magiging 100.
Name
created_at
Type
timestamp
Description
Timestamp kung kailan nalikha ang task, sa milliseconds.
Ang isang timestamp ay kumakatawan sa bilang ng milliseconds na lumipas mula Enero 1, 1970 UTC, alinsunod
sa RFC 3339 standard.
Halimbawa, Biyernes, Setyembre 1, 2023 12:00:00 PM GMT ay kinakatawan bilang 1693569600000. Ito ay naaangkop
sa lahat ng timestamp sa Meshy API.
Name
started_at
Type
timestamp
Description
Timestamp kung kailan sinimulan ang task, sa milliseconds. Kung hindi pa nasisimulan ang task, ang property na ito ay magiging 0.
Name
finished_at
Type
timestamp
Description
Timestamp kung kailan natapos ang task, sa milliseconds. Kung hindi pa natatapos ang task, ang property na ito ay magiging 0.
Name
expires_at
Type
timestamp
Description
Timestamp kung kailan mag-e-expire ang resulta ng task, sa milliseconds.
Name
preceding_tasks
Type
integer
Description
Ang bilang ng mga naunang task.
Ang value ng field na ito ay makabuluhan lamang kung ang status ng task ay PENDING.
Name
task_error
Type
object
Description
Mga detalye ng error para sa mga nabigong task. Tingnan ang Errors para sa buong reference ng task_error object.
Name
consumed_credits
Type
integer
Description
Ang bilang ng credits na nagamit ng task na ito. Ang isang task na umabot sa SUCCEEDED ay sinisingil ng buong halaga para sa kanyang stage. Ang isang task na hindi kailanman nalikha (isang 4xx sa oras ng request, kabilang ang isang moderation rejection) ay hindi sinisingil ng anuman. Ang isang task na umabot sa FAILED ay nagbabalik ng 0 — ang singil ay ire-refund, kabilang ang isang asynchronous moderation block. Ang pagkansela sa pamamagitan ng DELETE ay nagre-refund lamang habang ang task ay PENDING pa; ang isang task na IN_PROGRESS na ay mananatiling sisingilin, dahil nagamit na ang trabaho.
Name
image_urls
Type
array of strings
Description
Nada-download na URL ng finished-keycap design render — kung ano ang itsura ng candidate bilang isang tapos na keycap. May iisang entry lamang; ang image_urls[i] ay tumutugma sa candidate_ids[i]. Walang laman hanggang umabot ang task sa SUCCEEDED. Ang URL ay para lamang sa pagpapakita; ang build endpoint ay gumagamit ng candidate_ids, hindi ng mga URL na ito. Kaparehong URL lifecycle ng model_urls: naka-sign, walang Authorization header, balido hanggang expires_at, at matatag kapag binasa ulit ang task.
Name
candidate_ids
Type
array of strings
Description
Mga opaque candidate identifier, kaparalel ng image_urls. Ipasa ang entry na tumutugma sa iyong napiling disenyo bilang candidate_id ng build request. Huwag gumawa ng anumang palagay tungkol sa format ng mga id na ito.
Ang Keycap Build Task object ay isang work unit na sinusubaybayan ng Meshy upang
buuin ang panghuling na-texture na 3D keycap mula sa isang matagumpay na prototype task at
isang piniling candidate. Ang isang build ay tumatakbo sa buong pipeline — white-model
generation, awtomatikong seating at cutting, coloring, assembly, at export.
Mga Katangian
Name
id
Type
string
Description
Natatanging identifier para sa task.
Name
type
Type
string
Description
Uri ng task. Ang value ay creative-lab-keycap-build.
Name
name
Type
string
Description
Ang pangalan ng task na ibinigay noong ginawa ang task. Blangkong string kung walang ibinigay na pangalan.
Name
status
Type
string
Description
Status ng task. Ang mga posibleng value ay isa sa PENDING, IN_PROGRESS, SUCCEEDED, FAILED, CANCELED.
Name
progress
Type
integer
Description
Ang progress ng task. Kung hindi pa nasisimulan ang task, ang property na ito ay magiging 0. Kapag nagtagumpay na ang task, ito ay magiging 100.
Name
created_at
Type
timestamp
Description
Timestamp ng paglikha ng task, sa milliseconds.
Name
started_at
Type
timestamp
Description
Timestamp ng pagsisimula ng task, sa milliseconds.
Name
finished_at
Type
timestamp
Description
Timestamp ng pagkatapos ng task, sa milliseconds.
Name
expires_at
Type
timestamp
Description
Timestamp kung kailan mag-e-expire ang resulta ng task, sa milliseconds.
Name
preceding_tasks
Type
integer
Description
Ang bilang ng mga naunang task. May kahulugan lamang kapag ang status ay PENDING.
Name
task_error
Type
object
Description
Mga detalye ng error para sa mga nabigong task. Tingnan ang Errors para sa buong reference ng task_error object.
Name
consumed_credits
Type
integer
Description
Ang bilang ng credits na nagamit ng task na ito. Ang task na umabot sa SUCCEEDED ay sisingilin ng buong halaga para sa kanyang stage. Ang task na hindi kailanman nagawa (isang 4xx sa oras ng request, kabilang ang pagtanggi ng moderation) ay hindi sinisingil. Ang task na umabot sa FAILED ay nagbabalik ng 0 — ang singil ay ire-refund, kabilang ang asynchronous na moderation block. Ang pagkansela sa pamamagitan ng DELETE ay nagre-refund lamang habang ang task ay PENDING pa; ang task na IN_PROGRESS na ay mananatiling sisingilin, dahil nagamit na ang trabaho.
Name
model_urls
Type
object
Description
Mga URL na maaaring i-download para sa mga nabuong model artifact. Parehong ang GLB at ang OBJ bundle ay na-export sa real-world millimeter scale, Y-up, na ang harapan ng keycap ay nakaharap sa +Z. Ang mga mesh ay pinangalanang keycap-head at keycap-base; kapag ang base ay bumalik sa isang pattern fill, isang ikatlong mesh na keycap-base-interior ay naroroon din para sa stem cavity. Huwag ipagpalagay na eksaktong dalawang mesh lamang mayroon.
Ito ay mga signed URL: kunin ang mga ito nang walang header na Authorization. Mananatili silang valid hanggang sa expires_at, na 3 araw pagkatapos ng finished_at, at ang muling pagbasa sa task sa loob ng window na iyon ay nagbabalik ng eksaktong parehong URL sa halip na isang bagong signed na URL. I-download at i-store mo mismo ang mga file bago iyon — walang paraan upang i-refresh ang isang expired na link.
Name
glb
Type
string
Description
Downloadable URL sa panghuling na-texture na model.glb.
Name
obj_zip
Type
string
Description
Downloadable URL sa isang zip bundle na naglalaman ng model.obj, model.mtl, at ang mga texture PNG na aktwal na tinutukoy ng MTL nito. Ang isang solid-color na base ay may kasamang keycap-head.png lamang; ang isang may pattern na base ay may kasamang keycap-base.png din.
Name
process_image_urls
Type
object
Description
Mga URL na maaaring i-download para sa mga intermediate na process image, naka-key ayon sa uri. Kaparehong URL lifecycle ng model_urls: signed, walang header na Authorization, valid hanggang expires_at, at stable kapag muling binasa ang task. Kasalukuyang inilalabas na mga uri:
head_design — ang design image ng piniling candidate na ginamit ng build (laging naroroon).
composite — ang finished-keycap display render ng piniling candidate (naroroon kapag available).
base_canvas — ang pininturahang keycap-base canvas (naroroon kapag available).
Ituring na open-ended ang key set na ito; maaaring magdagdag ng mga bagong uri nang walang breaking change.
Ang kumpletong daloy: gumawa ng prototype mula sa isang larawan, i-poll ito hanggang
SUCCEEDED, pumili ng kandidato mula sa candidate_ids, gumawa ng build gamit
ang kandidatong iyon, i-poll ang build hanggang SUCCEEDED, pagkatapos ay i-download ang GLB at
ang OBJ bundle mula sa model_urls.
Pinipili ng halimbawa ang unang kandidato nang programatiko. Sa isang tunay na
integrasyon, ipapakita mo ang entry ng image_urls sa end user at
hahayaan silang pumili; ang napiling index ay isa-sa-isang naitutugma sa candidate_ids.
Complete flow
POST
/openapi/creative-lab/keycap/v1
#!/usr/bin/env bashset-euopipefail# 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:-}" ]]; thenecho"export IMAGE_PATH (local file) or IMAGE_URL (public url) first">&2exit1fiBASE="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 bodyshift2 out=$(curl--silent--show-error--max-time60--write-out$'\n%{http_code}' \-X"$method""$url"-H"$AUTH""$@") ||return1 http_code=${out##*$'\n'} body=${out%$'\n'*}if ((http_code >=400)); thenecho"HTTP $http_code for $url: $body">&2return1fiprintf'%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:; doif (($(date +%s) >= deadline)); thenecho"gave up waiting for $kind $id">&2return1fi task_status=$(apiGET"$BASE/$kind/$id"|jq-r'.status')echo"$kind: $task_status"case"$task_status"inSUCCEEDED)return0 ;;FAILED|CANCELED)return1 ;;esacsleep"$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"'EXITif [[ -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')"inpng) 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"elseprintf'{"image_url":"%s"}'"$IMAGE_URL">"$BODY"fi# 1. Create the prototype taskPROTO_ID=$(apiPOST"$BASE/prototype" \-H'Content-Type: application/json'--data-binary@"$BODY"|jq-r'.result')# 2. Wait for the design renderpollprototype"$PROTO_ID"# 3. Pick a candidate (first one here; show image_urls to a user in production)CANDIDATE_ID=$(apiGET"$BASE/prototype/$PROTO_ID"|jq-r'.candidate_ids[0]')# 4. Create the build taskjq-n--argp"$PROTO_ID"--argc"$CANDIDATE_ID" \'{input_task_id: $p, candidate_id: $c}'>"$BODY"BUILD_ID=$(apiPOST"$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)pollbuild"$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=$(apiGET"$BASE/build/$BUILD_ID")curl--silent--show-error--fail--max-time900 \-okeycap.glb"$(jq-r '.model_urls.glb' <<<"$TASK")"curl--silent--show-error--fail--max-time900 \-okeycap-obj.zip"$(jq-r '.model_urls.obj_zip' <<<"$TASK")"echo"Done: keycap.glb + keycap-obj.zip"