M8 · Skill 装载
Skills are folders, not files
- skill
Nobody's first instinct is "I need a loader node for my prompt text". It becomes obvious around the fifth time you copy the same 80 lines of house style into a new workflow, or the second time you fix a typo in three places. M8 · Skill Loader takes a text file - a skill, in the pack's language - and turns it into something you can wire into an LLM node, once, from one place.
What a skill actually is
A folder, not a file. Under the pack's data directory you get:
m8/data/skills/
└── aigc-prompt/
├── SKILL.md required - the main prompt text
└── references/ optional - style notes, templates, examples
That structure is the whole point. A prompt that says "write in the style described in references/style.md" is meaningless if the model can't read the file - so the reference files are detected and inlined into the request before it goes out. When the main file mentions references/style.md, or just gestures at "the references/ folder", those text files get pulled in and travel with the prompt. Caps are 64 KB per file and 256 KB per pack; anything over the cap is skipped rather than inlined, but gets listed at the end so the model knows what it's missing instead of confidently claiming it followed a reference it never saw.
Uploads go through buttons on the node panel (the node class itself only picks from what's already there), and name sanitising keeps a skill to a single safe directory level with relative paths that can't climb out of it.
How the wiring works
The output type is M8_SKILL, a custom wire type this pack defines, and its payload is a dict carrying the name, the text, the character count and the path. Since the text is what travels, one skill can feed several inference nodes at once - fix the file, and every node downstream picks up the change on the next run. That's the reason this is a separate node rather than a text box inside the inference node.
A slightly odd behaviour you'll notice: the dropdown reads (no skill uploaded yet) until the front end fetches the real list from the server after load. That's why the node declares a one-item placeholder list internally and bypasses list validation - the candidates live on the server, not in the node definition.
Inputs and outputs
skill(required) - the dropdown of uploaded skillsenabled(default true) - flip it off and the node outputs an empty skill, as if you'd unplugged the wire without touching the workflow. Handy for A/B-ing whether the pack is helping or hurtingextra_text- appended after the skill text, for one-off tweaks you don't want to commit to the file
Output: skill (M8_SKILL). Wire it into the skill input of M8 · LLM Inference or M8 · Local LLM Inference. Nothing else consumes it.
Installing it
Nothing to install beyond the pack itself:
cd ComfyUI/custom_nodes
git clone https://github.com/chenr5934-tech/ComfyUI-M8nodes.git
Restart. No pip dependencies, no model downloads. Data lives in m8/data/skills/ inside the plugin directory (gitignored, so a git pull won't clobber it) - back it up by copying the folder.
Where it bites
If the dropdown is empty, you haven't uploaded anything to the server. The list is not a folder on your disk that you can drop files into from your file manager and expect to appear; the upload button is the path in.
The /name reference in the prompt box is stricter than people expect. The backend injects a referenced skill only when the name resolves to exactly one uploaded skill - no match or several matches means nothing gets injected at all. That's deliberate, because guessing wrong stuffs the wrong reference into your context, and that's worse than omitting it. Type the name out fully. Also note that slashes in URLs, drive paths and things like 3/4 are never treated as references.
Lastly, size has a price. A fat skill pack is context you're paying for on every single run, and a pack that's mostly irrelevant to the current question is actively harmful - it dilutes the instruction. Referencing one specific skill from the prompt box beats turning on skill_auto and handing the model your entire library. An empty skill isn't an error, by the way; the inference node just treats that run as "no knowledge pack this time".
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| skill | COMBO | 选择已上传的 skill 文件。点节点上的「上传 Skill」按钮可以新增。 | |
| enabledopt | BOOLEAN | true | 关掉之后输出空 skill,等于临时断开这条线,不用改工作流。 |
| extra_textopt | STRING | 附加在这份 skill 后面的补充说明。临时调整不用去改文件。 |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| skill | M8_SKILL | — |