Skills
A skill is a reusable set of instructions, written as Markdown with YAML frontmatter, that the agent reads when a task needs it. Quick Apps follow the Agent Skills standard. This page covers where skills come from, how the agent uses them, and their limits. It is for platform engineers and app developers who add skills to Quick Apps. It assumes you know orchestration.
Where skills come from
| Source | Where it lives | Bundled files | Loaded |
|---|---|---|---|
| Predefined | config/predefined/skills/<name>/SKILL.md in the backend | No | At startup |
| DIAL prompt | A DIAL prompt, prompts/<bucket>/<path> | No | On each request |
| DIAL skill resource | A DIAL skill folder, skills/<bucket>/<path> | Yes, text files | On each request |
| Picked on a message | A user's own DIAL skill, chosen in the chat | Yes, text files | On each request |
DIAL skill resources and skills picked on a message need DIAL Core 0.48.0 or later.
How the agent uses skills
- The system prompt lists every skill's name and description in an
<available_skills>block. - The agent reads a skill's full instructions with the
read_skilltool, when it decides it needs them. - A DIAL skill resource lists its bundled files in the instructions. The agent opens a file with
read_skill(skill_name, file_path). - The built-in
tool-call-file-parameter-formattingskill is always present. It teaches the agent the file parameter convention.
Add skills to an app
skills lists the DIAL prompts and DIAL skill resources of an app. Predefined skills are always available and aren't listed here.
{
"skills": [
{ "type": "dial-prompt", "url": "prompts/<bucket>/skills/code-review" },
{ "type": "dial-skill", "url": "skills/<bucket>/refund-policy" }
]
}
type | url |
|---|---|
dial-prompt | A prompt, with the prompts/ prefix. Its content must be a valid SKILL.md. |
dial-skill | A skill resource folder, with the skills/ prefix |
When the app is deployed, DIAL Core shares a referenced prompt with the app automatically. A dial-skill isn't shared yet: it resolves only when the caller already has access, such as their own skill, one shared with them, or a published one.
Skill format
---
name: refund-policy
description: How to handle refund requests, by region.
---
# Refund policy
Determine the customer's region, then read the matching reference file.
| Field | Required | Rules |
|---|---|---|
name | Yes | Up to 64 characters: lowercase letters, numbers, and single hyphens, not at the start or end |
description | Yes | Up to 1024 characters. It helps the agent decide when to read the skill. |
license | No | Any text |
compatibility | No | Up to 500 characters |
metadata | No | Key-value strings |
allowed-tools | No | Tool names. Shown to the agent, but not enforced. |
For a predefined skill, the folder name must equal name. Invalid skills are skipped and logged.
Predefined skills
Predefined skills ship with the backend. To add your own, put them in a folder layered over the built-in templates with the backend's PREDEFINED_EXTRA_PATHS. Each skill is a folder with a SKILL.md. Restart the backend after you add or change one.
DIAL skill resources
A DIAL skill resource is a folder in DIAL: a SKILL.md plus any reference files. The agent reads only the files it needs, one DIAL Core request per file.
- Readable files. Regular files with one of these extensions:
.md,.markdown,.txt,.json,.yaml,.yml,.csv,.tsv,.xml,.html,.toml,.ini,.sql,.py,.sh,.js,.ts. Hidden files, subfolders, and binary files, such as images and PDFs, aren't available. - Only listed paths. A path that isn't in the skill's file list is refused, and the agent gets the list back.
- Limits.
DIAL_SKILLS_FILE_MAX_BYTES(default262144) caps each file; a largerSKILL.mddrops the skill.DIAL_SKILLS_MAX_FILES(default200) caps the files listed. Files must be UTF-8.
Skills picked on a message
A user can bring their own skill into a conversation with an agent they don't own. In DIAL Chat, they mention it in the message. The client sends it on the user message:
{
"role": "user",
"content": "/code-review focus on auth",
"custom_content": { "skills": [{ "url": "skills/<bucket>/code-review" }] }
}
- The skill is always loaded; the model doesn't choose. The user sees a Reading Skill stage for it.
- A message can pick up to
SKILL_INVOCATION_MAX_SKILLS_PER_MESSAGEskills, default5. Across a conversation, the newestSKILL_INVOCATION_MAX_SKILLS, default10, stay available. - DIAL Core shares each picked skill with the app for the request. It rejects the request with
400for a malformed entry, and with403for a skill the user can't read. - A skill that can't be loaded gets an error result naming it, and the request is still served.
- A pick made on a later message, not the first, keeps its instructions in context for that turn only. The skill stays listed, so the model can read it again.
Name collisions
When two skills have the same name, one wins and the other is skipped and reported in the Initialization issues stage:
- Among an app's own skills: predefined, then DIAL prompt, then DIAL skill resource. Within a source, the first one listed wins.
- A skill picked on a message wins over the app's skill with the same name.
Errors
A skill that fails to load never fails the request:
- An invalid or inaccessible skill is skipped, with a reason in the Initialization issues stage.
- If a DIAL skill's file list can't be read, the skill loads without its files.
- If DIAL Core is down, the DIAL skills are dropped and the predefined ones stay.
Further reading
- Hooks — call a tool at the start or end of every turn
- Chat User Guide: Skills — how users create and use skills in DIAL Chat
- Backend configuration — the skill limits
- Contexts and files — how Quick Apps use contexts, attachments, and file tools
- Orchestration — how the orchestrator runs the agent loop