Verwandeln Sie ein Ausgangsfoto in eine vollfarbige, benutzerdefinierte mechanische Tastaturtaste in zwei Phasen: Prototyp erzeugt ein "fertiges Tastenkappen"-Design-Rendering aus Ihrem Eingabefoto. Sobald Sie dieses Rendering bestätigt haben, verwandelt Bau es in ein texturiertes 3D-Tastenkappenmodell in einem einzigen Durchlauf — die Erstellung des Weißmodells, das automatische Platzieren und Schneiden in einer kalibrierten Standardpose, die vollständige Modellfärbung und die Endmontage erfolgen alle innerhalb einer Bauaufgabe. Die beiden Phasen sind über input_task_id plus candidate_id verbunden.
POST /openapi/creative-lab/keycap/v1/prototype
POST /openapi/creative-lab/keycap/v1/build
Beide POST endpoints erfordern einen kostenpflichtigen Abonnementplan. Anfragen von Konten mit kostenlosem Plan werden mit 402 Payment Required abgelehnt.
Erzeugen Sie ein fertiges Keycap-Design-Rendering aus dem Ausgangsfoto. Das Ergebnis der Aufgabe enthält ein image_urls-Array (das Anzeigerendering des fertigen Keycaps) und ein paralleles candidate_ids-Array; beide enthalten einen einzelnen Eintrag. Rufen Sie diesen Endpunkt erneut auf, wenn das Ergebnis nicht Ihren Wünschen entspricht – jeder Aufruf wird separat berechnet. Übergeben Sie die candidate_id zusammen mit der Prototyp-Aufgaben-ID an den Build-Endpunkt. Weitere Informationen zur Antwortstruktur finden Sie unter Das Keycap-Prototyp-Aufgabenobjekt.
Parameter
Name
image_url
Type
string
Erforderlich
Description
Ausgangsfoto, das Meshy in Keycap-Design-Bilder umwandeln soll. Derzeit unterstützen wir die Formate .jpg, .jpeg, .png und .webp.
Das Format wird durch Dekodieren der Bilddaten erkannt, nicht durch die Dateierweiterung der URL – eine URL ohne Erweiterung oder eine, die umleitet, funktioniert, solange die Bytes in ein unterstütztes Format dekodiert werden. HTTP-Weiterleitungen werden befolgt. Die EXIF-Ausrichtung wird normalisiert, sodass ein gedrehtes Handyfoto so verwendet wird, wie es aussieht.
Grenzen: mindestens 32 Pixel auf jeder Seite, maximal 178,956,970 Pixel insgesamt und maximal 20,000,000 Bytes nach dem Herunterladen. Bei einer Data URI gilt das Limit für die dekodierten Bytes, sodass die Quelldatei selbst bis zu dieser Größe sein kann – der Base64-Text ist etwa ein Drittel größer, was für Ihren Anfragekörper wichtig ist, nicht für dieses Limit. Eine Data URI muss einen image/*-Inhaltstyp und ;base64 deklarieren.
Es gibt zwei Möglichkeiten, das Bild bereitzustellen:
Öffentlich zugängliche URL: Eine URL, die vom öffentlichen Internet aus zugänglich ist.
Data URI: Eine Base64-kodierte Data URI des Bildes. Beispiel einer Data URI: data:image/jpeg;base64,<your base64-encoded image data>.
Name
name
Type
string
Description
Optionaler Aufgabenname für Anzeigezwecke. Maximal 100 Zeichen.
Name
remove_background
Type
boolean
Standard false
Description
Wenn auf true gesetzt, ist das in image_urls zurückgegebene Anzeigerendering ein transparentes RGBA-PNG mit entferntem Hintergrund, sodass Sie es auf jeden Hintergrund zusammensetzen können.
Dies gilt nur für das Anzeigerendering. Der Kandidat, den der Build-Endpunkt konsumiert, bleibt unberührt, sodass das 3D-Ergebnis in beiden Fällen identisch ist.
Rückgaben
Die result-Eigenschaft der Antwort enthält die Aufgaben-id der neu erstellten Keycap-Prototyp-Aufgabe. Überwachen Sie den Get a Task Endpunkt oder abonnieren Sie den Stream, bis die Aufgabe SUCCEEDED erreicht, und nehmen Sie dann den Eintrag aus candidate_ids und übergeben Sie ihn zusammen mit der Aufgaben-ID an den Build-Endpunkt.
Fehlermodi
Name
400 - Bad Request
Description
Die Anfrage war nicht akzeptabel. Häufige Ursachen:
Fehlender Parameter: image_url ist erforderlich.
Ungültiges Bildformat: Die bereitgestellte image_url ist kein unterstütztes Format (.jpg, .jpeg, .png, .webp).
Bildabmessungen außerhalb des Bereichs: Das Bild ist zu klein, überschreitet die maximale Dateigröße oder die maximale Pixelanzahl.
Nicht erreichbare URL: Die image_url konnte nicht heruntergeladen werden (404 oder timeout).
Ungültige Data URI: Der Base64-String ist fehlerhaft.
Inhalt markiert: Das Eingabebild wurde durch NSFW moderation markiert.
Name
401 - Unauthorized
Description
Authentifizierung fehlgeschlagen. Bitte überprüfen Sie Ihren API-Schlüssel.
Name
402 - Payment Required
Description
Das Konto befindet sich im kostenlosen Plan (ein kostenpflichtiger Plan ist erforderlich, um Aufgaben zu erstellen) oder hat nicht genügend Credits.
Name
403 - Forbidden
Description
Das Eingabebild wurde durch die moderation des geistigen Eigentums markiert.
Name
429 - Too Many Requests
Description
Sie haben Ihre Ratenbegrenzung überschritten.
Name
500 - Internal Server Error
Description
Ein unerwarteter serverseitiger Fehler ist aufgetreten – zum Beispiel war der Inhaltsmoderationsdienst nicht verfügbar, das Staging des Eingabebildes ist fehlgeschlagen oder die Aufgabe konnte nicht erstellt werden. In diesem Fall wird keine Aufgabe erstellt, sodass ein erneuter Versuch sicher ist.
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>" }'
Generieren Sie das endgültige 3D-Keycap-Modell mit Textur aus einer erfolgreichen Prototyp-Aufgabe und einem ihrer Kandidaten. Eine einzelne Build-Aufgabe führt die gesamte Pipeline von Anfang bis Ende aus — Weißmodell-Generierung aus dem gewählten Design, automatisches Platzieren und Schneiden auf die Keycap-Basis mit einer kalibrierten Standardpose (keine interaktive Anpassung erforderlich), vollständige Modellfärbung und endgültige Montage und Export. Ein Build dauert typischerweise 3–7 Minuten, wobei die obere Grenze erreicht wird, wenn mehrere Builds gleichzeitig ausgeführt werden.
Siehe Das Keycap-Build-Aufgabenobjekt für die Antwortstruktur.
Parameter
Name
input_task_id
Type
string
Erforderlich
Description
Die Aufgaben-ID einer Prototyp-Aufgabe, die über diesen gleichen OpenAPI-Endpunkt erstellt wurde. Der Prototyp muss vom gleichen Meshy-Konto erstellt worden sein, muss SUCCEEDED erreicht haben und muss mindestens einen Kandidaten produziert haben.
Prototyp-Aufgaben, die über die Web-App erstellt wurden, werden nicht akzeptiert — der Build-Endpunkt akzeptiert nur Prototyp-Aufgaben, die durch POST /openapi/creative-lab/keycap/v1/prototype erstellt wurden, und lehnt jede andere Quelle mit 404 ab.
Name
candidate_id
Type
string
Erforderlich
Description
Der zu bauende Kandidat, entnommen aus dem candidate_ids Array der erfolgreichen Prototyp-Aufgabe. Muss zu dieser Aufgabe gehören; jeder andere Wert wird mit 400 abgelehnt.
Name
name
Type
string
Description
Optionaler Aufgabenname für Anzeigezwecke. Maximal 100 Zeichen.
options
Optionale Geometrieanpassung. Jedes Feld hat einen kalibrierten Standardwert — senden Sie nur die, die Sie überschreiben möchten.
Name
base_model
Type
string
Standard cherry-mx-1x1-r1
Description
Die Keycap-Basis, auf der aufgebaut werden soll. Derzeit ist der einzige verfügbare Wert cherry-mx-1x1-r1 — ein Standard-Cherry-MX-Profil 1u-Keycap. 3–5 zusätzliche gängige Standardgrößen sind geplant; benutzerdefinierte Größen werden nicht unterstützt.
Name
head_size_mm
Type
number
Standard 23
Description
Zielgröße des skulptierten Kopfes in Millimetern: seine längste Dimension wird auf diesen Wert skaliert. Bereich: [10, 40]. Werte über etwa 32.9 können reduziert werden, damit der Kopf noch in das Schutzfußabdrucklimit der Basis passt, sodass die gelieferte längste Dimension kleiner als angefordert sein kann. Der angewendete Wert wird heute nicht im Aufgabenobjekt zurückgegeben — wenn Sie die tatsächlich erhaltene Größe bestätigen müssen, messen Sie den Begrenzungsrahmen des keycap-head Netzes im heruntergeladenen Modell.
Name
vertical_offset_mm
Type
number
Standard 0
Description
Vertikaler Versatz, der auf den Kopf angewendet wird, bevor er auf der Basis platziert wird, in Millimetern. Bereich: [-5, 5].
Rückgaben
Die result-Eigenschaft der Antwort enthält die Aufgaben-id der neu erstellten Keycap-Build-Aufgabe. Abfragen Sie den Get a Task Endpunkt oder abonnieren Sie den stream, bis die Aufgabe SUCCEEDED erreicht, und laden Sie dann die Artefakte von model_urls.glb und model_urls.obj_zip herunter.
Sowohl das GLB als auch das OBJ-Bundle werden im realen Millimetermaßstab exportiert, mit einem Y-up-Koordinatensystem und der Vorderseite der Keycap, die nach +Z zeigt.
Fehlermodi
Name
400 - Bad Request
Description
Die Anfrage war nicht akzeptabel. Häufige Ursachen:
Fehlender Parameter: input_task_id und candidate_id sind erforderlich.
Ungültige UUID: Die input_task_id ist keine gültige UUID.
Elternteil nicht erfolgreich: Die referenzierte Prototyp-Aufgabe hat SUCCEEDED noch nicht erreicht.
Keine Kandidaten: Die Prototyp-Aufgabe war erfolgreich, hat aber keine Kandidaten produziert.
Unbekannter Kandidat: candidate_id ist nicht einer der Kandidaten der Eingabeaufgabe.
Optionen außerhalb des Bereichs: Eines der options-Felder lag außerhalb des erlaubten Bereichs oder Enum-Sets.
Name
401 - Unauthorized
Description
Authentifizierung fehlgeschlagen. Bitte überprüfen Sie Ihren API-Schlüssel.
Name
402 - Payment Required
Description
Das Konto befindet sich im kostenlosen Plan (ein kostenpflichtiger Plan ist erforderlich, um Aufgaben zu erstellen) oder hat nicht genügend Credits.
Name
404 - Not Found
Description
Die referenzierte Prototyp-Aufgabe existiert nicht, gehört einem anderen Benutzer oder wurde über die Web-App erstellt (nur API-Modus-Prototyp-Aufgaben werden in den Build übernommen).
Name
429 - Too Many Requests
Description
Sie haben Ihre Ratenbegrenzung überschritten.
Name
500 - Internal Server Error
Description
Ein unerwarteter serverseitiger Fehler ist aufgetreten — zum Beispiel war der Inhaltsmoderationsdienst nicht verfügbar, das Staging des Eingabebildes ist fehlgeschlagen oder die Aufgabe konnte nicht erstellt werden. In diesem Fall wird keine Aufgabe erstellt, sodass ein erneuter Versuch sicher ist.
Anfrage
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 } }'
Abrufen einer Prototyp- oder Bauaufgabe mit einer gültigen Aufgaben-id. Der URL-Pfad
muss der Phase der Aufgabe entsprechen — eine Bauaufgabe, die über
/prototype/:id abgerufen wird, gibt 404 zurück, und umgekehrt.
Eine Keycap-Aufgabe abbrechen. Wenn die Aufgabe noch PENDING ist, werden die beim Erstellen verbrauchten Credits zurückerstattet. Aufgaben, die bereits IN_PROGRESS sind, werden ohne Rückerstattung abgebrochen (der Arbeiter könnte bereits Ressourcen verbrauchen). Aufgaben, die bereits einen Endzustand erreicht haben (SUCCEEDED, FAILED, CANCELED), können nicht abgebrochen werden.
Der URL-Pfad muss der Phase der Aufgabe entsprechen — DELETE auf
/prototype/:buildId gibt 404 zurück.
Pfadparameter
Name
id
Type
path
Description
Eindeutiger Bezeichner für die abzubrechende Keycap-Aufgabe.
Rückgaben
Gibt 204 No Content bei Erfolg mit leerem Körper zurück.
Fehlermodi
Name
400 - Bad Request
Description
Die Aufgabe befindet sich bereits in einem Endzustand und kann nicht abgebrochen werden.
Name
404 - Not Found
Description
Die Aufgabe existiert nicht, gehört einem anderen Benutzer oder ihre Phase stimmt nicht mit dem URL-Pfad überein.
Name
500 - Internal Server Error
Description
Ein unerwarteter serverseitiger Fehler trat beim Abbrechen auf. Die Aufgabe könnte abgebrochen worden sein oder nicht — lesen Sie sie erneut, um dies zu bestätigen, bevor Sie es erneut versuchen.
Streamen Sie Echtzeit-Updates für eine Keycap-Aufgabe über Server-Sent Events (SSE).
Der URL-Pfad muss mit der Phase der Aufgabe übereinstimmen — das Öffnen eines Streams bei
/prototype/:buildId/stream sendet ein einzelnes event: error Payload mit
status_code: 404 und schließt den Stream.
Parameter
Name
id
Type
path
Description
Eindeutiger Bezeichner für die Keycap-Aufgabe zum Streamen.
Rückgaben
Gibt einen Stream von Keycap Prototype
oder Keycap Build Aufgabenobjekten als
Server-Sent Events zurück. Für PENDING oder IN_PROGRESS Aufgaben wird der Antwortstream
nur die notwendigen progress und status Felder enthalten.
Abrufen einer paginierten Liste Ihrer Keycap-Aufgaben für eine einzelne Phase. Der URL-Pfad wählt die Phase aus — /prototype gibt Prototyp-Aufgaben zurück; /build gibt Build-Aufgaben zurück. Aufgaben aus der anderen Phase sind in keiner der Antworten enthalten.
Pfadparameter
Name
stage
Type
path
Erforderlich
Description
Entweder prototype oder build. Die Sammlung gibt nur Aufgaben zurück,
deren Phase mit der URL übereinstimmt — das Abrufen von /prototype gibt
niemals Build-Aufgaben zurück und umgekehrt.
Abfrageparameter
Name
page_num
Type
integer
Standard 1
Description
Seitennummer für die Paginierung.
Name
page_size
Type
integer
Standard 10
Description
Begrenzung der Seitengröße. Maximal erlaubt sind 100 Elemente.
Name
sort_by
Type
string
Standard -created_at
Description
Feld, nach dem sortiert werden soll. Verfügbare Werte:
+created_at: Sortierung nach Erstellungszeit in aufsteigender Reihenfolge.
-created_at: Sortierung nach Erstellungszeit in absteigender Reihenfolge.
Das Keycap-Prototyp-Task-Objekt ist eine Arbeitseinheit, die Meshy verfolgt, um ein fertiges Keycap-Designbild aus einem Ausgangsfoto zu generieren. Das Ergebnis dieser Phase wird über input_task_id plus candidate_id in die Bauphase eingebunden.
Eigenschaften
Name
id
Type
string
Description
Eindeutiger Bezeichner für die Aufgabe. Obwohl wir eine k-sortierbare UUID für Task-IDs als Implementierungsdetail verwenden, sollten Sie keine Annahmen über das Format der ID machen.
Name
type
Type
string
Description
Typ der Aufgabe. Der Wert ist creative-lab-keycap-prototype.
Name
name
Type
string
Description
Der bei der Erstellung der Aufgabe angegebene Aufgabenname. Leerer String, wenn kein Name angegeben wurde.
Name
status
Type
string
Description
Status der Aufgabe. Mögliche Werte sind einer von PENDING, IN_PROGRESS, SUCCEEDED, FAILED, CANCELED.
Name
progress
Type
integer
Description
Fortschritt der Aufgabe. Wenn die Aufgabe noch nicht gestartet wurde, ist diese Eigenschaft 0. Sobald die Aufgabe erfolgreich abgeschlossen ist, wird sie 100.
Name
created_at
Type
timestamp
Description
Zeitstempel, wann die Aufgabe erstellt wurde, in Millisekunden.
Ein Zeitstempel repräsentiert die Anzahl der Millisekunden, die seit dem 1. Januar 1970 UTC vergangen sind, gemäß dem RFC 3339-Standard. Zum Beispiel wird Freitag, der 1. September 2023, 12:00:00 Uhr GMT als 1693569600000 dargestellt. Dies gilt für alle Zeitstempel in der Meshy API.
Name
started_at
Type
timestamp
Description
Zeitstempel, wann die Aufgabe gestartet wurde, in Millisekunden. Wenn die Aufgabe noch nicht gestartet wurde, ist diese Eigenschaft 0.
Name
finished_at
Type
timestamp
Description
Zeitstempel, wann die Aufgabe abgeschlossen wurde, in Millisekunden. Wenn die Aufgabe noch nicht abgeschlossen ist, ist diese Eigenschaft 0.
Name
expires_at
Type
timestamp
Description
Zeitstempel, wann das Ergebnis der Aufgabe abläuft, in Millisekunden.
Name
preceding_tasks
Type
integer
Description
Die Anzahl der vorhergehenden Aufgaben.
Der Wert dieses Feldes ist nur sinnvoll, wenn der Aufgabenstatus PENDING ist.
Name
task_error
Type
object
Description
Fehlerdetails für fehlgeschlagene Aufgaben. Siehe Fehler für die vollständige task_error-Objektreferenz.
Name
consumed_credits
Type
integer
Description
Die Anzahl der von dieser Aufgabe verbrauchten Credits. Eine Aufgabe, die SUCCEEDED erreicht, wird mit dem vollen Betrag für ihre Phase belastet. Eine Aufgabe, die nie erstellt wird (ein 4xx zur Anforderungszeit, einschließlich einer Moderationsablehnung), wird überhaupt nicht belastet. Eine Aufgabe, die FAILED erreicht, gibt 0 zurück — die Gebühr wird erstattet, einschließlich einer asynchronen Moderationssperre. Eine Stornierung über DELETE wird nur erstattet, solange die Aufgabe noch PENDING ist; eine bereits IN_PROGRESS befindliche Aufgabe bleibt belastet, da die Arbeit bereits geleistet wurde.
Name
image_urls
Type
array of strings
Description
Herunterladbare URL des fertigen Keycap-Design-Renderings — wie der Kandidat als fertiges Keycap aussieht. Enthält einen einzigen Eintrag; image_urls[i] entspricht candidate_ids[i]. Leer, bis die Aufgabe SUCCEEDED erreicht. Die URL dient nur zur Anzeige; der Bau-Endpunkt verbraucht candidate_ids, nicht diese URLs. Gleicher URL-Lebenszyklus wie model_urls: signiert, kein Authorization-Header, gültig bis expires_at und stabil, wenn die Aufgabe erneut gelesen wird.
Name
candidate_ids
Type
array of strings
Description
Opaque Kandidatenbezeichner, parallel zu image_urls. Übergeben Sie den Eintrag, der Ihrem gewählten Design entspricht, als candidate_id der Bauanforderung. Machen Sie keine Annahmen über das Format dieser IDs.
Das Keycap Build Task Objekt ist eine Arbeitseinheit, die Meshy verfolgt, um das endgültige texturierte 3D-Keycap aus einer erfolgreichen Prototyp-Aufgabe und einem ausgewählten Kandidaten zu generieren. Ein einzelner Build durchläuft die gesamte Pipeline — Weißmodell-Generierung, automatisches Platzieren und Schneiden, Färben, Zusammenbau und Export.
Eigenschaften
Name
id
Type
string
Description
Eindeutiger Bezeichner für die Aufgabe.
Name
type
Type
string
Description
Typ der Aufgabe. Der Wert ist creative-lab-keycap-build.
Name
name
Type
string
Description
Der bei der Erstellung der Aufgabe angegebene Aufgabenname. Leerer String, wenn kein Name angegeben wurde.
Name
status
Type
string
Description
Status der Aufgabe. Mögliche Werte sind PENDING, IN_PROGRESS, SUCCEEDED, FAILED, CANCELED.
Name
progress
Type
integer
Description
Fortschritt der Aufgabe. Wenn die Aufgabe noch nicht gestartet wurde, ist dieser Wert 0. Sobald die Aufgabe erfolgreich abgeschlossen ist, wird dieser Wert 100.
Name
created_at
Type
timestamp
Description
Zeitstempel, wann die Aufgabe erstellt wurde, in Millisekunden.
Name
started_at
Type
timestamp
Description
Zeitstempel, wann die Aufgabe gestartet wurde, in Millisekunden.
Name
finished_at
Type
timestamp
Description
Zeitstempel, wann die Aufgabe abgeschlossen wurde, in Millisekunden.
Name
expires_at
Type
timestamp
Description
Zeitstempel, wann das Ergebnis der Aufgabe abläuft, in Millisekunden.
Name
preceding_tasks
Type
integer
Description
Die Anzahl der vorhergehenden Aufgaben. Nur sinnvoll, wenn der Status PENDING ist.
Name
task_error
Type
object
Description
Fehlerdetails für fehlgeschlagene Aufgaben. Siehe Fehler für die vollständige task_error Objektreferenz.
Name
consumed_credits
Type
integer
Description
Die Anzahl der von dieser Aufgabe verbrauchten Credits. Eine Aufgabe, die SUCCEEDED erreicht, wird mit dem vollen Betrag für ihre Stufe berechnet. Eine Aufgabe, die nie erstellt wird (ein 4xx zur Anforderungszeit, einschließlich einer Moderationsablehnung), wird überhaupt nicht berechnet. Eine Aufgabe, die FAILED erreicht, gibt 0 zurück — die Gebühr wird erstattet, einschließlich einer asynchronen Moderationsblockierung. Eine Stornierung über DELETE erstattet nur, solange die Aufgabe noch PENDING ist; eine Aufgabe, die bereits IN_PROGRESS ist, bleibt berechnet, da die Arbeit bereits geleistet wurde.
Name
model_urls
Type
object
Description
Herunterladbare URLs für die generierten Modellartefakte. Sowohl das GLB als auch das OBJ-Bundle werden im realen Millimetermaßstab, Y-oben, mit der Vorderseite des Keycaps in Richtung +Z exportiert. Netze sind als keycap-head und keycap-base benannt; wenn die Basis auf ein Musterfüllung zurückfällt, ist ein drittes Netz keycap-base-interior für die Stielhöhle ebenfalls vorhanden. Gehen Sie nicht davon aus, dass es genau zwei Netze gibt.
Dies sind signierte URLs: Abrufen ohneAuthorization Header. Sie bleiben gültig bis expires_at, was 3 Tage nach finished_at ist, und das erneute Lesen der Aufgabe innerhalb dieses Fensters gibt die identische URL zurück, anstatt eine neu signierte. Laden Sie die Dateien selbst herunter und speichern Sie sie vor Ablauf — es gibt keine Möglichkeit, einen abgelaufenen Link zu aktualisieren.
Name
glb
Type
string
Description
Herunterladbare URL zum endgültigen texturierten model.glb.
Name
obj_zip
Type
string
Description
Herunterladbare URL zu einem Zip-Bundle, das model.obj, model.mtl und die Textur-PNGs enthält, auf die sich das MTL tatsächlich bezieht. Eine einfarbige Basis liefert nur keycap-head.png; eine gemusterte Basis liefert auch keycap-base.png.
Name
process_image_urls
Type
object
Description
Herunterladbare URLs für Zwischenprozessbilder, nach Art sortiert. Gleicher URL-Lebenszyklus wie model_urls: signiert, kein Authorization Header, gültig bis expires_at und stabil, wenn die Aufgabe erneut gelesen wird. Derzeit ausgegebene Arten:
head_design — das Designbild des ausgewählten Kandidaten, das der Build verbraucht hat (immer vorhanden).
composite — das fertige Keycap-Display-Rendering des ausgewählten Kandidaten (vorhanden, wenn verfügbar).
base_canvas — die bemalte Keycap-Basis-Leinwand (vorhanden, wenn verfügbar).
Behandeln Sie die Schlüsselsammlung als offen; neue Arten können ohne eine Breaking-Änderung hinzugefügt werden.
Der komplette Ablauf: Erstellen Sie einen Prototypen aus einem Foto, warten Sie, bis er SUCCEEDED ist, wählen Sie einen Kandidaten aus candidate_ids, erstellen Sie einen Build mit diesem Kandidaten, warten Sie, bis der Build SUCCEEDED ist, und laden Sie dann das GLB und das OBJ-Paket von model_urls herunter.
Das Beispiel wählt den ersten Kandidaten programmatisch aus. In einer echten Integration würden Sie den Eintrag image_urls dem Endbenutzer anzeigen und ihn wählen lassen; der gewählte Index wird 1:1 auf candidate_ids abgebildet.
Kompletter Ablauf
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"