Skip to main content

Skills Reference

Skills are the atomic capabilities of the WASP agent. The LLM calls skills using XML-like syntax: <skill>skill_name(param="value")</skill>.

Capability Levels

Every skill is assigned a capability level that controls auditing, risk assessment, and rate limiting:

LevelExamplesAuditRisk CheckRate Limit
SAFEcalculate, datetime, system_infoNoNoUnlimited
MONITOREDweb_search, fetch_url, browserNoNoUnlimited
CONTROLLEDreminders, gmail, task_manager, skill_managerYesNoUnlimited
RESTRICTEDshell, python_exec, http_request, file_opsYesYesUnlimited
PRIVILEGEDself_improve, broker (Docker commands)YesYes20/hour

Built-in Skills

Web & Research

SkillCapabilityDescription
web_searchMONITOREDDuckDuckGo search, returns 5-10 results with snippets
fetch_urlMONITOREDHTTP GET with CSS selector support, 12k output cap. SSRF-protected: blocks RFC-1918, loopback, and cloud metadata endpoints.
scrapeMONITOREDExtract structured data from web pages
browserMONITOREDFull Chromium browser (click, type, screenshot, login, JS). Named sessions for persistent cookies.
browser_screenshot_full_pageMONITOREDFull-page screenshot capture via Chromium
browser_smart_navigateMONITOREDSmart navigation with auto-wait and JS rendering
browser_deep_scrapeMONITOREDDeep scrape of JS-rendered pages via browser
deep_scraperMONITOREDPlaywright/Crawlee containerized scraper — YouTube transcripts (network interception) and JS-heavy/anti-bot pages. SSRF-protected.

Browser skill actions: navigate, click, type, screenshot, capture, get_text, scroll, get_links, execute_js

Named browser sessions for persistent state:

browser(action="navigate", url="https://...", session="my_session")

deep_scraper

The deep_scraper skill runs a containerized Playwright/Chromium browser:

  • YouTube mode — intercepts the YouTube timedtext API to extract full captions without scraping the DOM
  • Generic mode — waits for networkidle to render fully JS-heavy or anti-bot pages

SSRF Protection: Before executing, resolves the hostname via getaddrinfo() and validates all A/AAAA records against RFC1918, loopback, link-local, reserved, and multicast ranges. Fails closed on any DNS resolution error.

Output format:

status: SUCCESS | PARTIAL | ERROR
type: TRANSCRIPT | DESCRIPTION | GENERIC
content:
<extracted text>

Code & System

SkillCapabilityDescription
python_execRESTRICTEDExecute Python code in subprocess sandbox, 60s timeout, 8k output
shellRESTRICTEDExecute shell commands, 60s default / 120s max timeout. Every invocation written to AuditLog with redacted command.
calculateSAFEMathematical calculations
system_infoSAFESystem information: disk usage, RAM, CPU, uptime

shell — Audit Logging (v2.6)

Every shell invocation is logged to audit_log with action="skill.shell":

  • Command is redacted before logging (strips sk-*, AIza*, xai-*, hf_*, key=value, password=value patterns)
  • Records exit code and optional goal_id context
  • Fire-and-forget via asyncio.ensure_future() — zero latency impact

File Operations

SkillCapabilityDescription
read_fileRESTRICTEDRead any file in the container
write_fileRESTRICTEDWrite any file in the container

Files accessible under /data/ (persistent volume mounts).

Communication & Calendar

SkillCapabilityDescription
gmailCONTROLLEDRead inbox, send email, search, reply
create_reminderCONTROLLEDCreate time-based reminders (fires via scheduler)
list_remindersCONTROLLEDList all active reminders for the user
delete_reminderCONTROLLEDDelete reminder by keyword match or keyword="all"
task_managerCONTROLLEDCreate/list/update/delete recurring tasks
google_calendarCONTROLLEDRead/create/update Google Calendar events

Data & APIs

SkillCapabilityDescription
http_requestRESTRICTEDHTTP GET/POST/PUT/DELETE/PATCH with custom headers. SSRF-protected.
subscribeCONTROLLEDRSS feed and price alert subscriptions
render_reportCONTROLLEDGenerate formatted reports (crypto, price tables, email digests)
extract_fieldsCONTROLLEDExtract named fields from previous skill output by path

Notes & Monitoring

SkillCapabilityDescription
create_noteCONTROLLEDCreate a note in persistent memory
search_notesCONTROLLEDSearch notes by keyword
create_monitorCONTROLLEDCreate a price or RSS monitor with threshold
list_monitorsCONTROLLEDList all active monitors
remove_monitorCONTROLLEDRemove a monitor by ID or name

Agent Management

SkillCapabilityDescription
agent_managerCONTROLLEDCreate, list, pause, resume, archive sub-agents
meta_orchestrateCONTROLLEDHigh-level orchestration across multiple agents and goals

agent_manager actions: create, list, get, pause, resume, archive

Self-Improvement

SkillCapabilityDescription
self_improvePRIVILEGEDRead, propose, apply, patch, install on own source code. Syntax-validated before write. Backup created before overwrite. Soft safety gate blocks safety-weakening edits.
skill_managerCONTROLLEDCreate, edit, toggle, delete custom Python skills at runtime

self_improve actions: read, propose, list, apply, reject, patch, install

skill_manager actions: create, list, edit, toggle, delete

self_improve — Safety (v2.6)

Before writing any Python file, the apply endpoint:

  1. Runs ast.parse(content) — rejects with HTTP 400 on SyntaxError (no file written)
  2. Creates a timestamped backup at /data/src_patches/backup_{ts}_{filename} before overwrite
  3. Passes through the Soft Safety Gate (deterministic pattern-based pre-execution check that blocks safety-weakening edits to critical source files)

Integrations

SkillCapabilityDescription
integrationCONTROLLEDInvoke any registered integration connector
openclawCONTROLLEDOpenClaw skill management and invocation

Parallel Execution

Skills can run in parallel by using <parallel> blocks:

<parallel>
<skill>web_search(query="BTC price")</skill>
<skill>web_search(query="ETH price")</skill>
<skill>fetch_url(url="https://api.coinbase.com/v2/prices/BTC-USD/spot")</skill>
</parallel>

All skills in a parallel block execute concurrently via asyncio.gather().

Custom Python Skills

Create custom skills via skill_manager:

skill_manager(
action="create",
name="my_skill",
description="Does something custom",
params="input_text,max_length",
code="
class MySkillSkill(SkillBase):
def definition(self):
return SkillDefinition(
name='my_skill',
description='Does something custom',
params=[
SkillParam(name='input_text', param_type=ParamType.STRING, required=True),
SkillParam(name='max_length', param_type=ParamType.INTEGER, required=False),
]
)

async def execute(self, input_text: str, max_length: int = 500, **kwargs) -> SkillResult:
result = input_text[:max_length]
return SkillResult(skill_name='my_skill', output=result)
"
)

Custom skills are stored in /data/skills/<slug>/skill.py and survive container restarts. They appear as python-custom in skill_manager(action="list").

Skill Registration

Skills are registered at startup in src/skills/builtin/__init__.py:

registry.register(WebSearchSkill())
registry.register(BrowserSkill())
registry.register(ShellSkill())
# ... etc

Each skill must implement SkillBase:

  • definition() → SkillDefinition — metadata, parameters, examples
  • async execute(**params) → SkillResult — execution logic

Anticipatory Simulation

Before executing RESTRICTED or PRIVILEGED skills, the agent runs an anticipatory simulation:

  • The LLM predicts the consequences of the action
  • Result appended to skill output as [ANTICIPATORY SIMULATION]:
  • Helps the agent course-correct before irreversible actions
  • Results cached in Redis for 5 minutes (identical calls avoid re-simulation)

Skill Output Format

SkillResult(
skill_name="shell",
success=True,
output="...", # Human-readable output (max varies by skill)
error=None, # Error message if failed
)