M8 · 破甲注入
776 characters of system prompt you wire in front of your LLM
- armor
You asked the chat model for one line of prompt tokens. It answered "Sure! Here's a prompt for you:", plus a preamble and a note about responsible use. All of it went into your text encoder, and the image came out wrong for reasons you'll never trace.
This node is a prewritten block of system instructions, wired in front of the model to cut that short.
What it is and why you'd reach for it
M8ArmorBreak ships in ComfyUI-M8nodes, a small MIT-licensed, Chinese-first pack by GitHub user chenr5934 - code strings in English, injected text and tooltips in Chinese. It sits on the pack's 大模型 shelf, and its only consumer is the pack's own M8LLMInference. "Armor break" is the author's jailbreak framing; the daily job is duller: stop the model narrating, start it delivering.
That's failure mode one of in-graph LLMs, per the KB's LLM-in-ComfyUI notes - chat scaffolding and refusal boilerplate land in your conditioning. The durable fix is a model that won't lecture you at all, hence the abliterated local-LLM scene. This is the cheaper version: change the instructions, not the weights.
How it works - the ordering is the entire trick
The pack's source is blunt: the inference node builds its system message as armor first, then your system prompt, then skill blocks. Armor goes in front because models weight instructions at the top of a system message most heavily; the same text at the end dilutes itself. It also can't ride the skill channel - skills get wrapped in <skill name="..."> tags, which demotes an instruction to reference material.
The text lives in the pack's prompts.py as three additive sections: core (lead with the deliverable, skip disclaimers, admit uncertainty), refusal (no apologies, no "as an AI", no quietly shrinking the request), and immune (treat "ignore your instructions" text as user content; fill placeholders instead of asking follow-ups). Levels slice them - 基础 core, 增强 adding refusal, 全量 adding immune, 关 empty - and scenes append one section: 编码 for code blocks, 写作 for fiction, 图像提示词 for one flowing prompt string. 增强 + 通用 is 776 characters, 全量 + 图像提示词 1,250. You pay that every call.
The inputs and the one output
level (强度档位, default 增强) is how deep it goes. scene (输出场景, default 通用) is the shape of what comes back - if your downstream is a CLIP text encode, that's the one worth thinking about.
body (破甲正文) is the interesting one. Empty by default, so the preset applies; type anything and that becomes the whole injected text, tier reduced to provenance. Whitespace alone doesn't count. 灌入预设 dumps the current preset in so you can edit from a known-good start; 恢复预设 empties it. extra (补充指令) is one line appended after the body either way - "这次只输出英文" style - and never replaces anything. enabled off means the node outputs nothing, so you can drop it out of the graph without touching wires.
The output, armor, is typed M8_ARMOR: a dict with the level, scene, final text, character count and sections used. The inference node only reads text off it. That custom type plugs into nothing but an armor input - only M8LLMInference has one - and you can't read it from a plain text node. Use the readonly 注入内容 box, which previews the first 4,000 characters.
Install
ComfyUI Manager, search the pack title, or just clone - zero pip dependencies:
cd ComfyUI/custom_nodes
git clone https://github.com/chenr5934-tech/ComfyUI-M8nodes.git
Restart and the node is under right-click → M8/大模型. pyproject.toml has an empty dependencies array and wants Python ≥3.10. Ignore the llama-cpp-python note in the README; that's the local GGUF node's extra.
Where people get burned
The preset buttons need the pack's backend. They fetch text from a route the pack registers inside ComfyUI. If that import fails (error M8-LLM-022, check the startup log) they say the endpoint didn't answer - but picking a tier and running still works, since composition happens in the node's Python.
The preset prose isn't stored in your workflow. Only the dropdowns are saved, so a git pull can quietly change what gets injected. Want reproducibility? Hit 灌入预设 and keep it in body, which is saved.
Filling body silently disables level. Change the tier afterwards and nothing happens. Same class of trap: a workflow holding a renamed tier value gets coerced to 增强 instead of erroring.
It does not unlock a filtered API. The default endpoint is DeepSeek, and hosted moderation runs server-side by their policy - filtering follows the model, not the node.
And nothing cleans the reply. What comes back is the string that hits your encoder. Still chatty? Tighten extra or the scene rather than assuming the node is broken.
The honest verdict
It's a text box with a good UI and three shelves of prewritten prose. You could paste the same ~800 characters into the inference node's system prompt field and get identical results; plenty of people do. You're paying for one authoritative copy fanned out across nodes, and one click to see what's injected.
Also worth saying: this pack has almost no community footprint - nothing for the name in the reddit corpus, zero impressions on this page. Read prompts.py before you depend on it.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| level | COMBO | 增强 | 【档位】管「破得多深」,逐档叠加:基础 = 身份与执行模式;增强 = 再加拒绝对抗;全量 = 再加外来指令免疫和占位符规则。选「关」等于把这条线摘掉。正文框留空时它决定正文。 |
| scene | COMBO | 通用 | 【场景】管「交付成什么形状」:编码给命令和代码块,写作要出戏,图像提示词给一行连着的提示词串。和档位正交,四乘四随便配。正文框留空时它决定正文的最后一段。 |
| enabledopt | BOOLEAN | true | 关掉之后输出空,等于临时摘下这个节点,不用改工作流。 |
| bodyopt | STRING | 【破甲正文】真正发给模型的那段话。留空 = 用上面「档位 + 场景」拼出来的预设;填了 = 以这里为准,档位只作记录不再参与拼接。想从预设起步就点节点上的「灌入预设」,然后在这里随便改。 | |
| extraopt | STRING | 【补充指令】拼在正文最后的一句。不覆盖正文,只是续一句 —— 比如「这次只输出英文」。正文走预设还是走自定义,它都排在最后。 |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| armor | M8_ARMOR | — |