{"id":"397e58a9-671c-4f02-ab7c-c5b165593a4d","entityType":"agent","slug":"clawhub-agentpmt-blender-3d-modeling","name":"blender-3d-modeling","canonicalUrl":"https://www.xpersona.co/agent/clawhub-agentpmt-blender-3d-modeling","canonicalPath":"/agent/clawhub-agentpmt-blender-3d-modeling","generatedAt":"2026-10-12T17:59:04.537Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T21:19:26.942Z","emptyReason":null},"description":"Blender 3D Modeling: Blender 3D suite running headless in the cloud. Use when an agent needs blender 3d modeling, render turntable videos of 3d models for game asset previews, create multi angle product shots from 3d models for e commerce, convert 3d files between formats like glb to blend, glb to fbx, cancel task, task id, check printability through AgentPMT-hosted remote tool calls. Discovery terms: blender 3d modeling, render turntable videos of 3d models for game asset previews.","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 991 downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s17c4gq739k6px8k8sryevfm9h86myay:blender-3d-modeling","sourceUrl":"https://clawhub.ai/agentpmt/blender-3d-modeling","homepage":"https://clawhub.ai/agentpmt/skills/blender-3d-modeling","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/agentpmt/blender-3d-modeling","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/agentpmt/skills/blender-3d-modeling","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":60,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"blender-3d-modeling technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T21:19:26.942Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T21:19:26.942Z","emptyReason":null},"stars":null,"forks":null,"downloads":991,"likes":null,"task":null,"library":null,"packageName":null,"latestVersion":"1.0.1","tractionLabel":"991 downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T21:19:26.929Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T21:19:26.942Z","lastCrawledAt":"2026-10-11T21:19:26.929Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T21:19:26.929Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.1","createdAt":"2026-09-11T23:38:12.866Z","changelog":"Publish blender-3d-modeling v1.0.1","fileCount":4,"zipByteSize":24377},{"version":"1.0.0","createdAt":"2026-06-24T10:50:22.042Z","changelog":"Publish blender-3d-modeling v1.0.0","fileCount":4,"zipByteSize":17716}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17c4gq739k6px8k8sryevfm9h86myay:blender-3d-modeling","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s17c4gq739k6px8k8sryevfm9h86myay:blender-3d-modeling` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/agentpmt/blender-3d-modeling before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-agentpmt-blender-3d-modeling/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-agentpmt-blender-3d-modeling/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-agentpmt-blender-3d-modeling/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-agentpmt-blender-3d-modeling/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-agentpmt-blender-3d-modeling/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-agentpmt-blender-3d-modeling/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-12T17:59:04.533Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-agentpmt-blender-3d-modeling/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-agentpmt-blender-3d-modeling/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-agentpmt-blender-3d-modeling/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-agentpmt-blender-3d-modeling/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T21:19:26.942Z","emptyReason":null},"readme":"Skill: blender-3d-modeling\n\nOwner: agentpmt\n\nSummary: Blender 3D Modeling: Blender 3D suite running headless in the cloud. Use when an agent needs blender 3d modeling, render turntable videos of 3d models for game asset previews, create multi angle product shots from 3d models for e commerce, convert 3d files between formats like glb to blend, glb to fbx, cancel task, task id, check printability through AgentPMT-hosted remote tool calls. Discovery terms: blender 3d modeling, render turntable videos of 3d models for game asset previews.\n\nTags: agentpmt:1.0.1, cancel-task:1.0.1, check-printability:1.0.1, convert-format:1.0.1, fix-printability:1.0.1, get-task:1.0.1, latest:1.0.1, list-tasks:1.0.1, marketplace:1.0.1, render-custom:1.0.1, render-turntable:1.0.1, render-views:1.0.1\n\nVersion history:\n\nv1.0.1 | 2026-09-11T23:38:12.866Z | user\n\nPublish blender-3d-modeling v1.0.1\n\nv1.0.0 | 2026-06-24T10:50:22.042Z | user\n\nPublish blender-3d-modeling v1.0.0\n\nArchive index:\n\nArchive v1.0.1: 4 files, 24377 bytes\n\nFiles: schema.md (32526b), skill-card.md (2915b), SKILL.md (54143b), _meta.json (138b)\n\nFile v1.0.1:SKILL.md\n\n---\nname: blender-3d-modeling\ndescription: \"Blender 3D Modeling: Blender 3D suite running headless in the cloud. Use when an agent needs blender 3d modeling, render turntable videos of 3d models for game asset previews, create multi angle product shots from 3d models for e commerce, convert 3d files between formats like glb to blend, glb to fbx, cancel task, task id, check printability through AgentPMT-hosted remote tool calls. Discovery terms: blender 3d modeling, render turntable videos of 3d models for game asset previews.\"\nversion: 1.0.1\nhomepage: https://www.agentpmt.com/marketplace/blender-3d-modeling\ncompatibility: \"Agent instructions for AgentPMT-hosted remote tool calls. Follow this skill body for supported account, wallet, and setup routes. No local command runtime is declared.\"\nmetadata: {\"author\":\"agentpmt\",\"openclaw\":{\"homepage\":\"https://www.agentpmt.com/marketplace/blender-3d-modeling\"}}\n---\n# Blender 3D Modeling\n\n## Freshness\nLast updated: `2026-09-11`.\n\nIf the current date is more than 7 days after the last updated date, reinstall this skill from skills.sh or ClawHub before relying on endpoints, schemas, setup steps, or examples.\n\n## What This Tool Does\nFull access to Blender, the industry-standard open-source 3D creation suite, running headless in the cloud. Render stunning images and turntable videos from any 3D model, convert between file formats (BLEND, GLB, FBX, OBJ, STL, DAE, PLY), set up professional studio lighting, and run custom Blender Python scripts — all without installing anything locally. Upload your 3D models and get back production-quality renders, spinning animations, processed assets, and Blender project files. Choose from four lighting presets (studio, product, outdoor, dramatic), render from multiple camera angles at once, or position the camera exactly where you want it. Perfect for game development asset previews, product visualization, architectural walkthroughs, e-commerce 3D photography, 3D printing prep, portfolio showcases, and creative projects of any kind.\n\n## Product Instructions\n### Blender 3D Modeling\n\nFull access to Blender, the industry-standard 3D creation suite, running headless in the cloud. Render images and videos from 3D models, convert between file formats, and run custom Blender Python scripts.\n\n#### How It Works\n\nRender actions (`render_turntable`, `render_views`, `render_custom`, `run_script`, `check_printability`, `fix_printability`, `voxel_remesh`, `slice_for_printing`) run **asynchronously**. They return immediately with a `task_id` and `status: \"processing\"`. The render runs in the background. Use `get_task` to check progress and retrieve download links when complete.\n\n`convert_format` runs **synchronously** and returns the converted file immediately (typically under 5 seconds).\n\nThe GPU runs one render at a time. When you submit while another job is in flight, your request joins a strict-FIFO queue and `get_task` returns three additional fields so you can plan around the wait:\n\n- `queue_position` — `0` while running, otherwise the 1-based slot in line.\n- `queue_eta_seconds` — best-guess seconds until the job is dequeued.\n- `queue_stats` — `{queue_total_running, queue_total_queued, queue_total_capacity}`.\n\nA submitted task that you no longer need can be cancelled with `cancel_task`. Cancellation works whether the task is still queued or actively rendering — see the action's docs for the contract.\n\n#### Quick Start For Agents\n\nUse this decision flow when choosing an action:\n\n1. Need a spinning preview video of an existing model: call `render_turntable`.\n2. Need front/top/side/3quarter still images of an existing model: call `render_views`.\n3. Need one specific camera angle: call `render_custom`.\n4. Need to change model file format, including exporting a native `.blend` file: call `convert_format`.\n5. Need to know if a model is 3D-printable: call `check_printability`.\n6. Need a light-touch cleaned export of a *mostly-clean* model (CAD output, hand-modeled mesh with a few stray non-manifolds): call `fix_printability`.\n7. Need to repair a *structurally-broken* organic model (3D-modeled / sculpted shapes with overlapping geometry, photogrammetry exports, self-intersecting Boolean unions, inverted-normal regions, dense multi-shell tessellation): call `voxel_remesh`.\n8. Need to slice a model and get print time / filament estimates: call `slice_for_printing`.\n9. Need to create or modify geometry/materials/lighting with Blender Python, render custom media, or save several files: call `run_script`.\n10. Need the result from an async action: call `get_task` with the returned `task_id`.\n11. Need recent work history: call `list_tasks`.\n12. Need to abort a queued or running task: call `cancel_task` with the `task_id`.\n\nFor any action that accepts a model, provide exactly one model source:\n- `file_id` when the model is already in AgentPMT file storage.\n- `file_url` when the model is available at a public HTTPS URL.\n\nDo not invent file IDs. If the user only has a local path, first upload it through the platform file manager or ask the user to provide an accessible file URL.\n\n#### Async Task Pattern\n\n`render_turntable`, `render_views`, `render_custom`, `run_script`, `check_printability`, `fix_printability`, `voxel_remesh`, and `slice_for_printing` return a task immediately. Always follow this pattern:\n\n1. Call the async action.\n2. Save the returned `task_id`.\n3. Poll `get_task` until `status` is `completed` or `failed`.\n4. When completed, read the returned `outputs` array and give the user the `signed_url`, `file_id`, `filename`, and `size_bytes`.\n5. If still processing, wait and poll again. Do not assume failure just because the first response has no file links.\n\n`convert_format` is the exception: it returns the converted file directly in the first response. If the queue is full it returns HTTP 429 with `error_code: \"GPU_RENDER_QUEUE_FULL\"` and a `Retry-After` hint; back off and retry.\n\nYou may abort a task you submitted with `cancel_task` (queued or running). The task transitions to `status: \"failed\"` with `error_code: \"GPU_RENDER_TASK_CANCELED\"` once the SIGTERM grace window closes (≤30 seconds for a running render, immediate for a queued one).\n\n#### Queue and Capacity\n\n- The GPU serves one render at a time. Submissions queue strictly in arrival order — there is **no per-budget reordering** or fair-share. Visibility (`queue_position`, `queue_eta_seconds`) is the fairness mechanism.\n- Maximum queue depth is **50**. A submission past that limit returns HTTP 429 with body `{\"success\": false, \"output\": {\"error\": \"...\", \"error_code\": \"GPU_RENDER_QUEUE_FULL\"}}` and a `Retry-After` header. Wait the suggested interval and retry.\n- Container restarts: if a job was processing when the container restarted, `get_task` returns `status: \"failed\"` with `error_code: \"GPU_RENDER_CONTAINER_RESTARTED\"`. Resubmit the request.\n\n#### Memory Limits\n\nEach render runs under a kernel-enforced memory cap and an additional container-level backstop:\n\n- Per-subprocess: **12 GiB**. A render that allocates beyond this fails fast with `error_code: \"BLENDER_SUBPROCESS_MEMORY_LIMIT\"`.\n- Per-container: **14 GiB hard cap** (catastrophic backstop only — the per-subprocess cap fires first).\n- `voxel_remesh` rejects requests whose grid cell count exceeds **5,000,000** with `error_code: \"BLENDER_VOXEL_GRID_TOO_LARGE\"`. The error message includes the minimum-safe `voxel_size`. For a 150 mm bbox the minimum-safe value is ≈ 0.31 mm; smaller voxels make the grid blow up cubically.\n- `run_script` rejects payloads larger than **64 KiB** with `error_code: \"BLENDER_RUN_SCRIPT_TOO_LARGE\"`. Reach for `convert_format` or `render_views` if the script is just orchestrating a few API calls.\n\n#### Input And Output Rules\n\nSupported model inputs for standard render/convert actions are BLEND, GLB, GLTF, FBX, OBJ, STL, DAE, and PLY.\n\nSupported `convert_format` outputs are `blend`, `glb`, `fbx`, `obj`, `stl`, `dae`, and `ply`.\n\n`fix_printability` re-exports the cleaned mesh and supports a smaller subset (`stl`, `glb`, `obj`, `ply`) — formats designed for 3D-printing pipelines.\n\n`slice_for_printing` accepts the same model inputs as the renderers and returns a `.gcode` file plus a Blender-rendered \"model on the printbed\" preview PNG with the print-time and filament numbers overlaid.\n\nEvery model-taking action accepts `source_units` (see \"Units\") to declare the unit basis of the input file when it cannot be inferred.\n\nFor `run_script`, any files saved directly inside `OUTPUT_DIR` are uploaded automatically. Use `output_type` to tell the tool what files to return:\n- `image` returns image outputs such as `.png`, `.jpg`, `.jpeg`, and `.webp`.\n- `video` returns video outputs such as `.mp4`, `.mov`, and `.webm`.\n- `model` returns model outputs such as `.blend`, `.glb`, `.gltf`, `.fbx`, `.obj`, `.stl`, `.dae`, `.ply`, and `.usdz`.\n- `all` returns every regular file written to `OUTPUT_DIR`.\n\nIf `output_type` does not match the files your script writes, the task can complete with skipped files. For example, set `output_type: \"model\"` when saving a `.blend` file and `output_type: \"video\"` when writing an `.mp4`.\n\nBlender project files are returned as generic binary downloads for broad client compatibility. They still use the `.blend` filename extension.\n\n#### Render Quality And Framing\n\nThe standard render actions automatically center and scale models for consistent framing. Leave `camera_distance` unset unless the user explicitly asks for a manual distance.\n\nUse these defaults for reliable results:\n- Product-style previews: `lighting_preset: \"product\"`, `background_color: \"ffffff\"`, `fit_margin: 1.35` to `1.6`, `camera_lens_mm: 28` to `35`.\n- General studio previews: `lighting_preset: \"studio\"`, default background, default framing.\n- Fast draft previews: out-of-the-box defaults are tuned for this — `resolution: \"720p\"`, `samples: 8`, with 12-24 turntable frames for a quick spin.\n- Higher quality stills: opt in with `resolution: \"1080p\"` or `2k` and `samples: 32` to `128`. Hero marketing renders may use `samples: 128+`.\n\nFor turntables, slower and smoother videos use more frames and longer duration. A useful default is 24 frames over 6 seconds for a quick review, or 72-96 frames over 6-8 seconds for smoother presentation.\n\nThe service renders with Cycles on an NVIDIA L4 GPU in production (Cloud Run); local dev falls back to CPU when no GPU is attached. Very large `samples` × `resolution` × `frames` combinations will still hit the per-action timeout cap even on GPU; choose the fast defaults for previews and only opt in to higher quality when the output justifies the wait. For very heavy STL imports, `decimate_ratio` lowers polygon count before rendering and is the right control to reach for instead of dropping resolution.\n\n#### Units\n\nEvery action that takes a model normalizes it to real-world size before doing anything else, using one rule set:\n\n- `source_units` (optional on every model-taking action): `auto` (default), `mm`, `cm`, `m`, `in`, or `native`.\n- `auto` means: an STL whose header declares a unit (Onshape writes `Units = meters`) is read in that unit; otherwise STL / OBJ / PLY are read as **millimetres** (the 3D-printing convention PrusaSlicer also assumes) and glTF / GLB / FBX / DAE / BLEND are read as their own native units.\n- Set `source_units` explicitly when a mesh was written in another unit without saying so (for example `source_units: \"m\"` for a metre-valued STL with a blank header).\n- All reported sizes are real-world: `model_stats.bounding_box_mm`, `volume_mm3`, `voxel_size`, `bbox_before`, `metadata.max_layer_z_mm` are millimetres regardless of what the file declared.\n- STL / OBJ / PLY outputs from `fix_printability`, `voxel_remesh` and `convert_format` are always written in millimetres, so they round-trip through `check_printability` and `slice_for_printing` at the same size. glTF / GLB / FBX / DAE / BLEND are written native.\n- Responses include a `units` block (`source_units_requested`, `source_units_resolved`, `import_scale_to_meters`, `stl_header_units`, plus `export_units` / `slicer_scale` where relevant) so you can confirm the basis that was applied.\n\n#### Printability QA\n\n`check_printability` and `fix_printability` use Blender's `object_print3d_utils` addon to surface the geometric problems an FFF/FDM printer slicer cannot recover from. The model is normalized to real-world units first (see \"Units\"), so `thickness_min_mm` and the degenerate-face threshold (`0.01 mm²`, faces smaller than a 0.4 mm nozzle can resolve) mean the same thing for a mm-valued and a metre-valued file.\n\nThe single contract for `summary.is_printable`:\n\n> A model is printable iff it has no non-manifold edges, no non-manifold vertices, no self-intersecting faces, and no degenerate faces or edges.\n\nDistorted faces, thin walls (below `thickness_min_mm`), and steep overhangs (above `overhang_angle_deg`) are all reported as `warning_count` rather than blockers — they are slicer-tunable and printer-dependent (an SLA printer can print steeper overhangs than an FDM printer; supports usually rescue most overhangs anyway).\n\n##### Choosing between `fix_printability` and `voxel_remesh`\n\nBoth repair actions produce a printable export. They use different techniques and have different trade-offs — pick based on the *severity* of the input's issues:\n\n- **`fix_printability`** runs Blender's lightweight clean operators (clean-non-manifold, clean-distorted). Preserves fine surface detail. The right tool when `check_printability` reports a small number of issues (dozens to a few hundred), typically from CAD exports or hand-modeled meshes with a few stray non-manifolds. If the input is structurally broken, this action's clean operators can actually make the metrics worse.\n- **`voxel_remesh`** rebuilds the entire mesh from a uniform voxel grid via OpenVDB. Guaranteed manifold output. Loses sub-voxel surface detail (smooths fine grooves, embossed text smaller than the voxel size). The right tool for organic 3D-modeled / sculpted shapes, photogrammetry exports, self-intersecting Boolean unions, inverted-normal regions, and dense multi-shell tessellation problems. Typically the only thing that fixes Meshy / sculpting / photogrammetry output. The auto-scaled voxel size keeps tentacle-class silhouette features intact on a normal-sized print.\n\nA reasonable default workflow: call `check_printability` first; if `summary.issue_count` is in the dozens or low hundreds, try `fix_printability`. If it's in the thousands, go straight to `voxel_remesh`.\n\n#### Slicing\n\n`slice_for_printing` ships one bundled printer profile, `prusa_mk4_pla_020`, an Original Prusa MK4 with the 0.4mm nozzle, Generic PLA filament, and the 0.20mm QUALITY print profile (250 × 210 mm bed, 0.2mm layers, 15% infill, no supports). The override fields (`layer_height_mm`, `infill_density_pct`, `support_material`) apply on top of that profile per call. The action returns:\n\n- `model.gcode` — the actual G-code that a printer can stream from.\n- `slice_preview.png` — a Blender-rendered image showing the model resting on a printbed-sized plane in roughly PrusaSlicer's default 3D-view orientation, with print-time / filament / layer / profile-name lines overlaid in the bottom-right corner. This is a wayfinding visual, not a hero render. The model and the bed share one unit basis (see \"Units\"), so the model appears at true size on the bed.\n- `metadata` — the parsed time / filament fields from the slicer's gcode comment block, plus `total_layers` and `max_layer_z_mm` counted from the per-layer `;LAYER_CHANGE` / `;Z:` markers when the slicer omits a summary line.\n- `units` — the unit basis applied to the input and the `--scale` (if any) passed to the slicer.\n\n#### Security And Script Safety\n\nBlender starts with Python auto-execution disabled when loading files, including user-provided `.blend` inputs.\n\n`run_script` executes the script in Blender, so keep scripts scoped to the requested task. Save only intended outputs into `OUTPUT_DIR`. Do not assume application source files, credentials, or other task working directories are available.\n\n#### Actions\n\n##### render_turntable\n\nGenerate a spinning turntable video of a 3D model with professional lighting. Returns a task_id immediately.\n\n**Required fields:**\n- `file_url` or `file_id` — the 3D model (BLEND, GLB, FBX, OBJ, STL, DAE, PLY)\n\n**Optional fields:**\n- `frames` (int, 12-120, default 72) — number of animation frames\n- `duration_seconds` (float, 1-30, default 6) — video length in seconds\n- `resolution` (string, default \"720p\") — 720p, 1080p, 2k, 4k, or custom WxH. Raise to 1080p or higher for hero output; the default is tuned for fast previews.\n- `samples` (int, 1-512, default 8) — render quality (higher = better but slower). Raise to 32-64 for hero stills, 128+ for marketing renders.\n- `background_color` (hex string without #, default \"1a1a1a\") — background color\n- `lighting_preset` (string, default \"studio\") — studio, product, outdoor, dramatic\n- `elevation` (float, -45 to 90, default 25) — camera elevation angle in degrees\n- `camera_distance` (float, optional) — explicit camera distance; omit for automatic full-object framing\n- `camera_lens_mm` (float, 10-120, default 35) — focal length in mm; lower is wider\n- `fit_margin` (float, 1-3, default 1.25) — auto-framing padding; higher leaves more space around the model\n- `decimate_ratio` (float, 0.05-1.0, optional) — polygon-reduction ratio applied before rendering. 0.5 keeps half the faces, 0.2 keeps a fifth, omit (or 1.0) for full fidelity. Use for very heavy STL imports of organic / 3D-print geometry where preview-quality renders are acceptable.\n\n**Example — basic turntable:**\n```json\n{\"action\": \"render_turntable\", \"file_url\": \"https://example.com/model.glb\"}\n```\n\n**Example — slow smooth spin at high quality:**\n```json\n{\"action\": \"render_turntable\", \"file_url\": \"https://example.com/model.glb\", \"frames\": 96, \"duration_seconds\": 8, \"resolution\": \"1080p\", \"samples\": 48, \"lighting_preset\": \"product\"}\n```\n\n**Example — wider framing:**\n```json\n{\"action\": \"render_turntable\", \"file_id\": \"abc-123-def\", \"fit_margin\": 1.6, \"camera_lens_mm\": 28}\n```\n\n**Example — quick low-res preview:**\n```json\n{\"action\": \"render_turntable\", \"file_id\": \"abc-123-def\", \"frames\": 12, \"duration_seconds\": 2, \"resolution\": \"720p\", \"samples\": 16}\n```\n\n**Example — dramatic lighting with low camera:**\n```json\n{\"action\": \"render_turntable\", \"file_url\": \"https://example.com/character.glb\", \"lighting_preset\": \"dramatic\", \"elevation\": 10, \"background_color\": \"000000\"}\n```\n\n---\n\n##### render_views\n\nRender the model from multiple preset camera angles and return individual images. Returns a task_id immediately.\n\n**Required fields:**\n- `file_url` or `file_id`\n\n**Optional fields:**\n- `views` (array of strings) — front, back, left, right, top, bottom, 3quarter. Default: front, back, left, right, top, 3quarter.\n- `resolution`, `samples`, `background_color`, `lighting_preset` — same as render_turntable\n- `camera_distance` (float, optional) — explicit camera distance; omit for automatic full-object framing\n- `camera_lens_mm` (float, 10-120, default 35) — focal length in mm; lower is wider\n- `fit_margin` (float, 1-3, default 1.25) — auto-framing padding; higher leaves more space around the model\n- `decimate_ratio` (float, 0.05-1.0, optional) — polygon-reduction ratio applied before rendering. Same semantics as render_turntable.\n\n**Example — all default views:**\n```json\n{\"action\": \"render_views\", \"file_url\": \"https://example.com/model.glb\"}\n```\n\n**Example — specific views with product lighting:**\n```json\n{\"action\": \"render_views\", \"file_url\": \"https://example.com/model.glb\", \"views\": [\"front\", \"3quarter\", \"top\"], \"lighting_preset\": \"product\", \"background_color\": \"ffffff\"}\n```\n\n**Example — using a stored file:**\n```json\n{\"action\": \"render_views\", \"file_id\": \"abc-123-def\", \"views\": [\"front\", \"back\"], \"resolution\": \"2k\"}\n```\n\n**Example — wider product views:**\n```json\n{\"action\": \"render_views\", \"file_id\": \"abc-123-def\", \"views\": [\"front\", \"3quarter\"], \"lighting_preset\": \"product\", \"background_color\": \"ffffff\", \"fit_margin\": 1.45, \"camera_lens_mm\": 30}\n```\n\n---\n\n##### render_custom\n\nRender with a custom camera position, target, and field of view. Returns a task_id immediately.\n\n**Required fields:**\n- `file_url` or `file_id`\n\n**Optional fields:**\n- `camera_position` (array [x, y, z], default [3, -3, 2.5]) — camera world position\n- `look_at` (array [x, y, z], default [0, 0, 0]) — point the camera looks at\n- `fov` (float, 10-120, default 50) — focal length in mm (lower = wider angle)\n- `resolution`, `samples`, `background_color`, `lighting_preset`\n\n**Example — close-up from the front:**\n```json\n{\"action\": \"render_custom\", \"file_url\": \"https://example.com/model.glb\", \"camera_position\": [0, -3, 1], \"look_at\": [0, 0, 0.5], \"fov\": 35}\n```\n\n**Example — bird's eye view:**\n```json\n{\"action\": \"render_custom\", \"file_url\": \"https://example.com/building.glb\", \"camera_position\": [0, 0, 8], \"look_at\": [0, 0, 0], \"fov\": 50, \"lighting_preset\": \"outdoor\"}\n```\n\n**Example — dramatic side angle:**\n```json\n{\"action\": \"render_custom\", \"file_url\": \"https://example.com/model.glb\", \"camera_position\": [6, -1, 2], \"lighting_preset\": \"dramatic\", \"background_color\": \"0a0a0a\"}\n```\n\n---\n\n##### convert_format\n\nConvert a 3D model between file formats using Blender's importers and exporters. Runs **synchronously** (returns result immediately).\n\n**Required fields:**\n- `file_url` or `file_id` — the source 3D model\n- `output_format` (string) — target format: blend, glb, fbx, obj, stl, dae, ply\n\n**Optional fields:**\n- `apply_transforms` (boolean, default true) — apply location, rotation, and scale transforms before interchange-format export. Ignored for `blend` output so editable Blender scene transforms are preserved.\n- `source_units` (string, default `auto`) — unit basis of the input; see \"Units\". STL / OBJ / PLY outputs are written in millimetres, glTF / GLB / FBX / DAE / BLEND natively (glTF is metres by spec). The response includes a `units` block.\n\n**Example — FBX to GLB for web:**\n```json\n{\"action\": \"convert_format\", \"file_url\": \"https://example.com/model.fbx\", \"output_format\": \"glb\"}\n```\n\n**Example — GLB to STL for 3D printing:**\n```json\n{\"action\": \"convert_format\", \"file_id\": \"abc-123-def\", \"output_format\": \"stl\"}\n```\n\n**Example — OBJ to FBX for Unity:**\n```json\n{\"action\": \"convert_format\", \"file_url\": \"https://example.com/model.obj\", \"output_format\": \"fbx\"}\n```\n\n**Example — GLB to Blender project file:**\n```json\n{\"action\": \"convert_format\", \"file_id\": \"abc-123-def\", \"output_format\": \"blend\"}\n```\nBlender project files are returned as generic binary downloads for broad client compatibility.\n\n**Typical time:** Under 5 seconds for most models.\n\n---\n\n##### check_printability\n\nRun a structured 3D-printability analysis on a model using Blender's bundled `object_print3d_utils` addon. Read-only — no upload, no mesh mutation. Returns a task_id immediately.\n\n**Required fields:**\n- `file_url` or `file_id` — the 3D model\n\n**Optional fields:**\n- `checks` (array of strings, default all six) — subset of `solid`, `intersect`, `degenerate`, `distort`, `thick`, `overhang`\n- `thickness_min_mm` (float, 0.05-10.0, default 0.5) — wall-thickness threshold\n- `overhang_angle_deg` (float, 10-89, default 45.0) — overhang threshold\n- `distort_angle_deg` (float, 5-89, default 45.0) — face-distortion threshold\n- `source_units` (string, default `auto`) — unit basis of the file; see \"Units\"\n\n**Response shape (in `outputs[0]`):** `type: \"printability_report\"`, `summary.is_printable` (bool), `summary.issue_count`, `summary.warning_count`, `results.{solid,intersect,degenerate,distort,thick,overhang}` per-check counts, `thresholds` (including `degenerate_threshold_mm2`), a `units` block, and a `model_stats` block with vertex/face/edge counts and `bounding_box_mm` / `volume_mm3` in real-world millimetres. `is_printable` is `true` only when the mesh is manifold, non-self-intersecting, and free of degenerate geometry (faces of 0.01 mm² or less) — distorted faces, thin walls, and steep overhangs register as warnings, not blockers. Sanity-check `model_stats.bounding_box_mm` against the size you expect; if it is off by 1000x, pass `source_units` explicitly.\n\n**Example — full default check:**\n```json\n{\"action\": \"check_printability\", \"file_url\": \"https://example.com/model.glb\"}\n```\n\n**Example — custom thickness threshold:**\n```json\n{\"action\": \"check_printability\", \"file_id\": \"abc-123-def\", \"thickness_min_mm\": 1.2}\n```\n\n**Example — only the manifold + intersect checks:**\n```json\n{\"action\": \"check_printability\", \"file_url\": \"https://example.com/model.glb\", \"checks\": [\"solid\", \"intersect\"]}\n```\n\n---\n\n##### fix_printability\n\nRun the same checks, then attempt the addon's auto-clean operators and re-export the cleaned mesh in the requested format. Returns a task_id immediately.\n\n**Required fields:**\n- `file_url` or `file_id`\n- `output_format` (string) — `stl`, `glb`, `obj`, or `ply`\n\n**Optional fields:**\n- `auto_fix_non_manifold` (boolean, default true) — run `print3d_clean_non_manifold`\n- `auto_fix_distorted` (boolean, default true) — run `print3d_clean_distorted`\n- `checks`, `thickness_min_mm`, `overhang_angle_deg`, `distort_angle_deg`, `source_units` — same as `check_printability`\n\n**Response shape (in `outputs[0]`):** all the fields of `check_printability` PLUS `before` and `after` blocks with the per-check results, a `fixes_applied` array (e.g. `[\"non_manifold\", \"distorted\"]`), a `model_stats` block split into `before`/`after`, and the standard upload fields `signed_url`, `file_id`, `filename`, `size_bytes` for the cleaned export. STL / OBJ / PLY exports are written in millimetres (`units.export_units`), so a 73 mm part stays 73 mm when re-checked or sliced.\n\n**Example — fix and export STL:**\n```json\n{\"action\": \"fix_printability\", \"file_url\": \"https://example.com/model.glb\", \"output_format\": \"stl\"}\n```\n\n**Example — only run the manifold cleanup, skip distorted:**\n```json\n{\"action\": \"fix_printability\", \"file_id\": \"abc-123-def\", \"output_format\": \"stl\", \"auto_fix_distorted\": false}\n```\n\n**Example — tighter thin-wall threshold for fine-detail prints:**\n```json\n{\"action\": \"fix_printability\", \"file_url\": \"https://example.com/figurine.glb\", \"output_format\": \"stl\", \"thickness_min_mm\": 0.8}\n```\n\n---\n\n##### voxel_remesh\n\nRebuild a model into a watertight manifold via OpenVDB voxel remesh. Returns a task_id immediately.\n\nThe right tool for inputs that are structurally broken — meshes the lightweight `fix_printability` operators cannot rescue:\n\n- 3D-modeled / sculpted organic shapes with overlapping geometry (tentacles, character models, organic planters)\n- Photogrammetry exports with shell artifacts\n- Self-intersecting Boolean union output from sloppy CAD\n- Inverted-normal regions\n- Dense multi-shell tessellation problems on heavily-decimated meshes\n\nThe output is **guaranteed manifold** (no non-manifold edges or self-intersections, normals consistently pointed outward). The trade-off is that surface detail smaller than the voxel size gets smoothed away.\n\n**Required fields:**\n- `file_url` or `file_id`\n- `output_format` (string) — `stl`, `glb`, `obj`, or `ply`\n\n**Optional fields:**\n- `voxel_size` (float, 0.01–100.0) — explicit voxel size in **millimetres** (the model is normalized to real-world units first; see \"Units\"). Smaller values preserve more detail at the cost of compute time. Omit to auto-scale to ~1.3% of the longest bounding-box dimension with a 0.5 mm floor, which works well for most print-scale models.\n- `source_units` (string, default `auto`) — unit basis of the file; see \"Units\"\n\n**Response shape (in `outputs[0]`):** `type: \"voxel_remesh_report\"`, `voxel_size` (mm, `voxel_size_units: \"mm\"`), `voxel_size_source: \"auto\"|\"override\"`, `bbox_before` (3-tuple, mm), `before` and `after` blocks with manifold metrics (`vertices`, `faces`, `edges`, `non_manifold_edges`, `non_manifold_verts`, `bad_contiguous_edges`), `is_manifold_after` (bool), and the standard upload fields `signed_url`, `file_id`, `filename`, `size_bytes` for the remeshed export (STL / OBJ / PLY written in millimetres).\n\n**Example — repair an organic 3D-modeled mesh:**\n```json\n{\"action\": \"voxel_remesh\", \"file_url\": \"https://example.com/sculpt.glb\", \"output_format\": \"stl\"}\n```\n\n**Example — finer detail for a small jewelry-class model:**\n```json\n{\"action\": \"voxel_remesh\", \"file_id\": \"abc-123-def\", \"output_format\": \"stl\", \"voxel_size\": 0.3}\n```\n\n**Example — coarser remesh for a large statue (faster, smaller output):**\n```json\n{\"action\": \"voxel_remesh\", \"file_url\": \"https://example.com/statue.glb\", \"output_format\": \"glb\", \"voxel_size\": 5.0}\n```\n\n---\n\n##### slice_for_printing\n\nSlice a model with PrusaSlicer's headless CLI against a bundled printer profile (default: `prusa_mk4_pla_020`, an Original Prusa MK4 with 0.4mm nozzle, Generic PLA, 0.20 mm QUALITY). Returns the gcode, a Blender-rendered \"model on the printbed\" preview PNG with the print-time and filament numbers overlaid in the corner, and parsed metadata. Returns a task_id immediately.\n\n**Required fields:**\n- `file_url` or `file_id`\n\n**Optional fields:**\n- `printer_profile` (string, default `prusa_mk4_pla_020`) — bundled profile name (lowercase letters, digits, underscores)\n- `layer_height_mm` (float, 0.05-0.6) — override the slicer's layer height; omit to use the profile's value\n- `infill_density_pct` (int, 0-100) — override infill density percent\n- `support_material` (boolean) — override the support-material toggle\n- `source_units` (string, default `auto`) — unit basis of the file; see \"Units\". A metre-valued STL is rescaled for the slicer automatically when its header says so, or when you pass `source_units: \"m\"`.\n\n**Response shape (in `outputs[0]`):** `type: \"slice_result\"`, `printer_profile`, `bed_dimensions_mm`, `units` (`source_units_resolved`, `slicer_scale`, ...), `metadata.{estimated_print_time_seconds,estimated_print_time_formatted,filament_used_mm,filament_used_g,filament_used_cm3,filament_cost,total_layers,max_layer_z_mm}`, `gcode.{signed_url,file_id,filename,size_bytes}` for `model.gcode`, and `preview.{signed_url,file_id,filename,size_bytes}` for `slice_preview.png` (the printbed preview with the metadata overlay). `total_layers` / `max_layer_z_mm` are counted from the gcode's per-layer markers, so they are populated even when the slicer writes no summary line.\n\n**Example — default slice:**\n```json\n{\"action\": \"slice_for_printing\", \"file_url\": \"https://example.com/model.glb\"}\n```\n\n**Example — finer 0.10 mm layers:**\n```json\n{\"action\": \"slice_for_printing\", \"file_id\": \"abc-123-def\", \"layer_height_mm\": 0.10}\n```\n\n**Example — force supports off and 30% infill:**\n```json\n{\"action\": \"slice_for_printing\", \"file_url\": \"https://example.com/model.glb\", \"support_material\": false, \"infill_density_pct\": 30}\n```\n\n---\n\n##### run_script\n\nExecute a custom Blender Python script on a model for advanced operations. Returns a task_id immediately.\n\n**Required fields:**\n- `script` (string) — Blender Python code to execute\n\n**Optional fields:**\n- `file_url` or `file_id` — model to load before running the script (optional; the script can create from scratch)\n- `output_type` (string) — image, video, model, all. Hint for what the script produces. Use `model` for `.blend`, `.glb`, `.fbx`, `.obj`, `.stl`, `.dae`, `.ply`, and `.usdz` outputs.\n- `script_timeout_seconds` (int, 600-1800, optional) — override the per-subprocess timeout for this run. The default is auto-scaled based on the rendered resolution and samples. Use this only when a script genuinely needs more than the default budget; it cannot exceed the service maximum (1800s).\n\n**Available variables in the script:**\n- `bpy` — the full Blender Python API\n- `MODEL_PATH` — filesystem path to the downloaded model (empty string if no model provided)\n- `OUTPUT_DIR` — directory to save output files. All files saved here are automatically uploaded and returned in the task outputs.\n\n**Example — render with Cycles ray-tracing:**\n```json\n{\n  \"action\": \"run_script\",\n  \"file_url\": \"https://example.com/model.glb\",\n  \"script\": \"import bpy, os\\nbpy.ops.import_scene.gltf(filepath=MODEL_PATH)\\nbpy.context.scene.render.engine = 'CYCLES'\\nbpy.context.scene.cycles.samples = 128\\nbpy.context.scene.render.resolution_x = 1920\\nbpy.context.scene.render.resolution_y = 1080\\ncam = bpy.data.cameras.new('Cam')\\ncam_obj = bpy.data.objects.new('Cam', cam)\\nbpy.context.scene.collection.objects.link(cam_obj)\\nbpy.context.scene.camera = cam_obj\\ncam_obj.location = (4, -4, 3)\\ntrack = cam_obj.constraints.new('TRACK_TO')\\nempty = bpy.data.objects.new('T', None)\\nempty.location = (0, 0, 0)\\nbpy.context.scene.collection.objects.link(empty)\\ntrack.target = empty\\ntrack.track_axis = 'TRACK_NEGATIVE_Z'\\ntrack.up_axis = 'UP_Y'\\nlight = bpy.data.lights.new('Sun', 'SUN')\\nlight.energy = 5\\nlight_obj = bpy.data.objects.new('Sun', light)\\nlight_obj.rotation_euler = (0.8, 0, 0.5)\\nbpy.context.scene.collection.objects.link(light_obj)\\nbpy.context.scene.render.filepath = os.path.join(OUTPUT_DIR, 'render.png')\\nbpy.ops.render.render(write_still=True)\"\n}\n```\n\n**Example — get model statistics:**\n```json\n{\n  \"action\": \"run_script\",\n  \"file_url\": \"https://example.com/model.glb\",\n  \"script\": \"import bpy, os, json\\nbpy.ops.import_scene.gltf(filepath=MODEL_PATH)\\nmeshes = [o for o in bpy.context.scene.objects if o.type == 'MESH']\\nstats = {'meshes': len(meshes), 'total_vertices': sum(len(m.data.vertices) for m in meshes), 'total_faces': sum(len(m.data.polygons) for m in meshes)}\\nwith open(os.path.join(OUTPUT_DIR, 'stats.json'), 'w') as f:\\n    json.dump(stats, f, indent=2)\"\n}\n```\n\n**Example — apply a subdivision modifier and re-export:**\n```json\n{\n  \"action\": \"run_script\",\n  \"file_url\": \"https://example.com/lowpoly.glb\",\n  \"script\": \"import bpy, os\\nbpy.ops.import_scene.gltf(filepath=MODEL_PATH)\\nfor obj in bpy.context.scene.objects:\\n    if obj.type == 'MESH':\\n        mod = obj.modifiers.new('Subdiv', 'SUBSURF')\\n        mod.levels = 2\\nbpy.ops.export_scene.gltf(filepath=os.path.join(OUTPUT_DIR, 'subdivided.glb'), export_format='GLB')\"\n}\n```\n\n**Example — save the processed scene as a Blender file:**\n```json\n{\n  \"action\": \"run_script\",\n  \"file_url\": \"https://example.com/model.glb\",\n  \"output_type\": \"model\",\n  \"script\": \"import bpy, os\\nbpy.ops.import_scene.gltf(filepath=MODEL_PATH)\\nbpy.ops.wm.save_as_mainfile(filepath=os.path.join(OUTPUT_DIR, 'scene.blend'))\"\n}\n```\n\n---\n\n##### get_task\n\nCheck the status of a render task and retrieve download links when complete.\n\n**Required fields:**\n- `task_id` (string) — the task ID returned from any async render action\n\n**Example:**\n```json\n{\"action\": \"get_task\", \"task_id\": \"849b4c79-2c2e-4886-bd40-1c01a8a2bd1d\"}\n```\n\n**Response when processing:**\n```json\n{\"action\": \"get_task\", \"task_id\": \"849b4c79...\", \"status\": \"processing\", \"progress\": 25, \"stage\": \"running_checks\", \"date_updated\": \"2026-09-11T14:02:11+00:00\", \"queue_position\": 0, \"queue_eta_seconds\": 60, \"queue_stats\": {\"queue_total_running\": 1, \"queue_total_queued\": 2, \"queue_total_capacity\": 50}}\n```\n\n`queue_position` is `0` when the task is running, `N` when it is the Nth slot from the front of the queue. `queue_eta_seconds` is the best-guess wait until the task is dequeued (always `0` for a running task). `queue_stats` summarizes the current queue state. All three fields are omitted on terminal records.\n\n`progress` is **coarse**: it advances only at stage boundaries (queued → started → downloading_model → running_checks / slicing / rendering → uploading), not continuously, so it can sit at one value for the whole Blender or slicer run. Key off `status` for completion, `stage` for what the worker is doing, and `date_updated` as a heartbeat; a task whose `date_updated` is more than a few minutes old with no `stage` change is the one to `cancel_task`. Never treat a flat `progress` alone as \"hung\".\n\n**Response when completed:**\n```json\n{\"action\": \"get_task\", \"task_id\": \"849b4c79...\", \"status\": \"completed\", \"progress\": 100, \"outputs\": [{\"type\": \"video\", \"signed_url\": \"https://...\", \"file_id\": \"...\", \"size_bytes\": 426703}]}\n```\n\n**Response when failed:**\n```json\n{\"action\": \"get_task\", \"task_id\": \"849b4c79...\", \"status\": \"failed\", \"error\": \"Blender exited with code 1.\"}\n```\n\nThe `error` field contains a sanitized message — `\"Blender timed out after Ns.\"`, `\"Blender exited with code N.\"`, `\"ffmpeg timed out after Ns.\"`, or a validation message — where `N` reflects the auto-scaled per-action timeout in effect, not a fixed wall.\n\n---\n\n##### cancel_task\n\nCancel a queued or running task. Idempotent: cancelling an already-terminal task returns an error explaining that.\n\n**Required fields:**\n- `task_id` (string) — the task ID returned from any async render action.\n\n**Example — cancel a queued task:**\n```json\n{\"action\": \"cancel_task\", \"task_id\": \"849b4c79-2c2e-4886-bd40-1c01a8a2bd1d\"}\n```\n\n**Response (success):**\n```json\n{\"action\": \"cancel_task\", \"task_id\": \"849b4c79...\", \"cancel_outcome\": \"queued_or_running_canceled\"}\n```\n\nThe task itself transitions to `status: \"failed\"` with `error_code: \"GPU_RENDER_TASK_CANCELED\"` once the SIGTERM grace window closes (≤30 seconds for a running render, immediate for a queued one). Poll `get_task` to confirm the terminal state.\n\n**Cancel a running task:**\n```json\n{\"action\": \"cancel_task\", \"task_id\": \"1b4f2acc-ff15-4b86-9d6d-2bd1c3a1b1d1\"}\n```\n\nThe semantics are identical — cancellation does not block awaiting subprocess termination; the response returns immediately and the task moves to terminal state asynchronously.\n\n---\n\n##### list_tasks\n\nList all render tasks for the current user, most recent first.\n\n**Optional fields:**\n- `limit` (int, 1-100, default 20) — maximum tasks to return\n\n**Example:**\n```json\n{\"action\": \"list_tasks\", \"limit\": 10}\n```\n\n**Response:**\n```json\n{\"action\": \"list_tasks\", \"count\": 3, \"tasks\": [{\"task_id\": \"...\", \"action\": \"render_turntable\", \"status\": \"completed\", \"progress\": 100, \"outputs\": [...]}, {\"task_id\": \"...\", \"action\": \"render_views\", \"status\": \"processing\", \"progress\": 45}]}\n```\n\n---\n\n#### Recommended Workflows\n\n##### Basic render workflow\n1. Call `render_turntable` or `render_views` with your model URL — get a `task_id`\n2. Wait 1-5 minutes depending on complexity\n3. Call `get_task` with the `task_id`\n4. If `status` is `\"completed\"`, the `outputs` array has download links\n5. If `status` is still `\"processing\"`, check `progress` and wait a bit longer\n\n##### Multiple renders at once\nSubmit multiple render requests — they run in parallel:\n```json\n{\"action\": \"render_turntable\", \"file_url\": \"https://...\", \"lighting_preset\": \"studio\"}\n{\"action\": \"render_views\", \"file_url\": \"https://...\", \"views\": [\"front\", \"3quarter\"]}\n```\nThen use `list_tasks` to see all of them at once, or `get_task` on each individually.\n\n##### Generate a 3D model and render it\n1. Use the 3D Modeling Agent to create a model from text or image\n2. Take the GLB download URL from the completed task\n3. Pass it to `render_turntable` or `render_views` to get professional renders\n4. Use `convert_format` to export to FBX for Unity or STL for 3D printing\n\n---\n\n#### Lighting Presets\n\n| Preset | Description | Best For |\n|--------|-------------|----------|\n| studio | 3-point lighting (key, fill, rim). Neutral white, soft shadows. | Product shots, portfolio renders, general purpose |\n| product | Large soft overhead light with bottom fill. Clean, even illumination. | E-commerce product photography, catalogs |\n| outdoor | Sun lamp with ambient sky fill. Natural daylight feel. | Architectural models, outdoor scenes |\n| dramatic | Single hard spotlight from the side. Deep shadows, dark background. | Character models, cinematic presentations, game assets |\n\n#### Supported Formats\n\n| Direction | Formats |\n|-----------|---------|\n| Import | BLEND, GLB, GLTF, FBX, OBJ, STL, DAE, PLY |\n| Export (convert_format) | BLEND, GLB, FBX, OBJ, STL, DAE, PLY |\n| Export (fix_printability / voxel_remesh) | STL, GLB, OBJ, PLY |\n| Slicer output | G-code (`.gcode`) + printbed preview PNG |\n\n#### Notes\n\n- Models are automatically centered and scaled for consistent framing across all render actions.\n- Unit handling is uniform across actions (see \"Units\"): imports are normalized to real-world size, unit-less mesh formats default to millimetres, and STL / OBJ / PLY outputs are written in millimetres.\n- Blender runs with Python auto-execution disabled when loading files, including user-provided `.blend` inputs.\n- Turntable videos are rendered as individual PNG frames then stitched to H.264 MP4 via ffmpeg.\n- Cycles is the default render engine and runs on GPU when available, falling back to CPU automatically when no GPU is attached. Use `run_script` with `bpy.context.scene.render.engine = 'BLENDER_EEVEE_NEXT'` only if you need EEVEE specifically.\n- Output files are stored for 7 days via signed URLs.\n- Each Blender subprocess runs under an auto-scaled timeout — floor 10 minutes (600s) for trivial work, scaling with frames × resolution × samples × view count, capped at 30 minutes (1800s). Very large requests (high samples, 4K resolution, many frames or views) hit the cap and may time out; choose the fast defaults for previews and only opt in to higher quality when the output justifies the wait.\n- The `run_script` action gives full access to the Blender Python API. Save output files to `OUTPUT_DIR` and they are automatically uploaded.\n\n## When To Use\n- Use this skill for `Blender 3D Modeling` on AgentPMT.\n- Use it when an agent needs this specific tool's behavior, schema, inputs, outputs, and invocation shape.\n- Search and activation keywords: blender 3d modeling, render turntable videos of 3d models for game asset previews, create multi angle product shots from 3d models for e commerce, convert 3d files between formats like glb to blend, glb to fbx, cancel task, task id, check printability.\n- Supported action names: `cancel_task`, `check_printability`, `convert_format`, `fix_printability`, `get_task`, `list_tasks`, `render_custom`, `render_turntable`, `render_views`, `run_script`, `slice_for_printing`, `voxel_remesh`.\n\n## Use Cases\n- Render turntable videos of 3D models for game asset previews\n- Create multi-angle product shots from 3D models for e-commerce\n- Convert 3D files between formats like GLB to BLEND\n- GLB to FBX\n- or OBJ to STL\n- Save procedurally generated scenes as Blender .blend files\n- Generate professional renders with studio lighting for portfolios\n- Preview 3D-printed models from every angle before printing\n- Render architectural models with custom camera positions\n- Create spinning animations of characters or props for social media\n- Apply dramatic lighting to 3D models for cinematic presentations\n- Run custom Blender Python scripts for advanced 3D processing\n- Render 3D models generated by AI tools like Meshy with proper textures and lighting\n- Convert game assets between Unity FBX and web GLB formats\n- Generate thumbnail images of 3D models for catalogs and marketplaces\n\n## Related Product Skills\n- File Management: ../file-management (ClawHub: `file-management`, page: https://clawhub.ai/agentpmt/file-management; skills.sh: `npx skills add AgentPMT/agent-skills --skill file-management`)\n\n## Categories And Industries\nNo categories or industry tags are published for this tool.\n\n## Actions And Schema\nComplete generated action schema: `./schema.md`.\nSupported action count: `12`.\nx402 availability: not enabled for this product.\n\n- `cancel_task` (action slug: `cancel-task`): Cancel a queued or running render task. Idempotent: cancelling an already-terminal task returns an error explaining that. Queued tasks transition immediately; running tasks transition once the SIGTERM grace window closes (≤30s). The task ends with status='failed' and error_code='GPU_RENDER_TASK_CANCELED'. Poll get_task to confirm the terminal state. Price: `25` credits. Parameters: `task_id`.\n- `check_printability` (action slug: `check-printability`): Run a structured 3D-printability analysis using Blender's object_print3d_utils addon. Read-only — no upload, no mesh mutation. Returns a task_id immediately. Price: `25` credits. Parameters: `checks`, `distort_angle_deg`, `file_id`, `file_url`, `overhang_angle_deg`, `source_units`, `thickness_min_mm`.\n- `convert_format` (action slug: `convert-format`): Convert a 3D model between file formats. Runs synchronously through the queue; if the queue is full, returns 429 with error_code GPU_RENDER_QUEUE_FULL. Price: `25` credits. Parameters: `apply_transforms`, `file_id`, `file_url`, `output_format`, `source_units`.\n- `fix_printability` (action slug: `fix-printability`): Light-touch repair using Blender's object_print3d_utils clean operators. For mostly-clean inputs (CAD exports, few stray non-manifolds). Use voxel_remesh for structurally-broken inputs. Price: `25` credits. Parameters: `auto_fix_distorted`, `auto_fix_non_manifold`, `checks`, `distort_angle_deg`, `file_id`, `file_url`, `output_format`, `overhang_angle_deg`, plus 2 more.\n- `get_task` (action slug: `get-task`): Check the status of a render task and retrieve download links when complete. Non-terminal responses include stage (what the worker is doing: queued, started, downloading_model, running_checks, slicing, rendering_preview, uploading_...) and date_updated as a heartbeat; progress is coarse and only advances at stage boundaries, so key off status and stage rather than a flat progress value. They also include queue_position (0 when running, 1+ when queued), queue_eta_seconds, and queue_stats {queue_total_running, queue_total_queued, queue_total_capacity}. Caller-driven failures (GPU_RENDER_QUEUE_FULL, BLENDER_VOXEL_GRID_TOO_LARGE, BLENDER_RUN_SCRIPT_TOO_LARGE, GPU_RENDER_TASK_CANCELED, BLENDER_SLICER_PROFILE_INVALID) report at warning severity and are safe to retry with corrected inputs; subprocess / memory / timeout failures (GPU_RENDER_BLENDER_NONZERO_EXIT, GPU_RENDER_BLENDER_TIMEOUT, BLENDER_SUBPROCESS_MEMORY_LIMIT, GPU_RENDER_CONTAINER_RESTARTED, GPU_RENDER_UNEXPECTED_ERROR) report at error severity — retry once but escalate if it recurs. Price: `25` credits. Parameters: `task_id`.\n- `list_tasks` (action slug: `list-tasks`): List render tasks for the current user, most recent first. Price: `25` credits. Parameters: `limit`.\n- `render_custom` (action slug: `render-custom`): Render with a custom camera position. Returns a task_id immediately. Joins the strict-FIFO render queue. Price: `25` credits. Parameters: `background_color`, `camera_position`, `decimate_ratio`, `file_id`, `file_url`, `fov`, `lighting_preset`, `look_at`, plus 3 more.\n- `render_turntable` (action slug: `render-turntable`): Generate a spinning turntable video of a 3D model. Returns a task_id immediately; use get_task to check progress and retrieve the output. Joins the strict-FIFO render queue (capacity 50); if the queue is full, returns a 429 with error_code GPU_RENDER_QUEUE_FULL and a Retry-After header. Price: `25` credits. Parameters: `background_color`, `camera_distance`, `camera_lens_mm`, `decimate_ratio`, `duration_seconds`, `elevation`, `file_id`, `file_url`, plus 6 more.\n- `render_views` (action slug: `render-views`): Render preset camera angles. Returns a task_id immediately. Joins the strict-FIFO render queue. Price: `25` credits. Parameters: `background_color`, `camera_distance`, `camera_lens_mm`, `decimate_ratio`, `file_id`, `file_url`, `fit_margin`, `lighting_preset`, plus 4 more.\n- `run_script` (action slug: `run-script`): Execute a custom Blender Python script. Returns a task_id immediately. Script payload limited to 65,536 bytes — oversize requests fail with error_code BLENDER_RUN_SCRIPT_TOO_LARGE. Price: `25` credits. Parameters: `file_id`, `file_url`, `output_type`, `script`, `script_timeout_seconds`, `source_units`.\n- `slice_for_printing` (action slug: `slice-for-printing`): Slice a 3D model with PrusaSlicer and return G-code, parsed metadata, and a Blender-rendered printbed preview PNG. Returns a task_id immediately. Price: `25` credits. Parameters: `file_id`, `file_url`, `infill_density_pct`, `layer_height_mm`, `printer_profile`, `source_units`, `support_material`.\n- `voxel_remesh` (action slug: `voxel-remesh`): Rebuild a model into a watertight manifold via OpenVDB voxel remesh. The right tool for structurally-broken inputs. Output is guaranteed manifold; surface detail smaller than the voxel size is smoothed away. Pre-flight rejects requests whose grid cell count exceeds 5,000,000 with error_code BLENDER_VOXEL_GRID_TOO_LARGE — the response message includes the minimum-safe voxel_size for the input, and the report context exposes bbox_x/y/z, voxel_size, cells, max_cells, and min_safe_voxel_size for runbooks. Price: `25` credits. Parameters: `file_id`, `file_url`, `output_format`, `source_units`, `voxel_size`.\n\n## Live Schema And Examples\nUse the compact schema above for ordinary calls. Before a new production integration, or whenever parameters, enum values, nested objects, outputs, or examples are unclear, fetch live details first.\n\n- Exact schema: call `agentpmt-tool-search-and-execution` with `action: \"get_schema\"`, and `tool_id: \"blender-3d-modeling\"`.\n- Detailed examples: call `agentpmt-tool-search-and-execution` with `action: \"get_instructions\"` and `tool_id: \"blender-3d-modeling\"`, or call this product with `action: \"get_instructions\"` when the product tool is already selected.\n- Treat returned live schema and instructions as more specific than this generated summary.\n\nMCP schema lookup through the main AgentPMT MCP server:\n\n```json\n{\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"AgentPMT-Tool-Search-and-Execution\",\n    \"arguments\": {\n      \"action\": \"get_schema\",\n      \"tool_id\": \"blender-3d-modeling\"\n    }\n  }\n}\n```\n\nFor live examples, keep the same MCP tool and use these arguments:\n\n```json\n{\n  \"action\": \"get_instructions\",\n  \"tool_id\": \"blender-3d-modeling\"\n}\n```\n\nAuthenticated AgentPMT R\n\nFile v1.0.1:_meta.json\n\n{\n  \"ownerId\": \"kn798pfbxm62kkd2750t7vsex5819pyc\",\n  \"slug\": \"blender-3d-modeling\",\n  \"version\": \"1.0.1\",\n  \"publishedAt\": 1789169892866\n}\n\nFile v1.0.1:schema.md\n\n# Blender 3D Modeling Schema\n\nThis generated reference belongs to the adjacent `SKILL.md`. Use it for exact action names, action slugs, parameter summaries, sample parameters, and generated JSON parameter schemas.\n\nProduct slug: `blender-3d-modeling`\n\nx402 availability: not enabled for this product.\n\n## `cancel_task`\n\nAction slug: `cancel-task`\n\nPrice: `25` credits\n\nCancel a queued or running render task. Idempotent: cancelling an already-terminal task returns an error explaining that. Queued tasks transition immediately; running tasks transition once the SIGTERM grace window closes (≤30s). The task ends with status='failed' and error_code='GPU_RENDER_TASK_CANCELED'. Poll get_task to confirm the terminal state.\n\nParameters:\n\n| Parameter | Type | Required | Description |\n|---|---|---|---|\n| `task_id` | `string` | yes | Task ID returned from a render action. |\n\nSample parameters:\n\n```json\n{\n  \"task_id\": \"example task id\"\n}\n```\n\nGenerated JSON parameter schema:\n\n```json\n{\n  \"task_id\": {\n    \"description\": \"Task ID returned from a render action.\",\n    \"required\": true,\n    \"type\": \"string\"\n  }\n}\n```\n\n## `check_printability`\n\nAction slug: `check-printability`\n\nPrice: `25` credits\n\nRun a structured 3D-printability analysis using Blender's object_print3d_utils addon. Read-only — no upload, no mesh mutation. Returns a task_id immediately.\n\nParameters:\n\n| Parameter | Type | Required | Description |\n|---|---|---|---|\n| `checks` | `array` | no | Subset of checks to run. Default: all six. |\n| `distort_angle_deg` | `number` | no | Face-distortion angle threshold in degrees. Default: 45. |\n| `file_id` | `string` | no | AgentPMT file storage ID. |\n| `file_url` | `string` | no | Public URL of the 3D model file. |\n| `overhang_angle_deg` | `number` | no | Overhang angle threshold in degrees. Default: 45. |\n| `source_units` | `string` | no | Unit basis of the input file: auto (default), mm, cm, m, in, or native. auto honors an STL header declaration, otherwise STL/OBJ/PLY are millimetres and glTF/GLB/FBX/DAE/BLEND are native. Set explicitly for a metre-valued STL with a blank header. |\n| `thickness_min_mm` | `number` | no | Wall-thickness threshold in mm. Default: 0.5. |\n\nSample parameters:\n\n```json\n{\n  \"checks\": [\n    \"solid\"\n  ],\n  \"distort_angle_deg\": 5,\n  \"file_id\": \"example file id\",\n  \"file_url\": \"https://example.com\",\n  \"overhang_angle_deg\": 10,\n  \"source_units\": \"auto\",\n  \"thickness_min_mm\": 0.05\n}\n```\n\nGenerated JSON parameter schema:\n\n```json\n{\n  \"checks\": {\n    \"description\": \"Subset of checks to run. Default: all six.\",\n    \"items\": {\n      \"enum\": [\n        \"solid\",\n        \"intersect\",\n        \"degenerate\",\n        \"distort\",\n        \"thick\",\n        \"overhang\"\n      ],\n      \"type\": \"string\"\n    },\n    \"required\": false,\n    \"type\": \"array\"\n  },\n  \"distort_angle_deg\": {\n    \"description\": \"Face-distortion angle threshold in degrees. Default: 45.\",\n    \"maximum\": 89,\n    \"minimum\": 5,\n    \"required\": false,\n    \"type\": \"number\"\n  },\n  \"file_id\": {\n    \"description\": \"AgentPMT file storage ID.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"file_url\": {\n    \"description\": \"Public URL of the 3D model file.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"overhang_angle_deg\": {\n    \"description\": \"Overhang angle threshold in degrees. Default: 45.\",\n    \"maximum\": 89,\n    \"minimum\": 10,\n    \"required\": false,\n    \"type\": \"number\"\n  },\n  \"source_units\": {\n    \"description\": \"Unit basis of the input file: auto (default), mm, cm, m, in, or native. auto honors an STL header declaration, otherwise STL/OBJ/PLY are millimetres and glTF/GLB/FBX/DAE/BLEND are native. Set explicitly for a metre-valued STL with a blank header.\",\n    \"enum\": [\n      \"auto\",\n      \"mm\",\n      \"cm\",\n      \"m\",\n      \"in\",\n      \"native\"\n    ],\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"thickness_min_mm\": {\n    \"description\": \"Wall-thickness threshold in mm. Default: 0.5.\",\n    \"maximum\": 10,\n    \"minimum\": 0.05,\n    \"required\": false,\n    \"type\": \"number\"\n  }\n}\n```\n\n## `convert_format`\n\nAction slug: `convert-format`\n\nPrice: `25` credits\n\nConvert a 3D model between file formats. Runs synchronously through the queue; if the queue is full, returns 429 with error_code GPU_RENDER_QUEUE_FULL.\n\nParameters:\n\n| Parameter | Type | Required | Description |\n|---|---|---|---|\n| `apply_transforms` | `boolean` | no | Apply transforms before export. Default: true. |\n| `file_id` | `string` | no | AgentPMT file storage ID for the source 3D model. |\n| `file_url` | `string` | no | Public URL of the source 3D model. |\n| `output_format` | `string` | yes | Target format. |\n| `source_units` | `string` | no | Unit basis of the input file: auto (default), mm, cm, m, in, or native. auto honors an STL header declaration, otherwise STL/OBJ/PLY are millimetres and glTF/GLB/FBX/DAE/BLEND are native. Set explicitly for a metre-valued STL with a blank header. |\n\nSample parameters:\n\n```json\n{\n  \"apply_transforms\": true,\n  \"file_id\": \"example file id\",\n  \"file_url\": \"https://example.com\",\n  \"output_format\": \"blend\",\n  \"source_units\": \"auto\"\n}\n```\n\nGenerated JSON parameter schema:\n\n```json\n{\n  \"apply_transforms\": {\n    \"description\": \"Apply transforms before export. Default: true.\",\n    \"required\": false,\n    \"type\": \"boolean\"\n  },\n  \"file_id\": {\n    \"description\": \"AgentPMT file storage ID for the source 3D model.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"file_url\": {\n    \"description\": \"Public URL of the source 3D model.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"output_format\": {\n    \"description\": \"Target format.\",\n    \"enum\": [\n      \"blend\",\n      \"glb\",\n      \"fbx\",\n      \"obj\",\n      \"stl\",\n      \"dae\",\n      \"ply\"\n    ],\n    \"required\": true,\n    \"type\": \"string\"\n  },\n  \"source_units\": {\n    \"description\": \"Unit basis of the input file: auto (default), mm, cm, m, in, or native. auto honors an STL header declaration, otherwise STL/OBJ/PLY are millimetres and glTF/GLB/FBX/DAE/BLEND are native. Set explicitly for a metre-valued STL with a blank header.\",\n    \"enum\": [\n      \"auto\",\n      \"mm\",\n      \"cm\",\n      \"m\",\n      \"in\",\n      \"native\"\n    ],\n    \"required\": false,\n    \"type\": \"string\"\n  }\n}\n```\n\n## `fix_printability`\n\nAction slug: `fix-printability`\n\nPrice: `25` credits\n\nLight-touch repair using Blender's object_print3d_utils clean operators. For mostly-clean inputs (CAD exports, few stray non-manifolds). Use voxel_remesh for structurally-broken inputs.\n\nParameters:\n\n| Parameter | Type | Required | Description |\n|---|---|---|---|\n| `auto_fix_distorted` | `boolean` | no | Run the addon's clean-distorted operator. Default: true. |\n| `auto_fix_non_manifold` | `boolean` | no | Run the addon's clean-non-manifold operator. Default: true. |\n| `checks` | `array` | no | Subset of checks to run. Default: all six. |\n| `distort_angle_deg` | `number` | no | Face-distortion angle threshold in degrees. Default: 45. |\n| `file_id` | `string` | no | AgentPMT file storage ID. |\n| `file_url` | `string` | no | Public URL of the 3D model file. |\n| `output_format` | `string` | yes | Target format for the cleaned export. |\n| `overhang_angle_deg` | `number` | no | Overhang angle threshold in degrees. Default: 45. |\n| `source_units` | `string` | no | Unit basis of the input file: auto (default), mm, cm, m, in, or native. auto honors an STL header declaration, otherwise STL/OBJ/PLY are millimetres and glTF/GLB/FBX/DAE/BLEND are native. Set explicitly for a metre-valued STL with a blank header. |\n| `thickness_min_mm` | `number` | no | Wall-thickness threshold in mm. Default: 0.5. |\n\nSample parameters:\n\n```json\n{\n  \"auto_fix_distorted\": true,\n  \"auto_fix_non_manifold\": true,\n  \"checks\": [\n    \"solid\"\n  ],\n  \"distort_angle_deg\": 5,\n  \"file_id\": \"example file id\",\n  \"file_url\": \"https://example.com\",\n  \"output_format\": \"stl\",\n  \"overhang_angle_deg\": 10\n}\n```\n\nGenerated JSON parameter schema:\n\n```json\n{\n  \"auto_fix_distorted\": {\n    \"description\": \"Run the addon's clean-distorted operator. Default: true.\",\n    \"required\": false,\n    \"type\": \"boolean\"\n  },\n  \"auto_fix_non_manifold\": {\n    \"description\": \"Run the addon's clean-non-manifold operator. Default: true.\",\n    \"required\": false,\n    \"type\": \"boolean\"\n  },\n  \"checks\": {\n    \"description\": \"Subset of checks to run. Default: all six.\",\n    \"items\": {\n      \"enum\": [\n        \"solid\",\n        \"intersect\",\n        \"degenerate\",\n        \"distort\",\n        \"thick\",\n        \"overhang\"\n      ],\n      \"type\": \"string\"\n    },\n    \"required\": false,\n    \"type\": \"array\"\n  },\n  \"distort_angle_deg\": {\n    \"description\": \"Face-distortion angle threshold in degrees. Default: 45.\",\n    \"maximum\": 89,\n    \"minimum\": 5,\n    \"required\": false,\n    \"type\": \"number\"\n  },\n  \"file_id\": {\n    \"description\": \"AgentPMT file storage ID.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"file_url\": {\n    \"description\": \"Public URL of the 3D model file.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"output_format\": {\n    \"description\": \"Target format for the cleaned export.\",\n    \"enum\": [\n      \"stl\",\n      \"glb\",\n      \"obj\",\n      \"ply\"\n    ],\n    \"required\": true,\n    \"type\": \"string\"\n  },\n  \"overhang_angle_deg\": {\n    \"description\": \"Overhang angle threshold in degrees. Default: 45.\",\n    \"maximum\": 89,\n    \"minimum\": 10,\n    \"required\": false,\n    \"type\": \"number\"\n  },\n  \"source_units\": {\n    \"description\": \"Unit basis of the input file: auto (default), mm, cm, m, in, or native. auto honors an STL header declaration, otherwise STL/OBJ/PLY are millimetres and glTF/GLB/FBX/DAE/BLEND are native. Set explicitly for a metre-valued STL with a blank header.\",\n    \"enum\": [\n      \"auto\",\n      \"mm\",\n      \"cm\",\n      \"m\",\n      \"in\",\n      \"native\"\n    ],\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"thickness_min_mm\": {\n    \"description\": \"Wall-thickness threshold in mm. Default: 0.5.\",\n    \"maximum\": 10,\n    \"minimum\": 0.05,\n    \"required\": false,\n    \"type\": \"number\"\n  }\n}\n```\n\n## `get_task`\n\nAction slug: `get-task`\n\nPrice: `25` credits\n\nCheck the status of a render task and retrieve download links when complete. Non-terminal responses include stage (what the worker is doing: queued, started, downloading_model, running_checks, slicing, rendering_preview, uploading_...) and date_updated as a heartbeat; progress is coarse and only advances at stage boundaries, so key off status and stage rather than a flat progress value. They also include queue_position (0 when running, 1+ when queued), queue_eta_seconds, and queue_stats {queue_total_running, queue_total_queued, queue_total_capacity}. Caller-driven failures (GPU_RENDER_QUEUE_FULL, BLENDER_VOXEL_GRID_TOO_LARGE, BLENDER_RUN_SCRIPT_TOO_LARGE, GPU_RENDER_TASK_CANCELED, BLENDER_SLICER_PROFILE_INVALID) report at warning severity and are safe to retry with corrected inputs; subprocess / memory / timeout failures (GPU_RENDER_BLENDER_NONZERO_EXIT, GPU_RENDER_BLENDER_TIMEOUT, BLENDER_SUBPROCESS_MEMORY_LIMIT, GPU_RENDER_CONTAINER_RESTARTED, GPU_RENDER_UNEXPECTED_ERROR) report at error severity — retry once but escalate if it recurs.\n\nParameters:\n\n| Parameter | Type | Required | Description |\n|---|---|---|---|\n| `task_id` | `string` | yes | Task ID returned from a render action. |\n\nSample parameters:\n\n```json\n{\n  \"task_id\": \"example task id\"\n}\n```\n\nGenerated JSON parameter schema:\n\n```json\n{\n  \"task_id\": {\n    \"description\": \"Task ID returned from a render action.\",\n    \"required\": true,\n    \"type\": \"string\"\n  }\n}\n```\n\n## `list_tasks`\n\nAction slug: `list-tasks`\n\nPrice: `25` credits\n\nList render tasks for the current user, most recent first.\n\nParameters:\n\n| Parameter | Type | Required | Description |\n|---|---|---|---|\n| `limit` | `integer` | no | Maximum tasks to return (1-100). Default: 20. |\n\nSample parameters:\n\n```json\n{\n  \"limit\": 1\n}\n```\n\nGenerated JSON parameter schema:\n\n```json\n{\n  \"limit\": {\n    \"description\": \"Maximum tasks to return (1-100). Default: 20.\",\n    \"maximum\": 100,\n    \"minimum\": 1,\n    \"required\": false,\n    \"type\": \"integer\"\n  }\n}\n```\n\n## `render_custom`\n\nAction slug: `render-custom`\n\nPrice: `25` credits\n\nRender with a custom camera position. Returns a task_id immediately. Joins the strict-FIFO render queue.\n\nParameters:\n\n| Parameter | Type | Required | Description |\n|---|---|---|---|\n| `background_color` | `string` | no | Background hex color without #. |\n| `camera_position` | `array` | no | Camera [x, y, z] position. Default: [3, -3, 2.5]. |\n| `decimate_ratio` | `number` | no | Optional polygon-reduction ratio (0.05-1.0). |\n| `file_id` | `string` | no | AgentPMT file storage ID. |\n| `file_url` | `string` | no | Public URL of the 3D model file. |\n| `fov` | `number` | no | Camera focal length in mm (10-120). Default: 50. |\n| `lighting_preset` | `string` | no | Lighting style. |\n| `look_at` | `array` | no | Camera look-at [x, y, z] target. Default: [0, 0, 0]. |\n| `resolution` | `string` | no | Resolution preset or WxH. |\n| `samples` | `integer` | no | Render samples. |\n| `source_units` | `string` | no | Unit basis of the input file: auto (default), mm, cm, m, in, or native. auto honors an STL header declaration, otherwise STL/OBJ/PLY are millimetres and glTF/GLB/FBX/DAE/BLEND are native. Set explicitly for a metre-valued STL with a blank header. |\n\nSample parameters:\n\n```json\n{\n  \"background_color\": \"example background color\",\n  \"camera_position\": [\n    1\n  ],\n  \"decimate_ratio\": 0.05,\n  \"file_id\": \"example file id\",\n  \"file_url\": \"https://example.com\",\n  \"fov\": 10,\n  \"lighting_preset\": \"studio\",\n  \"look_at\": [\n    1\n  ]\n}\n```\n\nGenerated JSON parameter schema:\n\n```json\n{\n  \"background_color\": {\n    \"description\": \"Background hex color without #.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"camera_position\": {\n    \"description\": \"Camera [x, y, z] position. Default: [3, -3, 2.5].\",\n    \"items\": {\n      \"type\": \"number\"\n    },\n    \"required\": false,\n    \"type\": \"array\"\n  },\n  \"decimate_ratio\": {\n    \"description\": \"Optional polygon-reduction ratio (0.05-1.0).\",\n    \"maximum\": 1,\n    \"minimum\": 0.05,\n    \"required\": false,\n    \"type\": \"number\"\n  },\n  \"file_id\": {\n    \"description\": \"AgentPMT file storage ID.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"file_url\": {\n    \"description\": \"Public URL of the 3D model file.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"fov\": {\n    \"description\": \"Camera focal length in mm (10-120). Default: 50.\",\n    \"maximum\": 120,\n    \"minimum\": 10,\n    \"required\": false,\n    \"type\": \"number\"\n  },\n  \"lighting_preset\": {\n    \"description\": \"Lighting style.\",\n    \"enum\": [\n      \"studio\",\n      \"product\",\n      \"outdoor\",\n      \"dramatic\"\n    ],\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"look_at\": {\n    \"description\": \"Camera look-at [x, y, z] target. Default: [0, 0, 0].\",\n    \"items\": {\n      \"type\": \"number\"\n    },\n    \"required\": false,\n    \"type\": \"array\"\n  },\n  \"resolution\": {\n    \"description\": \"Resolution preset or WxH.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"samples\": {\n    \"description\": \"Render samples.\",\n    \"maximum\": 512,\n    \"minimum\": 1,\n    \"required\": false,\n    \"type\": \"integer\"\n  },\n  \"source_units\": {\n    \"description\": \"Unit basis of the input file: auto (default), mm, cm, m, in, or native. auto honors an STL header declaration, otherwise STL/OBJ/PLY are millimetres and glTF/GLB/FBX/DAE/BLEND are native. Set explicitly for a metre-valued STL with a blank header.\",\n    \"enum\": [\n      \"auto\",\n      \"mm\",\n      \"cm\",\n      \"m\",\n      \"in\",\n      \"native\"\n    ],\n    \"required\": false,\n    \"type\": \"string\"\n  }\n}\n```\n\n## `render_turntable`\n\nAction slug: `render-turntable`\n\nPrice: `25` credits\n\nGenerate a spinning turntable video of a 3D model. Returns a task_id immediately; use get_task to check progress and retrieve the output. Joins the strict-FIFO render queue (capacity 50); if the queue is full, returns a 429 with error_code GPU_RENDER_QUEUE_FULL and a Retry-After header.\n\nParameters:\n\n| Parameter | Type | Required | Description |\n|---|---|---|---|\n| `background_color` | `string` | no | Background hex color without #. Default: 1a1a1a. |\n| `camera_distance` | `number` | no | Optional camera distance override. |\n| `camera_lens_mm` | `number` | no | Camera focal length in mm (10-120). Default: 35. |\n| `decimate_ratio` | `number` | no | Optional polygon-reduction ratio (0.05-1.0). |\n| `duration_seconds` | `number` | no | Video duration in seconds (1-30). Default: 6. |\n| `elevation` | `number` | no | Camera elevation degrees (-45 to 90). Default: 25. |\n| `file_id` | `string` | no | AgentPMT file storage ID for the 3D model. |\n| `file_url` | `string` | no | Public URL of the 3D model file (BLEND, GLB, GLTF, FBX, OBJ, STL, DAE, PLY). |\n| `fit_margin` | `number` | no | Auto-framing padding multiplier (1-3). Default: 1.25. |\n| `frames` | `integer` | no | Number of animation frames (12-120). Default: 72. |\n| `lighting_preset` | `string` | no | Lighting style. |\n| `resolution` | `string` | no | Resolution: 720p (default), 1080p, 2k, 4k, or WxH. |\n| `samples` | `integer` | no | Render samples (1-512). Default: 8. |\n| `source_units` | `string` | no | Unit basis of the input file: auto (default), mm, cm, m, in, or native. auto honors an STL header declaration, otherwise STL/OBJ/PLY are millimetres and glTF/GLB/FBX/DAE/BLEND are native. Set explicitly for a metre-valued STL with a blank header. |\n\nSample parameters:\n\n```json\n{\n  \"background_color\": \"example background color\",\n  \"camera_distance\": 0.1,\n  \"camera_lens_mm\": 10,\n  \"decimate_ratio\": 0.05,\n  \"duration_seconds\": 1,\n  \"elevation\": -45,\n  \"file_id\": \"example file id\",\n  \"file_url\": \"https://example.com\"\n}\n```\n\nGenerated JSON parameter schema:\n\n```json\n{\n  \"background_color\": {\n    \"description\": \"Background hex color without #. Default: 1a1a1a.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"camera_distance\": {\n    \"description\": \"Optional camera distance override.\",\n    \"maximum\": 100,\n    \"minimum\": 0.1,\n    \"required\": false,\n    \"type\": \"number\"\n  },\n  \"camera_lens_mm\": {\n    \"description\": \"Camera focal length in mm (10-120). Default: 35.\",\n    \"maximum\": 120,\n    \"minimum\": 10,\n    \"required\": false,\n    \"type\": \"number\"\n  },\n  \"decimate_ratio\": {\n    \"description\": \"Optional polygon-reduction ratio (0.05-1.0).\",\n    \"maximum\": 1,\n    \"minimum\": 0.05,\n    \"required\": false,\n    \"type\": \"number\"\n  },\n  \"duration_seconds\": {\n    \"description\": \"Video duration in seconds (1-30). Default: 6.\",\n    \"maximum\": 30,\n    \"minimum\": 1,\n    \"required\": false,\n    \"type\": \"number\"\n  },\n  \"elevation\": {\n    \"description\": \"Camera elevation degrees (-45 to 90). Default: 25.\",\n    \"maximum\": 90,\n    \"minimum\": -45,\n    \"required\": false,\n    \"type\": \"number\"\n  },\n  \"file_id\": {\n    \"description\": \"AgentPMT file storage ID for the 3D model.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"file_url\": {\n    \"description\": \"Public URL of the 3D model file (BLEND, GLB, GLTF, FBX, OBJ, STL, DAE, PLY).\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"fit_margin\": {\n    \"description\": \"Auto-framing padding multiplier (1-3). Default: 1.25.\",\n    \"maximum\": 3,\n    \"minimum\": 1,\n    \"required\": false,\n    \"type\": \"number\"\n  },\n  \"frames\": {\n    \"description\": \"Number of animation frames (12-120). Default: 72.\",\n    \"maximum\": 120,\n    \"minimum\": 12,\n    \"required\": false,\n    \"type\": \"integer\"\n  },\n  \"lighting_preset\": {\n    \"description\": \"Lighting style.\",\n    \"enum\": [\n      \"studio\",\n      \"product\",\n      \"outdoor\",\n      \"dramatic\"\n    ],\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"resolution\": {\n    \"description\": \"Resolution: 720p (default), 1080p, 2k, 4k, or WxH.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"samples\": {\n    \"description\": \"Render samples (1-512). Default: 8.\",\n    \"maximum\": 512,\n    \"minimum\": 1,\n    \"required\": false,\n    \"type\": \"integer\"\n  },\n  \"source_units\": {\n    \"description\": \"Unit basis of the input file: auto (default), mm, cm, m, in, or native. auto honors an STL header declaration, otherwise STL/OBJ/PLY are millimetres and glTF/GLB/FBX/DAE/BLEND are native. Set explicitly for a metre-valued STL with a blank header.\",\n    \"enum\": [\n      \"auto\",\n      \"mm\",\n      \"cm\",\n      \"m\",\n      \"in\",\n      \"native\"\n    ],\n    \"required\": false,\n    \"type\": \"string\"\n  }\n}\n```\n\n## `render_views`\n\nAction slug: `render-views`\n\nPrice: `25` credits\n\nRender preset camera angles. Returns a task_id immediately. Joins the strict-FIFO render queue.\n\nParameters:\n\n| Parameter | Type | Required | Description |\n|---|---|---|---|\n| `background_color` | `string` | no | Background hex color without #. Default: 1a1a1a. |\n| `camera_distance` | `number` | no | Optional camera distance override. |\n| `camera_lens_mm` | `number` | no | Camera focal length in mm (10-120). Default: 35. |\n| `decimate_ratio` | `number` | no | Optional polygon-reduction ratio (0.05-1.0). |\n| `file_id` | `string` | no | AgentPMT file storage ID. |\n| `file_url` | `string` | no | Public URL of the 3D model file. |\n| `fit_margin` | `number` | no | Auto-framing padding multiplier (1-3). Default: 1.25. |\n| `lighting_preset` | `string` | no | Lighting style. |\n| `resolution` | `string` | no | Resolution: 720p (default), 1080p, 2k, 4k, or WxH. |\n| `samples` | `integer` | no | Render samples (1-512). Default: 8. |\n| `source_units` | `string` | no | Unit basis of the input file: auto (default), mm, cm, m, in, or native. auto honors an STL header declaration, otherwise STL/OBJ/PLY are millimetres and glTF/GLB/FBX/DAE/BLEND are native. Set explicitly for a metre-valued STL with a blank header. |\n| `views` | `array` | no | Views to render. Default: front, back, left, right, top, 3quarter. |\n\nSample parameters:\n\n```json\n{\n  \"background_color\": \"example background color\",\n  \"camera_distance\": 0.1,\n  \"camera_lens_mm\": 10,\n  \"decimate_ratio\": 0.05,\n  \"file_id\": \"example file id\",\n  \"file_url\": \"https://example.com\",\n  \"fit_margin\": 1,\n  \"lighting_preset\": \"studio\"\n}\n```\n\nGenerated JSON parameter schema:\n\n```json\n{\n  \"background_color\": {\n    \"description\": \"Background hex color without #. Default: 1a1a1a.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"camera_distance\": {\n    \"description\": \"Optional camera distance override.\",\n    \"maximum\": 100,\n    \"minimum\": 0.1,\n    \"required\": false,\n    \"type\": \"number\"\n  },\n  \"camera_lens_mm\": {\n    \"description\": \"Camera focal length in mm (10-120). Default: 35.\",\n    \"maximum\": 120,\n    \"minimum\": 10,\n    \"required\": false,\n    \"type\": \"number\"\n  },\n  \"decimate_ratio\": {\n    \"description\": \"Optional polygon-reduction ratio (0.05-1.0).\",\n    \"maximum\": 1,\n    \"minimum\": 0.05,\n    \"required\": false,\n    \"type\": \"number\"\n  },\n  \"file_id\": {\n    \"description\": \"AgentPMT file storage ID.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"file_url\": {\n    \"description\": \"Public URL of the 3D model file.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"fit_margin\": {\n    \"description\": \"Auto-framing padding multiplier (1-3). Default: 1.25.\",\n    \"maximum\": 3,\n    \"minimum\": 1,\n    \"required\": false,\n    \"type\": \"number\"\n  },\n  \"lighting_preset\": {\n    \"description\": \"Lighting style.\",\n    \"enum\": [\n      \"studio\",\n      \"product\",\n      \"outdoor\",\n      \"dramatic\"\n    ],\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"resolution\": {\n    \"description\": \"Resolution: 720p (default), 1080p, 2k, 4k, or WxH.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"samples\": {\n    \"description\": \"Render samples (1-512). Default: 8.\",\n    \"maximum\": 512,\n    \"minimum\": 1,\n    \"required\": false,\n    \"type\": \"integer\"\n  },\n  \"source_units\": {\n    \"description\": \"Unit basis of the input file: auto (default), mm, cm, m, in, or native. auto honors an STL header declaration, otherwise STL/OBJ/PLY are millimetres and glTF/GLB/FBX/DAE/BLEND are native. Set explicitly for a metre-valued STL with a blank header.\",\n    \"enum\": [\n      \"auto\",\n      \"mm\",\n      \"cm\",\n      \"m\",\n      \"in\",\n      \"native\"\n    ],\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"views\": {\n    \"description\": \"Views to render. Default: front, back, left, right, top, 3quarter.\",\n    \"items\": {\n      \"enum\": [\n        \"front\",\n        \"back\",\n        \"left\",\n        \"right\",\n        \"top\",\n        \"bottom\",\n        \"3quarter\"\n      ],\n      \"type\": \"string\"\n    },\n    \"required\": false,\n    \"type\": \"array\"\n  }\n}\n```\n\n## `run_script`\n\nAction slug: `run-script`\n\nPrice: `25` credits\n\nExecute a custom Blender Python script. Returns a task_id immediately. Script payload limited to 65,536 bytes — oversize requests fail with error_code BLENDER_RUN_SCRIPT_TOO_LARGE.\n\nParameters:\n\n| Parameter | Type | Required | Description |\n|---|---|---|---|\n| `file_id` | `string` | no | Optional AgentPMT file storage ID — exposed as MODEL_PATH. |\n| `file_url` | `string` | no | Optional model URL — exposed as MODEL_PATH. |\n| `output_type` | `string` | no | Expected output class. Default: image. |\n| `script` | `string` | yes | Blender Python script (≤64 KiB). Has access to bpy, MODEL_PATH, OUTPUT_DIR. |\n| `script_timeout_seconds` | `integer` | no | Override the per-subprocess timeout in seconds. |\n| `source_units` | `string` | no | Unit basis of the input file: auto (default), mm, cm, m, in, or native. auto honors an STL header declaration, otherwise STL/OBJ/PLY are millimetres and glTF/GLB/FBX/DAE/BLEND are native. Set explicitly for a metre-valued STL with a blank header. |\n\nSample parameters:\n\n```json\n{\n  \"file_id\": \"example file id\",\n  \"file_url\": \"https://example.com\",\n  \"output_type\": \"image\",\n  \"script\": \"example script\",\n  \"script_timeout_seconds\": 600,\n  \"source_units\": \"auto\"\n}\n```\n\nGenerated JSON parameter schema:\n\n```json\n{\n  \"file_id\": {\n    \"description\": \"Optional AgentPMT file storage ID — exposed as MODEL_PATH.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"file_url\": {\n    \"description\": \"Optional model URL — exposed as MODEL_PATH.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"output_type\": {\n    \"description\": \"Expected output class. Default: image.\",\n    \"enum\": [\n      \"image\",\n      \"video\",\n      \"model\",\n      \"all\"\n    ],\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"script\": {\n    \"description\": \"Blender Python script (≤64 KiB). Has access to bpy, MODEL_PATH, OUTPUT_DIR.\",\n    \"required\": true,\n    \"type\": \"string\"\n  },\n  \"script_timeout_seconds\": {\n    \"description\": \"Override the per-subprocess timeout in seconds.\",\n    \"maximum\": 1800,\n    \"minimum\": 600,\n    \"required\": false,\n    \"type\": \"integer\"\n  },\n  \"source_units\": {\n    \"description\": \"Unit basis of the input file: auto (default), mm, cm, m, in, or native. auto honors an STL header declaration, otherwise STL/OBJ/PLY are millimetres and glTF/GLB/FBX/DAE/BLEND are native. Set explicitly for a metre-valued STL with a blank header.\",\n    \"enum\": [\n      \"auto\",\n      \"mm\",\n      \"cm\",\n      \"m\",\n      \"in\",\n      \"native\"\n    ],\n    \"required\": false,\n    \"type\": \"string\"\n  }\n}\n```\n\n## `slice_for_printing`\n\nAction slug: `slice-for-printing`\n\nPrice: `25` credits\n\nSlice a 3D model with PrusaSlicer and return G-code, parsed metadata, and a Blender-rendered printbed preview PNG. Returns a task_id immediately.\n\nParameters:\n\n| Parameter | Type | Required | Description |\n|---|---|---|---|\n| `file_id` | `string` | no | AgentPMT file storage ID. |\n| `file_url` | `string` | no | Public URL of the 3D model file. |\n| `infill_density_pct` | `integer` | no | Override infill density percent (0-100). |\n| `layer_height_mm` | `number` | no | Override the slicer's layer height in mm. |\n| `printer_profile` | `string` | no | Bundled PrusaSlicer profile name. Default: prusa_mk4_pla_020. |\n| `source_units` | `string` | no | Unit basis of the input file: auto (default), mm, cm, m, in, or native. auto honors an STL header declaration, otherwise STL/OBJ/PLY are millimetres and glTF/GLB/FBX/DAE/BLEND are native. Set explicitly for a metre-valued STL with a blank header. |\n| `support_material` | `boolean` | no | Override the support-material toggle. |\n\nSample parameters:\n\n```json\n{\n  \"file_id\": \"example file id\",\n  \"file_url\": \"https://example.com\",\n  \"infill_density_pct\": 0,\n  \"layer_height_mm\": 0.05,\n  \"printer_profile\": \"example printer profile\",\n  \"source_units\": \"auto\",\n  \"support_material\": true\n}\n```\n\nGenerated JSON parameter schema:\n\n```json\n{\n  \"file_id\": {\n    \"description\": \"AgentPMT file storage ID.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"file_url\": {\n    \"description\": \"Public URL of the 3D model file.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"infill_density_pct\": {\n    \"description\": \"Override infill density percent (0-100).\",\n    \"maximum\": 100,\n    \"minimum\": 0,\n    \"required\": false,\n    \"type\": \"integer\"\n  },\n  \"layer_height_mm\": {\n    \"description\": \"Override the slicer's layer height in mm.\",\n    \"maximum\": 0.6,\n    \"minimum\": 0.05,\n    \"required\": false,\n    \"type\": \"number\"\n  },\n  \"printer_profile\": {\n    \"description\": \"Bundled PrusaSlicer profile name. Default: prusa_mk4_pla_020.\",\n    \"pattern\": \"^[a-z0-9_]+$\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"source_units\": {\n    \"description\": \"Unit basis of the input file: auto (default), mm, cm, m, in, or native. auto honors an STL header declaration, otherwise STL/OBJ/PLY are millimetres and glTF/GLB/FBX/DAE/BLEND are native. Set explicitly for a metre-valued STL with a blank header.\",\n    \"enum\": [\n      \"auto\",\n      \"mm\",\n      \"cm\",\n      \"m\",\n      \"in\",\n      \"native\"\n    ],\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"support_material\": {\n    \"description\": \"Override the support-material toggle.\",\n    \"required\": false,\n    \"type\": \"boolean\"\n  }\n}\n```\n\n## `voxel_remesh`\n\nAction slug: `voxel-remesh`\n\nPrice: `25` credits\n\nRebuild a model into a watertight manifold via OpenVDB voxel remesh. The right tool for structurally-broken inputs. Output is guaranteed manifold; surface detail smaller than the voxel size is smoothed away. Pre-flight rejects requests whose grid cell count exceeds 5,000,000 with error_code BLENDER_VOXEL_GRID_TOO_LARGE — the response message includes the minimum-safe voxel_size for the input, and the report context exposes bbox_x/y/z, voxel_size, cells, max_cells, and min_safe_voxel_size for runbooks.\n\nParameters:\n\n| Parameter | Type | Required | Description |\n|---|---|---|---|\n| `file_id` | `string` | no | AgentPMT file storage ID. |\n| `file_url` | `string` | no | Public URL of the 3D model file. |\n| `output_format` | `string` | yes | Target format for the remeshed export. |\n| `source_units` | `string` | no | Unit basis of the input file: auto (default), mm, cm, m, in, or native. auto honors an STL header declaration, otherwise STL/OBJ/PLY are millimetres and glTF/GLB/FBX/DAE/BLEND are native. Set explicitly for a metre-valued STL with a blank header. |\n| `voxel_size` | `number` | no | Explicit voxel size in millimetres (the model is normalized to real-world units first). Smaller = finer detail and longer compute. Omit to auto-scale to ~1.3% of the longest bounding-box dimension (0.5 mm floor). |\n\nSample parameters:\n\n```json\n{\n  \"file_id\": \"example file id\",\n  \"file_url\": \"https://example.com\",\n  \"output_format\": \"stl\",\n  \"source_units\": \"auto\",\n  \"voxel_size\": 0.01\n}\n```\n\nGenerated JSON parameter schema:\n\n```json\n{\n  \"file_id\": {\n    \"description\": \"AgentPMT file storage ID.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"file_url\": {\n    \"description\": \"Public URL of the 3D model file.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"output_format\": {\n    \"description\": \"Target format for the remeshed export.\",\n    \"enum\": [\n      \"stl\",\n      \"glb\",\n      \"obj\",\n      \"ply\"\n    ],\n    \"required\": true,\n    \"type\": \"string\"\n  },\n  \"source_units\": {\n    \"description\": \"Unit basis of the input file: auto (default), mm, cm, m, in, or native. auto honors an STL header declaration, otherwise STL/OBJ/PLY are millimetres and glTF/GLB/FBX/DAE/BLEND are native. Set explicitly for a metre-valued STL with a blank header.\",\n    \"enum\": [\n      \"auto\",\n      \"mm\",\n      \"cm\",\n      \"m\",\n      \"in\",\n      \"native\"\n    ],\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"voxel_size\": {\n    \"description\": \"Explicit voxel size in millimetres (the model is normalized to real-world units first). Smaller = finer detail and longer compute. Omit to auto-scale to ~1.3% of the longest bounding-box dimension (0.5 mm floor).\",\n    \"maximum\": 100,\n    \"minimum\": 0.01,\n    \"required\": false,\n    \"type\": \"number\"\n  }\n}\n```\n\nFile v1.0.1:skill-card.md\n\n## Description:\n\nBlender 3D Modeling gives agents instructions for using AgentPMT-hosted Blender remote tool calls to render and convert 3D models, check and repair printability, slice models for printing, manage render tasks, and run scoped Blender Python scripts.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[agentpmt](https://clawhub.ai/user/agentpmt)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and agents use this skill to invoke hosted Blender workflows for game asset previews, e-commerce product views, 3D format conversion, printability checks and repairs, slicing, and custom Blender automation.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill relies on a hosted remote Blender provider and asks agents to trust mutable live schemas and remote instructions.\n\nMitigation: Install only when AgentPMT is trusted for the workflow, verify live schemas before production use, and prefer pinned or ClawHub-reviewed setup paths for account configuration.\n\nRisk: Custom Blender Python execution can process uploaded models and create arbitrary output files within the hosted task context.\n\nMitigation: Keep scripts scoped to the requested task, avoid untrusted Blender Python, save only intended outputs, and do not include secrets, wallet material, signatures, or payment headers in prompts or logs.\n\nRisk: Large renders, voxel remeshing, and script jobs can fail or queue because of GPU capacity, memory, grid-size, payload-size, or timeout limits.\n\nMitigation: Use documented limits and response warnings to select smaller renders, larger voxel sizes, or standard actions, then poll task status and retry only after correcting inputs.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/agentpmt/skills/blender-3d-modeling)\n- [AgentPMT marketplace product](https://www.agentpmt.com/marketplace/blender-3d-modeling)\n- [Action schema](artifact/schema.md)\n- [AgentPMT account MCP/REST setup](https://clawhub.ai/agentpmt/agentpmt-account-mcp-rest-api-setup)\n- [What AgentPMT is](https://clawhub.ai/agentpmt/what-is-agentpmt)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, API calls, configuration, guidance]\n\n**Output Format:** [Markdown guidance with JSON request examples and response-handling instructions]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Remote calls may return task IDs, JSON status responses, signed download URLs, rendered images or videos, converted model files, G-code, metadata, and Blender project files.]\n\n## Skill Version(s):\n\n1.0.1 (source: frontmatter and server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.0: 4 files, 17716 bytes\n\nFiles: schema.md (25573b), skill-card.md (2403b), SKILL.md (34525b), _meta.json (138b)\n\nFile v1.0.0:SKILL.md\n\n---\nname: blender-3d-modeling\ndescription: \"Blender 3D Modeling: Blender 3D suite running headless in the cloud. Use when an agent needs blender 3d modeling, render turntable videos of 3d models for game asset previews, create multi angle product shots from 3d models for e commerce, convert 3d files between formats like glb to blend, glb to fbx, cancel task, task id, check printability through AgentPMT-hosted remote tool calls. Discovery terms: blender 3d modeling, render turntable videos of 3d models for game asset previews.\"\nversion: 1.0.0\nhomepage: https://www.agentpmt.com/marketplace/blender-3d-modeling\ncompatibility: \"Agent instructions for AgentPMT-hosted remote tool calls. Follow this skill body for supported account, wallet, and setup routes. No local command runtime is declared.\"\nmetadata: {\"author\":\"agentpmt\",\"openclaw\":{\"homepage\":\"https://www.agentpmt.com/marketplace/blender-3d-modeling\"}}\n---\n# Blender 3D Modeling\n\n## Freshness\nLast updated: `2026-06-24`.\n\nIf the current date is more than 7 days after the last updated date, reinstall this skill from skills.sh or ClawHub before relying on endpoints, schemas, setup steps, or examples.\n\n## What This Tool Does\nFull access to Blender, the industry-standard open-source 3D creation suite, running headless in the cloud. Render stunning images and turntable videos from any 3D model, convert between file formats (BLEND, GLB, FBX, OBJ, STL, DAE, PLY), set up professional studio lighting, and run custom Blender Python scripts — all without installing anything locally. Upload your 3D models and get back production-quality renders, spinning animations, processed assets, and Blender project files. Choose from four lighting presets (studio, product, outdoor, dramatic), render from multiple camera angles at once, or position the camera exactly where you want it. Perfect for game development asset previews, product visualization, architectural walkthroughs, e-commerce 3D photography, 3D printing prep, portfolio showcases, and creative projects of any kind.\n\n## Product Instructions\n### Blender 3D Modeling\n\nFull access to Blender, the industry-standard 3D creation suite, running headless in the cloud. Render images and videos from 3D models, convert between file formats, and run custom Blender Python scripts.\n\n#### How It Works\n\nRender actions (`render_turntable`, `render_views`, `render_custom`, `run_script`, `check_printability`, `fix_printability`, `voxel_remesh`, `slice_for_printing`) run **asynchronously**. They return immediately with a `task_id` and `status: \"processing\"`. The render runs in the background. Use `get_task` to check progress and retrieve download links when complete.\n\n`convert_format` runs **synchronously** and returns the converted file immediately (typically under 5 seconds).\n\nThe GPU runs one render at a time. When you submit while another job is in flight, your request joins a strict-FIFO queue and `get_task` returns three additional fields so you can plan around the wait:\n\n- `queue_position` — `0` while running, otherwise the 1-based slot in line.\n- `queue_eta_seconds` — best-guess seconds until the job is dequeued.\n- `queue_stats` — `{queue_total_running, queue_total_queued, queue_total_capacity}`.\n\nA submitted task that you no longer need can be cancelled with `cancel_task`. Cancellation works whether the task is still queued or actively rendering — see the action's docs for the contract.\n\n#### Quick Start For Agents\n\nUse this decision flow when choosing an action:\n\n1. Need a spinning preview video of an existing model: call `render_turntable`.\n2. Need front/top/side/3quarter still images of an existing model: call `render_views`.\n3. Need one specific camera angle: call `render_custom`.\n4. Need to change model file format, including exporting a native `.blend` file: call `convert_format`.\n5. Need to know if a model is 3D-printable: call `check_printability`.\n6. Need a light-touch cleaned export of a *mostly-clean* model (CAD output, hand-modeled mesh with a few stray non-manifolds): call `fix_printability`.\n7. Need to repair a *structurally-broken* organic model (3D-modeled / sculpted shapes with overlapping geometry, photogrammetry exports, self-intersecting Boolean unions, inverted-normal regions, dense multi-shell tessellation): call `voxel_remesh`.\n8. Need to slice a model and get print time / filament estimates: call `slice_for_printing`.\n9. Need to create or modify geometry/materials/lighting with Blender Python, render custom media, or save several files: call `run_script`.\n10. Need the result from an async action: call `get_task` with the returned `task_id`.\n11. Need recent work history: call `list_tasks`.\n12. Need to abort a queued or running task: call `cancel_task` with the `task_id`.\n\nFor any action that accepts a model, provide exactly one model source:\n- `file_id` when the model is already in AgentPMT file storage.\n- `file_url` when the model is available at a public HTTPS URL.\n\nDo not invent file IDs. If the user only has a local path, first upload it through the platform file manager or ask the user to provide an accessible file URL.\n\n#### Async Task Pattern\n\n`render_turntable`, `render_views`, `render_custom`, `run_script`, `check_printability`, `fix_printability`, `voxel_remesh`, and `slice_for_printing` return a task immediately. Always follow this pattern:\n\n1. Call the async action.\n2. Save the returned `task_id`.\n3. Poll `get_task` until `status` is `completed` or `failed`.\n4. When completed, read the returned `outputs` array and give the user the `signed_url`, `file_id`, `filename`, and `size_bytes`.\n5. If still processing, wait and poll again. Do not assume failure just because the first response has no file links.\n\n`convert_format` is the exception: it returns the converted file directly in the first response. If the queue is full it returns HTTP 429 with `error_code: \"GPU_RENDER_QUEUE_FULL\"` and a `Retry-After` hint; back off and retry.\n\nYou may abort a task you submitted with `cancel_task` (queued or running). The task transitions to `status: \"failed\"` with `error_code: \"GPU_RENDER_TASK_CANCELED\"` once the SIGTERM grace window closes (≤30 seconds for a running render, immediate for a queued one).\n\n#### Queue and Capacity\n\n- The GPU serves one render at a time. Submissions queue strictly in arrival order — there is **no per-budget reordering** or fair-share. Visibility (`queue_position`, `queue_eta_seconds`) is the fairness mechanism.\n- Maximum queue depth is **50**. A submission past that limit returns HTTP 429 with body `{\"success\": false, \"output\": {\"error\": \"...\", \"error_code\": \"GPU_RENDER_QUEUE_FULL\"}}` and a `Retry-After` header. Wait the suggested interval and retry.\n- Container restarts: if a job was processing when the container restarted, `get_task` returns `status: \"failed\"` with `error_code: \"GPU_RENDER_CONTAINER_RESTARTED\"`. Resubmit the request.\n\n#### Memory Limits\n\nEach render runs under a kernel-enforced memory cap and an additional container-level backstop:\n\n- Per-subprocess: **12 GiB**. A render that allocates beyond this fails fast with `error_code: \"BLENDER_SUBPROCESS_MEMORY_LIMIT\"`.\n- Per-container: **14 GiB hard cap** (catastrophic backstop only — the per-subprocess cap fires first).\n- `voxel_remesh` rejects requests whose grid cell count exceeds **5,000,000** with `error_code: \"BLENDER_VOXEL_GRID_TOO_LARGE\"`. The error message includes the minimum-safe `voxel_size`. For a 150 mm bbox the minimum-safe value is ≈ 0.31 mm; smaller voxels make the grid blow up cubically.\n- `run_script` rejects payloads larger than **64 KiB** with `error_code: \"BLENDER_RUN_SCRIPT_TOO_LARGE\"`. Reach for `convert_format` or `render_views` if the script is just orchestrating a few API calls.\n\n#### Input And Output Rules\n\nSupported model inputs for standard render/convert actions are BLEND, GLB, GLTF, FBX, OBJ, STL, DAE, and PLY.\n\nSupported `convert_format` outputs are `blend`, `glb`, `fbx`, `obj`, `stl`, `dae`, and `ply`.\n\n`fix_printability` re-exports the cleaned mesh and supports a smaller subset (`stl`, `glb`, `obj`, `ply`) — formats designed for 3D-printing pipelines.\n\n`slice_for_printing` accepts the same model inputs as the renderers and returns a `.gcode` file plus a Blender-rendered \"model on the printbed\" preview PNG with the print-time and filament numbers overlaid.\n\nFor `run_script`, any files saved directly inside `OUTPUT_DIR` are uploaded automatically. Use `output_type` to tell the tool what files to return:\n- `image` returns image outputs such as `.png`, `.jpg`, `.jpeg`, and `.webp`.\n- `video` returns video outputs such as `.mp4`, `.mov`, and `.webm`.\n- `model` returns model outputs such as `.blend`, `.glb`, `.gltf`, `.fbx`, `.obj`, `.stl`, `.dae`, `.ply`, and `.usdz`.\n- `all` returns every regular file written to `OUTPUT_DIR`.\n\nIf `output_type` does not match the files your script writes, the task can complete with skipped files. For example, set `output_type: \"model\"` when saving a `.blend` file and `output_type: \"video\"` when writing an `.mp4`.\n\nBlender project files are returned as generic binary downloads for broad client compatibility. They still use the `.blend` filename extension.\n\n#### Render Quality And Framing\n\nThe standard render actions automatically center and scale models for consistent framing. Leave `camera_distance` unset unless the user explicitly asks for a manual distance.\n\nUse these defaults for reliable results:\n- Product-style previews: `lighting_preset: \"product\"`, `background_color: \"ffffff\"`, `fit_margin: 1.35` to `1.6`, `camera_lens_mm: 28` to `35`.\n- General studio previews: `lighting_preset: \"studio\"`, default background, default framing.\n- Fast draft previews: out-of-the-box defaults are tuned for this — `resolution: \"720p\"`, `samples: 8`, with 12-24 turntable frames for a quick spin.\n- Higher quality stills: opt in with `resolution: \"1080p\"` or `2k` and `samples: 32` to `128`. Hero marketing renders may use `samples: 128+`.\n\nFor turntables, slower and smoother videos use more frames and longer duration. A useful default is 24 frames over 6 seconds for a quick review, or 72-96 frames over 6-8 seconds for smoother presentation.\n\nThe service renders with Cycles on an NVIDIA L4 GPU in production (Cloud Run); local dev falls back to CPU when no GPU is attached. Very large `samples` × `resolution` × `frames` combinations will still hit the per-action timeout cap even on GPU; choose the fast defaults for previews and only opt in to higher quality when the output justifies the wait. For very heavy STL imports, `decimate_ratio` lowers polygon count before rendering and is the right control to reach for instead of dropping resolution.\n\n#### Printability QA\n\n`check_printability` and `fix_printability` use Blender's `object_print3d_utils` addon to surface the geometric problems an FFF/FDM printer slicer cannot recover from.\n\nThe single contract for `summary.is_printable`:\n\n> A model is printable iff it has no non-manifold edges, no non-manifold vertices, no self-intersecting faces, and no degenerate faces or edges.\n\nDistorted faces, thin walls (below `thickness_min_mm`), and steep overhangs (above `overhang_angle_deg`) are all reported as `warning_count` rather than blockers — they are slicer-tunable and printer-dependent (an SLA printer can print steeper overhangs than an FDM printer; supports usually rescue most overhangs anyway).\n\n##### Choosing between `fix_printability` and `voxel_remesh`\n\nBoth repair actions produce a printable export. They use different techniques and have different trade-offs — pick based on the *severity* of the input's issues:\n\n- **`fix_printability`** runs Blender's lightweight clean operators (clean-non-manifold, clean-distorted). Preserves fine surface detail. The right tool when `check_printability` reports a small number of issues (dozens to a few hundred), typically from CAD exports or hand-modeled meshes with a few stray non-manifolds. If the input is structurally broken, this action's clean operators can actually make the metrics worse.\n- **`voxel_remesh`** rebuilds the entire mesh from a uniform voxel grid via OpenVDB. Guaranteed manifold output. Loses sub-voxel surface detail (smooths fine grooves, embossed text smaller than the voxel size). The right tool for organic 3D-modeled / sculpted shapes, photogrammetry exports, self-intersecting Boolean unions, inverted-normal regions, and dense multi-shell tessellation problems. Typically the only thing that fixes Meshy / sculpting / photogrammetry output. The auto-scaled voxel size keeps tentacle-class silhouette features intact on a normal-sized print.\n\nA reasonable default workflow: call `check_printability` first; if `summary.issue_count` is in the dozens or low hundreds, try `fix_printability`. If it's in the thousands, go straight to `voxel_remesh`.\n\n#### Slicing\n\n`slice_for_printing` ships one bundled printer profile, `prusa_mk4_pla_020`, an Original Prusa MK4 with the 0.4mm nozzle, Generic PLA filament, and the 0.20mm QUALITY print profile (250 × 210 mm bed, 0.2mm layers, 15% infill, no supports). The override fields (`layer_height_mm`, `infill_density_pct`, `support_material`) apply on top of that profile per call. The action returns:\n\n- `model.gcode` — the actual G-code that a printer can stream from.\n- `slice_preview.png` — a Blender-rendered image showing the model resting on a printbed-sized plane in roughly PrusaSlicer's default 3D-view orientation, with print-time / filament / layer / profile-name lines overlaid in the bottom-right corner. This is a wayfinding visual, not a hero render.\n- `metadata` — the parsed time / filament / layer-count fields lifted directly out of the slicer's gcode comment block.\n\n#### Security And Script Safety\n\nBlender starts with Python auto-execution disabled when loading files, including user-provided `.blend` inputs.\n\n`run_script` executes the script in Blender, so keep scripts scoped to the requested task. Save only intended outputs into `OUTPUT_DIR`. Do not assume application source files, credentials, or other task working directories are available.\n\n#### Actions\n\n##### render_turntable\n\nGenerate a spinning turntable video of a 3D model with professional lighting. Returns a task_id immediately.\n\n**Required fields:**\n- `file_url` or `file_id` — the 3D model (BLEND, GLB, FBX, OBJ, STL, DAE, PLY)\n\n**Optional fields:**\n- `frames` (int, 12-120, default 72) — number of animation frames\n- `duration_seconds` (float, 1-30, default 6) — video length in seconds\n- `resolution` (string, default \"720p\") — 720p, 1080p, 2k, 4k, or custom WxH. Raise to 1080p or higher for hero output; the default is tuned for fast previews.\n- `samples` (int, 1-512, default 8) — render quality (higher = better but slower). Raise to 32-64 for hero stills, 128+ for marketing renders.\n- `background_color` (hex string without #, default \"1a1a1a\") — background color\n- `lighting_preset` (string, default \"studio\") — studio, product, outdoor, dramatic\n- `elevation` (float, -45 to 90, default 25) — camera elevation angle in degrees\n- `camera_distance` (float, optional) — explicit camera distance; omit for automatic full-object framing\n- `camera_lens_mm` (float, 10-120, default 35) — focal length in mm; lower is wider\n- `fit_margin` (float, 1-3, default 1.25) — auto-framing padding; higher leaves more space around the model\n- `decimate_ratio` (float, 0.05-1.0, optional) — polygon-reduction ratio applied before rendering. 0.5 keeps half the faces, 0.2 keeps a fifth, omit (or 1.0) for full fidelity. Use for very heavy STL imports of organic / 3D-print geometry where preview-quality renders are acceptable.\n\n**Example — basic turntable:**\n```json\n{\"action\": \"render_turntable\", \"file_url\": \"https://example.com/model.glb\"}\n```\n\n---\n\n##### render_views\n\nRender the model from multiple preset camera angles and return individual images. Returns a task_id immediately.\n\n**Required fields:**\n- `file_url` or `file_id`\n\n**Optional fields:**\n- `views` (array of strings) — front, back, left, right, top, bottom, 3quarter. Default: front, back, left, right, top, 3quarter.\n- `resolution`, `samples`, `background_color`, `lighting_preset` — same as render_turntable\n- `camera_distance`, `camera_lens_mm`, `fit_margin`, `decimate_ratio` — same as render_turntable\n\n---\n\n##### render_custom\n\nRender with a custom camera position, target, and field of view. Returns a task_id immediately.\n\n**Required fields:**\n- `file_url` or `file_id`\n\n**Optional fields:**\n- `camera_position` (array [x, y, z], default [3, -3, 2.5])\n- `look_at` (array [x, y, z], default [0, 0, 0])\n- `fov` (float, 10-120, default 50)\n- `resolution`, `samples`, `background_color`, `lighting_preset`\n\n---\n\n##### convert_format\n\nConvert a 3D model between file formats. Runs **synchronously**.\n\n**Required fields:**\n- `file_url` or `file_id`\n- `output_format` (string) — blend, glb, fbx, obj, stl, dae, ply\n\n**Optional fields:**\n- `apply_transforms` (boolean, default true) — ignored for `blend` output.\n\nIf the queue is full, returns HTTP 429 with `error_code: \"GPU_RENDER_QUEUE_FULL\"` and a `Retry-After` header.\n\n---\n\n##### check_printability\n\nRun a structured 3D-printability analysis using `object_print3d_utils`. Read-only — no upload, no mesh mutation.\n\n**Required:** `file_url` or `file_id`.\n\n**Optional:** `checks` (subset of solid/intersect/degenerate/distort/thick/overhang), `thickness_min_mm`, `overhang_angle_deg`, `distort_angle_deg`.\n\n---\n\n##### fix_printability\n\nLight-touch repair using the addon's clean operators. Preserves fine surface detail. Use `voxel_remesh` for structurally-broken inputs.\n\n**Required:** `file_url` or `file_id`, `output_format` (`stl`, `glb`, `obj`, `ply`).\n\n**Optional:** `auto_fix_non_manifold` (default true), `auto_fix_distorted` (default true), `checks`, `thickness_min_mm`, `overhang_angle_deg`, `distort_angle_deg`.\n\n---\n\n##### voxel_remesh\n\nRebuild a model into a watertight manifold via OpenVDB voxel remesh. The right tool for structurally-broken inputs. Output is guaranteed manifold; surface detail smaller than the voxel size is smoothed away.\n\n**Required:** `file_url` or `file_id`, `output_format` (`stl`, `glb`, `obj`, `ply`).\n\n**Optional:** `voxel_size` (float, 0.01–100.0; omit to auto-scale to ~1.3% of the longest bounding-box dimension).\n\nPre-flight rejects requests whose grid cell count exceeds 5,000,000 with `error_code: \"BLENDER_VOXEL_GRID_TOO_LARGE\"` — the error message includes the minimum-safe `voxel_size` for the input.\n\n---\n\n##### slice_for_printing\n\nSlice a model with PrusaSlicer's headless CLI against a bundled printer profile. Returns the gcode, a Blender-rendered \"model on the printbed\" preview PNG, and parsed metadata.\n\n**Required:** `file_url` or `file_id`.\n\n**Optional:** `printer_profile` (default `prusa_mk4_pla_020`), `layer_height_mm`, `infill_density_pct`, `support_material`.\n\n---\n\n##### run_script\n\nExecute a custom Blender Python script. Returns a task_id immediately.\n\n**Required:** `script` (string).\n\n**Optional:** `file_url` or `file_id` (sets MODEL_PATH), `output_type` (image/video/model/all, default image), `script_timeout_seconds` (600-1800).\n\n**Available in the script:** `bpy`, `MODEL_PATH`, `OUTPUT_DIR`. Save output files to `OUTPUT_DIR` for automatic upload.\n\nScript payloads are limited to 64 KiB; oversize requests fail with `error_code: \"BLENDER_RUN_SCRIPT_TOO_LARGE\"`.\n\n---\n\n##### get_task\n\nCheck the status of a render task and retrieve download links when complete.\n\n**Required:** `task_id`.\n\nNon-terminal responses include `queue_position` (0 when running, 1+ when queued), `queue_eta_seconds` (best-guess wait), and `queue_stats` (running/queued/capacity counters). All three are omitted on terminal records.\n\n**Response when processing:**\n```json\n{\"action\": \"get_task\", \"task_id\": \"...\", \"status\": \"processing\", \"progress\": 45, \"queue_position\": 0, \"queue_eta_seconds\": 60, \"queue_stats\": {\"queue_total_running\": 1, \"queue_total_queued\": 2, \"queue_total_capacity\": 50}}\n```\n\n**Response when failed (cancelled):**\n```json\n{\"action\": \"get_task\", \"task_id\": \"...\", \"status\": \"failed\", \"error\": \"Task canceled by caller.\", \"error_code\": \"GPU_RENDER_TASK_CANCELED\"}\n```\n\n**Response when failed (container restart):**\n```json\n{\"action\": \"get_task\", \"task_id\": \"...\", \"status\": \"failed\", \"error\": \"Container restarted before this task could complete.\", \"error_code\": \"GPU_RENDER_CONTAINER_RESTARTED\"}\n```\n\n---\n\n##### cancel_task\n\nCancel a queued or running task. Idempotent.\n\n**Required:** `task_id`.\n\n**Response (success):**\n```json\n{\"action\": \"cancel_task\", \"task_id\": \"...\", \"cancel_outcome\": \"queued_or_running_canceled\"}\n```\n\nThe task itself transitions to `status: \"failed\"` with `error_code: \"GPU_RENDER_TASK_CANCELED\"` once the SIGTERM grace window closes (≤30 seconds for a running render, immediate for a queued one). Poll `get_task` to confirm the terminal state.\n\n---\n\n##### list_tasks\n\nList all render tasks for the current user, most recent first.\n\n**Optional:** `limit` (1-100, default 20).\n\n#### Lighting Presets\n\n| Preset | Description | Best For |\n|--------|-------------|----------|\n| studio | 3-point lighting (key, fill, rim). Neutral white. | Product shots, portfolio |\n| product | Large soft overhead with bottom fill. | E-commerce, catalogs |\n| outdoor | Sun lamp with ambient sky fill. | Architectural, outdoor |\n| dramatic | Single hard spotlight from the side. | Character models, cinematic |\n\n#### Notes\n\n- Models are automatically centered and scaled for consistent framing across render actions.\n- Blender runs with Python auto-execution disabled when loading files.\n- Turntable videos are rendered as PNG frames then stitched to H.264 MP4 via ffmpeg.\n- Cycles is the default render engine; runs on GPU when available, falls back to CPU automatically.\n- The `object_print3d_utils` addon is enabled at runtime for `check_printability` / `fix_printability`.\n- `voxel_remesh` uses Blender's OpenVDB-backed voxel remesher.\n- `slice_for_printing` ships PrusaSlicer 2.x with one bundled MK4 PLA profile.\n- Output files are stored for 7 days via signed URLs.\n- Each Blender subprocess runs under an auto-scaled timeout — floor 10 minutes (600s), capped at 30 minutes (1800s).\n- The render queue is strict-FIFO with capacity 50; a full queue returns HTTP 429 with `error_code: \"GPU_RENDER_QUEUE_FULL\"` and a `Retry-After` header.\n- Per-subprocess memory cap is 12 GiB; per-container backstop is 14 GiB.\n\n## When To Use\n- Use this skill for `Blender 3D Modeling` on AgentPMT.\n- Use it when an agent needs this specific tool's behavior, schema, inputs, outputs, and invocation shape.\n- Search and activation keywords: blender 3d modeling, render turntable videos of 3d models for game asset previews, create multi angle product shots from 3d models for e commerce, convert 3d files between formats like glb to blend, glb to fbx, cancel task, task id, check printability.\n- Supported action names: `cancel_task`, `check_printability`, `convert_format`, `fix_printability`, `get_task`, `list_tasks`, `render_custom`, `render_turntable`, `render_views`, `run_script`, `slice_for_printing`, `voxel_remesh`.\n\n## Use Cases\n- Render turntable videos of 3D models for game asset previews\n- Create multi-angle product shots from 3D models for e-commerce\n- Convert 3D files between formats like GLB to BLEND\n- GLB to FBX\n- or OBJ to STL\n- Save procedurally generated scenes as Blender .blend files\n- Generate professional renders with studio lighting for portfolios\n- Preview 3D-printed models from every angle before printing\n- Render architectural models with custom camera positions\n- Create spinning animations of characters or props for social media\n- Apply dramatic lighting to 3D models for cinematic presentations\n- Run custom Blender Python scripts for advanced 3D processing\n- Render 3D models generated by AI tools like Meshy with proper textures and lighting\n- Convert game assets between Unity FBX and web GLB formats\n- Generate thumbnail images of 3D models for catalogs and marketplaces\n\n## Related Product Skills\n- File Management: ../file-management (ClawHub: `file-management`, page: https://clawhub.ai/agentpmt/file-management; skills.sh: `npx skills add AgentPMT/agent-skills --skill file-management`)\n\n## Categories And Industries\nNo categories or industry tags are published for this tool.\n\n## Actions And Schema\nComplete generated action schema: `./schema.md`.\nSupported action count: `12`.\nx402 availability: not enabled for this product.\n\n- `cancel_task` (action slug: `cancel-task`): Cancel a queued or running render task. Idempotent: cancelling an already-terminal task returns an error explaining that. Queued tasks transition immediately; running tasks transition once the SIGTERM grace window closes (≤30s). The task ends with status='failed' and error_code='GPU_RENDER_TASK_CANCELED'. Poll get_task to confirm the terminal state. Price: `25` credits. Parameters: `task_id`.\n- `check_printability` (action slug: `check-printability`): Run a structured 3D-printability analysis using Blender's object_print3d_utils addon. Read-only — no upload, no mesh mutation. Returns a task_id immediately. Price: `25` credits. Parameters: `checks`, `distort_angle_deg`, `file_id`, `file_url`, `overhang_angle_deg`, `thickness_min_mm`.\n- `convert_format` (action slug: `convert-format`): Convert a 3D model between file formats. Runs synchronously through the queue; if the queue is full, returns 429 with error_code GPU_RENDER_QUEUE_FULL. Price: `25` credits. Parameters: `apply_transforms`, `file_id`, `file_url`, `output_format`.\n- `fix_printability` (action slug: `fix-printability`): Light-touch repair using Blender's object_print3d_utils clean operators. For mostly-clean inputs (CAD exports, few stray non-manifolds). Use voxel_remesh for structurally-broken inputs. Price: `25` credits. Parameters: `auto_fix_distorted`, `auto_fix_non_manifold`, `checks`, `distort_angle_deg`, `file_id`, `file_url`, `output_format`, `overhang_angle_deg`, plus 1 more.\n- `get_task` (action slug: `get-task`): Check the status of a render task and retrieve download links when complete. Non-terminal responses include queue_position (0 when running, 1+ when queued), queue_eta_seconds, and queue_stats {queue_total_running, queue_total_queued, queue_total_capacity}. Caller-driven failures (GPU_RENDER_QUEUE_FULL, BLENDER_VOXEL_GRID_TOO_LARGE, BLENDER_RUN_SCRIPT_TOO_LARGE, GPU_RENDER_TASK_CANCELED, BLENDER_SLICER_PROFILE_INVALID) report at warning severity and are safe to retry with corrected inputs; subprocess / memory / timeout failures (GPU_RENDER_BLENDER_NONZERO_EXIT, GPU_RENDER_BLENDER_TIMEOUT, BLENDER_SUBPROCESS_MEMORY_LIMIT, GPU_RENDER_CONTAINER_RESTARTED, GPU_RENDER_UNEXPECTED_ERROR) report at error severity — retry once but escalate if it recurs. Price: `25` credits. Parameters: `task_id`.\n- `list_tasks` (action slug: `list-tasks`): List render tasks for the current user, most recent first. Price: `25` credits. Parameters: `limit`.\n- `render_custom` (action slug: `render-custom`): Render with a custom camera position. Returns a task_id immediately. Joins the strict-FIFO render queue. Price: `25` credits. Parameters: `background_color`, `camera_position`, `decimate_ratio`, `file_id`, `file_url`, `fov`, `lighting_preset`, `look_at`, plus 2 more.\n- `render_turntable` (action slug: `render-turntable`): Generate a spinning turntable video of a 3D model. Returns a task_id immediately; use get_task to check progress and retrieve the output. Joins the strict-FIFO render queue (capacity 50); if the queue is full, returns a 429 with error_code GPU_RENDER_QUEUE_FULL and a Retry-After header. Price: `25` credits. Parameters: `background_color`, `camera_distance`, `camera_lens_mm`, `decimate_ratio`, `duration_seconds`, `elevation`, `file_id`, `file_url`, plus 5 more.\n- `render_views` (action slug: `render-views`): Render preset camera angles. Returns a task_id immediately. Joins the strict-FIFO render queue. Price: `25` credits. Parameters: `background_color`, `camera_distance`, `camera_lens_mm`, `decimate_ratio`, `file_id`, `file_url`, `fit_margin`, `lighting_preset`, plus 3 more.\n- `run_script` (action slug: `run-script`): Execute a custom Blender Python script. Returns a task_id immediately. Script payload limited to 65,536 bytes — oversize requests fail with error_code BLENDER_RUN_SCRIPT_TOO_LARGE. Price: `25` credits. Parameters: `file_id`, `file_url`, `output_type`, `script`, `script_timeout_seconds`.\n- `slice_for_printing` (action slug: `slice-for-printing`): Slice a 3D model with PrusaSlicer and return G-code, parsed metadata, and a Blender-rendered printbed preview PNG. Returns a task_id immediately. Price: `25` credits. Parameters: `file_id`, `file_url`, `infill_density_pct`, `layer_height_mm`, `printer_profile`, `support_material`.\n- `voxel_remesh` (action slug: `voxel-remesh`): Rebuild a model into a watertight manifold via OpenVDB voxel remesh. The right tool for structurally-broken inputs. Output is guaranteed manifold; surface detail smaller than the voxel size is smoothed away. Pre-flight rejects requests whose grid cell count exceeds 5,000,000 with error_code BLENDER_VOXEL_GRID_TOO_LARGE — the response message includes the minimum-safe voxel_size for the input, and the report context exposes bbox_x/y/z, voxel_size, cells, max_cells, and min_safe_voxel_size for runbooks. Price: `25` credits. Parameters: `file_id`, `file_url`, `output_format`, `voxel_size`.\n\n## Live Schema And Examples\nUse the compact schema above for ordinary calls. Before a new production integration, or whenever parameters, enum values, nested objects, outputs, or examples are unclear, fetch live details first.\n\n- Exact schema: call `agentpmt-tool-search-and-execution` with `action: \"get_schema\"`, and `tool_id: \"blender-3d-modeling\"`.\n- Detailed examples: call `agentpmt-tool-search-and-execution` with `action: \"get_instructions\"` and `tool_id: \"blender-3d-modeling\"`, or call this product with `action: \"get_instructions\"` when the product tool is already selected.\n- Treat returned live schema and instructions as more specific than this generated summary.\n\nMCP schema lookup through the main AgentPMT MCP server:\n\n```json\n{\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"AgentPMT-Tool-Search-and-Execution\",\n    \"arguments\": {\n      \"action\": \"get_schema\",\n      \"tool_id\": \"blender-3d-modeling\"\n    }\n  }\n}\n```\n\nFor live examples, keep the same MCP tool and use these arguments:\n\n```json\n{\n  \"action\": \"get_instructions\",\n  \"tool_id\": \"blender-3d-modeling\"\n}\n```\n\nAuthenticated AgentPMT REST schema lookup body:\n\n```json\n{\n  \"name\": \"agentpmt-tool-search-and-execution\",\n  \"parameters\": {\n    \"action\": \"get_schema\",\n    \"tool_id\": \"blender-3d-modeling\"\n  }\n}\n```\n\nAuthenticated AgentPMT REST live examples body:\n\n```json\n{\n  \"name\": \"agentpmt-tool-search-and-execution\",\n  \"parameters\": {\n    \"action\": \"get_instructions\",\n    \"tool_id\": \"blender-3d-modeling\"\n  }\n}\n```\n\n## Call This Tool\nProduct slug: `blender-3d-modeling`\n\nMarketplace page: https://www.agentpmt.com/marketplace/blender-3d-modeling\n\n- AgentPMT account route: first use `../agentpmt-account-mcp-rest-api-setup` to connect the main MCP server or REST API for an Agent Group where this tool is enabled.\n- x402 route: not enabled for this product.\n- AgentPMT overview: use `../what-is-agentpmt` for marketplace, Agent Group, workflow, MCP, REST, and payment concepts.\n\nIf those setup skills are not installed beside this product skill, use the downloads below.\n\nCore AgentPMT setup skills:\n- What AgentPMT is: ../what-is-agentpmt\n  - ClawHub page: https://clawhub.ai/agentpmt/what-is-agentpmt\n  - OpenClaw install: `openclaw skills install what-is-agentpmt`\n  - skills.sh install: `npx skills add AgentPMT/agent-skills --skill what-is-agentpmt`\n- AgentPMT account MCP/REST setup: ../agentpmt-account-mcp-rest-api-setup\n  - ClawHub page: https://clawhub.ai/agentpmt/agentpmt-account-mcp-rest-api-setup\n  - OpenClaw install: `openclaw skills install agentpmt-account-mcp-rest-api-setup`\n  - skills.sh install: `npx skills add AgentPMT/agent-skills --skill agentpmt-account-mcp-rest-api-setup`\n\nskills.sh install script:\n\n```bash\nnpx skills add AgentPMT/agent-skills --skill what-is-agentpmt\nnpx skills add AgentPMT/agent-skills --skill agentpmt-account-mcp-rest-api-setup\n```\n\nMCP call shape after the main AgentPMT MCP server is connected:\n\n```json\n{\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"Blender-3D-Modeling\",\n    \"arguments\": {\n      \"action\": \"cancel_task\",\n      \"task_id\": \"example task id\"\n    }\n  }\n}\n```\n\nUse the exact tool name returned by `tools/list`; the name above is the expected readable form.\n\nAuthenticated AgentPMT REST call body:\n\n```json\n{\n  \"name\": \"blender-3d-modeling\",\n  \"parameters\": {\n    \"action\": \"cancel_task\",\n    \"task_id\": \"example task id\"\n  }\n}\n```\n\nUse the setup skill for the account connection details before making REST calls.\n\n## Response Handling\n- Treat the returned JSON as the source of truth for this tool call.\n- If the response includes warnings or correction targets, apply them before retrying.\n- If the response includes a `passed` or success-style boolean, use it as the workflow gate.\n- If validation fails or the response shape is unclear, call `get_schema` or `get_instructions` before retrying.\n- If `cancel_task` fails, preserve the request parameters and retry only after fixing schema, auth, or payment errors.\n\n## Security\n- Do not place account secrets, wallet private keys, mnemonics, signatures, or payment headers in prompts or logs.\n- Keep tool inputs scoped to the minimum content needed for the task.\n- Use the setup skills for credential handling; this product skill only defines product-specific behavior.\n\n## AgentPMT Reference\n- What AgentPMT is: ../what-is-agentpmt (ClawHub: `what-is-agentpmt`, page: https://clawhub.ai/agentpmt/what-is-agentpmt; skills.sh: `npx skills add AgentPMT/agent-skills --skill what-is-agentpmt`)\n- AgentPMT account MCP/REST setup: ../agentpmt-account-mcp-rest-api-setup (ClawHub: `agentpmt-account-mcp-rest-api-setup`, page: https://clawhub.ai/agentpmt/agentpmt-account-mcp-rest-api-setup; skills.sh: `npx skills add AgentPMT/agent-skills --skill agentpmt-account-mcp-rest-api-setup`)\n- Marketplace product: https://www.agentpmt.com/marketplace/blender-3d-modeling\n- AgentPMT main MCP server: https://api.agentpmt.com/mcp/\n- AgentPMT REST invoke endpoint: https://api.agentpmt.com/products/purchase\n\nFile v1.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn798pfbxm62kkd2750t7vsex5819pyc\",\n  \"slug\": \"blender-3d-modeling\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1782298222042\n}\n\nFile v1.0.0:schema.md\n\n# Blender 3D Modeling Schema\n\nThis generated reference belongs to the adjacent `SKILL.md`. Use it for exact action names, action slugs, parameter summaries, sample parameters, and generated JSON parameter schemas.\n\nProduct slug: `blender-3d-modeling`\n\nx402 availability: not enabled for this product.\n\n## `cancel_task`\n\nAction slug: `cancel-task`\n\nPrice: `25` credits\n\nCancel a queued or running render task. Idempotent: cancelling an already-terminal task returns an error explaining that. Queued tasks transition immediately; running tasks transition once the SIGTERM grace window closes (≤30s). The task ends with status='failed' and error_code='GPU_RENDER_TASK_CANCELED'. Poll get_task to confirm the terminal state.\n\nParameters:\n\n| Parameter | Type | Required | Description |\n|---|---|---|---|\n| `task_id` | `string` | yes | Task ID returned from a render action. |\n\nSample parameters:\n\n```json\n{\n  \"task_id\": \"example task id\"\n}\n```\n\nGenerated JSON parameter schema:\n\n```json\n{\n  \"task_id\": {\n    \"description\": \"Task ID returned from a render action.\",\n    \"required\": true,\n    \"type\": \"string\"\n  }\n}\n```\n\n## `check_printability`\n\nAction slug: `check-printability`\n\nPrice: `25` credits\n\nRun a structured 3D-printability analysis using Blender's object_print3d_utils addon. Read-only — no upload, no mesh mutation. Returns a task_id immediately.\n\nParameters:\n\n| Parameter | Type | Required | Description |\n|---|---|---|---|\n| `checks` | `array` | no | Subset of checks to run. Default: all six. |\n| `distort_angle_deg` | `number` | no | Face-distortion angle threshold in degrees. Default: 45. |\n| `file_id` | `string` | no | AgentPMT file storage ID. |\n| `file_url` | `string` | no | Public URL of the 3D model file. |\n| `overhang_angle_deg` | `number` | no | Overhang angle threshold in degrees. Default: 45. |\n| `thickness_min_mm` | `number` | no | Wall-thickness threshold in mm. Default: 0.5. |\n\nSample parameters:\n\n```json\n{\n  \"checks\": [\n    \"solid\"\n  ],\n  \"distort_angle_deg\": 5,\n  \"file_id\": \"example file id\",\n  \"file_url\": \"https://example.com\",\n  \"overhang_angle_deg\": 10,\n  \"thickness_min_mm\": 0.05\n}\n```\n\nGenerated JSON parameter schema:\n\n```json\n{\n  \"checks\": {\n    \"description\": \"Subset of checks to run. Default: all six.\",\n    \"items\": {\n      \"enum\": [\n        \"solid\",\n        \"intersect\",\n        \"degenerate\",\n        \"distort\",\n        \"thick\",\n        \"overhang\"\n      ],\n      \"type\": \"string\"\n    },\n    \"required\": false,\n    \"type\": \"array\"\n  },\n  \"distort_angle_deg\": {\n    \"description\": \"Face-distortion angle threshold in degrees. Default: 45.\",\n    \"maximum\": 89,\n    \"minimum\": 5,\n    \"required\": false,\n    \"type\": \"number\"\n  },\n  \"file_id\": {\n    \"description\": \"AgentPMT file storage ID.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"file_url\": {\n    \"description\": \"Public URL of the 3D model file.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"overhang_angle_deg\": {\n    \"description\": \"Overhang angle threshold in degrees. Default: 45.\",\n    \"maximum\": 89,\n    \"minimum\": 10,\n    \"required\": false,\n    \"type\": \"number\"\n  },\n  \"thickness_min_mm\": {\n    \"description\": \"Wall-thickness threshold in mm. Default: 0.5.\",\n    \"maximum\": 10,\n    \"minimum\": 0.05,\n    \"required\": false,\n    \"type\": \"number\"\n  }\n}\n```\n\n## `convert_format`\n\nAction slug: `convert-format`\n\nPrice: `25` credits\n\nConvert a 3D model between file formats. Runs synchronously through the queue; if the queue is full, returns 429 with error_code GPU_RENDER_QUEUE_FULL.\n\nParameters:\n\n| Parameter | Type | Required | Description |\n|---|---|---|---|\n| `apply_transforms` | `boolean` | no | Apply transforms before export. Default: true. |\n| `file_id` | `string` | no | AgentPMT file storage ID for the source 3D model. |\n| `file_url` | `string` | no | Public URL of the source 3D model. |\n| `output_format` | `string` | yes | Target format. |\n\nSample parameters:\n\n```json\n{\n  \"apply_transforms\": true,\n  \"file_id\": \"example file id\",\n  \"file_url\": \"https://example.com\",\n  \"output_format\": \"blend\"\n}\n```\n\nGenerated JSON parameter schema:\n\n```json\n{\n  \"apply_transforms\": {\n    \"description\": \"Apply transforms before export. Default: true.\",\n    \"required\": false,\n    \"type\": \"boolean\"\n  },\n  \"file_id\": {\n    \"description\": \"AgentPMT file storage ID for the source 3D model.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"file_url\": {\n    \"description\": \"Public URL of the source 3D model.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"output_format\": {\n    \"description\": \"Target format.\",\n    \"enum\": [\n      \"blend\",\n      \"glb\",\n      \"fbx\",\n      \"obj\",\n      \"stl\",\n      \"dae\",\n      \"ply\"\n    ],\n    \"required\": true,\n    \"type\": \"string\"\n  }\n}\n```\n\n## `fix_printability`\n\nAction slug: `fix-printability`\n\nPrice: `25` credits\n\nLight-touch repair using Blender's object_print3d_utils clean operators. For mostly-clean inputs (CAD exports, few stray non-manifolds). Use voxel_remesh for structurally-broken inputs.\n\nParameters:\n\n| Parameter | Type | Required | Description |\n|---|---|---|---|\n| `auto_fix_distorted` | `boolean` | no | Run the addon's clean-distorted operator. Default: true. |\n| `auto_fix_non_manifold` | `boolean` | no | Run the addon's clean-non-manifold operator. Default: true. |\n| `checks` | `array` | no | Subset of checks to run. Default: all six. |\n| `distort_angle_deg` | `number` | no | Face-distortion angle threshold in degrees. Default: 45. |\n| `file_id` | `string` | no | AgentPMT file storage ID. |\n| `file_url` | `string` | no | Public URL of the 3D model file. |\n| `output_format` | `string` | yes | Target format for the cleaned export. |\n| `overhang_angle_deg` | `number` | no | Overhang angle threshold in degrees. Default: 45. |\n| `thickness_min_mm` | `number` | no | Wall-thickness threshold in mm. Default: 0.5. |\n\nSample parameters:\n\n```json\n{\n  \"auto_fix_distorted\": true,\n  \"auto_fix_non_manifold\": true,\n  \"checks\": [\n    \"solid\"\n  ],\n  \"distort_angle_deg\": 5,\n  \"file_id\": \"example file id\",\n  \"file_url\": \"https://example.com\",\n  \"output_format\": \"stl\",\n  \"overhang_angle_deg\": 10\n}\n```\n\nGenerated JSON parameter schema:\n\n```json\n{\n  \"auto_fix_distorted\": {\n    \"description\": \"Run the addon's clean-distorted operator. Default: true.\",\n    \"required\": false,\n    \"type\": \"boolean\"\n  },\n  \"auto_fix_non_manifold\": {\n    \"description\": \"Run the addon's clean-non-manifold operator. Default: true.\",\n    \"required\": false,\n    \"type\": \"boolean\"\n  },\n  \"checks\": {\n    \"description\": \"Subset of checks to run. Default: all six.\",\n    \"items\": {\n      \"enum\": [\n        \"solid\",\n        \"intersect\",\n        \"degenerate\",\n        \"distort\",\n        \"thick\",\n        \"overhang\"\n      ],\n      \"type\": \"string\"\n    },\n    \"required\": false,\n    \"type\": \"array\"\n  },\n  \"distort_angle_deg\": {\n    \"description\": \"Face-distortion angle threshold in degrees. Default: 45.\",\n    \"maximum\": 89,\n    \"minimum\": 5,\n    \"required\": false,\n    \"type\": \"number\"\n  },\n  \"file_id\": {\n    \"description\": \"AgentPMT file storage ID.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"file_url\": {\n    \"description\": \"Public URL of the 3D model file.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"output_format\": {\n    \"description\": \"Target format for the cleaned export.\",\n    \"enum\": [\n      \"stl\",\n      \"glb\",\n      \"obj\",\n      \"ply\"\n    ],\n    \"required\": true,\n    \"type\": \"string\"\n  },\n  \"overhang_angle_deg\": {\n    \"description\": \"Overhang angle threshold in degrees. Default: 45.\",\n    \"maximum\": 89,\n    \"minimum\": 10,\n    \"required\": false,\n    \"type\": \"number\"\n  },\n  \"thickness_min_mm\": {\n    \"description\": \"Wall-thickness threshold in mm. Default: 0.5.\",\n    \"maximum\": 10,\n    \"minimum\": 0.05,\n    \"required\": false,\n    \"type\": \"number\"\n  }\n}\n```\n\n## `get_task`\n\nAction slug: `get-task`\n\nPrice: `25` credits\n\nCheck the status of a render task and retrieve download links when complete. Non-terminal responses include queue_position (0 when running, 1+ when queued), queue_eta_seconds, and queue_stats {queue_total_running, queue_total_queued, queue_total_capacity}. Caller-driven failures (GPU_RENDER_QUEUE_FULL, BLENDER_VOXEL_GRID_TOO_LARGE, BLENDER_RUN_SCRIPT_TOO_LARGE, GPU_RENDER_TASK_CANCELED, BLENDER_SLICER_PROFILE_INVALID) report at warning severity and are safe to retry with corrected inputs; subprocess / memory / timeout failures (GPU_RENDER_BLENDER_NONZERO_EXIT, GPU_RENDER_BLENDER_TIMEOUT, BLENDER_SUBPROCESS_MEMORY_LIMIT, GPU_RENDER_CONTAINER_RESTARTED, GPU_RENDER_UNEXPECTED_ERROR) report at error severity — retry once but escalate if it recurs.\n\nParameters:\n\n| Parameter | Type | Required | Description |\n|---|---|---|---|\n| `task_id` | `string` | yes | Task ID returned from a render action. |\n\nSample parameters:\n\n```json\n{\n  \"task_id\": \"example task id\"\n}\n```\n\nGenerated JSON parameter schema:\n\n```json\n{\n  \"task_id\": {\n    \"description\": \"Task ID returned from a render action.\",\n    \"required\": true,\n    \"type\": \"string\"\n  }\n}\n```\n\n## `list_tasks`\n\nAction slug: `list-tasks`\n\nPrice: `25` credits\n\nList render tasks for the current user, most recent first.\n\nParameters:\n\n| Parameter | Type | Required | Description |\n|---|---|---|---|\n| `limit` | `integer` | no | Maximum tasks to return (1-100). Default: 20. |\n\nSample parameters:\n\n```json\n{\n  \"limit\": 1\n}\n```\n\nGenerated JSON parameter schema:\n\n```json\n{\n  \"limit\": {\n    \"description\": \"Maximum tasks to return (1-100). Default: 20.\",\n    \"maximum\": 100,\n    \"minimum\": 1,\n    \"required\": false,\n    \"type\": \"integer\"\n  }\n}\n```\n\n## `render_custom`\n\nAction slug: `render-custom`\n\nPrice: `25` credits\n\nRender with a custom camera position. Returns a task_id immediately. Joins the strict-FIFO render queue.\n\nParameters:\n\n| Parameter | Type | Required | Description |\n|---|---|---|---|\n| `background_color` | `string` | no | Background hex color without #. |\n| `camera_position` | `array` | no | Camera [x, y, z] position. Default: [3, -3, 2.5]. |\n| `decimate_ratio` | `number` | no | Optional polygon-reduction ratio (0.05-1.0). |\n| `file_id` | `string` | no | AgentPMT file storage ID. |\n| `file_url` | `string` | no | Public URL of the 3D model file. |\n| `fov` | `number` | no | Camera focal length in mm (10-120). Default: 50. |\n| `lighting_preset` | `string` | no | Lighting style. |\n| `look_at` | `array` | no | Camera look-at [x, y, z] target. Default: [0, 0, 0]. |\n| `resolution` | `string` | no | Resolution preset or WxH. |\n| `samples` | `integer` | no | Render samples. |\n\nSample parameters:\n\n```json\n{\n  \"background_color\": \"example background color\",\n  \"camera_position\": [\n    1\n  ],\n  \"decimate_ratio\": 0.05,\n  \"file_id\": \"example file id\",\n  \"file_url\": \"https://example.com\",\n  \"fov\": 10,\n  \"lighting_preset\": \"studio\",\n  \"look_at\": [\n    1\n  ]\n}\n```\n\nGenerated JSON parameter schema:\n\n```json\n{\n  \"background_color\": {\n    \"description\": \"Background hex color without #.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"camera_position\": {\n    \"description\": \"Camera [x, y, z] position. Default: [3, -3, 2.5].\",\n    \"items\": {\n      \"type\": \"number\"\n    },\n    \"required\": false,\n    \"type\": \"array\"\n  },\n  \"decimate_ratio\": {\n    \"description\": \"Optional polygon-reduction ratio (0.05-1.0).\",\n    \"maximum\": 1,\n    \"minimum\": 0.05,\n    \"required\": false,\n    \"type\": \"number\"\n  },\n  \"file_id\": {\n    \"description\": \"AgentPMT file storage ID.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"file_url\": {\n    \"description\": \"Public URL of the 3D model file.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"fov\": {\n    \"description\": \"Camera focal length in mm (10-120). Default: 50.\",\n    \"maximum\": 120,\n    \"minimum\": 10,\n    \"required\": false,\n    \"type\": \"number\"\n  },\n  \"lighting_preset\": {\n    \"description\": \"Lighting style.\",\n    \"enum\": [\n      \"studio\",\n      \"product\",\n      \"outdoor\",\n      \"dramatic\"\n    ],\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"look_at\": {\n    \"description\": \"Camera look-at [x, y, z] target. Default: [0, 0, 0].\",\n    \"items\": {\n      \"type\": \"number\"\n    },\n    \"required\": false,\n    \"type\": \"array\"\n  },\n  \"resolution\": {\n    \"description\": \"Resolution preset or WxH.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"samples\": {\n    \"description\": \"Render samples.\",\n    \"maximum\": 512,\n    \"minimum\": 1,\n    \"required\": false,\n    \"type\": \"integer\"\n  }\n}\n```\n\n## `render_turntable`\n\nAction slug: `render-turntable`\n\nPrice: `25` credits\n\nGenerate a spinning turntable video of a 3D model. Returns a task_id immediately; use get_task to check progress and retrieve the output. Joins the strict-FIFO render queue (capacity 50); if the queue is full, returns a 429 with error_code GPU_RENDER_QUEUE_FULL and a Retry-After header.\n\nParameters:\n\n| Parameter | Type | Required | Description |\n|---|---|---|---|\n| `background_color` | `string` | no | Background hex color without #. Default: 1a1a1a. |\n| `camera_distance` | `number` | no | Optional camera distance override. |\n| `camera_lens_mm` | `number` | no | Camera focal length in mm (10-120). Default: 35. |\n| `decimate_ratio` | `number` | no | Optional polygon-reduction ratio (0.05-1.0). |\n| `duration_seconds` | `number` | no | Video duration in seconds (1-30). Default: 6. |\n| `elevation` | `number` | no | Camera elevation degrees (-45 to 90). Default: 25. |\n| `file_id` | `string` | no | AgentPMT file storage ID for the 3D model. |\n| `file_url` | `string` | no | Public URL of the 3D model file (BLEND, GLB, GLTF, FBX, OBJ, STL, DAE, PLY). |\n| `fit_margin` | `number` | no | Auto-framing padding multiplier (1-3). Default: 1.25. |\n| `frames` | `integer` | no | Number of animation frames (12-120). Default: 72. |\n| `lighting_preset` | `string` | no | Lighting style. |\n| `resolution` | `string` | no | Resolution: 720p (default), 1080p, 2k, 4k, or WxH. |\n| `samples` | `integer` | no | Render samples (1-512). Default: 8. |\n\nSample parameters:\n\n```json\n{\n  \"background_color\": \"example background color\",\n  \"camera_distance\": 0.1,\n  \"camera_lens_mm\": 10,\n  \"decimate_ratio\": 0.05,\n  \"duration_seconds\": 1,\n  \"elevation\": -45,\n  \"file_id\": \"example file id\",\n  \"file_url\": \"https://example.com\"\n}\n```\n\nGenerated JSON parameter schema:\n\n```json\n{\n  \"background_color\": {\n    \"description\": \"Background hex color without #. Default: 1a1a1a.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"camera_distance\": {\n    \"description\": \"Optional camera distance override.\",\n    \"maximum\": 100,\n    \"minimum\": 0.1,\n    \"required\": false,\n    \"type\": \"number\"\n  },\n  \"camera_lens_mm\": {\n    \"description\": \"Camera focal length in mm (10-120). Default: 35.\",\n    \"maximum\": 120,\n    \"minimum\": 10,\n    \"required\": false,\n    \"type\": \"number\"\n  },\n  \"decimate_ratio\": {\n    \"description\": \"Optional polygon-reduction ratio (0.05-1.0).\",\n    \"maximum\": 1,\n    \"minimum\": 0.05,\n    \"required\": false,\n    \"type\": \"number\"\n  },\n  \"duration_seconds\": {\n    \"description\": \"Video duration in seconds (1-30). Default: 6.\",\n    \"maximum\": 30,\n    \"minimum\": 1,\n    \"required\": false,\n    \"type\": \"number\"\n  },\n  \"elevation\": {\n    \"description\": \"Camera elevation degrees (-45 to 90). Default: 25.\",\n    \"maximum\": 90,\n    \"minimum\": -45,\n    \"required\": false,\n    \"type\": \"number\"\n  },\n  \"file_id\": {\n    \"description\": \"AgentPMT file storage ID for the 3D model.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"file_url\": {\n    \"description\": \"Public URL of the 3D model file (BLEND, GLB, GLTF, FBX, OBJ, STL, DAE, PLY).\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"fit_margin\": {\n    \"description\": \"Auto-framing padding multiplier (1-3). Default: 1.25.\",\n    \"maximum\": 3,\n    \"minimum\": 1,\n    \"required\": false,\n    \"type\": \"number\"\n  },\n  \"frames\": {\n    \"description\": \"Number of animation frames (12-120). Default: 72.\",\n    \"maximum\": 120,\n    \"minimum\": 12,\n    \"required\": false,\n    \"type\": \"integer\"\n  },\n  \"lighting_preset\": {\n    \"description\": \"Lighting style.\",\n    \"enum\": [\n      \"studio\",\n      \"product\",\n      \"outdoor\",\n      \"dramatic\"\n    ],\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"resolution\": {\n    \"description\": \"Resolution: 720p (default), 1080p, 2k, 4k, or WxH.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"samples\": {\n    \"description\": \"Render samples (1-512). Default: 8.\",\n    \"maximum\": 512,\n    \"minimum\": 1,\n    \"required\": false,\n    \"type\": \"integer\"\n  }\n}\n```\n\n## `render_views`\n\nAction slug: `render-views`\n\nPrice: `25` credits\n\nRender preset camera angles. Returns a task_id immediately. Joins the strict-FIFO render queue.\n\nParameters:\n\n| Parameter | Type | Required | Description |\n|---|---|---|---|\n| `background_color` | `string` | no | Background hex color without #. Default: 1a1a1a. |\n| `camera_distance` | `number` | no | Optional camera distance override. |\n| `camera_lens_mm` | `number` | no | Camera focal length in mm (10-120). Default: 35. |\n| `decimate_ratio` | `number` | no | Optional polygon-reduction ratio (0.05-1.0). |\n| `file_id` | `string` | no | AgentPMT file storage ID. |\n| `file_url` | `string` | no | Public URL of the 3D model file. |\n| `fit_margin` | `number` | no | Auto-framing padding multiplier (1-3). Default: 1.25. |\n| `lighting_preset` | `string` | no | Lighting style. |\n| `resolution` | `string` | no | Resolution: 720p (default), 1080p, 2k, 4k, or WxH. |\n| `samples` | `integer` | no | Render samples (1-512). Default: 8. |\n| `views` | `array` | no | Views to render. Default: front, back, left, right, top, 3quarter. |\n\nSample parameters:\n\n```json\n{\n  \"background_color\": \"example background color\",\n  \"camera_distance\": 0.1,\n  \"camera_lens_mm\": 10,\n  \"decimate_ratio\": 0.05,\n  \"file_id\": \"example file id\",\n  \"file_url\": \"https://example.com\",\n  \"fit_margin\": 1,\n  \"lighting_preset\": \"studio\"\n}\n```\n\nGenerated JSON parameter schema:\n\n```json\n{\n  \"background_color\": {\n    \"description\": \"Background hex color without #. Default: 1a1a1a.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"camera_distance\": {\n    \"description\": \"Optional camera distance override.\",\n    \"maximum\": 100,\n    \"minimum\": 0.1,\n    \"required\": false,\n    \"type\": \"number\"\n  },\n  \"camera_lens_mm\": {\n    \"description\": \"Camera focal length in mm (10-120). Default: 35.\",\n    \"maximum\": 120,\n    \"minimum\": 10,\n    \"required\": false,\n    \"type\": \"number\"\n  },\n  \"decimate_ratio\": {\n    \"description\": \"Optional polygon-reduction ratio (0.05-1.0).\",\n    \"maximum\": 1,\n    \"minimum\": 0.05,\n    \"required\": false,\n    \"type\": \"number\"\n  },\n  \"file_id\": {\n    \"description\": \"AgentPMT file storage ID.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"file_url\": {\n    \"description\": \"Public URL of the 3D model file.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"fit_margin\": {\n    \"description\": \"Auto-framing padding multiplier (1-3). Default: 1.25.\",\n    \"maximum\": 3,\n    \"minimum\": 1,\n    \"required\": false,\n    \"type\": \"number\"\n  },\n  \"lighting_preset\": {\n    \"description\": \"Lighting style.\",\n    \"enum\": [\n      \"studio\",\n      \"product\",\n      \"outdoor\",\n      \"dramatic\"\n    ],\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"resolution\": {\n    \"description\": \"Resolution: 720p (default), 1080p, 2k, 4k, or WxH.\",\n    \"required\": false,\n    \"type\": \"string\"\n  },\n  \"samples\": {\n    \"description\": \"Render samples (1-512). Default: 8.\",\n    \"maximum\": 512,\n    \"minimum\": 1,\n    \"required\": false,\n    \"type\": \"integer\"\n  },\n  \"views\": {\n    \"description\": \"Views to render. Default: front, back, left, right, top, 3quarter.\",\n    \"items\": {\n      \"enum\": [\n        \"front\",\n        \"back\",\n        \"left\",\n        \"right\",\n        \"top\",\n        \"bottom\",\n        \"3quarter\"\n      ],\n      \"type\": \"string\"\n    },\n    \"required\": false,\n    \"type\": \"array\"\n  }\n}\n```\n\n## `run_script`\n\nAction slug: `run-script`\n\nPrice: `25` credits\n\nExecute a custom Blender Python script. Returns a task_id immediately. Script payload limited to 65,536 bytes —","readmeExcerpt":"Skill: blender-3d-modeling Owner: agentpmt Summary: Blender 3D Modeling: Blender 3D suite running headless in the cloud. Use when an agent needs blender 3d modeling, render turntable videos of 3d models for game asset previews, create multi angle product shots from 3d models for e commerce, convert 3d files between formats like glb to blend, glb to fbx, cancel task, task id, check printability through AgentPMT-hosted","codeSnippets":[],"executableExamples":[{"language":"json","snippet":"{\"action\": \"render_turntable\", \"file_url\": \"https://example.com/model.glb\"}"},{"language":"json","snippet":"{\"action\": \"render_turntable\", \"file_url\": \"https://example.com/model.glb\", \"frames\": 96, \"duration_seconds\": 8, \"resolution\": \"1080p\", \"samples\": 48, \"lighting_preset\": \"product\"}"},{"language":"json","snippet":"{\"action\": \"render_turntable\", \"file_id\": \"abc-123-def\", \"fit_margin\": 1.6, \"camera_lens_mm\": 28}"},{"language":"json","snippet":"{\"action\": \"render_turntable\", \"file_id\": \"abc-123-def\", \"frames\": 12, \"duration_seconds\": 2, \"resolution\": \"720p\", \"samples\": 16}"},{"language":"json","snippet":"{\"action\": \"render_turntable\", \"file_url\": \"https://example.com/character.glb\", \"lighting_preset\": \"dramatic\", \"elevation\": 10, \"background_color\": \"000000\"}"},{"language":"json","snippet":"{\"action\": \"render_views\", \"file_url\": \"https://example.com/model.glb\"}"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: blender-3d-modeling\ndescription: \"Blender 3D Modeling: Blender 3D suite running headless in the cloud. Use when an agent needs blender 3d modeling, render turntable videos of 3d models for game asset previews, create multi angle product shots from 3d models for e commerce, convert 3d files between formats like glb to blend, glb to fbx, cancel task, task id, check printability through AgentPMT-hosted remote tool calls. Discovery terms: blender 3d modeling, render turntable videos of 3d models for game asset previews.\"\nversion: 1.0.1\nhomepage: https://www.agentpmt.com/marketplace/blender-3d-modeling\ncompatibility: \"Agent instructions for AgentPMT-hosted remote tool calls. Follow this skill body for supported account, wallet, and setup routes. No local command runtime is declared.\"\nmetadata: {\"author\":\"agentpmt\",\"openclaw\":{\"homepage\":\"https://www.agentpmt.com/marketplace/blender-3d-modeling\"}}\n---\n# Blender 3D Modeling\n\n## Freshness\nLast updated: `2026-09-11`.\n\nIf the current date is more than 7 days after the last updated date, reinstall this skill from skills.sh or ClawHub before relying on endpoints, schemas, setup steps, or examples.\n\n## What This Tool Does\nFull access to Blender, the industry-standard open-source 3D creation suite, running headless in the cloud. Render stunning images and turntable videos from any 3D model, convert between file formats (BLEND, GLB, FBX, OBJ, STL, DAE, PLY), set up professional studio lighting, and run custom Blender Python scripts — all without installing anything locally. Upload your 3D models and get back production-quality renders, spinning animations, processed assets, and Blender project files. Choose from four lighting presets (studio, product, outdoor, dramatic), render from multiple camera angles at once, or position the camera exactly where you want it. Perfect for game development asset previews, product visualization, architectural walkthroughs, e-commerce 3D photography, 3D printing prep, portfolio showcases, and creative projects of any kind.\n\n## Product Instructions\n### Blender 3D Modeling\n\nFull access to Blender, the industry-standard 3D creation suite, running headless in the cloud. Render images and videos from 3D models, convert between file formats, and run custom Blender Python scripts.\n\n#### How It Works\n\nRender actions (`render_turntable`, `render_views`, `render_custom`, `run_script`, `check_printability`, `fix_printability`, `voxel_remesh`, `slice_for_printing`) run **asynchronously**. They return immediately with a `task_id` and `status: \"processing\"`. The render runs in the background. Use `get_task` to check progress and retrieve download links when complete.\n\n`convert_format` runs **synchronously** and returns the converted file immediately (typically under 5 seconds).\n\nThe GPU runs one render at a time. When you submit while another job is in flight, your request joins a strict-FIFO queue and `get_task` returns three additional fields so you can plan around the wait:\n\n- `"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn798pfbxm62kkd2750t7vsex5819pyc\",\n  \"slug\": \"blender-3d-modeling\",\n  \"version\": \"1.0.1\",\n  \"publishedAt\": 1789169892866\n}"},{"path":"schema.md","content":"# Blender 3D Modeling Schema\n\nThis generated reference belongs to the adjacent `SKILL.md`. Use it for exact action names, action slugs, parameter summaries, sample parameters, and generated JSON parameter schemas.\n\nProduct slug: `blender-3d-modeling`\n\nx402 availability: not enabled for this product.\n\n## `cancel_task`\n\nAction slug: `cancel-task`\n\nPrice: `25` credits\n\nCancel a queued or running render task. Idempotent: cancelling an already-terminal task returns an error explaining that. Queued tasks transition immediately; running tasks transition once the SIGTERM grace window closes (≤30s). The task ends with status='failed' and error_code='GPU_RENDER_TASK_CANCELED'. Poll get_task to confirm the terminal state.\n\nParameters:\n\n| Parameter | Type | Required | Description |\n|---|---|---|---|\n| `task_id` | `string` | yes | Task ID returned from a render action. |\n\nSample parameters:\n\n```json\n{\n  \"task_id\": \"example task id\"\n}\n```\n\nGenerated JSON parameter schema:\n\n```json\n{\n  \"task_id\": {\n    \"description\": \"Task ID returned from a render action.\",\n    \"required\": true,\n    \"type\": \"string\"\n  }\n}\n```\n\n## `check_printability`\n\nAction slug: `check-printability`\n\nPrice: `25` credits\n\nRun a structured 3D-printability analysis using Blender's object_print3d_utils addon. Read-only — no upload, no mesh mutation. Returns a task_id immediately.\n\nParameters:\n\n| Parameter | Type | Required | Description |\n|---|---|---|---|\n| `checks` | `array` | no | Subset of checks to run. Default: all six. |\n| `distort_angle_deg` | `number` | no | Face-distortion angle threshold in degrees. Default: 45. |\n| `file_id` | `string` | no | AgentPMT file storage ID. |\n| `file_url` | `string` | no | Public URL of the 3D model file. |\n| `overhang_angle_deg` | `number` | no | Overhang angle threshold in degrees. Default: 45. |\n| `source_units` | `string` | no | Unit basis of the input file: auto (default), mm, cm, m, in, or native. auto honors an STL header declaration, otherwise STL/OBJ/PLY are millimetres and glTF/GLB/FBX/DAE/BLEND are native. Set explicitly for a metre-valued STL with a blank header. |\n| `thickness_min_mm` | `number` | no | Wall-thickness threshold in mm. Default: 0.5. |\n\nSample parameters:\n\n```json\n{\n  \"checks\": [\n    \"solid\"\n  ],\n  \"distort_angle_deg\": 5,\n  \"file_id\": \"example file id\",\n  \"file_url\": \"https://example.com\",\n  \"overhang_angle_deg\": 10,\n  \"source_units\": \"auto\",\n  \"thickness_min_mm\": 0.05\n}\n```\n\nGenerated JSON parameter schema:\n\n```json\n{\n  \"checks\": {\n    \"description\": \"Subset of checks to run. Default: all six.\",\n    \"items\": {\n      \"enum\": [\n        \"solid\",\n        \"intersect\",\n        \"degenerate\",\n        \"distort\",\n        \"thick\",\n        \"overhang\"\n      ],\n      \"type\": \"string\"\n    },\n    \"required\": false,\n    \"type\": \"array\"\n  },\n  \"distort_angle_deg\": {\n    \"description\": \"Face-distortion angle threshold in degrees. Default: 45.\",\n    \"maximum\": 89,\n    \"minimum\": 5,\n    \"required\": false,\n    \"type\": \"number\"\n  },\n  \"file_id\": {\n   "},{"path":"skill-card.md","content":"## Description:\n\nBlender 3D Modeling gives agents instructions for using AgentPMT-hosted Blender remote tool calls to render and convert 3D models, check and repair printability, slice models for printing, manage render tasks, and run scoped Blender Python scripts.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[agentpmt](https://clawhub.ai/user/agentpmt)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and agents use this skill to invoke hosted Blender workflows for game asset previews, e-commerce product views, 3D format conversion, printability checks and repairs, slicing, and custom Blender automation.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill relies on a hosted remote Blender provider and asks agents to trust mutable live schemas and remote instructions.\n\nMitigation: Install only when AgentPMT is trusted for the workflow, verify live schemas before production use, and prefer pinned or ClawHub-reviewed setup paths for account configuration.\n\nRisk: Custom Blender Python execution can process uploaded models and create arbitrary output files within the hosted task context.\n\nMitigation: Keep scripts scoped to the requested task, avoid untrusted Blender Python, save only intended outputs, and do not include secrets, wallet material, signatures, or payment headers in prompts or logs.\n\nRisk: Large renders, voxel remeshing, and script jobs can fail or queue because of GPU capacity, memory, grid-size, payload-size, or timeout limits.\n\nMitigation: Use documented limits and response warnings to select smaller renders, larger voxel sizes, or standard actions, then poll task status and retry only after correcting inputs.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/agentpmt/skills/blender-3d-modeling)\n- [AgentPMT marketplace product](https://www.agentpmt.com/marketplace/blender-3d-modeling)\n- [Action schema](artifact/schema.md)\n- [AgentPMT account MCP/REST setup](https://clawhub.ai/agentpmt/agentpmt-account-mcp-rest-api-setup)\n- [What AgentPMT is](https://clawhub.ai/agentpmt/what-is-agentpmt)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, API calls, configuration, guidance]\n\n**Output Format:** [Markdown guidance with JSON request examples and response-handling instructions]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Remote calls may return task IDs, JSON status responses, signed download URLs, rendered images or videos, converted model files, G-code, metadata, and Blender project files.]\n\n## Skill Version(s):\n\n1.0.1 (source: frontmatter and server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1594,"uniquenessScore":44,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T21:19:26.942Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T21:19:26.942Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-12T17:59:04.537Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}