Bir kaynak fotoğrafı iki aşamada tam renkli, özel bir mekanik klavye tuş kapağına
dönüştürün: prototip, girdi fotoğrafınızdan "bitmiş tuş kapağı" tasarım
render'ı oluşturur. Bu render'ı onayladıktan sonra, build (yapılandırma) onu
tek bir çalıştırmada dokulu bir 3D tuş kapağı modeline dönüştürür — beyaz model
oluşturma, kalibre edilmiş varsayılan bir poz üzerinde otomatik yerleştirme ve
kesme, tam model renklendirme ve nihai montajın tümü tek bir yapılandırma görevi
içinde gerçekleşir. İki aşama, input_task_id ile candidate_id üzerinden
birbirine bağlanır.
POST /openapi/creative-lab/keycap/v1/prototype
POST /openapi/creative-lab/keycap/v1/build
Her iki POST endpoint'i de ücretli bir abonelik planı gerektirir.
Ücretsiz plan hesaplarından gelen istekler 402 Payment Required ile
reddedilir.
Kaynak fotoğraftan bitmiş bir keycap tasarım render'ı oluşturur. Görev
sonucu, bir image_urls dizisi (bitmiş keycap'in görüntüleme render'ı) ve
buna paralel bir candidate_ids dizisi taşır; her ikisi de tek bir giriş
içerir. Sonuç istediğiniz gibi değilse başka bir render için bu uç noktayı
tekrar çağırın — her çağrı ayrı ayrı faturalandırılır. candidate_id'yi
prototip görev kimliğiyle birlikte build uç noktasına iletin.
Yanıt şekli için
Keycap Prototip Görevi Nesnesi
başlığına bakın.
Parametreler
Name
image_url
Type
string
Zorunlu
Description
Meshy'nin keycap tasarım görsellerine dönüştürmesi için kaynak fotoğraf. Şu anda .jpg, .jpeg, .png ve .webp biçimlerini destekliyoruz.
Biçim, görsel verisi çözümlenerek algılanır, URL'nin dosya uzantısından değil — uzantısı olmayan veya yönlendirme yapan bir URL, baytlar desteklenen bir biçime çözümlendiği sürece çalışır. HTTP yönlendirmeleri takip edilir. EXIF yönlendirmesi normalize edilir, böylece döndürülmüş bir telefon fotoğrafı göründüğü gibi kullanılır.
Sınırlar: her kenarda en az 32 piksel, toplamda en fazla 178.956.970 piksel ve indirildikten sonra en fazla 20.000.000 bayt. Bir data URI için sınır çözümlenmiş baytlara uygulanır, dolayısıyla kaynak dosyanın kendisi bu boyuta kadar olabilir — yaklaşık üçte bir daha büyük olan base64 metnidir ve bu, istek gövdeniz için önemlidir, bu sınır için değil. Bir data URI, bir image/* içerik türü ve ;base64 bildirmelidir.
Görseli sağlamanın iki yolu vardır:
Herkese açık erişilebilir URL: Genel internetten erişilebilen bir URL.
Data URI: Görselin base64 ile kodlanmış bir data URI'si. Data URI örneği: data:image/jpeg;base64,<base64 ile kodlanmış görsel verileriniz>.
Name
name
Type
string
Description
Görüntüleme amaçlı isteğe bağlı görev adı. En fazla 100 karakter.
Name
remove_background
Type
boolean
varsayılan false
Description
true olarak ayarlandığında, image_urls içinde döndürülen görüntüleme render'ı, arka planı kaldırılmış şeffaf bir RGBA PNG olur; böylece herhangi bir arka plan üzerine yerleştirebilirsiniz.
Bu yalnızca görüntüleme render'ı için geçerlidir. Build uç noktasının tükettiği aday bundan etkilenmez, dolayısıyla 3D sonuç her iki durumda da aynıdır.
Döndürülenler
Yanıtın result özelliği, yeni oluşturulan keycap prototip görevinin id'sini içerir. Görev SUCCEEDED durumuna ulaşana kadar Bir Görev Alma uç noktasını yoklayın veya stream'e abone olun, ardından candidate_ids içindeki girişi alın ve görev kimliğiyle birlikte build uç noktasına iletin.
Hata Modları
Name
400 - Bad Request
Description
İstek kabul edilemedi. Yaygın nedenler:
Eksik parametre: image_url gereklidir.
Geçersiz görsel biçimi: Sağlanan image_url desteklenen bir biçim değil (.jpg, .jpeg, .png, .webp).
Görsel boyutları aralık dışında: Görsel çok küçük, maksimum dosya boyutunu aşıyor veya maksimum piksel sayısını aşıyor.
Erişilemeyen URL: image_url indirilemedi (404 veya timeout).
Geçersiz Data URI: Base64 dizesi hatalı biçimlendirilmiş.
İçerik işaretlendi: Girdi görseli NSFW moderation tarafından işaretlendi.
Name
401 - Unauthorized
Description
Kimlik doğrulama başarısız oldu. Lütfen API anahtarınızı kontrol edin.
Name
402 - Payment Required
Description
Hesap ücretsiz plandadır (görev oluşturmak için ücretli bir plan gereklidir) veya yeterli krediye sahip değildir.
Name
403 - Forbidden
Description
Girdi görseli fikri mülkiyet moderation tarafından işaretlendi.
Name
429 - Too Many Requests
Description
Hız sınırınızı aştınız.
Name
500 - Internal Server Error
Description
Beklenmeyen bir sunucu tarafı hatası oluştu — örneğin içerik moderation hizmeti kullanılamıyordu, girdi görselinin hazırlanması başarısız oldu veya görev oluşturulamadı. Bu durumda hiçbir görev oluşturulmaz, dolayısıyla yeniden denemek güvenlidir.
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>" }'
Başarılı bir prototip görevinden ve onun adaylarından biri kullanılarak nihai dokulu 3D keycap modelini oluşturur. Tek bir build görevi, tüm boru hattını uçtan uca çalıştırır — seçilen tasarımdan beyaz model üretimi, kalibre edilmiş bir varsayılan poz kullanılarak keycap tabanına otomatik oturtma ve kesme (etkileşimli ayarlama gerekmez), tüm modelin renklendirilmesi ve nihai montaj ile dışa aktarma. Bir build işlemi genellikle 3–7 dakika sürer; birden çok build eşzamanlı çalıştığında bu süre üst sınıra yaklaşır.
Yanıt şekli için Keycap Build Görevi Nesnesi bölümüne bakın.
Parametreler
Name
input_task_id
Type
string
Zorunlu
Description
Aynı OpenAPI uç noktası üzerinden oluşturulmuş bir prototip görevinin görev kimliği. Prototip aynı Meshy hesabı tarafından oluşturulmuş olmalı, SUCCEEDED durumuna ulaşmış olmalı ve en az bir aday üretmiş olmalıdır.
Webapp üzerinden oluşturulan prototip görevleri kabul edilmez — build uç noktası yalnızca POST /openapi/creative-lab/keycap/v1/prototype tarafından üretilen prototip görevlerini kabul eder ve başka herhangi bir kaynağı 404 ile reddeder.
Name
candidate_id
Type
string
Zorunlu
Description
Başarılı prototip görevinin candidate_ids dizisinden alınan, oluşturulacak aday. O göreve ait olmalıdır; başka herhangi bir değer 400 ile reddedilir.
Name
name
Type
string
Description
Görüntüleme amaçlı isteğe bağlı görev adı. En fazla 100 karakter.
options
İsteğe bağlı geometri ayarları. Her alanın kalibre edilmiş bir varsayılanı vardır — yalnızca geçersiz kılmak istediklerinizi gönderin.
Name
base_model
Type
string
varsayılan cherry-mx-1x1-r1
Description
Üzerine inşa edilecek keycap tabanı. Şu anda mevcut olan tek değer
cherry-mx-1x1-r1 — standart bir Cherry MX profilli 1u keycap. 3–5
ek yaygın standart boyut planlanmaktadır; özel boyutlar
desteklenmemektedir.
Name
head_size_mm
Type
number
varsayılan 23
Description
Şekillendirilmiş kafanın hedef boyutu, milimetre cinsinden: en uzun boyutu bu değere ölçeklenir. Aralık: [10, 40]. Yaklaşık 32.9 üzerindeki değerler, kafanın hâlâ tabanın koruyucu ayak izi sınırına sığması için azaltılabilir; bu nedenle teslim edilen en uzun boyut istenenden küçük olabilir. Uygulanan değer bugün itibarıyla görev nesnesinde geri yansıtılmaz — gerçekte aldığınız boyutu doğrulamanız gerekiyorsa, indirilen modeldeki keycap-head ağının sınırlayıcı kutusunu ölçün.
Name
vertical_offset_mm
Type
number
varsayılan 0
Description
Kafa tabana oturtulmadan önce uygulanan dikey ofset, milimetre cinsinden. Aralık: [-5, 5].
Dönüş Değerleri
Yanıtın result özelliği, yeni oluşturulan keycap build görevinin id değerini içerir. Görev SUCCEEDED durumuna ulaşana kadar Bir Görev Al uç noktasını yoklayın veya stream'e abone olun, ardından çıktıları model_urls.glb ve model_urls.obj_zip üzerinden indirin.
Hem GLB hem de OBJ paketi, gerçek dünya milimetre ölçeğinde, Y-yukarı koordinat sistemiyle ve keycap'in ön yüzü +Z yönüne bakacak şekilde dışa aktarılır.
Hata Modları
Name
400 - Bad Request
Description
İstek kabul edilemedi. Yaygın nedenler:
Eksik parametre: input_task_id ve candidate_id zorunludur.
Geçersiz UUID: input_task_id geçerli bir UUID değil.
Üst görev başarılı değil: Referans verilen prototip görevi henüz SUCCEEDED durumuna ulaşmadı.
Aday yok: Prototip görevi başarılı oldu ancak hiçbir aday üretmedi.
Bilinmeyen aday: candidate_id, girdi görevinin adaylarından biri değil.
Seçenekler aralık dışında: options alanlarından biri izin verilen aralığın veya enum kümesinin dışında kaldı.
Name
401 - Unauthorized
Description
Kimlik doğrulama başarısız oldu. Lütfen API anahtarınızı kontrol edin.
Name
402 - Payment Required
Description
Hesap ücretsiz plan üzerinde (görev oluşturmak için ücretli bir plan gereklidir) veya yetersiz kredisi var.
Name
404 - Not Found
Description
Referans verilen prototip görevi mevcut değil, farklı bir kullanıcıya ait veya webapp üzerinden oluşturulmuş (yalnızca API modundaki prototip görevleri build'e zincirlenebilir).
Name
429 - Too Many Requests
Description
Hız sınırınızı aştınız.
Name
500 - Internal Server Error
Description
Beklenmeyen bir sunucu tarafı hatası oluştu — örneğin içerik moderation hizmeti kullanılamadı, girdi görüntüsünün hazırlanması başarısız oldu veya görev oluşturulamadı. Bu durumda hiçbir görev oluşturulmaz, bu nedenle yeniden denemek güvenlidir.
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 } }'
Geçerli bir görev id değeri verildiğinde bir prototip veya build görevini
getirir. URL yolu, görevin aşamasıyla eşleşmelidir — /prototype/:id
üzerinden getirilen bir build görevi 404 döndürür ve bunun tersi de
geçerlidir.
Bir keycap görevini iptal eder. Görev hâlâ PENDING durumundaysa,
oluşturma sırasında tüketilen kredi iade edilir. Zaten IN_PROGRESS
durumunda olan görevler iade yapılmadan iptal edilir (worker zaten
kaynak tüketiyor olabilir). Zaten bir sonlanmış duruma
(SUCCEEDED, FAILED, CANCELED) ulaşmış görevler iptal edilemez.
URL yolu, görevin aşamasıyla eşleşmelidir — /prototype/:buildId
üzerinde DELETE işlemi 404 döndürür.
Yol Parametreleri
Name
id
Type
path
Description
İptal edilecek keycap görevi için benzersiz tanımlayıcı.
Dönüş Değerleri
Başarılı olması durumunda boş bir gövdeyle 204 No Content döndürür.
Hata Modları
Name
400 - Bad Request
Description
Görev zaten sonlanmış bir durumda ve iptal edilemez.
Name
404 - Not Found
Description
Görev mevcut değil, farklı bir kullanıcıya ait veya aşaması URL yoluyla eşleşmiyor.
Name
500 - Internal Server Error
Description
İptal işlemi sırasında beklenmeyen bir sunucu tarafı hatası oluştu. Görev iptal edilmiş veya edilmemiş olabilir — yeniden denemeden önce doğrulamak için görevi tekrar okuyun.
Server-Sent Events (SSE) aracılığıyla bir keycap görevi için gerçek zamanlı
güncellemeleri akış olarak alın. URL yolu, görevin aşamasıyla eşleşmelidir —
/prototype/:buildId/stream adresinde bir akış açmak, status_code: 404
ile tek bir event: error yükü yayınlar ve akışı kapatır.
Parametreler
Name
id
Type
path
Description
Akış olarak alınacak keycap görevi için benzersiz tanımlayıcı.
Dönüş Değerleri
Server-Sent Events olarak bir Keycap Prototype
veya Keycap Build görev nesnesi akışı döndürür.
Her çerçeve, ilgili aşama için tam görev nesnesini taşır — bu, Get uç noktasının
döndürdüğü ile aynı şekildir — bu nedenle görev PENDING veya IN_PROGRESS
durumundayken çıktı alanları henüz doldurulmamıştır (null, [] veya {}) ve
finished_at değeri null'dur.
// 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=***" }}
Tek bir aşamaya ait keycap görevlerinizin sayfalanmış bir listesini alın. URL
yolu aşamayı seçer — /prototype prototip görevlerini döndürür; /build
üretim (build) görevlerini döndürür. Diğer aşamaya ait görevler her iki yanıta
da dahil edilmez.
Yol Parametreleri
Name
stage
Type
path
Zorunlu
Description
prototype veya build olabilir. Koleksiyon yalnızca aşaması URL
ile eşleşen görevleri döndürür — /prototype çağrısı asla build
görevlerini döndürmez ve bunun tersi de geçerlidir.
Sorgu Parametreleri
Name
page_num
Type
integer
varsayılan 1
Description
Sayfalama için sayfa numarası.
Name
page_size
Type
integer
varsayılan 10
Description
Sayfa boyutu sınırı. İzin verilen maksimum 100 öğedir.
Name
sort_by
Type
string
varsayılan -created_at
Description
Sıralama yapılacak alan. Kullanılabilir değerler:
+created_at: Oluşturulma zamanına göre artan sırayla sırala.
-created_at: Oluşturulma zamanına göre azalan sırayla sırala.
Keycap Prototip Görevi nesnesi, Meshy'nin bir kaynak fotoğraftan bitmiş keycap tasarım görüntüsü üretmek için takip ettiği bir iş birimidir. Bu aşamanın çıktısı, input_task_id ile candidate_id aracılığıyla derleme aşamasına zincirlenir.
Özellikler
Name
id
Type
string
Description
Görev için benzersiz tanımlayıcı. Uygulama detayı olarak görev id'leri için k-sıralanabilir bir UUID kullansak da, id'nin formatı hakkında hiçbir varsayımda bulunmamalısınız.
Name
type
Type
string
Description
Görevin türü. Değer creative-lab-keycap-prototype şeklindedir.
Name
name
Type
string
Description
Görev oluşturulduğunda sağlanan görev adı. Ad sağlanmadıysa boş dizedir.
Görevin progress'i. Görev henüz başlamadıysa, bu özellik 0 olacaktır. Görev başarılı olduğunda, bu 100 olacaktır.
Name
created_at
Type
timestamp
Description
Görevin oluşturulduğu zamanın milisaniye cinsinden zaman damgası.
Bir zaman damgası, RFC 3339 standardını takip ederek,
1 Ocak 1970 UTC'den bu yana geçen milisaniye sayısını temsil eder.
Örneğin, 1 Eylül 2023 Cuma, 12:00:00 GMT 1693569600000 olarak temsil edilir. Bu, Meshy API'deki
tüm zaman damgaları için geçerlidir.
Name
started_at
Type
timestamp
Description
Görevin başladığı zamanın milisaniye cinsinden zaman damgası. Görev henüz başlamadıysa, bu özellik 0 olacaktır.
Name
finished_at
Type
timestamp
Description
Görevin tamamlandığı zamanın milisaniye cinsinden zaman damgası. Görev henüz tamamlanmadıysa, bu özellik 0 olacaktır.
Name
expires_at
Type
timestamp
Description
Görev sonucunun süresinin dolacağı zamanın milisaniye cinsinden zaman damgası.
Name
preceding_tasks
Type
integer
Description
Önceki görevlerin sayısı.
Bu alanın değeri yalnızca görev durumu PENDING olduğunda anlamlıdır.
Name
task_error
Type
object
Description
Başarısız görevler için hata detayları. Tam task_error nesne referansı için Hatalar bölümüne bakın.
Name
consumed_credits
Type
integer
Description
Bu görev tarafından tüketilen kredi sayısı. SUCCEEDED durumuna ulaşan bir görevden, aşaması için tam tutar tahsil edilir. Hiç oluşturulmamış bir görevden (istek sırasında 4xx, moderation reddi dahil) hiç ücret alınmaz. FAILED durumuna ulaşan bir görev 0 döner — ücret iade edilir, asenkron moderation engeli dahil. DELETE ile iptal etmek yalnızca görev hâlâ PENDING durumundayken ücreti iade eder; zaten IN_PROGRESS durumundaki bir görev ücretlendirilmeye devam eder, çünkü iş harcanmıştır.
Name
image_urls
Type
array of strings
Description
Bitmiş keycap tasarım render'ının indirilebilir URL'si — adayın bitmiş bir keycap olarak nasıl göründüğü. Tek bir giriş tutar; image_urls[i], candidate_ids[i]'ye karşılık gelir. Görev SUCCEEDED durumuna ulaşana kadar boştur. URL yalnızca görüntüleme amaçlıdır; derleme uç noktası bu URL'leri değil, candidate_ids'i tüketir. model_urls ile aynı URL yaşam döngüsüne sahiptir: imzalıdır, Authorization başlığı gerektirmez, expires_at'e kadar geçerlidir ve görev yeniden okunduğunda değişmez.
Name
candidate_ids
Type
array of strings
Description
image_urls ile paralel, opak aday tanımlayıcıları. Seçtiğiniz tasarıma karşılık gelen girişi derleme isteğinin candidate_id'si olarak geçirin. Bu id'lerin formatı hakkında hiçbir varsayımda bulunmayın.
Keycap Oluşturma Görevi nesnesi, Meshy'nin başarılı bir prototip görevinden ve seçilen bir adaydan nihai dokulu 3D keycap'i oluşturmak için takip ettiği bir çalışma birimidir. Tek bir oluşturma işlemi, tüm iş akışını çalıştırır — beyaz model üretimi, otomatik oturtma ve kesme, renklendirme, montaj ve dışa aktarma.
Özellikler
Name
id
Type
string
Description
Görev için benzersiz tanımlayıcı.
Name
type
Type
string
Description
Görevin türü. Değer creative-lab-keycap-build şeklindedir.
Name
name
Type
string
Description
Görev oluşturulurken belirtilen görev adı. Ad belirtilmemişse boş dizedir.
Görevin ilerlemesi (progress). Görev henüz başlamadıysa bu özellik 0 olur. Görev başarıyla tamamlandığında bu değer 100 olur.
Name
created_at
Type
timestamp
Description
Görevin oluşturulduğu zaman damgası, milisaniye cinsinden.
Name
started_at
Type
timestamp
Description
Görevin başladığı zaman damgası, milisaniye cinsinden.
Name
finished_at
Type
timestamp
Description
Görevin tamamlandığı zaman damgası, milisaniye cinsinden.
Name
expires_at
Type
timestamp
Description
Görev sonucunun süresinin dolduğu zaman damgası, milisaniye cinsinden.
Name
preceding_tasks
Type
integer
Description
Önceki görevlerin sayısı. Yalnızca durum PENDING olduğunda anlamlıdır.
Name
task_error
Type
object
Description
Başarısız görevler için hata ayrıntıları. Tam task_error nesnesi referansı için Hatalar bölümüne bakın.
Name
consumed_credits
Type
integer
Description
Bu görev tarafından tüketilen kredi sayısı. SUCCEEDED durumuna ulaşan bir görevden, aşamasına ait tam tutar tahsil edilir. Hiç oluşturulmamış bir görevden (istek anında bir 4xx hatası, moderation reddi dahil) hiçbir ücret alınmaz. FAILED durumuna ulaşan bir görev 0 döndürür — ücret, asenkron bir moderation engeli dahil olmak üzere iade edilir. DELETE ile iptal etme yalnızca görev hâlâ PENDING durumundayken ücreti iade eder; zaten IN_PROGRESS durumundaki bir görev, iş harcandığı için ücretlendirilmeye devam eder.
Name
model_urls
Type
object
Description
Oluşturulan model dosyaları için indirilebilir URL'ler. Hem GLB hem de OBJ paketi gerçek dünya milimetre ölçeğinde, Y-yukarı olarak ve keycap'in ön yüzü +Z yönüne bakacak şekilde dışa aktarılır. Ağlar (mesh) keycap-head ve keycap-base olarak adlandırılır; taban bir desen doldurmasına geri döndüğünde, sap boşluğu için üçüncü bir ağ olan keycap-base-interior de bulunur. Tam olarak iki ağ olduğunu varsaymayın.
Bunlar imzalı URL'lerdir: bunları bir Authorization başlığı olmadan getirin. expires_at değerine kadar geçerli kalırlar; bu değer finished_at'ten 3 gün sonrasıdır ve bu süre içinde görevi yeniden okumak, yeni imzalanmış bir URL yerine aynı URL'yi döndürür. Dosyaları bu süre dolmadan kendiniz indirip saklayın — süresi dolmuş bir bağlantıyı yenilemenin bir yolu yoktur.
Name
glb
Type
string
Description
Nihai dokulu model.glb için indirilebilir URL.
Name
obj_zip
Type
string
Description
model.obj, model.mtl ve MTL'sinin gerçekten referans verdiği doku PNG'lerini içeren bir zip paketi için indirilebilir URL. Tek renkli bir taban yalnızca keycap-head.png içerir; desenli bir taban ayrıca keycap-base.png de içerir.
Name
process_image_urls
Type
object
Description
Türe göre anahtarlandırılmış, ara işlem görüntüleri için indirilebilir URL'ler. model_urls ile aynı URL yaşam döngüsüne sahiptir: imzalıdır, Authorization başlığı gerektirmez, expires_at'e kadar geçerlidir ve görev yeniden okunduğunda değişmez kalır. Şu anda üretilen türler:
head_design — oluşturma işleminin tükettiği, seçilen adayın tasarım görüntüsü (her zaman mevcuttur).
Eksiksiz akış: bir fotoğraftan prototip oluşturma, SUCCEEDED durumuna
kadar sorgulama, candidate_ids içinden bir aday seçme, bu adayla bir
yapı (build) oluşturma, yapıyı SUCCEEDED durumuna kadar sorgulama,
ardından model_urls üzerinden GLB ve OBJ paketini indirme.
Örnek, ilk adayı programatik olarak seçer. Gerçek bir entegrasyonda,
image_urls girdisini son kullanıcıya gösterip seçim yapmasına izin
verirsiniz; seçilen indeks candidate_ids ile birebir eşleşir.
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"