Working with Skills
Skills are structured knowledge documents that give an AI agent the domain-specific expertise it needs to complete a task. A skill tells the agent how to reason about a specific subject — which dimensions to evaluate, what questions to ask, and how to reach a confident conclusion. The quality of a skill directly determines the quality of the agent's output.
This section explains how skills are structured, how the Skill Expert creates and maintains them, and how the Prompt Modeller makes them available to an agent — either statically via a tag in the prompt template, or dynamically via tool calls that let the agent select the right skill itself.
Skills: The Agent's Knowledge of What Is Possible
The central concept of the Dynamixs.AI BPMNAgent are Skills. A skill describes a workflow action that the agent can invoke on behalf of the user — for example starting a new workflow process and filling in its form data.
Skills are not hardcoded. They are derived entirely from the BPMN models deployed in the system and the process configuration. This means the agent's capabilities grow automatically as new workflows are deployed — without any changes to the agent itself.
The Five Skill Levels
Skills are organised in a five-level hierarchy that mirrors the structure of Imixs-Office-Workflow:
ProcessSkill
└── ModelSkill
└── WorkflowGroupSkill
└── TaskSkill
├── EventSkill
└── ItemSkill (Form Fields)
ProcessSkill — the top level, corresponding to the Process Layer. The process layer is an organisational unit that groups related workflows and defines which users have access. The ProcessSkill serves as the access control boundary — the agent only includes skills that the current user is authorised to see.
ModelSkill — corresponds to a deployed BPMN model file. The ModelSkill carries the model version and its documentation, which gives the agent the domain context for all workflows within that model.
WorkflowGroupSkill — corresponds to a BPMN Pool (Workflow Group). The WorkflowGroupSkill carries the pool-level documentation, which describes the business purpose of that specific process.
TaskSkill — corresponds to the initial BPMN Task of a workflow group. The TaskSkill carries the task name and description, which is the most specific description of what the process is about.
EventSkill — corresponds to a BPMN Event on the initial task. A task can have multiple events, each representing a different way to start the process. The EventSkill carries the event name and documentation, which gives the LLM the semantic context to select the correct event — for example distinguishing between saving a draft and submitting for approval.
ItemSkill (Form Fields) — derived from the optional form definition attached to the initial task. Each ItemSkill carries the field name, type, label and whether the field is required. The agent uses this to know which data it needs to collect from the user before submitting the workflow.
How the Skill Hierarchy Becomes the System Prompt
Before the first LLM call, the BPMNSkillController traverses the skill hierarchy and renders it as a structured Markdown document — the skill headers. This document is injected into the agent's system prompt:
# Available Workflow Processes:
## Human Resources
### vacation-request-en-1.0
This model covers all HR-related processes for employees and managers.
#### New Vacation Request
A new vacation request has been submitted by an employee.
The request needs to be reviewed and approved by the manager.
(model: vacation-request-en-1.0, taskid: 1000, process.ref: 6d0f...)
- **Submit** (eventid: 20)
Submit for approval. Use this event only when ALL required fields are filled.
The request will be forwarded to the manager for review.
- **[init]** (eventid: 10)
Save as draft. Use this event when required fields are still missing.
The process is saved but not yet submitted for approval.
**Form Fields:**
- `vacation.date` (html5date, required): From
- `vacation.due` (html5date, required): To
- `employee.department` (text, required): Department
- `vacation.description` (textarea, required): Description
The LLM reads this document and matches the user's natural-language input against it — across languages, phrasings and levels of abstraction. A user typing “Ich brauche Urlaub” will reliably match “A new vacation request has been submitted by an employee” because a modern LLM understands the semantic equivalence between the two. It also reads the form fields and extracts matching values directly from the conversation — without asking the user for data they have already provided.
Skill Quality and Filtering
The agent only includes a workflow in the skill headers if at least one of the three description levels — model, pool, or task — contains meaningful content. Workflows without any description are silently skipped and logged as a warning. This keeps the system prompt compact and prevents the agent from presenting options it cannot explain.
This filtering also serves as a continuous quality signal: every warning in the log is a workflow that needs better documentation before the agent can use it reliably.
How to write effective BPMN descriptions that give the agent a reliable semantic foundation is covered in Modelling BPMN AI Agents.
The Two Roles
Working with skills requires two people with different responsibilities:
| Role | Responsibility |
|---|---|
| Skill Expert | Creates and maintains skill documents. Defines what the agent needs to know about a specific domain — which dimensions matter, what makes something simple or complex, when to ask for more information. |
| Prompt Modeller | Defines the agent's system prompt in the BPMN model. Decides whether a skill is loaded statically by ID, by category, or dynamically by the agent itself via tool calls. |
Both roles must work together. A perfectly written skill has no effect if the prompt modeller does not make it available to the agent. And a well-designed prompt cannot compensate for a skill that is missing or too vague.
Skill Structure
A skill is a document stored in the workflow system with the following fields:
| Field | Description |
|---|---|
type |
Always skill — identifies the document as a skill |
name |
A short, readable label, e.g. "Technische Folien" |
description |
One sentence describing what this skill covers — used by the agent when selecting between multiple skills |
category |
Groups related skills together, e.g. material, production — used for filtering |
content |
The full skill text the agent reads when performing its task |
The name and description are what the agent sees when choosing between skills. The content is what the agent reads when actually using the skill. Keep description short and precise — it is the agent's only basis for selection.
Writing Effective Skill Content
The content field is a free-form text document. There is no required structure — the skill expert decides what the agent needs to know. That said, the following structure has proven effective for classification tasks:
Purpose One sentence: what is this skill for?
Typical materials / subjects Which materials, products or cases does this skill cover?
Classification levels What does SIMPLE, MEDIUM and COMPLEX mean in this domain?
Classification dimensions Which properties determine complexity? For each dimension: what increases complexity, what reduces it?
Open points — when to ask When is information missing or ambiguous enough that the agent should ask the user before classifying?
Confidence rules When is HIGH confidence justified? When is MEDIUM acceptable? When should the agent ask instead of deciding?
Examples (recommended) One concrete SIMPLE case and one COMPLEX case, with a brief explanation why.
Static Skill Loading via the Prompt Template
The simplest way to make a skill available to an agent is to embed it directly in the prompt template using the <skill> tag. The SkillPromptHandler resolves this tag at runtime before the first LLM call — the agent receives the full skill content as part of its system prompt.
Load by ID
<skill id="MATERIAL_CLASSIFICATION" />
Loads exactly one skill by its name field. Use this when the modeller knows exactly which skill applies to this task.
Load by Category
<skill category="material" />
Loads all skills with category="material" and concatenates them into labeled blocks. Use this when the modeller wants to give the agent a fixed set of skills without hardcoding a single ID.
Load by Category with Custom Separator
<skill category="material" separator="---" />
The optional separator attribute controls how skill blocks are separated in the prompt. Defaults to ## Skill: if not provided.
ID with Category Fallback
<skill id="MATERIAL_CLASSIFICATION" category="material" />
Tries the exact ID first. If not found, falls back to loading all skills in the category. Use this during development or when a default skill should apply if a specific one is missing.
Dynamic Skill Selection via Tool Calls
For scenarios where the right skill depends on the content of the request — and the modeller cannot know in advance which skill applies — the agent can select the skill itself at runtime using two tool calls.
This approach adds flexibility but also adds two LLM iterations to the agent loop. Use it when the number of skills per category is large and loading all of them at once would make the prompt too long.
find_skill
Searches for skills by category and returns a list of matches. Each entry contains the skill's name, description and uniqueid. The agent uses name and description to decide which skill fits the current task.
| Argument | Description |
|---|---|
category |
The skill category to search |
Example result:
[
{
"uniqueid": "a1b2c3",
"name": "Technische Folien",
"description": "Klassifizierung von Kunststofffolien für elektrische und mechanische Anwendungen"
},
{
"uniqueid": "d4e5f6",
"name": "Dichtungsmaterialien",
"description": "Klassifizierung von Elastomeren, Schäumen und Dichtungsplatten"
}
]
get_skill
Loads the full content of a skill by its uniqueid. The uniqueid is taken directly from the result of a prior find_skill call.
| Argument | Description |
|---|---|
uniqueid |
The uniqueid of the skill as returned by find_skill |
Combining Both Approaches in the System Prompt
When using dynamic skill selection, the system prompt must instruct the agent to call find_skill and get_skill before starting its actual task. The category is always provided by the prompt modeller — the agent does not invent it.
<PromptDefinition>
<options>{"n_predict": 4096, "temperature": 0}</options>
<prompt role="system"><![CDATA[
You are a calculation assistant for the manufacturing of specialty films.
PROCEDURE
1. Call find_skill with category="material" to see the available
classification skills.
2. Select the skill that best matches the requested material based on
its name and description.
3. Call get_skill with the uniqueid of the selected skill to load its
full content.
4. Classify the material based on the loaded skill.
BEHAVIOUR
- Work exclusively with the information from the loaded skill
- Do not make assumptions when information is unclear or missing
]]></prompt>
<prompt role="user"><![CDATA[
<filedata ref="agent.workitem.ref">\.pdf$</filedata>
]]></prompt>
</PromptDefinition>
The category "material" is fixed in the prompt by the modeller. The agent decides only which skill within that category fits the request.
Choosing the Right Approach
| Situation | Recommended approach |
|---|---|
| One skill always applies to this task | <skill id="..." /> |
| A small fixed set of skills applies | <skill category="..." /> |
| Many skills exist and the right one depends on the request | find_skill + get_skill tool calls |
| A default skill should apply unless a specific one exists | <skill id="..." category="..." /> |
What Happens Without Good Skills
If skills are missing or too vague, the agent's behaviour becomes unpredictable:
- It may ask unnecessary questions because it has no basis for classification
- It may reach a wrong conclusion because no dimension guided its reasoning
- It may select the wrong skill if descriptions are too similar or too generic
- It may produce inconsistent results across runs because the reasoning is unconstrained
None of these are failures of the agent — they are failures of the skill content. The agent can only be as good as the knowledge it is given.
Summary: Skills Checklist
Before deploying an agent that uses skills, verify the following:
For the Skill Expert:
- [ ] Each skill has a short, precise
descriptionthat clearly distinguishes it from other skills in the same category - [ ] The
categoryfield is set consistently across all related skills - [ ] The
contentcovers all dimensions the agent needs to reason about - [ ] The content defines when the agent should ask for more information
- [ ] The content defines confidence rules so the agent knows when it can decide
- [ ] At least one SIMPLE and one COMPLEX example is included (recommended)
For the Prompt Modeller:
- [ ] The correct loading approach is chosen for the task (static ID, category, or dynamic tool calls)
- [ ] If dynamic tool calls are used, the system prompt instructs the agent to call
find_skillbefore starting the task - [ ] The category passed to
find_skillis fixed in the prompt — the agent does not determine it - [ ] The prompt instructs the agent to use only the loaded skill content — no assumptions from general knowledge