Text Generation
GGUF
qwen36
Mixture of Experts
conversational
multimodal
agent
ollama
heretic
uncensored
reasoning
distillation
Instructions to use FoolDev/Janus-35B-HERETIC with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- llama.cpp
How to use FoolDev/Janus-35B-HERETIC with llama.cpp:
Install (macOS, Linux)
curl -LsSf https://llama.app/install.sh | sh # Start a local OpenAI-compatible server with a web UI: llama serve -hf FoolDev/Janus-35B-HERETIC:Q4_K_M # Run inference directly in the terminal: llama cli -hf FoolDev/Janus-35B-HERETIC:Q4_K_M
Install from WinGet (Windows)
winget install llama.cpp # Start a local OpenAI-compatible server with a web UI: llama serve -hf FoolDev/Janus-35B-HERETIC:Q4_K_M # Run inference directly in the terminal: llama cli -hf FoolDev/Janus-35B-HERETIC:Q4_K_M
Use pre-built binary
# Download pre-built binary from: # https://github.com/ggerganov/llama.cpp/releases # Start a local OpenAI-compatible server with a web UI: ./llama-server -hf FoolDev/Janus-35B-HERETIC:Q4_K_M # Run inference directly in the terminal: ./llama-cli -hf FoolDev/Janus-35B-HERETIC:Q4_K_M
Build from source code
git clone https://github.com/ggerganov/llama.cpp.git cd llama.cpp cmake -B build cmake --build build -j --target llama-server llama-cli # Start a local OpenAI-compatible server with a web UI: ./build/bin/llama-server -hf FoolDev/Janus-35B-HERETIC:Q4_K_M # Run inference directly in the terminal: ./build/bin/llama-cli -hf FoolDev/Janus-35B-HERETIC:Q4_K_M
Use Docker
docker model run hf.co/FoolDev/Janus-35B-HERETIC:Q4_K_M
- LM Studio
- Jan
- vLLM
How to use FoolDev/Janus-35B-HERETIC with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "FoolDev/Janus-35B-HERETIC" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "FoolDev/Janus-35B-HERETIC", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker
docker model run hf.co/FoolDev/Janus-35B-HERETIC:Q4_K_M
- Ollama
How to use FoolDev/Janus-35B-HERETIC with Ollama:
ollama run hf.co/FoolDev/Janus-35B-HERETIC:Q4_K_M
- Unsloth Desktop
- Pi
How to use FoolDev/Janus-35B-HERETIC with Pi:
Start the llama.cpp server
# Install llama.cpp: brew install llama.cpp # Start a local OpenAI-compatible server: llama serve -hf FoolDev/Janus-35B-HERETIC:Q4_K_M
Configure the model in Pi
# Install Pi: npm install -g @earendil-works/pi-coding-agent # Add to ~/.pi/agent/models.json: { "providers": { "llama-cpp": { "baseUrl": "http://localhost:8080/v1", "api": "openai-completions", "apiKey": "none", "models": [ { "id": "FoolDev/Janus-35B-HERETIC:Q4_K_M" } ] } } }Run Pi
# Start Pi in your project directory: pi
- Docker Model Runner
How to use FoolDev/Janus-35B-HERETIC with Docker Model Runner:
docker model run hf.co/FoolDev/Janus-35B-HERETIC:Q4_K_M
- Lemonade
How to use FoolDev/Janus-35B-HERETIC with Lemonade:
Pull the model
# Download Lemonade from https://lemonade-server.ai/ lemonade pull FoolDev/Janus-35B-HERETIC:Q4_K_M
Run and chat with the model
lemonade run user.Janus-35B-HERETIC-Q4_K_M
List all available models
lemonade list
- Hermes Agent
How to use FoolDev/Janus-35B-HERETIC with Hermes Agent:
Start the llama.cpp server
# Install llama.cpp: brew install llama.cpp # Start a local OpenAI-compatible server: llama serve -hf FoolDev/Janus-35B-HERETIC:Q4_K_M
Configure Hermes
# Install Hermes: curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash hermes setup # Point Hermes at the local server: hermes config set model.provider custom hermes config set model.base_url http://127.0.0.1:8080/v1 hermes config set model.default FoolDev/Janus-35B-HERETIC:Q4_K_M
Run Hermes
hermes
- Atomic Chat
- OpenClaw
How to use FoolDev/Janus-35B-HERETIC with OpenClaw:
Start the llama.cpp server
# Install llama.cpp: brew install llama.cpp # Start a local OpenAI-compatible server: llama serve -hf FoolDev/Janus-35B-HERETIC:Q4_K_M
Configure OpenClaw
# Install OpenClaw: npm install -g openclaw@latest # Register the local server and set it as the default model: openclaw onboard --non-interactive --mode local \ --auth-choice custom-api-key \ --custom-base-url http://127.0.0.1:8080/v1 \ --custom-model-id "FoolDev/Janus-35B-HERETIC:Q4_K_M" \ --custom-provider-id llama-cpp \ --custom-compatibility openai \ --custom-text-input \ --accept-risk \ --skip-health
Run OpenClaw
openclaw agent --local --agent main --message "Hello from Hugging Face"
Commit History
29 days ago
-
release 0.9.8: fix the system block, correct 0.9.7's render claim, land audit top tier
The system block ended on a blank line. `{{ .System }}` was followed by an unconditional \n\n -- the right separator when the `# Tools` block follows it, but with no tools nothing consumed it, so a no-tools request rendered {system}\n\n<|im_end|> where Qwen renders {system}<|im_end|>. The same dangling pair followed the $effort line. Both separators are now conditional: `{{ if or .System .Tools }}` after $effort, `{{ if .Tools }}` after .System. This fired on the DEFAULT path -- the Modelfile bakes a SYSTEM and Ollama passes it as .System -- so every request without a tools array carried it. Neither new condition names .ToolCalls, so parseTag still lands on the tool-call block: derived tag <tool_call>, capabilities `completion tools thinking` read back with `ollama show`, both re-verified after the edit. 0.9.7's "10 of 12 shapes match byte for byte" was body-only and did not say so. That comparison stripped the system block from both sides and masked the tool-call payload -- each a d…ee4c9b0
30 days ago
-
release 0.9.7: render tool chains exactly as Qwen does, guarded in the AST
Both remaining whitespace differences between the Go template and Qwen's format are gone, and neither fix touches the `range .ToolCalls` body that 0.9.5 broke. * the blank-line residue 0.9.6 documented: an assistant turn with tool calls and no text rendered two blank lines after </think> where Qwen renders one, because the range adds its own leading newline on top of the one the thinking block already emitted. That line is now conditional on $blank, false exactly when the turn has tool calls and no text. * the blank line between an assistant turn's text and its first <tool_call>, which 0.9.5 attempted and 0.9.6 reverted, recording that it "cannot be had without placing an action exactly where the parser's prefix has to be". It can: only the FIRST call needs the extra newline and whether it is needed depends on .Content alone, not on the loop index, so the separator is emitted OUTSIDE the range, where an action is harmless. The range body is …edf99d7 -
release 0.9.6: restore tool calling, which 0.9.5 silently broke
Ollama derives its tool-call PARSER from this template: it takes the literal text at the head of the `range .ToolCalls` body as the prefix to scan for in the model's output. 0.9.5 put an action there -- `{{- if $j }}`, the blank-line separator -- so the derived prefix stopped matching and Ollama no longer recognised tool calls at all. The model still emitted a correct <tool_call> block; it arrived as plain text in `content` with `tool_calls` empty. Measured on the real 35B-A3B blob, first-turn tool call parsed: v0.9.4 2/2 v0.9.5 0/5 this release 3/3 scripts/live_check.sh: 16/17 on 0.9.5 -> 17/17 now. Every render test passed on 0.9.5 because the rendered BYTES were identical for every conversation shape tested -- the break was in the AST, which only a live tool call against a real model exposes. check_go_template.py now pins the body as literal-first, replacing the separator assertion that pinned the very construct responsible. Kept from 0.9.5: consecutive tool result…3070964 -
release 0.9.5: render tool chains the way Qwen's template does
The Go template differed from Qwen's format on three points, each verified by rendering the same conversation through both paths and diffing, using Ollama's own renderer (/api/chat with "_debug_render_only": true, 0.33.3) against a 1.2 MB stories260K.gguf in an isolated CPU-only daemon: - consecutive tool results got one <|im_start|>user turn each, not one shared turn, so a parallel tool call rendered as two user turns - a single newline, not a blank line, between an assistant turn's text and its first <tool_call> - <think>...</think> on one line, and no empty block for a turn that did no reasoning Nine test conversations now render identically on both paths, modulo the two documented deliberate differences (tools preamble, JSON-vs-XML call body). ollama show still reports tools and thinking. check_go_template.py pins all three so they cannot regress. Text-only: the Go template is not embedded in the GGUF, so the blob sha256 is unchanged and nobody re-downloads. D…3950347
-
release 0.4.0: replay earlier turns' reasoning on both runtimes
- Ollama: the Go template / Modelfile TEMPLATE thinking block opens with (and $.IsThinkSet .Thinking), so every assistant message that carries reasoning is rendered, earlier turns included. - llama.cpp: chat_template.jinja reads preserve_thinking / preserve_reasoning again and replays by default, as upstream does. Upstream's raise on conflicting values is dropped and preserve_thinking wins: llama-server master derives preserve_thinking from its default preserve_reasoning=true, so with upstream's block a request sending preserve_thinking=false got HTTP 500. - The deferred chat_template.jinja comment fixes ride on this restamp. - check_chat_template.py, check_go_template.py and live_check.sh now expect replay; check.sh labels follow. - Verified on CPU: live_check.sh 17/17 on the restamped blob; llama-server master, b10760 and b10519 replay by default and honour every opt-out without errors. - CHANGELOG 0.4.0, CITATION.cff 0.4.0. The GGUF is restamped in a separate commi…936e88c
-
release 0.3.1: JSON tool definitions on Ollama, safer live checks, doc fixes
- Go template renders tool signatures with {{ json .Function }}. Since Ollama 0.14.0 a bare {{ .Function }} printed Go struct syntax inside <tools> (rendered with Ollama's own template package at v0.33.3; unchanged in 0.34.0 and main). check 9 now fails on a bare {{ .Function }}. Template-only: no new GGUF. - live_check.sh: each run uses a fresh subdirectory of WORK_DIR and deletes only that (it used to delete WORK_DIR itself); transport errors are recorded as failures instead of aborting; relative GGUF paths work; a server that fails to start is reported; paths reach Python as arguments. It runs 17 checks. - check_go_template.py accepts the documented replay-all edit and checks the think block by nesting, not offset; make live-check honours GGUF_PATH. - Verified on Ollama 0.34.0 (17/17 on both models). Docs fixes from an adversarial review: the provenance note no longer credits the upstream base with the Teacher field and datasets; check counts, llama.cpp and Ollama …752eff3 -
release 0.3.0: effort line on Ollama, no reasoning replay on llama-server
- Go template reads Ollama's think level and adds the reasoning-effort line chat_template.jinja adds: high/xhigh/max/ultra -> xhigh, low/minimal -> low, medium and unset -> none. Verified live on Ollama 0.33.3 (live_check.sh). - chat_template.jinja ignores preserve_thinking / preserve_reasoning. Recent llama-server builds set preserve_thinking=true by default, so the old opt-in replayed every earlier turn's reasoning on a stock server. The bundled GGUF is restamped in a separate commit. - check.sh check 9 (check_go_template.py) guards Ollama's thinking detection and Qwen's stock condition; scripts/live_check.sh (make live-check) runs live checks in an isolated Ollama. - Docs: standalone llama.cpp results (master a2878d3 and b10760: one call per tool request, effort values forwarded), Ollama live results, CPU-only throughput, and the kwargs-equivalence claim narrowed to the tool-call fix. - CHANGELOG 0.3.0, CITATION.cff 0.3.0. Co-Authored-By: Claude Opus 5 (1M context…2e2b8f8 -
fix(template): restore Qwen's stock thinking condition; correct the docs
The Go template's thinking block had been restored as `$last`-only (9ead6fb), which was stricter than Qwen stock: on Ollama it also dropped the reasoning of a live tool-call chain once the tool result followed. Review caught it. Restored instead with Qwen's stock condition, {{ if (and $.IsThinkSet (and .Thinking (or $last (gt $i $lastUserIdx)))) -}}, with its $lastUserIdx loop. The file is byte-identical to the Go template this repo shipped before its preserve-thinking change (be5b45f~1). Reasoning from turns before the latest user message is still dropped; the turn in progress, a tool-call chain included, keeps its own; Ollama still detects thinking, so it keeps the Go template. Verified in an isolated Ollama 0.33.3 daemon against the published blob: selected=go_template go_template="[completion tools thinking]"; a first-turn tool call at reasoning_effort "max" returns one call; a prior turn's reasoning is dropped (187 prompt tokens with and without it) while a live tool chain keeps…9dfadfe -
fix(template): restore the Go template's thinking detection so Ollama runs it
Disabling preserve-thinking (a6a2b7e) deleted the {{ if (and $.IsThinkSet .Thinking) }} block from the Go template. That block was also the only thing Ollama uses to infer the template's "thinking" capability, and recent Ollama compares that list with the GGUF's embedded Jinja template at load time, keeping the Go template only on a tie (read from Ollama v0.33.3 source: shouldPreferChatTemplate, thinking.InferTags). With thinking gone, Ollama switched to the embedded template. The service log shows one unchanged 0.33.3 process logging selected=go_template before the change and selected=gguf_chat_template after it. That switch exposed the reasoning_effort 500s fixed in 2f2f397, and a parser problem: on the embedded-template path the bundled llama-server also picks up tool calls the model rehearses inside <think>, so one call came back twice (reproduced from raw model output). Restored as {{ if and $last $.IsThinkSet .Thinking }}. It renders only for a trailing assistant message, so ea…9ead6fb
-
change: stop replaying earlier turns' reasoning into the prompt
This repo preserved reasoning across turns deliberately - a documented divergence from Qwen stock - so the model could see how it reached its previous answers. The cost was context: every retained trace stayed in the prompt and prefill grew with it. Measured A/B on this model, same 3-message request, only the template differing: 192 prompt tokens without replay vs 221 with. The 29-token delta is exactly the prior turn's <think> block. Changed on both runtimes so they stay consistent: Ollama the {{ if (and $.IsThinkSet .Thinking) }} block is removed from the Modelfile TEMPLATE and the bridge template. Byte-equivalent to before for any turn that carried no trace. llama.cpp chat_template.jinja defaults preserve_thinking to false where upstream defaults it true. Both bundled GGUFs re-stamped so the embedded template matches - only tokenizer.chat_template changed, all 851 tensors carried through untouched. Reasoning is st…a6a2b7e
-
feat(template): preserve thinking across turns
Qwen's stock template drops reasoning from every earlier turn: the guard `(or $last (gt $i $lastUserIdx))` only renders a <think> block for the current assistant turn. Removing that clause means every assistant message carrying a .Thinking field renders its reasoning back into the prompt. The `$lastUserIdx` preamble fed only that guard, so it goes too. Applied to both `template` and the Modelfile TEMPLATE block — they must match or the HF bridge and local builds diverge — and kept byte-identical to the Thanatos sibling. Verified: two tags off identical weights differing only in template, given a conversation whose first assistant turn carried a ~240-word thinking block, rendered 181 vs 464 prompt tokens. The cost is context, and it compounds on a prefill-bound host. Documented in the card and in a Modelfile comment so the divergence from Qwen stock is not reverted by mistake. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/…be5b45f
-
fix: honor think=false by gating the <think> prefill on IsThinkSet
The generation prompt unconditionally prefilled an open <think>, so requests with think=false still forced a reasoning trace (it leaked into content). Gate the prefill on IsThinkSet: emit a closed empty think block when thinking is explicitly off, else open <think>. Verified vs Ollama 0.30.8: think=true keeps reasoning in the thinking field, think=false suppresses it, unset still reasons. template + Modelfile kept bridge-synced. Also corrects the stale '-o on ollama run' comment (no such flag; use /set parameter). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>f4db68f
-
Duplicate from FoolDev/Janus-35B
64b629a