EmAySee Deep Reasoning Connector
An LLM connector that hands you the thinking and the answer separately — built for local oobabooga-style backends
- answer
- thinking
- full_raw
This is a big one hiding in a kitchen-sink pack: a fully wired LLM connector that talks to any OpenAI-compatible /v1/chat/completions endpoint, with one feature you barely see elsewhere - it splits the model's chain-of-thought out of the answer and hands you both. Point it at a local oobabooga text-generation-webui or llama.cpp server running a reasoning model (Qwen3, DeepSeek-R1 distills, anything that emits <think> blocks) and you get a thinking output and an answer output. No API key required for local use, no account, no rate limits. Just a POST to your own machine.
The name is accurate in a way the pack's README isn't: this one targets reasoning models specifically. That's what the reasoning_effort knob and the think-tag parsing are about.
How it works
The node builds a standard chat payload - system_prompt + prompt, with enable_thinking: True and a pile of text-generation-webui sampler knobs (min_p, top_k, repetition_penalty_range, xtc_*, dry_*) - and POSTs it non-streaming. Two details make it genuinely useful:
- Auto-continue. If the response's
finish_reasonislength/maxlen(the model hitmax_tokens_per_callmid-thought), it appends the partial reply as an assistant message and re-posts, up tomax_continuestimes. That's how a 4096-token default gets a 32k-token response out of a local model without you babysitting it. - Think-tag parsing. After the loop it regexes the full text for
<think>/<thought>blocks. Everything inside becomes thethinkingoutput; everything outside becomesanswer. If the model opens a think tag and never closes it, you get[REASONING DID NOT FINISH]in the answer - a loud, honest failure mode instead of a silently truncated reply.
The inputs you actually set
Most of the 20+ inputs are sampler values you can leave alone. The ones that matter:
api_url- the default ishttp://10.0.0.71:5000/v1/chat/completions, which is the author's own LAN box. You must change this to your text-generation-webui or llama.cpp server's address. This is the #1 footgun.api_key- for local textgen, any string works (it's ignored); for a real remote service, use the real key.model_name-"default"is fine for textgen; set it explicitly for llama.cpp/Ollama.auto_continue+max_continues- leave on unless you want short, fast replies.reasoning_effort-low/medium/high, passed straight through;lowis the sensible default for prompt-tagging work.
Outputs: answer (clean reply), thinking (the chain-of-thought), full_raw (everything, for debugging). Wire answer into a text display or back into prompt-building; wire thinking to its own viewer so you can watch the model talk to itself.
Install
Part of ComfyUI_EmAySee_CustomNodes (Manager → search "EmAySee", or git clone https://github.com/EmAySee/ComfyUI_EmAySee_CustomNodes into ComfyUI/custom_nodes, then restart). It needs requests, which ComfyUI already bundles - no extra pip install, no model files.
Gotchas and the honest take
Non-streaming means a long reasoning run blocks the entire ComfyUI queue for minutes (there's a 600-second timeout, so it won't hang forever). The dry_*/xtc_* fields are textgen-specific sampler options; llama.cpp ignores unknown keys, textgen honors them. And remember the LLMVISION lesson from this ecosystem: custom nodes run unsandboxed, and this one sends your prompts to whatever URL you configure. A local endpoint keeps everything on your machine. Pointing it at a random public API means your prompts go there too - be deliberate. For a seedable, reproducible version of this exact node, grab EmAySee_DeepReasoningConnectorWithSeed.
Inputs (22)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | Enter prompt here | — |
| system_prompt | STRING | You are a helpful assistant. | — |
| api_url | STRING | http://10.0.0.71:5000/v1/chat/completions | — |
| api_key | STRING | supersecretkey | — |
| model_name | STRING | default | — |
| max_tokens_per_call | INT | 40961–8192 | — |
| truncation_length | INT | 327680–131072 | — |
| temperature | FLOAT | 0.600–2 | — |
| top_p | FLOAT | 0.950–1 | — |
| min_p | FLOAT | 0.500–1 | — |
| top_k | INT | 200–200 | — |
| repetition_penalty | FLOAT | 1.151–2 | — |
| repetition_penalty_range | INT | 20480–8192 | — |
| reasoning_effort | COMBO | low | 3 options: low, medium, high |
| xtc_threshold | FLOAT | 0.100–1 | — |
| xtc_probability | FLOAT | 0.000–1 | — |
| dry_multiplier | FLOAT | 0.80–2 | — |
| dry_base | FLOAT | 1.751–5 | — |
| dry_allowed_length | INT | 10–20 | — |
| auto_continue | BOOLEAN | true | — |
| max_continues | INT | 31–10 | — |
| stop_on_error | BOOLEAN | true | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| answer | STRING | — |
| thinking | STRING | — |
| full_raw | STRING | — |