快速开始

这是用于以编程方式与 Meshy 交互的 API 参考。


Meshy API 提供了一个简单的界面,可以从文本提示和图像生成 3D 模型和纹理。请按照本指南快速入门。

创建 API 密钥

在此处的 API 设置页面中创建 API 密钥,您将使用它来安全地验证您的请求。API 密钥的格式为 msy-<random-string>

生成 API 密钥

一旦生成了 API 密钥,请将其存储在安全的位置。

测试模式 API 密钥

在开发和测试期间,您可以使用我们的测试模式 API 密钥来探索 API,而不消耗您的积分:

msy_dummy_api_key_for_test_mode_12345678

此特殊 API 密钥具有以下特性:

  • 可用于向所有 Meshy API 端点发出请求
  • 使用此密钥时不会消耗积分
  • 所有有效请求将返回相同的示例任务结果,无论输入参数如何
  • 响应数据结构将与生产 API 完全匹配
  • 非常适合在切换到真实 API 密钥之前测试您的 API 集成

发出您的第一个“文本生成3D”API 请求

在此示例中,我们将使用 text-to-3d 端点 从文本提示生成 3D 模型。该过程包括两个阶段:预览阶段和细化阶段。在预览阶段,生成一个没有纹理的基础网格,允许您评估几何形状。在细化阶段,预览网格根据文本提示进行纹理化。

我们将向您展示如何在 Python 脚本中发出这些请求。

预览

Meshy 提供了一组 REST API 端点。您可以使用任何您选择的 HTTP 客户端使用它们。无论调用哪个 API,API 密钥始终作为名为 Authorization 的标头传递。请记住在使用此脚本之前将您的 API 密钥导出为名为 MESHY_API_KEY 的环境变量。

预览请求的关键参数是 mode,始终为 "preview",以及 prompt,即您需要的模型描述。在此示例中,我们还指定了 negative_promptart_styleshould_remesh,但它们是可选的。

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",
  "negative_prompt": "low quality, low resolution, low poly, ugly",
  "art_style": "realistic",
  "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)

这完成了预览 API 调用。

请注意,Meshy API 采用异步执行模型,这意味着当您创建任务时,API 端点仅返回任务 ID。然后您必须使用此 ID 轮询任务状态端点以检查任务是否已完成。

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)

一旦任务完成,您将能够从其响应中访问模型的URL。让我们从响应中的 model_urls 字段下载模型。

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.")

如果到目前为止一切正常,您的 preview_model.glb 应该看起来与此类似。由于AI管道中的内在随机性,它不会完全匹配。

预览模型

细化

让我们继续进行细化阶段。要启动细化请求,请提供预览任务ID作为输入参数。

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.")

3D模型 refined_model.glb 现在已完全纹理化 ✨。

细化模型

整合

以下是使用文本生成3D API的完整代码。

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",
  "negative_prompt": "low quality, low resolution, low poly, ugly",
  "art_style": "realistic",
  "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.")

将代码复制并粘贴到 Python 脚本中并运行。

运行脚本

python api_request.py

你应该会在终端看到如下输出:

运行脚本

下一步

  • 你可以在 "API 端点" 部分找到完整的 API 参考,其中提供了关于每个 API 的详细信息。
  • 探索有关 定价速率限制 的详细信息,以及如何排查 常见错误
  • 别忘了定期查看我们的 更新日志 以获取更新和错误修复。
  • 有反馈或遇到问题?加入我们的 Discord 社区 - 我们期待您的声音!