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:
| Level | Examples | Audit | Risk Check | Rate Limit |
|---|---|---|---|---|
SAFE | calculate, datetime | No | No | Unlimited |
MONITORED | web_search, fetch_url, browser | No | No | Unlimited |
CONTROLLED | reminders, gmail, task_manager | Yes | No | Unlimited |
RESTRICTED | shell, python_exec, http_request, file_ops | Yes | Yes | Unlimited |
PRIVILEGED | broker (Docker commands) | Yes | Yes | 20/hour |
Built-in Skills
Web & Research
| Skill | Capability | Description |
|---|---|---|
web_search | MONITORED | DuckDuckGo search, returns 5-10 results with snippets |
fetch_url | MONITORED | HTTP GET with CSS selector support, 12k output cap |
scrape | MONITORED | Extract structured data from web pages |
browser | MONITORED | Full Chromium browser (click, type, screenshot, login, JS) |
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")
Code & System
| Skill | Capability | Description |
|---|---|---|
python_exec | RESTRICTED | Execute Python code in subprocess, 60s timeout, 8k output |
shell | RESTRICTED | Execute shell commands, 60s default / 120s max timeout |
calculate | SAFE | Mathematical calculations |
File Operations
| Skill | Capability | Description |
|---|---|---|
read_file | RESTRICTED | Read any file in the container |
write_file | RESTRICTED | Write any file in the container |
Files accessible under /data/ (persistent volume mounts).
Communication & Calendar
| Skill | Capability | Description |
|---|---|---|
gmail | CONTROLLED | Read inbox, send email, search, reply |
create_reminder | CONTROLLED | Create time-based reminders (fires via scheduler) |
task_manager | CONTROLLED | Create/list/update/delete recurring tasks |
Data & APIs
| Skill | Capability | Description |
|---|---|---|
http_request | RESTRICTED | HTTP GET/POST/PUT/DELETE/PATCH with custom headers |
subscribe | CONTROLLED | RSS feed and price alert subscriptions |
Memory & Knowledge
| Skill | Capability | Description |
|---|---|---|
memory | CONTROLLED | Search and store in episodic/semantic memory |
knowledge_graph | CONTROLLED | Query entities and relationships |
Agent Management
| Skill | Capability | Description |
|---|---|---|
agent_manager | CONTROLLED | Create, list, pause, resume, archive sub-agents |
Actions: create, list, get, pause, resume, archive
Self-Improvement
| Skill | Capability | Description |
|---|---|---|
self_improve | PRIVILEGED | Read, propose, apply, patch, install on own source code |
skill_manager | PRIVILEGED | Create, edit, toggle, delete skills at runtime |
self_improve actions: read, propose, list, apply, reject, patch, install
skill_manager actions: create, list, edit, toggle, delete
Integrations
| Skill | Capability | Description |
|---|---|---|
integration | CONTROLLED | Invoke any registered integration connector |
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',
parameters=[
SkillParameter(name='input_text', type='string', required=True),
SkillParameter(name='max_length', type='integer', required=False),
]
)
async def execute(self, input_text: str, max_length: int = 500) -> SkillResult:
result = input_text[:max_length]
return SkillResult(output=result)
"
)
Custom skills are stored in /data/skills/<slug>/skill.py and survive container restarts.
Skill Registration
Skills are registered at startup in src/skills/builtin/__init__.py:
registry.register(WebSearchSkill())
registry.register(BrowserSkill())
registry.register(PythonExecSkill())
# ... etc
Each skill must implement SkillBase:
definition() → SkillDefinition— metadata, parameters, examplesasync 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 is appended to skill output as
[ANTICIPATORY SIMULATION]: - Helps the agent course-correct before irreversible actions
Skill Output Format
SkillResult(
output="...", # Human-readable output (max 8k chars)
error=None, # Error message if failed
metadata={}, # Optional structured data
)