skills/open-webui/SKILL.md
Comprehensive guide for developing tools, functions, and plugins for Open-WebUI (OWI) LLM Chat UI.
npx skillsauth add ayylmaonade/dotfiles open-webuiInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Before writing any OWI code, consult these primary references:
Functions Documentation → references/functions-guide.md
Tools Documentation → references/tools-guide.md
Event Emitters → references/event-emitters.md
| Type | Purpose | Execution | |------|---------|-----------| | Pipe | Custom agents/models or integrations | Standalone execution | | Filter | Modify inputs/outputs at stages | Preprocessing/Streaming/Postprocessing | | Action | Custom chat interface buttons | User-triggered actions |
Default Mode (function_calling = "default"):
Native Mode (Agentic) (function_calling = "native"):
Always detect function calling mode to ensure UI compatibility:
is_native_mode = metadata and metadata.get("params", {}).get("function_calling") == "native"
status - Real-time status updates (✓ COMPATIBLE)citation - Document citations with metadata (✓ COMPATIBLE)files - File attachments (✓ COMPATIBLE)chat:message:error - Error messages (✓ COMPATIBLE)chat:message:follow_ups - Follow-up suggestions (✓ COMPATIBLE)chat:title - Dynamic chat title (✓ COMPATIBLE)chat:tags - Chat tags management (✓ COMPATIBLE)notification - Toast notifications (✓ COMPATIBLE)confirmation - User confirmations (✓ COMPATIBLE)input - User input requests (✓ COMPATIBLE)execute - Dynamic code execution (✓ COMPATIBLE)message - Content updates (BROKEN - causes flickering)chat:completion - Limited supportchat:message:delta - BROKENchat:message - BROKENreplace - BROKENasync def universal_tool(self, prompt: str, __event_emitter__=None, metadata=None):
is_native_mode = metadata and metadata.get("params", {}).get("function_calling") == "native"
if __event_emitter__:
if is_native_mode:
await __event_emitter__({
"type": "status",
"data": {"description": "Native mode processing...", "done": False}
})
else:
await __event_emitter__({
"type": "message",
"data": {"content": "Default mode full streaming..."}
})
# Tool logic here
if __event_emitter__:
await __event_emitter__({
"type": "status",
"data": {"description": "Completed", "done": True}
})
return "Tool execution completed"
from fastapi.responses import HTMLResponse
async def visualize_data(self, data: str, __event_emitter__=None):
html_content = """
<script src="https://cdn.plot.ly/plotly-latest.min.js"></script>
<div id="chart" style="width:100%;height:400px;"></div>
<script>Plotly.newPlot('chart', [{y: [1, 2, 3], type: 'scatter'}]);</script>
"""
return HTMLResponse(content=html_content, headers={"Content-Disposition": "inline"})
Before deployment:
references/functions-guide.md - Comprehensive Functions & Tools guidereferences/event-emitters.md - Complete Event emitter documentation and examplesreferences/implementation-patterns.md - Code patterns and API patternsreferences/troubleshooting.md - Common issues and solutionstools
Use when work should span one or more detached tasks but still behave like one job with a single owner context. TaskFlow is the durable flow substrate under authoring layers like Lobster, ACPX, plugins, or plain code. Keep conditional logic in the caller; use TaskFlow for flow identity, child-task linkage, waiting state, revision-checked mutations, and user-facing emergence.
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------
tools
A CLI tool for making authenticated requests to the X (Twitter) API. Use this skill when you need to post tweets, reply, quote, search, read posts, manage followers, send DMs, upload media, or interact with any X API v2 endpoint.