open-webui / open-webui/open-webui
issue: selecting a skill from the `/` menu inserts `<@id|label>`, which the backend silently ignores
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 153k
- Forks
- 22.3k
- Avg merge
- 1d 4h
- Merged PRs (30d)
- 194
Description
Before Submitting
- I searched open and closed issues and discussions for an existing report.
- I checked whether this is already fixed on the
devbranch or latest source. - I understand that maintainers want a well-written issue before any code pull request.
- I am using the latest available version of Open WebUI for my install method.
- This is not a security vulnerability.
Installation Method
Docker
Open WebUI Version
v0.11.3
Operating System
ubuntu
Browser
No response
Ollama Version
No response
Summary
Selecting a skill from the / command menu produces a mention tag with @ as the
trigger char. The backend's skill-mention regex accepts only $ and /, so the skill
is never loaded. Because the same regex is what strips the markup, the raw tag also
stays in the message and reaches the model, which then improvises a non-existent
skill protocol. Selecting the same skill from the $ menu works.
Steps to reproduce
- Create an active skill (e.g. id
es). - In a chat, type
/, pick that skill from the list, add a question, send. - Inspect the stored message: it contains
<@es|label>.
Expected: the skill's full content is injected (the / path is explicitly
supported — see the ch === '/' ? '$' : ch remap in the serializer).
Root cause
/ is the only mention-producing trigger with a custom command that builds the
node by hand, in src/lib/components/chat/MessageInput.svelte:
char: '/',
command: ({ editor, range, props }) => {
...
.insertContentAt(range, [
{ type: 'mention', attrs: props },
{ type: 'text', text: ' ' }
])
### Expected Behavior
**Expected:** the skill's full content is injected (the `/` path is explicitly
supported — see the `ch === '/' ? '$' : ch` remap in the serializer).
### Actual Behavior
**Actual:** nothing is injected, the raw tag is left in the user message, and the
model receives `<@es|label>` as literal text.
### Steps to Reproduce
1. Create an active skill (e.g. id `es`).
2. In a chat, type `/`, pick that skill from the list, add a question, send.
3. Inspect the stored message: it contains `<@es|label>`.
### Logs, Screenshots, and Config
**Root cause**
`/` is the only mention-producing trigger with a custom `command` that builds the
node by hand, in `src/lib/components/chat/MessageInput.svelte`:
```js
char: '/',
command: ({ editor, range, props }) => {
...
.insertContentAt(range, [
{ type: 'mention', attrs: props },
{ type: 'text', text: ' ' }
])
### Additional Information
_No response_
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start in src/lib/components/chat/MessageInput.svelte at the / command's custom command and trace how its mention node is serialized, including the ch === '/' ? '$' : ch remap. Reproduce the issue with an active skill, then verify that selecting it from / produces a tag the backend recognizes, injects the skill content, and does not leave raw markup in the stored message.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- javascript
- Domain
- backend, frontend
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Active
- Clarity
- Clearly specified
- Newbie friendliness
- 74/100