Overview
Built-in Python Skills
Core skills implemented in Python:
- Time, weather, web search
- Spotify, Google Workspace (Gmail, Calendar, Drive)
- Files, reminders, learning (RAG)
- Silly GIFs, server status
backend/app/skills/Workspace Skills
User-defined skills as markdown files:
- Notes, Apple Notes, Things (macOS)
- Math, GitHub, Vercel, Notion
- Custom agents and workflows
- On-demand loading (OpenClaw-style)
workspace/skills/*/SKILL.mdSkill Loading Strategy
Asta uses OpenClaw-style on-demand skill loading to minimize context size. Only relevant skills are loaded when needed.
How On-Demand Loading Works
Available Skills List
When building context (
backend/app/context.py), Asta injects an <available_skills> block listing all enabled workspace skills with their descriptions:Model Selects Skill
The AI model reads the task and selects the most relevant skill from the available list based on the description.
Read Tool Call
The model calls
read(path="workspace/skills/notes/SKILL.md") to load the full skill instructions.- Token efficiency: Only load skills actually needed for the current task
- Scalability: Add unlimited skills without bloating context
- Flexibility: Skills can be detailed without worrying about context limits
Built-in Python Skills
Built-in skills are intent-based and automatically triggered when relevant.- Core Skills
- Integrations
- Utilities
Time (backend/app/skills/time.py)
When triggered:- “what time is it”
- “current time”
- “time in Tokyo”
- Gets current time in user’s timezone
- Formats in 12-hour AM/PM format
- Uses location from
user_locationtable orworkspace/USER.md
Weather (backend/app/skills/weather.py)
When triggered:- “what’s the weather”
- “weather tomorrow”
- “will it rain”
- Fetches weather from Open-Meteo API
- Today and tomorrow forecast
- Uses geocoded location with normalization
Web Search (backend/app/skills/web.py)
When triggered:- “search for”
- “look up”
- “what’s the latest on”
- DuckDuckGo search (no API key required)
- Returns top results with snippets
- Prioritizes RAG knowledge first if available
Workspace Skills (SKILL.md)
Workspace skills are markdown files with YAML frontmatter and instructions.Skill File Structure
Frontmatter Fields
Internal skill identifier (matches folder name)
Brief description shown to the AI when listing available skills. Should clearly indicate when the skill is relevant.
Emoji icon for the skill (displayed in UI)
Allowed operating systems:
["darwin", "linux", "windows"]If specified, skill is only available on matching OS.Required executable binaries (e.g.,
["memo", "jq"])- Automatically added to exec allowlist when skill is enabled
- Skill hidden if binaries not found in PATH
Set to
true for named agent skills (see Named Agents)Default AI model for this skill/agent (e.g.,
claude-3-5-sonnet)Default thinking level:
off|minimal|low|medium|high|xhighExample: Notes Skill
workspace/skills/notes/SKILL.md
workspace/skills/notes/SKILL.md
Example: Apple Notes Skill (macOS-only)
workspace/skills/apple-notes/SKILL.md
workspace/skills/apple-notes/SKILL.md
YAML Frontmatter:Skill Content:Access Apple Notes on macOS using the Commands:List all notes:Search notes:Read specific note:Example flow:User: “check my notes for meeting notes”
memo CLI.When to use:- User asks: “check my Apple Notes”, “what’s in Notes app”, “memo notes”
- User mentions looking for a note in Apple Notes
- Call:
exec(command="memo notes -s 'meeting'") - Parse the output (list of matching notes)
- Call:
exec(command="memo read <id>")for relevant notes - Return formatted results
Host OS Gating
Skills can be restricted to specific operating systems using themetadata.clawdbot.os field.
Implementation (backend/app/workspace.py):
apple-notes- macOS only (requires Apple Notes app)things-mac- macOS only (Things app)notion- All platformsnotes- macOS and Linux only
Required Binaries
Skills can declare required executables that must be present in PATH.Binary Resolution
Asta searches for binaries in:
- Standard PATH
/opt/homebrew/bin(Homebrew on Apple Silicon)/usr/local/bin(Homebrew on Intel)~/.local/bin(User binaries)
Auto-Allowlist
When the skill is enabled:
- Required binaries are added to exec allowlist
- Asta can call them via the exec tool
- No need to manually configure allowlist
Named Agents
Workspace skills can be marked as agents - specialized AI behaviors with custom instructions.What are Named Agents?
Named agents are workspace skills with
is_agent: true in frontmatter. They appear in the Agents API and can have custom models and thinking levels.Creating a Named Agent
Agent-specific features:- Custom model selection per agent
- Per-agent thinking levels
- Agents can spawn subagents for multi-step workflows
- API endpoints for agent management (
backend/app/routers/agents.py)
Skill Management
Enabling/Disabling Skills
- Desktop App
- API
- Database
- Open Settings (gear icon)
- Go to Skills tab
- Toggle switches for each skill
- Built-in skills show with Python icon
- Workspace skills show with folder icon
Creating Custom Skills
Test the Skill
- Restart Asta or reload skills
- Enable in Settings → Skills
- Test with relevant query
- Check
backend/backend.logfor skill loading
Skill Execution Flow
Best Practices
Clear Descriptions
Write descriptions that clearly indicate when the skill should be used:✅ Good: “Use when user says ‘note that’, ‘save this’, or ‘write that down’”❌ Bad: “Handles notes”
Concrete Examples
Include real tool call examples in SKILL.md:
Error Guidance
Tell the AI how to handle common errors:“If exec returns ‘command not found’, tell user to install memo via Homebrew.”
Context-Aware
Reference available tools and context:“Use the exec tool with command=‘memo notes -s query’ to search Apple Notes.”
Troubleshooting
Skill not appearing in available_skills
Skill not appearing in available_skills
Possible causes:
- Skill is disabled in Settings → Skills
- Invalid YAML frontmatter (syntax error)
- OS restriction (skill requires macOS, running on Linux)
- Missing required binaries
- SKILL.md not found in correct location
AI not using the skill correctly
AI not using the skill correctly
Improvements:
- Make description more specific and trigger-focused
- Add more concrete examples
- Include expected input/output format
- Specify exact tool call syntax
- Add common mistake warnings
- Enable only that skill to isolate behavior
- Use exact trigger phrases from description
- Check if AI is reading the skill (look for
readtool call in logs)
Required binary not found
Required binary not found
Solutions:
- Install the required tool:
brew install <tool> - Add to PATH if installed in custom location
- Update
requires.binsin frontmatter if wrong binary name - Add custom binary paths to
ASTA_EXEC_ALLOWED_BINS
Skill works in chat but not in Telegram
Skill works in chat but not in Telegram
Common cause: Tool output is too large for Telegram messageSolution: Add truncation guidance in SKILL.md:
Next Steps
Architecture
Understand how skills fit into Asta’s architecture
AI Providers
Learn how different providers handle skill instructions
API Reference
See how to use skills via the API
Contributing
Submit your custom skills to the community