{"id":"b13373ce-132a-410b-ad9a-224387ad8a1c","shortId":"3WZcsH","kind":"skill","title":"meshy-3d-generation","tagline":"Generate 3D models, textures, images, rig characters, and animate them using the Meshy AI API. Handles API key detection, setup, and all generation workflows via direct HTTP calls. Use when the user asks to create 3D models, convert text/images to 3D, texture models, rig or anima","description":"# Meshy 3D Generation\n\nDirectly communicate with the Meshy AI API to generate 3D assets. This skill handles the complete lifecycle: environment setup, API key detection, task creation, polling, downloading, and chaining multi-step pipelines.\n\nFor full endpoint reference (all parameters, response schemas, error codes), read [reference.md](reference.md).\n\n---\n\n## IMPORTANT: 3D Printing → Use `meshy-3d-printing` Skill\n\n**If the user's request involves 3D printing** (keywords: print, 3d print, slicer, slice, bambu, orca, prusa, cura, multicolor, 3mf, figurine, miniature, statue, physical model), **use the `meshy-3d-printing` skill instead of this one for the entire workflow.** The printing skill handles generation with correct print-optimized parameters (e.g. `target_formats` with `\"3mf\"` for multicolor), slicer detection, coordinate conversion, and slicer launch — all in one pipeline.\n\nThis skill's `create_task`/`poll_task`/`download` template functions are reused by the printing skill, but the **workflow orchestration** (what to generate, which formats, what to do after) must come from the printing skill when printing is involved.\n\n**Do NOT generate a model with this skill and then hand off to the printing skill** — the printing skill needs to control parameters from the start (e.g. `target_formats`, `should_texture`).\n\n---\n\n## IMPORTANT: First-Use Session Notice\n\nWhen this skill is first activated in a session, inform the user:\n\n> All generated files will be saved to `meshy_output/` in the current working directory. Each project gets its own folder (`{YYYYMMDD_HHmmss}_{prompt}_{id}/`) with model files, textures, thumbnails, and metadata. History is tracked in `meshy_output/history.json`.\n\nThis only needs to be said **once per session**, at the beginning.\n\n## IMPORTANT: File Organization\n\nAll downloaded files MUST go into a structured `meshy_output/` directory in the current working directory. **Do NOT scatter files randomly.**\n\n- Each project gets its own folder: `meshy_output/{YYYYMMDD_HHmmss}_{prompt_slug}_{task_id_prefix}/`\n- For chained tasks (preview → refine → rig), reuse the same `project_dir`\n- Track tasks in `metadata.json` per project, and global `history.json`\n- Auto-download thumbnails alongside models\n\nThe Reusable Script Template below includes `get_project_dir()`, `record_task()`, and `save_thumbnail()` helpers.\n\n---\n\n## IMPORTANT: Shell Command Rules\n\n**Use only standard POSIX tools in shell commands.** Do NOT use `rg` (ripgrep), `fd`, or other non-standard CLI tools — they may not be installed. Use these standard alternatives instead:\n\n| Do NOT use | Use instead |\n|---|---|\n| `rg` | `grep` |\n| `fd` | `find` |\n| `bat` | `cat` |\n| `exa` / `eza` | `ls` |\n\n---\n\n## IMPORTANT: Run Long Tasks Properly\n\nMeshy generation tasks take 1–5 minutes. When running Python scripts that poll for completion:\n\n- Write the entire create → poll → download flow as **ONE Python script** and execute it in a single Bash call. Do NOT split into multiple commands. This keeps the API key, task IDs, and session in one process context.\n- Use `python3 -u script.py` (unbuffered) so progress output is visible in real time.\n- Be patient with long-running scripts — do NOT interrupt or kill them prematurely. Tasks at 99% for 30–120s is normal finalization, not a failure.\n\n---\n\n## Step 0: Environment Detection (ALWAYS RUN FIRST)\n\nBefore any API call, detect whether the environment is ready:\n\n```bash\necho \"=== Meshy API Key Detection ===\"\n\n# 1. Check current env var\nif [ -n \"$MESHY_API_KEY\" ]; then\n  echo \"ENV_VAR: FOUND (${MESHY_API_KEY:0:8}...)\"\nelse\n  echo \"ENV_VAR: NOT_FOUND\"\nfi\n\n# 2. Check .env files in workspace\nfor f in .env .env.local; do\n  if [ -f \"$f\" ] && grep -q \"MESHY_API_KEY\" \"$f\" 2>/dev/null; then\n    echo \"DOTENV($f): FOUND\"\n    export $(grep \"MESHY_API_KEY\" \"$f\" | head -1)\n  fi\ndone\n\n# 3. Check shell profiles\nfor f in ~/.zshrc ~/.bashrc ~/.bash_profile ~/.profile; do\n  if [ -f \"$f\" ] && grep -q \"MESHY_API_KEY\" \"$f\" 2>/dev/null; then\n    echo \"SHELL_PROFILE: FOUND in $f\"\n  fi\ndone\n\n# 4. Final status\nif [ -n \"$MESHY_API_KEY\" ]; then\n  echo \"READY: key=${MESHY_API_KEY:0:12}...\"\nelse\n  echo \"READY: NO_KEY_FOUND\"\nfi\n\n# 5. Python requests check\npython3 -c \"import requests; print('PYTHON_REQUESTS: OK')\" 2>/dev/null || echo \"PYTHON_REQUESTS: MISSING (run: pip install requests)\"\n\necho \"=== Detection Complete ===\"\n```\n\n### Decision After Detection\n\n- **Key found** → Proceed to Step 1.\n- **Key NOT found** → Go to Step 0a.\n- **Python requests missing** → Run `pip install requests`.\n\n## Step 0a: API Key Setup (Only If No Key Found)\n\nTell the user:\n\n> To use the Meshy API, you need an API key. Here's how to get one:\n>\n> 1. Go to **https://www.meshy.ai/settings/api**\n> 2. Click **\"Create API Key\"**, give it a name, and copy the key (it starts with `msy_`)\n> 3. The key is only shown once — save it somewhere safe\n>\n> **Note:** API access requires a **Pro plan or above**. Free-tier accounts cannot create API keys. If you see \"Please upgrade to a premium plan to create API tasks\", you'll need to upgrade at https://www.meshy.ai/pricing first.\n\nOnce the user provides their key, set it and verify:\n\n**macOS (zsh):**\n```bash\nexport MESHY_API_KEY=\"msy_PASTE_KEY_HERE\"\n\n# Verify\nSTATUS=$(curl -s -o /dev/null -w \"%{http_code}\" \\\n  -H \"Authorization: Bearer $MESHY_API_KEY\" \\\n  https://api.meshy.ai/openapi/v1/balance)\n\nif [ \"$STATUS\" = \"200\" ]; then\n  BALANCE=$(curl -s -H \"Authorization: Bearer $MESHY_API_KEY\" https://api.meshy.ai/openapi/v1/balance)\n  echo \"Key valid. $BALANCE\"\n  echo 'export MESHY_API_KEY=\"msy_PASTE_KEY_HERE\"' >> ~/.zshrc\n  echo \"Persisted to ~/.zshrc\"\nelse\n  echo \"Key invalid (HTTP $STATUS). Check the key and try again.\"\nfi\n```\n\n**Linux (bash):**\n```bash\nexport MESHY_API_KEY=\"msy_PASTE_KEY_HERE\"\n\n# Verify (same as above), then persist to ~/.bashrc\nSTATUS=$(curl -s -o /dev/null -w \"%{http_code}\" \\\n  -H \"Authorization: Bearer $MESHY_API_KEY\" \\\n  https://api.meshy.ai/openapi/v1/balance)\n\nif [ \"$STATUS\" = \"200\" ]; then\n  BALANCE=$(curl -s -H \"Authorization: Bearer $MESHY_API_KEY\" https://api.meshy.ai/openapi/v1/balance)\n  echo \"Key valid. $BALANCE\"\n  echo 'export MESHY_API_KEY=\"msy_PASTE_KEY_HERE\"' >> ~/.bashrc\n  echo \"Persisted to ~/.bashrc\"\nelse\n  echo \"Key invalid (HTTP $STATUS). Check the key and try again.\"\nfi\n```\n\n**Windows (PowerShell):**\n```powershell\n$env:MESHY_API_KEY = \"msy_PASTE_KEY_HERE\"\n\n# Verify\n$status = (Invoke-WebRequest -Uri \"https://api.meshy.ai/openapi/v1/balance\" -Headers @{Authorization=\"Bearer $env:MESHY_API_KEY\"} -UseBasicParsing).StatusCode\nif ($status -eq 200) {\n    Write-Host \"Key valid.\"\n    # Persist permanently\n    [System.Environment]::SetEnvironmentVariable(\"MESHY_API_KEY\", $env:MESHY_API_KEY, \"User\")\n    Write-Host \"Persisted to user environment variables. Restart terminal to take effect.\"\n} else {\n    Write-Host \"Key invalid (HTTP $status). Check the key and try again.\"\n}\n```\n\n**Alternative (all platforms):** Create a `.env` file in your project root:\n```\nMESHY_API_KEY=msy_PASTE_KEY_HERE\n```\n\n---\n\n## Step 1: Confirm Plan With User Before Spending Credits\n\n**CRITICAL**: Before creating any task, present the user with a summary and get confirmation:\n\n```\nI'll generate a 3D model of \"<prompt>\" using the following plan:\n\n  1. Preview (mesh generation) — 5-20 credits (meshy-6/lowpoly: 20, others: 5)\n  2. Refine (texturing with PBR) — 10 credits\n  3. Download as .glb\n\n  Total cost: 30 credits\n  Current balance: <N> credits\n\n  Shall I proceed?\n```\n\nFor multi-step pipelines (e.g., text-to-3d → rig → animate), present the FULL pipeline cost upfront:\n\n| Step | API | Credits |\n|---|---|---|\n| Preview | Text to 3D | 20 |\n| Refine | Text to 3D | 10 |\n| Rig | Auto-Rigging | 5 |\n| **Total** | | **35** |\n\n> **Note:** Rigging automatically includes basic walking + running animations for free (in `result.basic_animations`). Only add `Animate` (3 credits) if the user needs a custom animation beyond walking/running.\n\nWait for user confirmation before executing.\n\n### Intent → API Mapping\n\n| User wants to... | API | Endpoint | Credits |\n|---|---|---|---|\n| 3D model from text | Text to 3D | `POST /openapi/v2/text-to-3d` | 5–20 (preview) + 10 (refine) |\n| 3D model from one image | Image to 3D | `POST /openapi/v1/image-to-3d` | 5–30 |\n| 3D model from multiple images | Multi-Image to 3D | `POST /openapi/v1/multi-image-to-3d` | 5–30 |\n| New textures on existing model | Retexture | `POST /openapi/v1/retexture` | 10 |\n| Change mesh format/topology | Remesh | `POST /openapi/v1/remesh` | 5 |\n| Add skeleton to character | Auto-Rigging | `POST /openapi/v1/rigging` | 5 (includes walking + running) |\n| Animate a rigged character (custom) | Animation | `POST /openapi/v1/animations` | 3 |\n| 2D image from text | Text to Image | `POST /openapi/v1/text-to-image` | 3–9 |\n| Transform a 2D image | Image to Image | `POST /openapi/v1/image-to-image` | 3–9 |\n| Check credit balance | Balance | `GET /openapi/v1/balance` | 0 |\n| Multi-color 3D print | Multi-Color Print | `POST /openapi/v1/print/multi-color` | 10 |\n\n---\n\n## Step 2: Execute the Workflow\n\n### CRITICAL: Async Task Model\n\nAll generation endpoints return `{\"result\": \"<task_id>\"}`, NOT the model. You MUST poll.\n\n**NEVER** read `model_urls` from the POST response.\n\n### Reusable Script Template\n\nUse this as the base for ALL generation workflows:\n\n```python\n#!/usr/bin/env python3\n\"\"\"Meshy API task runner. Handles create → poll → download.\"\"\"\nimport requests, time, os, sys\n\nAPI_KEY = os.environ.get(\"MESHY_API_KEY\", \"\")\nif not API_KEY:\n    sys.exit(\"ERROR: MESHY_API_KEY not set\")\n\nBASE = \"https://api.meshy.ai\"\nHEADERS = {\"Authorization\": f\"Bearer {API_KEY}\"}\nSESSION = requests.Session()\nSESSION.trust_env = False  # bypass any system proxy settings\n\ndef create_task(endpoint, payload):\n    resp = SESSION.post(f\"{BASE}{endpoint}\", headers=HEADERS, json=payload, timeout=30)\n    if resp.status_code == 401:\n        sys.exit(\"ERROR: Invalid API key (401)\")\n    if resp.status_code == 402:\n        try:\n            bal = SESSION.get(f\"{BASE}/openapi/v1/balance\", headers=HEADERS, timeout=10)\n            balance = bal.json().get(\"balance\", \"unknown\")\n            sys.exit(f\"ERROR: Insufficient credits (402). Current balance: {balance}. Top up at https://www.meshy.ai/pricing\")\n        except Exception:\n            sys.exit(\"ERROR: Insufficient credits (402). Check balance at https://www.meshy.ai/pricing\")\n    if resp.status_code == 429:\n        sys.exit(\"ERROR: Rate limited (429). Wait and retry.\")\n    resp.raise_for_status()\n    task_id = resp.json()[\"result\"]\n    print(f\"TASK_CREATED: {task_id}\")\n    return task_id\n\ndef poll_task(endpoint, task_id, timeout=300):\n    \"\"\"Poll task with exponential backoff (5s→30s, fixed 15s at 95%+).\"\"\"\n    elapsed = 0\n    delay = 5            # Initial delay: 5s\n    max_delay = 30       # Cap: 30s\n    backoff = 1.5        # Backoff multiplier\n    finalize_delay = 15  # Fixed delay during finalization (95%+)\n    poll_count = 0\n    while elapsed < timeout:\n        poll_count += 1\n        resp = SESSION.get(f\"{BASE}{endpoint}/{task_id}\", headers=HEADERS, timeout=30)\n        resp.raise_for_status()\n        task = resp.json()\n        status = task[\"status\"]\n        progress = task.get(\"progress\", 0)\n        filled = int(progress / 5)\n        bar = f\"[{'█' * filled}{'░' * (20 - filled)}] {progress}%\"\n        print(f\"  {bar} — {status} ({elapsed}s, poll #{poll_count})\", flush=True)\n        if status == \"SUCCEEDED\":\n            return task\n        if status in (\"FAILED\", \"CANCELED\"):\n            msg = task.get(\"task_error\", {}).get(\"message\", \"Unknown\")\n            sys.exit(f\"TASK_{status}: {msg}\")\n        current_delay = finalize_delay if progress >= 95 else delay\n        time.sleep(current_delay)\n        elapsed += current_delay\n        if progress < 95:\n            delay = min(delay * backoff, max_delay)\n    sys.exit(f\"TIMEOUT after {timeout}s ({poll_count} polls)\")\n\ndef download(url, filepath):\n    \"\"\"Download a file to the given path (within a project directory).\"\"\"\n    os.makedirs(os.path.dirname(filepath), exist_ok=True)\n    print(f\"Downloading {filepath}...\", flush=True)\n    resp = SESSION.get(url, timeout=300, stream=True)\n    resp.raise_for_status()\n    with open(filepath, \"wb\") as f:\n        for chunk in resp.iter_content(chunk_size=8192):\n            f.write(chunk)\n    size_mb = os.path.getsize(filepath) / (1024 * 1024)\n    print(f\"DOWNLOADED: {filepath} ({size_mb:.1f} MB)\")\n\n# --- File organization helpers (see File Organization section above) ---\nimport re, json\nfrom datetime import datetime\n\nOUTPUT_ROOT = os.path.join(os.getcwd(), \"meshy_output\")\nos.makedirs(OUTPUT_ROOT, exist_ok=True)\nHISTORY_FILE = os.path.join(OUTPUT_ROOT, \"history.json\")\n\ndef get_project_dir(task_id, prompt=\"\", task_type=\"model\"):\n    timestamp = datetime.now().strftime(\"%Y%m%d_%H%M%S\")\n    slug = re.sub(r'[^a-z0-9]+', '-', (prompt or task_type).lower())[:30].strip('-')\n    folder = f\"{timestamp}_{slug}_{task_id[:8]}\"\n    project_dir = os.path.join(OUTPUT_ROOT, folder)\n    os.makedirs(project_dir, exist_ok=True)\n    return project_dir\n\ndef record_task(project_dir, task_id, task_type, stage, prompt=\"\", files=None):\n    meta_path = os.path.join(project_dir, \"metadata.json\")\n    if os.path.exists(meta_path):\n        meta = json.load(open(meta_path))\n    else:\n        meta = {\"project_name\": prompt or task_type, \"folder\": os.path.basename(project_dir),\n                \"root_task_id\": task_id, \"created_at\": datetime.now().isoformat(),\n                \"updated_at\": datetime.now().isoformat(), \"tasks\": []}\n    meta[\"tasks\"].append({\"task_id\": task_id, \"task_type\": task_type, \"stage\": stage,\n                          \"files\": files or [], \"created_at\": datetime.now().isoformat()})\n    meta[\"updated_at\"] = datetime.now().isoformat()\n    json.dump(meta, open(meta_path, \"w\"), indent=2)\n    # Update global history\n    if os.path.exists(HISTORY_FILE):\n        history = json.load(open(HISTORY_FILE))\n    else:\n        history = {\"version\": 1, \"projects\": []}\n    folder = os.path.basename(project_dir)\n    entry = next((p for p in history[\"projects\"] if p[\"folder\"] == folder), None)\n    if entry:\n        entry[\"task_count\"] = len(meta[\"tasks\"])\n        entry[\"updated_at\"] = meta[\"updated_at\"]\n    else:\n        history[\"projects\"].append({\"folder\": folder, \"prompt\": prompt, \"task_type\": task_type,\n            \"root_task_id\": task_id, \"created_at\": meta[\"created_at\"],\n            \"updated_at\": meta[\"updated_at\"], \"task_count\": len(meta[\"tasks\"])})\n    json.dump(history, open(HISTORY_FILE, \"w\"), indent=2)\n\ndef save_thumbnail(project_dir, url):\n    path = os.path.join(project_dir, \"thumbnail.png\")\n    if os.path.exists(path): return\n    try:\n        r = SESSION.get(url, timeout=15); r.raise_for_status()\n        open(path, \"wb\").write(r.content)\n    except Exception: pass\n```\n\n### Text to 3D (Preview + Refine)\n\nAppend this to the template above and run as one script:\n\n```python\nPROMPT = \"USER_PROMPT\"  # max 600 chars\n\n# --- Preview ---\npreview_id = create_task(\"/openapi/v2/text-to-3d\", {\n    \"mode\": \"preview\",\n    \"prompt\": PROMPT,\n    \"ai_model\": \"latest\",\n    # \"model_type\": \"standard\",    # \"standard\" | \"lowpoly\"\n    # \"topology\": \"triangle\",      # \"triangle\" | \"quad\"\n    # \"target_polycount\": 30000,   # 100–300000\n    # \"should_remesh\": False,\n    # \"symmetry_mode\": \"auto\",     # \"auto\" | \"on\" | \"off\"\n    # \"pose_mode\": \"t-pose\",       # \"\" | \"a-pose\" | \"t-pose\" (use \"t-pose\" if rigging/animating later)\n})\n\ntask = poll_task(\"/openapi/v2/text-to-3d\", preview_id)\nproject_dir = get_project_dir(preview_id, prompt=PROMPT)\ndownload(task[\"model_urls\"][\"glb\"], os.path.join(project_dir, \"preview.glb\"))\nrecord_task(project_dir, preview_id, \"text-to-3d\", \"preview\", prompt=PROMPT, files=[\"preview.glb\"])\nif task.get(\"thumbnail_url\"):\n    save_thumbnail(project_dir, task[\"thumbnail_url\"])\n\nprint(f\"\\nPREVIEW COMPLETE\")\nprint(f\"  Task ID: {preview_id}\")\nprint(f\"  Project: {project_dir}\")\nprint(f\"  Formats: {', '.join(task['model_urls'].keys())}\")\n\n# --- Refine ---\nrefine_id = create_task(\"/openapi/v2/text-to-3d\", {\n    \"mode\": \"refine\",\n    \"preview_task_id\": preview_id,\n    \"enable_pbr\": True,\n    \"ai_model\": \"latest\",\n    # \"texture_prompt\": \"\",\n    # \"remove_lighting\": True,     # Remove baked lighting (meshy-6/latest only, default True)\n})\n\ntask = poll_task(\"/openapi/v2/text-to-3d\", refine_id)\ndownload(task[\"model_urls\"][\"glb\"], os.path.join(project_dir, \"refined.glb\"))\nrecord_task(project_dir, refine_id, \"text-to-3d\", \"refined\", prompt=PROMPT, files=[\"refined.glb\"])\n\nprint(f\"\\nREFINE COMPLETE\")\nprint(f\"  Task ID: {refine_id}\")\nprint(f\"  Project: {project_dir}\")\nprint(f\"  Formats: {', '.join(task['model_urls'].keys())}\")\n```\n\n> **Refine compatibility**: All models (meshy-5, meshy-6, latest) support both preview and refine. The preview and refine `ai_model` should match — mismatched models may return 400 (model mismatch).\n\n### Image to 3D\n\n```python\nimport base64\n\n# For local files, convert to data URI:\n# with open(\"photo.jpg\", \"rb\") as f:\n#     image_url = \"data:image/jpeg;base64,\" + base64.b64encode(f.read()).decode()\n\ntask_id = create_task(\"/openapi/v1/image-to-3d\", {\n    \"image_url\": \"IMAGE_URL_OR_DATA_URI\",\n    \"should_texture\": True,\n    \"enable_pbr\": True,            # Default is False; set True for metallic/roughness/normal maps\n    \"ai_model\": \"latest\",\n    # \"image_enhancement\": True,   # Optimize input image (meshy-6/latest only, default True)\n    # \"remove_lighting\": True,     # Remove baked lighting from texture (meshy-6/latest only, default True)\n})\n\ntask = poll_task(\"/openapi/v1/image-to-3d\", task_id)\ndownload(task[\"model_urls\"][\"glb\"], \"model.glb\")\n```\n\n### Multi-Image to 3D\n\n```python\ntask_id = create_task(\"/openapi/v1/multi-image-to-3d\", {\n    \"image_urls\": [\"URL_1\", \"URL_2\", \"URL_3\"],  # 1–4 images\n    \"should_texture\": True,\n    \"enable_pbr\": True,            # Default is False; set True for metallic/roughness/normal maps\n    \"ai_model\": \"latest\",\n    # \"image_enhancement\": True,   # Optimize input images (meshy-6/latest only, default True)\n    # \"remove_lighting\": True,     # Remove baked lighting from texture (meshy-6/latest only, default True)\n})\ntask = poll_task(\"/openapi/v1/multi-image-to-3d\", task_id)\ndownload(task[\"model_urls\"][\"glb\"], \"model.glb\")\n```\n\n### Retexture\n\n**IMPORTANT**: Before calling, ask the user to provide a texture style:\n- **Text prompt**: e.g. \"rusty metal\", \"cartoon style\" → `text_style_prompt`\n- **Reference image**: URL of style image → `image_style_url`\nOne of these is **required**. If both provided, `image_style_url` takes precedence.\n\n```python\n# REQUIRED: ask user for text_style_prompt OR image_style_url before calling\ntask_id = create_task(\"/openapi/v1/retexture\", {\n    \"input_task_id\": \"PREVIOUS_TASK_ID\",      # or \"model_url\": \"URL\"\n    \"text_style_prompt\": \"wooden texture\",     # REQUIRED if no image_style_url\n    # \"image_style_url\": \"URL\",               # REQUIRED if no text_style_prompt (takes precedence)\n    \"enable_pbr\": True,\n    # \"remove_lighting\": True,     # Remove baked lighting (meshy-6/latest only, default True)\n    # \"target_formats\": [\"glb\", \"3mf\"],  # 3mf must be explicitly requested\n    # \"auto_size\": True,           # AI auto-estimate real-world height\n})\ntask = poll_task(\"/openapi/v1/retexture\", task_id)\ndownload(task[\"model_urls\"][\"glb\"], \"retextured.glb\")\n```\n\n### Remesh / Format Conversion\n\n```python\ntask_id = create_task(\"/openapi/v1/remesh\", {\n    \"input_task_id\": \"TASK_ID\",\n    \"target_formats\": [\"glb\", \"fbx\", \"obj\"],\n    \"topology\": \"quad\",\n    \"target_polycount\": 10000,\n})\ntask = poll_task(\"/openapi/v1/remesh\", task_id)\nfor fmt, url in task[\"model_urls\"].items():\n    download(url, f\"remeshed.{fmt}\")\n```\n\n### Auto-Rigging + Animation\n\n**IMPORTANT: When the user explicitly asks to rig or animate, the generation step (text-to-3d / image-to-3d) MUST use `pose_mode: \"t-pose\"` for best rigging results.** If the model was already generated without t-pose, recommend regenerating with `pose_mode: \"t-pose\"` first.\n\n**Before rigging, verify the model's polygon count is under 300,000.** The script should auto-check and block if exceeded:\n\n```python\n# Pre-rig check: verify face count (MUST be ≤ 300,000)\nsource_endpoint = \"/openapi/v2/text-to-3d\"  # adjust to match the source task's endpoint\nsource_task_id = \"TASK_ID\"\ncheck_resp = SESSION.get(f\"{BASE}{source_endpoint}/{source_task_id}\", headers=HEADERS, timeout=30)\ncheck_resp.raise_for_status()\nsource = check_resp.json()\nface_count = source.get(\"face_count\", 0)\nif face_count > 300000:\n    print(f\"ERROR: Model has {face_count:,} faces (limit: 300,000). Remesh first:\")\n    print(f\"  create_task('/openapi/v1/remesh', {{'input_task_id': '{source_task_id}', 'target_polycount': 100000}})\")\n    sys.exit(\"Rigging blocked: face count too high\")\n```\n\n```python\n# Rig (humanoid bipedal characters only, polycount must be ≤ 300,000)\nrig_id = create_task(\"/openapi/v1/rigging\", {\n    \"input_task_id\": \"TASK_ID\",\n    \"height_meters\": 1.7,\n})\nrig_task = poll_task(\"/openapi/v1/rigging\", rig_id)\ndownload(rig_task[\"result\"][\"rigged_character_glb_url\"], \"rigged.glb\")\n\n# Rigging automatically includes basic walking + running animations — download them:\ndownload(rig_task[\"result\"][\"basic_animations\"][\"walking_glb_url\"], \"walking.glb\")\ndownload(rig_task[\"result\"][\"basic_animations\"][\"running_glb_url\"], \"running.glb\")\n\n# Only call meshy_animate if you need a CUSTOM animation beyond walking/running:\n# anim_id = create_task(\"/openapi/v1/animations\", {\n#     \"rig_task_id\": rig_id,\n#     \"action_id\": 1,  # from Animation Library\n# })\n# anim_task = poll_task(\"/openapi/v1/animations\", anim_id)\n# download(anim_task[\"result\"][\"animation_glb_url\"], \"animated.glb\")\n```\n\n### Text to Image / Image to Image\n\n```python\n# Text to Image\ntask_id = create_task(\"/openapi/v1/text-to-image\", {\n    \"ai_model\": \"nano-banana-pro\",\n    \"prompt\": \"a futuristic spaceship\",\n})\ntask = poll_task(\"/openapi/v1/text-to-image\", task_id)\n# Result: task[\"image_url\"]\n\n# Image to Image\ntask_id = create_task(\"/openapi/v1/image-to-image\", {\n    \"ai_model\": \"nano-banana-pro\",\n    \"prompt\": \"make it look cyberpunk\",\n    \"reference_image_urls\": [\"URL\"],\n})\ntask = poll_task(\"/openapi/v1/image-to-image\", task_id)\n```\n\n---\n\n## Step 3: Report Results\n\nAfter task succeeds, report:\n\n1. **Downloaded file paths** and sizes\n2. **Task IDs** (for follow-up operations like refine, rig, retexture)\n3. **Available formats** (list `model_urls` keys — may include glb, fbx, obj, usdz, 3mf)\n4. **Thumbnail URL** if present\n5. **Credits consumed** and remaining balance (run balance check)\n6. **Suggested next steps**:\n   - Preview done → \"Want to refine (add textures)?\"\n   - Model done → \"Want to rig this character for animation?\"\n   - Rigged → \"Want to apply an animation?\"\n   - Any model → \"Want to remesh / export to another format?\"\n   - Any textured model → \"Want to 3D print this? Multicolor printing is available!\" (requires `meshy-3d-printing` skill)\n   - Any model → \"Want to 3D print this model?\" (requires `meshy-3d-printing` skill)\n\n---\n\n## Error Recovery\n\n| HTTP Status | Meaning | Action |\n|---|---|---|\n| 401 | Invalid API key | Re-run Step 0; ask user to check key |\n| 402 | Insufficient credits | Auto-query balance (`GET /openapi/v1/balance`), show current balance, link https://www.meshy.ai/pricing |\n| 422 | Cannot process | Explain limitation (e.g., non-humanoid for rigging) |\n| 429 | Rate limited | Auto-retry after 5s (max 3 times) |\n| 5xx | Server error | Auto-retry after 10s (once) |\n\nTask `FAILED` messages:\n- `\"The server is busy...\"` → retry with backoff (5s, 10s, 20s)\n- `\"Internal server error.\"` → simplify prompt, retry once\n\n---\n\n## Known Behaviors & Constraints\n\n- **99% progress stall**: Tasks commonly sit at 99% for 30–120s during finalization. This is normal. Do NOT kill or restart.\n- **CORS**: API blocks browser requests. Always server-side.\n- **Asset retention**: Files deleted after **3 days** (non-Enterprise). Download immediately.\n- **PBR maps**: Must set `enable_pbr: true` explicitly.\n- **Format availability**: Check keys in `model_urls` before downloading — not all formats are always present. 3MF is available from the Multi-Color Print API.\n- **Download format**: ALWAYS ask the user which format they need before downloading. Recommend: GLB (viewing), OBJ (white model printing), 3MF (multicolor printing), FBX (game engines), USDZ (AR). Do NOT download all formats.\n- **3MF format**: 3MF is NOT included in default output of generation endpoints. To get 3MF from generate/remesh/retexture, pass `\"3mf\"` in `target_formats`. For multicolor 3D printing, the Multi-Color Print API outputs 3MF directly — no need to request it from generate/refine.\n- **Timestamps**: All API timestamps are Unix epoch **milliseconds**.\n- **Large files**: Refined models can be 50–200 MB. Use streaming downloads with timeouts.\n\n---\n\n## Execution Checklist\n\n- [ ] Ran environment detection (Step 0)\n- [ ] API key present and verified\n- [ ] Presented cost summary and got user confirmation\n- [ ] Wrote complete workflow as single Python script\n- [ ] Ran script with `python3 -u` for unbuffered output\n- [ ] Reported file paths, formats, task IDs, and balance\n- [ ] Suggested next steps\n\n## Additional Resources\n\nFor the complete API endpoint reference including all parameters, response schemas, deprecated fields, and detailed error codes, read [reference.md](reference.md).","tags":["meshy","generation","agent","meshy-dev","3d-generation","agent-skills","claude-code-skills","claude-skills","cursor-skills","image-to-3d","skill-md","text-to-3d"],"capabilities":["skill","source-meshy-dev","skill-meshy-3d-generation","topic-3d-generation","topic-agent-skills","topic-claude-code-skills","topic-claude-skills","topic-cursor-skills","topic-image-to-3d","topic-meshy","topic-skill-md","topic-text-to-3d"],"categories":["meshy-3d-agent"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/meshy-dev/meshy-3d-agent/meshy-3d-generation","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add meshy-dev/meshy-3d-agent","source_repo":"https://github.com/meshy-dev/meshy-3d-agent","install_from":"skills.sh"}},"qualityScore":"0.455","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 10 github stars · SKILL.md body (25,467 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-24T07:03:26.263Z","embedding":null,"createdAt":"2026-04-23T13:04:07.975Z","updatedAt":"2026-04-24T07:03:26.263Z","lastSeenAt":"2026-04-24T07:03:26.263Z","tsv":"'-1':625 '-20':1138 '-5':2312 '-6':1141,2249,2314,2399,2413,2476,2490,2613 '/.bash_profile':637 '/.bashrc':636,939,986,990 '/.profile':638 '/.zshrc':635,903,907 '/dev/null':612,650,697,861,944 '/latest':2250,2400,2414,2477,2491,2614 '/lowpoly':1142 '/openapi/v1/animations':1323,2946,2962 '/openapi/v1/balance':1023,1352,1492,3186 '/openapi/v1/balance)':873,889,956,972 '/openapi/v1/image-to-3d':1270,2367,2421 '/openapi/v1/image-to-image':1344,3015,3034 '/openapi/v1/multi-image-to-3d':1284,2440,2498 '/openapi/v1/print/multi-color':1364 '/openapi/v1/remesh':1301,2658,2677,2844 '/openapi/v1/retexture':1294,2569,2641 '/openapi/v1/rigging':1311,2876,2889 '/openapi/v1/text-to-image':1333,2987,3001 '/openapi/v2/text-to-3d':1255,2099,2151,2226,2257,2784 '/pricing':833,1516,1529,3193 '/settings/api**':766 '/usr/bin/env':1407 '0':541,581,675,1353,1578,1603,1632,2822,3172,3425 '000':2759,2781,2837,2871 '0a':724,733 '1':452,563,717,761,1100,1133,1609,1966,2444,2449,2954,3045 '1.5':1590 '1.7':2884 '10':1151,1197,1259,1295,1365,1496 '100':2119 '10000':2673 '100000':2853 '1024':1766,1767 '10s':3223,3236 '12':676 '120s':533,3258 '15':1595,2059 '15s':1574 '1f':1774 '2':590,611,649,696,767,1146,1367,1950,2038,2446,3051 '20':1143,1192,1257,1640 '200':876,959,1036,3412 '20s':3237 '2d':1325,1338 '3':628,784,1153,1221,1324,1334,1345,2448,3038,3063,3214,3283 '30':532,1159,1272,1286,1472,1586,1620,1840,2811,3257 '300':1565,1740,2758,2780,2836,2870 '30000':2118 '300000':2120,2826 '30s':1572,1588 '35':1204 '3d':3,6,40,45,52,63,100,105,114,118,137,1126,1176,1191,1196,1247,1253,1261,1268,1273,1282,1357,2073,2181,2278,2338,2434,2713,2717,3131,3141,3148,3155,3379 '3mf':127,163,2621,2622,3076,3313,3342,3355,3357,3369,3373,3388 '4':660,2450,3077 '400':2333 '401':1476,1482,3164 '402':1486,1507,1523,3178 '422':3194 '429':1533,1538,3205 '5':453,684,1137,1145,1202,1256,1271,1285,1302,1312,1580,1636,3082 '50':3411 '5s':1571,1583,3212,3235 '5xx':3216 '6':3091 '600':2092 '8':582,1848 '8192':1759 '9':1335,1346,1834 '95':1576,1600,1682,1693 '99':530,3248,3255 'a-pos':2135 'a-z0':1831 'access':797 'account':807 'action':2952,3163 'activ':258 'add':1219,1303,3100 'addit':3464 'adjust':2785 'ai':18,59,2104,2237,2325,2389,2466,2630,2988,3016 'alongsid':377 'alreadi':2733 'altern':427,1081 'alway':544,3274,3311,3325 'anim':13,1178,1212,1217,1220,1229,1316,1321,2696,2706,2907,2915,2925,2933,2939,2942,2956,2958,2963,2966,2969,3110,3116 'anima':50 'animated.glb':2972 'anoth':3124 'api':19,21,60,73,491,549,560,571,579,608,621,646,666,673,734,749,753,770,796,810,823,850,869,885,897,926,952,968,980,1009,1029,1047,1051,1093,1186,1239,1244,1410,1422,1426,1430,1435,1445,1480,3166,3270,3322,3386,3399,3426,3469 'api.meshy.ai':872,888,955,971,1022,1440 'api.meshy.ai/openapi/v1/balance':1021 'api.meshy.ai/openapi/v1/balance)':871,887,954,970 'append':1920,2002,2076 'appli':3114 'ar':3349 'ask':37,2511,2553,2702,3173,3326 'asset':64,3278 'async':1372 'author':866,882,949,965,1025,1442 'auto':374,1200,1308,2126,2127,2627,2632,2694,2764,3182,3209,3220 'auto-check':2763 'auto-download':373 'auto-estim':2631 'auto-queri':3181 'auto-retri':3208,3219 'auto-rig':1199,1307,2693 'automat':1207,2902 'avail':3064,3137,3299,3315 'backoff':1570,1589,1591,1697,3234 'bake':2246,2408,2485,2610 'bal':1488 'bal.json':1498 'balanc':878,893,961,976,1162,1349,1350,1497,1500,1509,1510,1525,3087,3089,3184,3189,3460 'bambu':122 'banana':2992,3020 'bar':1637,1645 'base':1401,1439,1465,1491,1613,2802 'base64':2341,2359 'base64.b64encode':2360 'bash':480,557,847,922,923 'basic':1209,2904,2914,2924 'bat':438 'bearer':867,883,950,966,1026,1444 'begin':313 'behavior':3246 'best':2726 'beyond':1230,2940 'biped':2864 'block':2767,2856,3271 'browser':3272 'busi':3231 'bypass':1452 'c':689 'call':32,481,550,2510,2564,2931 'cancel':1663 'cannot':808,3195 'cap':1587 'cartoon':2524 'cat':439 'chain':81,354 'chang':1296 'char':2093 'charact':11,1306,1319,2865,2897,3108 'check':564,591,629,687,914,997,1075,1347,1524,2765,2774,2798,3090,3176,3300 'check_resp.json':2816 'check_resp.raise':2812 'checklist':3420 'chunk':1753,1757,1761 'cli':417 'click':768 'code':95,864,947,1475,1485,1532,3482 'color':1356,1361,3320,3384 'come':207 'command':396,405,487 'common':3252 'communic':55 'compat':2308 'complet':69,462,708,2201,2287,3439,3468 'confirm':1101,1121,1235,3437 'constraint':3247 'consum':3084 'content':1756 'context':500 'control':237 'convers':169,2652 'convert':42,2345 'coordin':168 'copi':777 'cor':3269 'correct':154 'cost':1158,1183,3432 'count':1602,1608,1651,1707,1989,2027,2755,2777,2818,2821,2825,2833,2858 'creat':39,180,466,769,809,822,1084,1110,1414,1458,1552,1909,1934,2016,2019,2097,2224,2365,2438,2567,2656,2842,2874,2944,2985,3013 'creation':77 'credit':1107,1139,1152,1160,1163,1187,1222,1246,1348,1506,1522,3083,3180 'critic':1108,1371 'cura':125 'curl':858,879,941,962 'current':276,330,565,1161,1508,1676,1686,1689,3188 'custom':1228,1320,2938 'cyberpunk':3026 'd':1824 'data':2347,2357,2373 'datetim':1788,1790 'datetime.now':1820,1911,1915,1936,1941 'day':3284 'decis':709 'decod':2362 'def':1457,1558,1709,1809,1864,2039 'default':2252,2381,2402,2416,2458,2479,2493,2616,3362 'delay':1579,1582,1585,1594,1597,1677,1679,1684,1687,1690,1694,1696,1699 'delet':3281 'deprec':3477 'detail':3480 'detect':23,75,167,543,551,562,707,711,3423 'dir':363,387,1812,1850,1857,1863,1868,1881,1903,1971,2043,2048,2155,2158,2170,2175,2194,2212,2267,2272,2298 'direct':30,54,3389 'directori':278,327,332,1723 'done':627,659,3096,3103 'dotenv':615 'download':79,184,318,375,468,1154,1416,1710,1713,1732,1770,2163,2260,2424,2501,2644,2688,2892,2908,2910,2920,2965,3046,3288,3306,3323,3334,3352,3416 'e.g':159,242,1172,2521,3199 'echo':558,574,584,614,652,669,678,698,706,890,894,904,909,973,977,987,992 'effect':1066 'elaps':1577,1605,1647,1688 'els':583,677,908,991,1067,1683,1892,1963,1999 'enabl':2234,2378,2455,2603,3294 'endpoint':88,1245,1377,1460,1466,1561,1614,2783,2792,2804,3366,3470 'engin':3347 'enhanc':2393,2470 'enterpris':3287 'entir':146,465 'entri':1972,1986,1987,1993 'env':566,575,585,592,599,1007,1027,1049,1086,1450 'env.local':600 'environ':71,542,554,1060,3422 'epoch':3403 'eq':1035 'error':94,1433,1478,1504,1520,1535,1667,2829,3158,3218,3240,3481 'estim':2633 'exa':440 'exceed':2769 'except':1517,1518,2068,2069 'execut':475,1237,1368,3419 'exist':1290,1727,1800,1858 'explain':3197 'explicit':2625,2701,3297 'exponenti':1569 'export':618,848,895,924,978,3122 'eza':441 'f':597,603,604,610,616,623,633,641,642,648,657,1443,1464,1490,1503,1550,1612,1638,1644,1672,1701,1731,1751,1769,1843,2199,2203,2209,2214,2285,2289,2295,2300,2354,2690,2801,2828,2841 'f.read':2361 'f.write':1760 'face':2776,2817,2820,2824,2832,2834,2857 'fail':1662,3226 'failur':539 'fals':1451,2123,2383,2460 'fbx':2667,3073,3345 'fd':411,436 'fi':589,626,658,683,920,1003 'field':3478 'figurin':128 'file':267,291,315,319,336,593,1087,1715,1776,1780,1804,1875,1931,1932,1957,1962,2035,2185,2282,2344,3047,3280,3406,3454 'filepath':1712,1726,1733,1748,1765,1771 'fill':1633,1639,1641 'final':536,661,1593,1599,1678,3260 'find':437 'first':249,257,546,834,2747,2839 'first-us':248 'fix':1573,1596 'flow':469 'flush':1652,1734 'fmt':2681,2692 'folder':284,343,1842,1854,1900,1968,1982,1983,2003,2004 'follow':1131,3056 'follow-up':3055 'format':161,201,244,2215,2301,2619,2651,2665,3065,3125,3298,3309,3324,3330,3354,3356,3376,3456 'format/topology':1298 'found':577,588,617,655,682,713,720,741 'free':805,1214 'free-tier':804 'full':87,1181 'function':186 'futurist':2996 'game':3346 'generat':4,5,27,53,62,152,199,218,266,449,1124,1136,1376,1404,2708,2734,3365 'generate/refine':3396 'generate/remesh/retexture':3371 'get':281,340,385,759,1120,1351,1499,1668,1810,2156,3185,3368 'give':772 'given':1718 'glb':1156,2167,2264,2428,2505,2620,2648,2666,2898,2917,2927,2970,3072,3336 'global':371,1952 'go':321,721,762 'got':3435 'grep':435,605,619,643 'h':865,881,948,964,1825 'hand':226 'handl':20,67,151,1413 'head':624 'header':1024,1441,1467,1468,1493,1494,1617,1618,2808,2809 'height':2637,2882 'helper':393,1778 'hhmmss':286,347 'high':2860 'histori':296,1803,1953,1956,1958,1961,1964,1978,2000,2032,2034 'history.json':372,1808 'host':1039,1056,1070 'http':31,863,912,946,995,1073,3160 'humanoid':2863,3202 'id':288,351,494,1546,1554,1557,1563,1616,1814,1847,1870,1906,1908,1922,1924,2013,2015,2096,2153,2160,2177,2205,2207,2223,2231,2233,2259,2274,2291,2293,2364,2423,2437,2500,2566,2572,2575,2643,2655,2661,2663,2679,2795,2797,2807,2847,2850,2873,2879,2881,2891,2943,2949,2951,2953,2964,2984,3003,3012,3036,3053,3458 'imag':9,1265,1266,1277,1280,1326,1331,1339,1340,1342,2336,2355,2368,2370,2392,2397,2432,2441,2451,2469,2474,2530,2534,2535,2546,2560,2588,2591,2715,2975,2976,2978,2982,3006,3008,3010,3028 'image-to-3d':2714 'image/jpeg':2358 'immedi':3289 'import':99,247,314,394,443,690,1417,1784,1789,2340,2508,2697 'includ':384,1208,1313,2903,3071,3360,3472 'indent':1949,2037 'inform':262 'initi':1581 'input':2396,2473,2570,2659,2845,2877 'instal':423,704,730 'instead':140,428,433 'insuffici':1505,1521,3179 'int':1634 'intent':1238 'intern':3238 'interrupt':523 'invalid':911,994,1072,1479,3165 'invok':1018 'invoke-webrequest':1017 'involv':113,215 'isoformat':1912,1916,1937,1942 'item':2687 'join':2216,2302 'json':1469,1786 'json.dump':1943,2031 'json.load':1888,1959 'keep':489 'key':22,74,492,561,572,580,609,622,647,667,671,674,681,712,718,735,740,754,771,779,786,811,840,851,854,870,886,891,898,901,910,916,927,930,953,969,974,981,984,993,999,1010,1013,1030,1040,1048,1052,1071,1077,1094,1097,1423,1427,1431,1436,1446,1481,2220,2306,3069,3167,3177,3301,3427 'keyword':116 'kill':525,3266 'known':3245 'larg':3405 'later':2147 'latest':2106,2239,2315,2391,2468 'launch':172 'len':1990,2028 'librari':2957 'lifecycl':70 'light':2243,2247,2405,2409,2482,2486,2607,2611 'like':3059 'limit':1537,2835,3198,3207 'link':3190 'linux':921 'list':3066 'll':826,1123 'local':2343 'long':445,518 'long-run':517 'look':3025 'lower':1839 'lowpoli':2111 'ls':442 'm':1823,1826 'maco':845 'make':3023 'map':1240,2388,2465,3291 'match':2328,2787 'max':1584,1698,2091,3213 'may':420,2331,3070 'mb':1763,1773,1775,3413 'mean':3162 'mesh':1135,1297 'meshi':2,17,51,58,104,136,272,300,325,344,448,559,570,578,607,620,645,665,672,748,849,868,884,896,925,951,967,979,1008,1028,1046,1050,1092,1140,1409,1425,1434,1795,2248,2311,2313,2398,2412,2475,2489,2612,2932,3140,3154 'meshy-3d-generation':1 'meshy-3d-printing':103,135,3139,3153 'messag':1669,3227 'meta':1877,1885,1887,1890,1893,1918,1938,1944,1946,1991,1996,2018,2023,2029 'metadata':295 'metadata.json':367,1882 'metal':2523 'metallic/roughness/normal':2387,2464 'meter':2883 'millisecond':3404 'min':1695 'miniatur':129 'minut':454 'mismatch':2329,2335 'miss':701,727 'mode':2100,2125,2131,2227,2721,2743 'model':7,41,47,132,220,290,378,1127,1248,1262,1274,1291,1374,1382,1388,1818,2105,2107,2165,2218,2238,2262,2304,2310,2326,2330,2334,2390,2426,2467,2503,2577,2646,2685,2731,2752,2830,2989,3017,3067,3102,3118,3128,3145,3151,3303,3340,3408 'model.glb':2429,2506 'msg':1664,1675 'msi':783,852,899,928,982,1011,1095 'multi':83,1169,1279,1355,1360,2431,3319,3383 'multi-color':1354,1359,3318,3382 'multi-imag':1278,2430 'multi-step':82,1168 'multicolor':126,165,3134,3343,3378 'multipl':486,1276 'multipli':1592 'must':206,320,1384,2623,2718,2778,2868,3292 'n':569,664 'name':775,1895 'nano':2991,3019 'nano-banana-pro':2990,3018 'need':235,304,751,827,1226,2936,3332,3391 'never':1386 'new':1287 'next':1973,3093,3462 'non':415,3201,3286 'non-enterpris':3285 'non-humanoid':3200 'non-standard':414 'none':1876,1984 'normal':535,3263 'note':795,1205 'notic':252 'npreview':2200 'nrefin':2286 'o':860,943 'obj':2668,3074,3338 'ok':695,1728,1801,1859 'one':143,175,471,498,760,1264,2085,2538 'open':1747,1889,1945,1960,2033,2063,2350 'oper':3058 'optim':157,2395,2472 'orca':123 'orchestr':196 'organ':316,1777,1781 'os':1420 'os.environ.get':1424 'os.getcwd':1794 'os.makedirs':1724,1797,1855 'os.path.basename':1901,1969 'os.path.dirname':1725 'os.path.exists':1884,1955,2051 'os.path.getsize':1764 'os.path.join':1793,1805,1851,1879,2046,2168,2265 'other':1144 'output':273,326,345,508,1791,1796,1798,1806,1852,3363,3387,3452 'output/history.json':301 'p':1974,1976,1981 'paramet':91,158,238,3474 'pass':2070,3372 'past':853,900,929,983,1012,1096 'path':1719,1878,1886,1891,1947,2045,2052,2064,3048,3455 'patient':515 'payload':1461,1470 'pbr':1150,2235,2379,2456,2604,3290,3295 'per':309,368 'perman':1043 'persist':905,937,988,1042,1057 'photo.jpg':2351 'physic':131 'pip':703,729 'pipelin':85,176,1171,1182 'plan':801,820,1102,1132 'platform':1083 'pleas':815 'poll':78,182,460,467,1385,1415,1559,1566,1601,1607,1649,1650,1706,1708,2149,2255,2419,2496,2639,2675,2887,2960,2999,3032 'polycount':2117,2672,2852,2867 'polygon':2754 'pose':2130,2134,2137,2140,2144,2720,2724,2738,2742,2746 'posix':401 'post':1254,1269,1283,1293,1300,1310,1322,1332,1343,1363,1392 'powershel':1005,1006 'pre':2772 'pre-rig':2771 'preced':2550,2602 'prefix':352 'prematur':527 'premium':819 'present':1113,1179,3081,3312,3428,3431 'preview':356,1134,1188,1258,2074,2094,2095,2101,2152,2159,2176,2182,2206,2229,2232,2318,2322,3095 'preview.glb':2171,2186 'previous':2573 'print':101,106,115,117,119,138,149,156,191,210,213,230,233,692,1358,1362,1549,1643,1730,1768,2198,2202,2208,2213,2284,2288,2294,2299,2827,2840,3132,3135,3142,3149,3156,3321,3341,3344,3380,3385 'print-optim':155 'pro':800,2993,3021 'proceed':714,1166 'process':499,3196 'profil':631,654 'progress':507,1629,1631,1635,1642,1681,1692,3249 'project':280,339,362,369,386,1090,1722,1811,1849,1856,1862,1867,1880,1894,1902,1967,1970,1979,2001,2042,2047,2154,2157,2169,2174,2193,2210,2211,2266,2271,2296,2297 'prompt':287,348,1815,1835,1874,1896,2005,2006,2088,2090,2102,2103,2161,2162,2183,2184,2241,2280,2281,2520,2528,2558,2582,2600,2994,3022,3242 'proper':447 'provid':838,2515,2545 'proxi':1455 'prusa':124 'python':457,472,685,693,699,725,1406,2087,2339,2435,2551,2653,2770,2861,2979,3443 'python3':502,688,1408,3448 'q':606,644 'quad':2115,2670 'queri':3183 'r':1830,2055 'r.content':2067 'r.raise':2060 'ran':3421,3445 'random':337 'rate':1536,3206 'rb':2352 're':1785,3169 're-run':3168 're.sub':1829 'read':96,1387,3483 'readi':556,670,679 'real':512,2635 'real-world':2634 'recommend':2739,3335 'record':388,1865,2172,2269 'recoveri':3159 'refer':89,2529,3027,3471 'reference.md':97,98,3484,3485 'refin':357,1147,1193,1260,2075,2221,2222,2228,2258,2273,2279,2292,2307,2320,2324,3060,3099,3407 'refined.glb':2268,2283 'regener':2740 'remain':3086 'remesh':1299,2122,2650,2691,2838,3121 'remov':2242,2245,2404,2407,2481,2484,2606,2609 'report':3039,3044,3453 'request':112,686,691,694,700,705,726,731,1418,2626,3273,3393 'requests.session':1448 'requir':798,2542,2552,2585,2595,3138,3152 'resourc':3465 'resp':1462,1610,1736,2799 'resp.iter':1755 'resp.json':1547,1625 'resp.raise':1542,1621,1743 'resp.status':1474,1484,1531 'respons':92,1393,3475 'restart':1062,3268 'result':1379,1548,2728,2895,2913,2923,2968,3004,3040 'result.basic':1216 'retent':3279 'retextur':1292,2507,3062 'retextured.glb':2649 'retri':1541,3210,3221,3232,3243 'return':1378,1555,1657,1861,2053,2332 'reus':188,359 'reusabl':380,1394 'rg':409,434 'rig':10,48,358,1177,1198,1201,1206,1309,1318,2695,2704,2727,2749,2773,2855,2862,2872,2885,2890,2893,2896,2901,2911,2921,2947,2950,3061,3106,3111,3204 'rigged.glb':2900 'rigging/animating':2146 'ripgrep':410 'root':1091,1792,1799,1807,1853,1904,2011 'rule':397 'run':444,456,519,545,702,728,1211,1315,2083,2906,2926,3088,3170 'runner':1412 'running.glb':2929 'rusti':2522 'safe':794 'said':307 'save':270,391,791,2040,2191 'scatter':335 'schema':93,3476 'script':381,458,473,520,1395,2086,2761,3444,3446 'script.py':504 'section':1782 'see':814,1779 'server':3217,3229,3239,3276 'server-sid':3275 'session':251,261,310,496,1447 'session.get':1489,1611,1737,2056,2800 'session.post':1463 'session.trust':1449 'set':841,1438,1456,2384,2461,3293 'setenvironmentvari':1045 'setup':24,72,736 'shall':1164 'shell':395,404,630,653 'show':3187 'shown':789 'side':3277 'simplifi':3241 'singl':479,3442 'sit':3253 'size':1758,1762,1772,2628,3050 'skeleton':1304 'skill':66,107,139,150,178,192,211,223,231,234,255,3143,3157 'skill-meshy-3d-generation' 'slice':121 'slicer':120,166,171 'slug':349,1828,1845 'somewher':793 'sourc':2782,2789,2793,2803,2805,2815,2848 'source-meshy-dev' 'source.get':2819 'spaceship':2997 'spend':1106 'split':484 'stage':1873,1929,1930 'stall':3250 'standard':400,416,426,2109,2110 'start':241,781 'statu':130 'status':662,857,875,913,940,958,996,1016,1034,1074,1544,1623,1626,1628,1646,1655,1660,1674,1745,2062,2814,3161 'statuscod':1032 'step':84,540,716,723,732,1099,1170,1185,1366,2709,3037,3094,3171,3424,3463 'stream':1741,3415 'strftime':1821 'strip':1841 'structur':324 'style':2518,2525,2527,2533,2536,2547,2557,2561,2581,2589,2592,2599 'succeed':1656,3043 'suggest':3092,3461 'summari':1118,3433 'support':2316 'symmetri':2124 'sys':1421 'sys.exit':1432,1477,1502,1519,1534,1671,1700,2854 'system':1454 'system.environment':1044 't-pose':2132,2138,2142,2722,2736,2744 'take':451,1065,2549,2601 'target':160,243,2116,2618,2664,2671,2851,3375 'task':76,181,183,350,355,365,389,446,450,493,528,824,1112,1373,1411,1459,1545,1551,1553,1556,1560,1562,1567,1615,1624,1627,1658,1666,1673,1813,1816,1837,1846,1866,1869,1871,1898,1905,1907,1917,1919,1921,1923,1925,1927,1988,1992,2007,2009,2012,2014,2026,2030,2098,2148,2150,2164,2173,2195,2204,2217,2225,2230,2254,2256,2261,2270,2290,2303,2363,2366,2418,2420,2422,2425,2436,2439,2495,2497,2499,2502,2565,2568,2571,2574,2638,2640,2642,2645,2654,2657,2660,2662,2674,2676,2678,2684,2790,2794,2796,2806,2843,2846,2849,2875,2878,2880,2886,2888,2894,2912,2922,2945,2948,2959,2961,2967,2983,2986,2998,3000,3002,3005,3011,3014,3031,3033,3035,3042,3052,3225,3251,3457 'task.get':1630,1665,2188 'tell':742 'templat':185,382,1396,2080 'termin':1063 'text':1174,1189,1194,1250,1251,1328,1329,2071,2179,2276,2519,2526,2556,2580,2598,2711,2973,2980 'text-to-3d':1173,2178,2275,2710 'text/images':43 'textur':8,46,246,292,1148,1288,2240,2376,2411,2453,2488,2517,2584,3101,3127 'thumbnail':293,376,392,2041,2189,2192,2196,3078 'thumbnail.png':2049 'tier':806 'time':513,1419,3215 'time.sleep':1685 'timeout':1471,1495,1564,1606,1619,1702,1704,1739,2058,2810,3418 'timestamp':1819,1844,3397,3400 'tool':402,418 'top':1511 'topic-3d-generation' 'topic-agent-skills' 'topic-claude-code-skills' 'topic-claude-skills' 'topic-cursor-skills' 'topic-image-to-3d' 'topic-meshy' 'topic-skill-md' 'topic-text-to-3d' 'topolog':2112,2669 'total':1157,1203 'track':298,364 'transform':1336 'tri':918,1001,1079,1487,2054 'triangl':2113,2114 'true':1653,1729,1735,1742,1802,1860,2236,2244,2253,2377,2380,2385,2394,2403,2406,2417,2454,2457,2462,2471,2480,2483,2494,2605,2608,2617,2629,3296 'type':1817,1838,1872,1899,1926,1928,2008,2010,2108 'u':503,3449 'unbuff':505,3451 'unix':3402 'unknown':1501,1670 'updat':1913,1939,1951,1994,1997,2021,2024 'upfront':1184 'upgrad':816,829 'uri':1020,2348,2374 'url':1389,1711,1738,2044,2057,2166,2190,2197,2219,2263,2305,2356,2369,2371,2427,2442,2443,2445,2447,2504,2531,2537,2548,2562,2578,2579,2590,2593,2594,2647,2682,2686,2689,2899,2918,2928,2971,3007,3029,3030,3068,3079,3304 'usdz':3075,3348 'use':15,33,102,133,250,398,408,424,431,432,501,746,1129,1397,2141,2719,3414 'usebasicpars':1031 'user':36,110,264,744,837,1053,1059,1104,1115,1225,1234,1241,2089,2513,2554,2700,3174,3328,3436 'valid':892,975,1041 'var':567,576,586 'variabl':1061 'verifi':844,856,932,1015,2750,2775,3430 'version':1965 'via':29 'view':3337 'visibl':510 'w':862,945,1948,2036 'wait':1232,1539 'walk':1210,1314,2905,2916 'walking.glb':2919 'walking/running':1231,2941 'want':1242,3097,3104,3112,3119,3129,3146 'wb':1749,2065 'webrequest':1019 'whether':552 'white':3339 'window':1004 'within':1720 'without':2735 'wooden':2583 'work':277,331 'workflow':28,147,195,1370,1405,3440 'workspac':595 'world':2636 'write':463,1038,1055,1069,2066 'write-host':1037,1054,1068 'wrote':3438 'www.meshy.ai':765,832,1515,1528,3192 'www.meshy.ai/pricing':831,1514,1527,3191 'www.meshy.ai/settings/api**':764 'y':1822 'yyyymmdd':285,346 'z0':1833 'zsh':846","prices":[{"id":"3ec33bbc-6cc5-42c5-90f8-221b9d9d7d45","listingId":"b13373ce-132a-410b-ad9a-224387ad8a1c","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"meshy-dev","category":"meshy-3d-agent","install_from":"skills.sh"},"createdAt":"2026-04-23T13:04:07.975Z"}],"sources":[{"listingId":"b13373ce-132a-410b-ad9a-224387ad8a1c","source":"github","sourceId":"meshy-dev/meshy-3d-agent/meshy-3d-generation","sourceUrl":"https://github.com/meshy-dev/meshy-3d-agent/tree/main/skills/meshy-3d-generation","isPrimary":false,"firstSeenAt":"2026-04-23T13:04:07.975Z","lastSeenAt":"2026-04-24T07:03:26.263Z"}],"details":{"listingId":"b13373ce-132a-410b-ad9a-224387ad8a1c","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"meshy-dev","slug":"meshy-3d-generation","github":{"repo":"meshy-dev/meshy-3d-agent","stars":10,"topics":["3d-generation","agent-skills","ai","claude-code-skills","claude-skills","cursor-skills","image-to-3d","meshy","skill-md","text-to-3d"],"license":"mit","html_url":"https://github.com/meshy-dev/meshy-3d-agent","pushed_at":"2026-04-03T13:58:05Z","description":"AI agent skills for Meshy AI 3D generation platform","skill_md_sha":"357364de0cf57a6d5ed8708a2eb7a9768400cc0a","skill_md_path":"skills/meshy-3d-generation/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/meshy-dev/meshy-3d-agent/tree/main/skills/meshy-3d-generation"},"layout":"multi","source":"github","category":"meshy-3d-agent","frontmatter":{"name":"meshy-3d-generation","license":"MIT","description":"Generate 3D models, textures, images, rig characters, and animate them using the Meshy AI API. Handles API key detection, setup, and all generation workflows via direct HTTP calls. Use when the user asks to create 3D models, convert text/images to 3D, texture models, rig or animate characters, or interact with the Meshy API.","compatibility":"Requires Python 3 with requests package. Works with Claude Code, Cursor, and all Agent Skills compatible tools."},"skills_sh_url":"https://skills.sh/meshy-dev/meshy-3d-agent/meshy-3d-generation"},"updatedAt":"2026-04-24T07:03:26.263Z"}}