Install
openclaw skills install @xiaohao17501671450-lgtm/aholo-3dgs-recon-globalAholo OpenAPI v1 global 3D tasks (reconstruction/generation): upload, create (worldId), poll/status. Gateway api.aholo3d.com, /global/world/v1. Default one create per single intent; multiple creates allowed when user explicitly chooses separate 3DGS per video. Not for 2D.
openclaw skills install @xiaohao17501671450-lgtm/aholo-3dgs-recon-globalAholo global Open Platform (
api.aholo3d.com). Agent runsaholo_reconstruct.py; user setsAHOLO_API_KEYonly.
Use: 3D reconstruction, 3D generation, worldId status/poll, PLY/SPZ/SOG.
Do not use: 2D renders only; no 3D outcome requested.
Ambiguous requests: Clarify 2D single image vs 3D task (worldId + poll). Example: "generate a room from a reference image" → ask whether the user wants a 2D single render or a 3D task (worldId, pollable). Enter this skill only if user picks 3D.
| Item | Detail |
|---|---|
| Env | AHOLO_API_KEY — api-keys |
| Auth | Authorization: <API Key>, no Bearer |
| Create header | x-source: skills → platform OPEN_API_SKILL |
| Gateway | https://api.aholo3d.com; upload token GET /global/asset/v1/token; world tasks /global/world/v1/* |
| Viewer | https://studio.aholo3d.com/3dgs-model/{worldId} |
| Actions | create / create-reconstruction / create-generation / status / poll / list |
| Create success | WorldAsyncOperation contains worldId only |
Credits 11003 | Say insufficient credits; link www.aholo3d.com/pricing; no invented URLs; no create* retry for same video / same intent |
Missing API key: Tell user to set env and reply continue; agent runs script — do not make manual python the main path.
AHOLO_INSECURE_SKIP_VERIFY=1 (or true / yes / on) to explicitly disable verification; prefer REQUESTS_CA_BUNDLE to point at your enterprise CA.CERTIFICATE_VERIFY_FAILED, configure CA certs first; use AHOLO_INSECURE_SKIP_VERIFY only when you accept the risk.WorldAsyncOperation with worldId only.ApiError: code, message, status, details.metaData.bizCode (e.g. 10004 not authenticated, 11003 insufficient credits).| # | Rule |
|---|---|
| 0 | 2D-only → no create/status/poll from this skill |
| 7 | Unclear 3D intent → 2D/3D clarify first (§1) |
| 1–3 | Reconstruction only: need confirmed scene (model/space) + taskQuality (low/normal/high) before create; no defaults (e.g. high/model) placed on behalf of the user |
| 1–4 | Reconstruction only: the initial AskQuestion round must simultaneously include the useMask option (note: "only effective when scene=model; ignored when scene=space"); never default to false silently; never defer to a second round |
| 4 | Generation: do not ask scene/taskQuality; create when prompt/image ready |
| 8 | Image folder → use imageDir for all images; never upload a subset only |
| 11 | Multiple videos: ask before create (do not choose for user): A one 3DGS (one create, all in videoPaths); B one 3DGS per video (see #9). Only 1 video → skip question |
| 9 | Create POST (high cost) — Default: one user single 3D intent → at most one create per conversation round; no retry on same intent after fail/timeout/missing worldId unless user explicitly re-orders. Pre-upload failure (POST not sent) → one first create after fix. Charged but no worldId → task list / status/list, not another create. Multi-video B: user chose separate 3DGS → create per video (videoPaths one each), warn N tasks/charges upfront; no duplicate create for same video; failed video → no retry, continue with remaining. Use forbidCreate only to block accidental duplicate for the same completed task, not the next video in B |
| 10 | projectName only if user explicitly asks; never invent from folder name or timestamp |
| 5–6 | After each worldId → ask wait or not; if wait → sync poll (intervalSeconds=60, timeoutSeconds=14400); if not → link only. No background poll + "I'll notify you"; no poll without asking |
taskQuality display names (API values unchanged)| Value | Display |
|---|---|
low | Fast Preview (极速预览) |
normal | Standard (标准) |
high | Professional — recommended (专业,推荐) |
reconstruction vs generation.AskQuestion first — confirm scene, taskQuality, and useMask in one round (§5 table); normalize free text before confirming; do not split into two rounds.worldId; ask wait (§5 template).poll; else link only.Reconstruction — initial confirm (scene, taskQuality, useMask — one round, do not split):
Use AskQuestion with all three questions simultaneously:
| Question | Options |
|---|---|
| scene | model (object) / space (scene) |
| taskQuality | low Fast Preview / normal Standard / high Professional (recommended) |
| useMask | Enable (auto background removal, best for plain backgrounds) / Disable (keep original background, default) — only effective when scene=model; ignored when scene=space |
Multiple videos:
You provided N videos. Choose (I will not choose for you):
A) One 3DGS — one worldId
B) Separate 3DGS per video — N worldIds (N tasks, processed one video at a time)
After create:
Task created, worldId: {worldId}
View when ready: https://studio.aholo3d.com/3dgs-model/{worldId}
(Link may not be accessible until the task completes)
Wait until complete?
- wait / yes — sync poll in this session
- no — poll later or open the link yourself
videoPaths (no fixed limit) or imagePaths/imageDir (≥20 images), pick one
.mp4 / .mov → type=video; .insv (Insta360 panoramic video) → type=insv; detected automatically from extensionscene, taskQualityuseMask (boolean; auto background removal; only effective when scene=model; default false; ignored when scene=space)imageDir scans jpg/jpeg/png/webp only (excludes bmp/gif)prompt and image not both empty; no videoPaths; no scene/taskQuality| Param | Description |
|---|---|
action / workflow | see §2 actions |
imageDir | preferred for image-folder reconstruction |
videoPaths | no fixed limit; .insv auto-detected as type=insv, others as type=video |
useMask | boolean, background removal (optional; reconstruction + scene=model only; default false) |
worldId | for status / poll |
pageNum / pageSize / statusList | list pagination params |
forbidCreate | guard against accidental duplicate create for same task; do not set for next video in multi-video B |
python -u)JSON argument on a single line as the second argv. See Windows/PowerShell section below for Windows-specific rules.
# Reconstruction (image directory)
python -u .cursor/skills/aholo-3dgs-reconstruction-global/aholo_reconstruct.py '{"action":"create","workflow":"reconstruction","imageDir":"D:/images","scene":"space","taskQuality":"high"}'
# Reconstruction (Insta360 panoramic video, auto-detected as type=insv)
python -u .cursor/skills/aholo-3dgs-reconstruction-global/aholo_reconstruct.py '{"action":"create","workflow":"reconstruction","videoPaths":["D:/room.insv"],"scene":"space","taskQuality":"high"}'
# Reconstruction (with background removal)
python -u .cursor/skills/aholo-3dgs-reconstruction-global/aholo_reconstruct.py '{"action":"create","workflow":"reconstruction","videoPaths":["D:/obj.mp4"],"scene":"model","taskQuality":"normal","useMask":true}'
# Generation
python -u .cursor/skills/aholo-3dgs-reconstruction-global/aholo_reconstruct.py '{"action":"create-generation","imagePaths":["D:/seed.jpg"],"prompt":"modern minimal interior"}'
# Poll
python -u .cursor/skills/aholo-3dgs-reconstruction-global/aholo_reconstruct.py '{"action":"poll","worldId":"xxx","intervalSeconds":60,"timeoutSeconds":14400}'
# List (running + succeeded)
python -u .cursor/skills/aholo-3dgs-reconstruction-global/aholo_reconstruct.py '{"action":"list","pageNum":0,"pageSize":20,"statusList":["RUNNING","SUCCEEDED"]}'
When the user is on Windows, the agent must follow these rules:
&& chaining); use ; to separate commands, or issue one python -u ... at a time.D:/images/0001.jpg, to avoid unescaped backslash issues..cursor/skills/aholo-3dgs-reconstruction-global/.-u so create/upload/poll progress streams in real time.$env:AHOLO_API_KEY="..." then the same single-line python -u ...; agent-run is still the preferred path.API paths: GET /global/asset/v1/token · POST /global/world/v1/reconstructions · POST /global/world/v1/generations · GET /global/world/v1/{worldId} · POST /global/world/v1/list · OUS upload uses domain from token response (no /global prefix on OUS)
Terminal states: SUCCEEDED · FAILED · CANCELED · TIMEOUT · REJECTED
Output fields (after SUCCEEDED): plyPath · spzPath · lodMetaPath (LOD chunk metadata, optional) · panoUrl (AI panorama, generation only)
$env:AHOLO_API_KEY="your_api_key"
# Self-signed certs (not recommended): $env:AHOLO_INSECURE_SKIP_VERIFY="1"
# Or set CA bundle: $env:REQUESTS_CA_BUNDLE="D:/certs/corp-ca.pem"
Agent-run is preferred; user sets the key and replies continue.