Szybki start

To jest dokumentacja referencyjna API do programowej interakcji z Meshy.


Meshy API zapewnia prosty interfejs do generowania modeli 3D i tekstur z promptów tekstowych oraz obrazów. Postępuj zgodnie z tym przewodnikiem, aby szybko rozpocząć.

Utwórz klucz API

Utwórz klucz API na stronie ustawień API tutaj, którego użyjesz do bezpiecznego uwierzytelniania swoich żądań. Format klucza API to msy-<random-string>.

Wygeneruj klucz API

Po wygenerowaniu klucza API przechowuj go w bezpiecznym miejscu.

Klucz API trybu testowego

Podczas tworzenia i testowania możesz użyć naszego klucza API trybu testowego, aby poznawać API bez zużywania swoich kredytów:

msy_dummy_api_key_for_test_mode_12345678

Ten specjalny klucz API ma następujące cechy:

  • Może być używany do wysyłania żądań do wszystkich punktów końcowych Meshy API
  • Podczas używania tego klucza nie są zużywane żadne kredyty
  • Wszystkie prawidłowe żądania zwrócą te same przykładowe wyniki zadań, niezależnie od parametrów wejściowych
  • Struktura danych odpowiedzi będzie dokładnie odpowiadać produkcyjnemu API
  • Idealny do testowania integracji API przed przejściem na prawdziwy klucz API

Wykonaj pierwsze żądanie API „Tekst na 3D”

W tym przykładzie wygenerujemy model 3D z promptu tekstowego przy użyciu punktu końcowego text-to-3d. Proces obejmuje dwa etapy: etap preview i etap refine. Na etapie preview generowana jest bazowa siatka bez zastosowanej tekstury, co pozwala ocenić geometrię. Na etapie refine siatka preview otrzymuje teksturę na podstawie promptu tekstowego.

Pokażemy, jak wykonać te żądania w skrypcie Python.

Preview

Meshy udostępnia zestaw punktów końcowych REST API. Możesz używać ich z dowolnym wybranym klientem HTTP. Niezależnie od tego, które API wywołujesz, klucz API jest zawsze przekazywany jako nagłówek o nazwie Authorization. Pamiętaj, aby przed użyciem tego skryptu wyeksportować swój klucz API jako zmienną środowiskową o nazwie MESHY_API_KEY.

Kluczowe parametry żądania preview to mode, który zawsze ma wartość "preview", oraz prompt, czyli opis potrzebnego modelu. W tym przykładzie określiliśmy również should_remesh, ale jest to opcjonalne.

api_request.py

import requests
import os
import time

headers = {
  "Authorization": f"Bearer {os.environ['MESHY_API_KEY']}"
}

# 1. Generate a preview model and get the task ID

generate_preview_request = {
  "mode": "preview",
  "prompt": "a monster mask",
  "should_remesh": True,
}

generate_preview_response = requests.post(
  "https://api.meshy.ai/openapi/v2/text-to-3d",
  headers=headers,
  json=generate_preview_request,
)

generate_preview_response.raise_for_status()

preview_task_id = generate_preview_response.json()["result"]

print("Preview task created. Task ID:", preview_task_id)

To kończy wywołanie API preview.

Pamiętaj, że Meshy API przyjmuje model wykonania asynchronicznego, co oznacza, że podczas tworzenia zadania punkt końcowy API zwraca tylko identyfikator zadania. Następnie musisz odpytywać punkt końcowy statusu zadania z tym identyfikatorem, aby sprawdzić, czy zadanie zostało ukończone.

api_request.py

# 2. Poll the preview task status until it's finished

preview_task = None

while True:
  preview_task_response = requests.get(
    f"https://api.meshy.ai/openapi/v2/text-to-3d/{preview_task_id}",
    headers=headers,
  )

  preview_task_response.raise_for_status()

  preview_task = preview_task_response.json()

  if preview_task["status"] == "SUCCEEDED":
    print("Preview task finished.")
    break

  print("Preview task status:", preview_task["status"], "| Progress:", preview_task["progress"], "| Retrying in 5 seconds...")
  time.sleep(5)

Po zakończeniu zadania będziesz mieć dostęp do adresów URL modelu z jego odpowiedzi. Pobierzmy model z pola model_urls w odpowiedzi.

api_request.py

# 3. Download the preview model in glb format

preview_model_url = preview_task["model_urls"]["glb"]

preview_model_response = requests.get(preview_model_url)
preview_model_response.raise_for_status()

with open("preview_model.glb", "wb") as f:
  f.write(preview_model_response.content)

print("Preview model downloaded.")

Jeśli do tej pory wszystko działa, Twój preview_model.glb powinien wyglądać podobnie do tego. Nie będzie to dokładne dopasowanie ze względu na wrodzoną losowość w potoku AI.

Model preview

Refine

Przejdźmy do etapu refine. Aby zainicjować żądanie refine, podaj identyfikator zadania preview jako parametr wejściowy.

api_request.py

# 4. Generate a refined model and get the task ID

generate_refined_request = {
  "mode": "refine",
  "preview_task_id": preview_task_id,
}

generate_refined_response = requests.post(
  "https://api.meshy.ai/openapi/v2/text-to-3d",
  headers=headers,
  json=generate_refined_request,
)

generate_refined_response.raise_for_status()

refined_task_id = generate_refined_response.json()["result"]

print("Refined task created. Task ID:", refined_task_id)

# 5. Poll the refined task status until it's finished

refined_task = None

while True:
  refined_task_response = requests.get(
    f"https://api.meshy.ai/openapi/v2/text-to-3d/{refined_task_id}",
    headers=headers,
  )

  refined_task_response.raise_for_status()

  refined_task = refined_task_response.json()

  if refined_task["status"] == "SUCCEEDED":
    print("Refined task finished.")
    break

  print("Refined task status:", refined_task["status"], "| Progress:", refined_task["progress"], "| Retrying in 5 seconds...")
  time.sleep(5)

# 6. Download the refined model in glb format

refined_model_url = refined_task["model_urls"]["glb"]

refined_model_response = requests.get(refined_model_url)
refined_model_response.raise_for_status()

with open("refined_model.glb", "wb") as f:
  f.write(refined_model_response.content)

print("Refined model downloaded.")

Model 3D refined_model.glb ma teraz w pełni nałożone tekstury ✨.

Model refined

Połącz wszystko razem

Oto kompletny kod do korzystania z API Tekst na 3D.

api_request.py

import requests
import os
import time

headers = {
  "Authorization": f"Bearer {os.environ['MESHY_API_KEY']}"
}

# 1. Generate a preview model and get the task ID

generate_preview_request = {
  "mode": "preview",
  "prompt": "a monster mask",
  "should_remesh": True,
}

generate_preview_response = requests.post(
  "https://api.meshy.ai/openapi/v2/text-to-3d",
  headers=headers,
  json=generate_preview_request,
)

generate_preview_response.raise_for_status()

preview_task_id = generate_preview_response.json()["result"]

print("Preview task created. Task ID:", preview_task_id)

# 2. Poll the preview task status until it's finished

preview_task = None

while True:
  preview_task_response = requests.get(
    f"https://api.meshy.ai/openapi/v2/text-to-3d/{preview_task_id}",
    headers=headers,
  )

  preview_task_response.raise_for_status()

  preview_task = preview_task_response.json()

  if preview_task["status"] == "SUCCEEDED":
    print("Preview task finished.")
    break

  print("Preview task status:", preview_task["status"], "| Progress:", preview_task["progress"], "| Retrying in 5 seconds...")
  time.sleep(5)

# 3. Download the preview model in glb format

preview_model_url = preview_task["model_urls"]["glb"]

preview_model_response = requests.get(preview_model_url)
preview_model_response.raise_for_status()

with open("preview_model.glb", "wb") as f:
  f.write(preview_model_response.content)

print("Preview model downloaded.")

# 4. Generate a refined model and get the task ID

generate_refined_request = {
  "mode": "refine",
  "preview_task_id": preview_task_id,
}

generate_refined_response = requests.post(
  "https://api.meshy.ai/openapi/v2/text-to-3d",
  headers=headers,
  json=generate_refined_request,
)

generate_refined_response.raise_for_status()

refined_task_id = generate_refined_response.json()["result"]

print("Refined task created. Task ID:", refined_task_id)

# 5. Poll the refined task status until it's finished

refined_task = None

while True:
  refined_task_response = requests.get(
    f"https://api.meshy.ai/openapi/v2/text-to-3d/{refined_task_id}",
    headers=headers,
  )

  refined_task_response.raise_for_status()

  refined_task = refined_task_response.json()

  if refined_task["status"] == "SUCCEEDED":
    print("Refined task finished.")
    break

  print("Refined task status:", refined_task["status"], "| Progress:", refined_task["progress"], "| Retrying in 5 seconds...")
  time.sleep(5)

# 6. Download the refined model in glb format

refined_model_url = refined_task["model_urls"]["glb"]

refined_model_response = requests.get(refined_model_url)
refined_model_response.raise_for_status()

with open("refined_model.glb", "wb") as f:
  f.write(refined_model_response.content)

print("Refined model downloaded.")

Skopiuj i wklej kod do skryptu Python, a następnie go uruchom.

Run the script

python api_request.py

W terminalu powinny pojawić się dane wyjściowe podobne do poniższych:

Uruchom skrypt

Następne kroki

  • Wolisz najpierw wypróbować punkty końcowe bez pisania kodu? Użyj API Playground, aby skonfigurować i uruchomić żądanie, a następnie skopiuj wygenerowany fragment kodu.
  • Pełną dokumentację referencyjną API znajdziesz w sekcji „Punkty końcowe API”, która zawiera szczegółowe informacje o każdym API.
  • Poznaj szczegóły dotyczące Cennika, limitów szybkości oraz sposobów rozwiązywania typowych błędów.
  • Nie zapomnij regularnie sprawdzać naszego dziennika zmian, aby być na bieżąco z aktualizacjami i poprawkami błędów.
  • Masz opinię lub napotykasz problemy? Dołącz do naszej społeczności Discord — chętnie Cię wysłuchamy!