Install
openclaw skills install uandai-aiUandai platform — configure API access, package OpenClaw workspace zip, upload agents, list subscriptions, invoke runs.
openclaw skills install uandai-aiBundled docs version: 2026.06.14
Use this skill for all Uandai automation: first-time setup, workspace packaging, upload, subscriptions, and invocation.
When the user sends a configure Uandai message with settings, or env vars are missing:
Parse from the user message (setup-only; do not repeat key in later work prompts):
UANDAI_API_ORIGIN — API host without /api (e.g. https://api.uandai.ai or http://127.0.0.1:8000)
APP_SITE_URL — uandai.ai web app origin (no trailing slash; e.g. https://app.uandai.ai or http://127.0.0.1:8080)
UANDAI_API_KEY — full uand_live_… from uandai.ai app → Settings → API Keys
API base URL (derived — do not store separately): {UANDAI_API_ORIGIN}/api (e.g. https://api.uandai.ai/api). Use this prefix for all programmatic paths (/v1/…).
Install the full skill folder (SKILL.md + references/) under ~/.openclaw/skills/uandai-ai/ (preferred) or <workspace>/skills/uandai-ai/ for local dev.
Merge into ~/.openclaw/openclaw.json under skills.entries.uandai-ai:
{
skills: {
entries: {
"uandai-ai": {
enabled: true,
apiKey: "uand_live_…",
env: {
UANDAI_API_KEY: "uand_live_…",
UANDAI_API_ORIGIN: "https://api.uandai.ai",
APP_SITE_URL: "https://app.uandai.ai",
},
},
},
},
}
Do not echo the full API key back. Tell the user to run /new or restart the gateway.
Optional smoke test: exchange → GET /v1/auth/me.
Security: Prefer a private OpenClaw session for setup messages that contain the key. After setup, operational prompts need no key and no doc URLs.
Read bundled reference files in this skill directory first. Do not rely on web_fetch unless the user explicitly pastes a Uandai doc URL in the current message.
| Task | Read |
|---|---|
| Package workspace zip | references/agent-packaging.md |
| Exchange, upload, invoke | references/programmatic-api.md |
Optional live refresh: if the user pastes {UANDAI_API_ORIGIN}/docs/agent-packaging or /docs/programmatic-api in chat, you may web_fetch that URL and prefer it for that session.
Default prod origins: API https://api.uandai.ai (base {ORIGIN}/api); app https://app.uandai.ai
Do not call Uandai business endpoints until all required inputs for that endpoint are known.
| Source | Examples |
|---|---|
| Env / config (setup once) | UANDAI_API_ORIGIN, APP_SITE_URL, UANDAI_API_KEY, exchanged access_token; API base = {UANDAI_API_ORIGIN}/api |
| User message (minimal ZIP upload) | agent_name, description, packaged zip |
| User message (full ZIP upload) | agent_name, description, subscription_price, default_model_identifier, provider test values |
| User message (invoke) | configs, confirm agent_id / revision_no |
| Prior API response | agent.id, revision_no from upload 201 body ({ "agent": { "id", "revision_no", … } }); activations list for invoke |
If any user-sourced field is missing or ambiguous:
Per-endpoint prerequisite tables and checklists: references/programmatic-api.md.
Stable rules (full steps in references/agent-packaging.md):
Never zip the live workspace root directly
Staging: copy to output/<agent>-workspace/ with exclusions → validate → zip staging contents only
Output: output/<agent-name>-workspace.zip
Uandai zip layout:
SOUL.md, IDENTITY.md, …) at zip rootSKILL.md only at skills/<id>/SKILL.md, workspace/skills/<id>/SKILL.md, or zip rootnode_modules/, .env, logs/, memory/, .openclaw/, output/, uandai-ai/ — max 50MBDo not include this skill in the upload zip. Install on the trainer machine at ~/.openclaw/skills/uandai-ai/ (full folder with references/). A copy under <workspace>/skills/uandai-ai/ is for local dev only — exclude it when packaging.
Report: 📍 Path: MEDIA:<path-to-zip>
Common failures: personality only under workspace/; nested wrapper folder; misplaced skill/SKILL.md; uandai-ai/ in zip (openclaw_bundle_platform_skill).
Raw API keys work only on exchange:
POST /v1/auth/token
Authorization: Bearer $UANDAI_API_KEY
Alternative on exchange only: send the raw key in header X-Uandai-Api-Key or JSON { "api_key": "…" }.
Response: { "access_token", "refresh_token", "user" } — cache in session memory.
All other calls: Authorization: Bearer <access_token>
On access expiry: POST /v1/auth/refresh. On refresh 401: re-exchange if key still active; else user creates a new key in Settings.
Do not send $UANDAI_API_KEY on upload, invoke, or list endpoints.
Upload 201 response shape: { "agent": { "id", "revision_no", "name", … } }.
Always return to the user:
agent.id — numeric agent id from the responserevision_no — current revision from the same response (needed for proposal updates and invoke){APP_SITE_URL}/training-center/agents/manage/{agent.id} where they set subscription price, invokable duration, provider LLM credentials, default model, and remaining marketplace fieldsUse APP_SITE_URL from skill env (setup above). Do not guess the app origin.
Trainer — publish end-to-end (minimal ZIP): setup → read references/agent-packaging.md → package zip → collect agent_name + description from user → exchange → POST {UANDAI_API_ORIGIN}/api/v1/agents/upload with bundle → return agent.id and revision_no from the upload response → share manage link {APP_SITE_URL}/training-center/agents/manage/{agent.id} (pricing, duration, provider LLM, model, invocation settings) → user completes there or via POST /agents/{id}/proposals → PATCH …/proposals/{id} status=submitted when ready
Trainer — full ZIP upload: collect all ZIP prerequisites from user → exchange → POST /v1/agents/upload with bundle + agent_name + description + subscription_price + default_model_identifier + provider config_data_type_json / test_values_json (Ollama: OLLAMA_KEY + OLLAMA_URL) → return agent.id, revision_no, and the same manage link
Trainer — minimal ZIP only: collect agent_name + description + packaged zip → exchange → POST /v1/agents/upload with bundle — do not block on price/model at upload time; do not use multipart files for the minimal path
Subscriber — discover: exchange → GET /v1/me/subscriptions → GET /v1/me/activations?invokable_only=true
Subscriber — invoke: exchange → GET /v1/me/activations?invokable_only=true → collect configs from user (and confirm agent_id / revision_no) → POST /v1/executions → poll GET /v1/executions/{run_id} until terminal
401: refresh → re-exchange → key may be revoked402: user needs credits