#Local llm pc requirements
1 messages ¡ Page 1 of 1 (latest)
Yes â it can run Qwen3 32B locally on that box, but only in quantized form and itâll be CPU/RAM-bandwidth limited (so: usable for experimentation, not âsnappy ChatGPT speedâ).
What will / wonât work
- FP16 / full precision: basically no on 64GB (32B fp16 weights alone are ~64GB, and you still need KV cache + overhead).
- 8-bit: maybe tight depending on the build/context length, but often ends up cramped/slow.
- 4-bit (recommended): yes. A 32B model in 4-bit is typically ~16â20GB for weights + some overhead, so 64GB system RAM is enough.
Performance expectations (important)
- With no discrete GPU (Intel Iris Xe iGPU isnât very helpful for big LLM inference in most common stacks), expect something like low single-digit tokens/sec on CPU for 32B Q4, sometimes worse depending on context length and settings.
- Itâll run, but longer prompts / big context windows will slow it down further because the KV cache grows with context.
Practical advice
- If your goal is âfeels fastâ, you usually want an NVIDIA GPU with lots of VRAM (e.g., 24GB+ for this class of model).
- If youâre okay with âruns but slowâ, start with Q4 quantization (llama.cpp/Ollama style) and keep context moderate.
- If you want a smoother local experience on that machine, consider Qwen 14B / 8B tiers instead.
If you tell me what runtime you plan to use (Ollama vs llama.cpp vs something else) and what âacceptable speedâ means to you (coding assistant vs occasional Q&A), I can suggest the best quant + settings.
What are realistic use cases for qwen 14b / 8b and what types of use cases would push it overboard
For local use, 8B/14B models are the sweet spot: fast enough on CPU (or modest GPU), cheap enough to run often, and âsmart enoughâ for a lot of daily tasks. The main limits are reasoning depth, long-context synthesis, and high-precision coding/debugging.
Realistic âthis works wellâ use cases
Qwen ~8B (good when you want speed)
- Everyday chat + brainstorming (ideas, outlines, alternatives, pros/cons)
- Rewrite/cleanup: emails, docs, tone changes, shortening/expanding text
- Summaries of short/medium content (a few pages worth)
- Light coding help: explain snippets, write small functions, regex, config examples
- Basic RAG/Q&A if you feed it tight, relevant chunks (it can be a solid âanswer formatterâ)
Qwen ~14B (noticeably better âthinkingâ, still runnable locally)
- Everything above, but better at:
- Following instructions + structured outputs (JSON-ish, step lists, templates)
- More reliable coding: small features, refactors in a file, debugging from a stack trace
- Multi-step tasks: âcompare these options, choose one, justify, produce final outputâ
- RAG with a bit more messiness (it tolerates noisier retrieved context)
What tends to push 8B/14B âoverboardâ
These are the common failure modes:
- Very long context / lots of documents
- âRead these 20 pages and find subtle contradictionsâ
- Long transcripts + long instructions + long output
Even if it fits in context, quality drops: it misses details or blends facts.
- High-precision reasoning
- Hard math, tricky logic puzzles, detailed planning with many constraints
Theyâll often give an answer confidently, but make a small fatal mistake.
- Serious coding in a real codebase
- âAdd a feature across 20 filesâ, âdiagnose a complex concurrency bugâ, âunderstand this architecture from multiple modulesâ
Smaller models lose the thread and invent details unless you heavily guide them (or use stronger models).
- High-stakes factuality
- Legal/medical/finance âmust be correctâ answers without ground truth docs
Hallucination risk is the real limiter, not raw speed.
- Agent/tool reliability
- If you want consistent tool-calling / step-by-step execution without supervision, smaller models can be flaky (depends on the runtime, prompt discipline, and quantization).
Rule of thumb
- If you mostly do single-file coding, writing, summarizing, Q&A with RAG â 14B feels like âdaily driverâ.
- If you want fast + cheap + good enough â 8B.
- If you want deep reasoning, large refactors, or messy multi-doc synthesis â thatâs where you start wanting bigger than 14B (or a cloud model).
If you tell me your top 2â3 tasks (e.g. âcoding assistantâ, âRAG over PDFsâ, âchatâ), I can say whether 8B is enough or 14B is worth it, and what context length/quant to aim for.
Is it possible that the 14b takes over 5 minutes to respond on this machine? Or is it likely that my files are corrupted?
Yes, itâs possible for a 14B model to take 5+ minutes on that machine â but only under certain conditions. For a short prompt (like âhiâ in a fresh chat), 5 minutes is not normal and usually points to settings/runtime issues rather than âcorrupted filesâ.
When 5+ minutes can be normal
-
Huge prompt / huge context being fed in
- If your UI/RAG is injecting a lot of text (logs, docs, multiple files), the model has to âprefillâ (process) all of it before it can emit the first token.
- With 10kâ50k tokens of input, âminutes to first tokenâ can happen on CPU.
-
Too-high precision / weak quantization choice
- If you accidentally loaded something like FP16 or a very heavy quant (or a format/backend that doesnât use good CPU kernels), it can crawl.
-
Swapping / memory pressure
- If RAM is getting close to full and the OS starts swapping, performance falls off a cliff.
-
Low-power / throttling
- Mini PCs can thermal throttle hard; if clocks drop a lot under sustained load, everything slows.
When it suggests âsomethingâs wrongâ
- If even a tiny prompt in a new session takes 5 minutes to produce the first token, thatâs usually:
- wrong backend (not using AVX/BLAS optimizations),
- thread count set weirdly low,
- stuck download/verify step in the runner,
- or the app is feeding a massive hidden system prompt/context.
Corrupted model files are less likely â corruption usually causes load errors / crashes, not just âsuper slow but still worksâ.
Quick way to narrow it down
- Try a fresh chat, prompt:
Say "test" and stop. - While itâs âthinkingâ, check:
- Is CPU pegged near 100%? (then itâs likely just crunching a big prefill or slow quant)
- Is RAM near the limit / swap active?
- Tell me what youâre using to run it (Ollama / LM Studio / llama.cpp) and (if you know) the quantization (Q4/Q5/Q8/etc) + your context length setting.
With those 3 details I can tell you if the timing is expected and what to change to get it down to seconds.
Ollama
Q4
262144 length
Context token cap at 50000
All I said was âsay âhiââ and itâs going on 10 minutes without a response
Thatâs almost certainly the context length setting, not corrupted files.
In Ollama (llama.cpp under the hood), num_ctx isnât just a âcapâ â it drives how big the KV cache is, and a lot of backends effectively allocate/prepare memory sized for that max. At 262,144 ctx, a 14B model can need way more than 64GB worth of KV/cache/overhead (or itâll start swapping like crazy). Result: you get âno output for 10 minutesâ even for say "hi".
What to do
- Drop context length hard: try 8192 (or 16384 if you really want).
- Restart Ollama after changing it (so it actually reloads with the new ctx).
- Test again with a truly fresh prompt.
If youâre using âOllama + a UIâ
Many UIs have a âcontext length / num_ctxâ slider. Set it to 8k/16k. Your âcontext token cap at 50000â doesnât save you if the runner is still configured for 262k max.
If you want 50k+ context
On that machine, itâs usually not the right approach. Use RAG/chunking (retrieve only the relevant parts) instead of trying to stuff 50k tokens into the prompt window.
If you tell me which UI youâre using (Open WebUI, LM Studio, etc.), I can point to the exact setting name/location to change.
Can you explain this very simply for me pretty please. Like Iâm your grandma
Sure.
The simple version
âContext lengthâ is how much the AI is allowed to remember at once (how big its âworking memoryâ is).
You set it to 262,144, which is like telling your computer:
âBefore you answer even âhiâ, please set up a giant table big enough to hold an entire library.â
Your PC canât comfortably set up a table that big with only 64GB of RAM, so it starts struggling (it uses the SSD as emergency memory, which is much slower). Thatâs why you get no response for 10 minutes.
Itâs not that the model is corrupted â itâs just trying to prepare for an absurdly huge memory setting.
What to do (easy fix)
- Change context length from 262144 to 8192 (or 16384).
- Restart Ollama (or restart whatever app/UI youâre using with Ollama).
- Try again:
say "hi"should respond normally.
Why your âcap at 50,000â didnât help
Even if you promise you wonât use the whole library, the computer still tries to prepare the huge table because you told it the max could be 262,144.
If you tell me what app youâre using on top of Ollama (Open WebUI, LM Studio, etc.), Iâll tell you exactly where that setting is.
So whatâs the trade off?
Tradeâoff is basically âhow much it can hold in its headâ vs âhow fast and smooth it runs.â
If you set a small context (like 8kâ16k)
Pros
- Replies start fast
- Uses less RAM (so your PC stays responsive)
- Less chance of the system going into slow âswap to SSDâ mode
Cons
- It âforgetsâ older parts of the conversation sooner
- You canât paste huge documents and expect it to consider all of it at once
If you set a big context (like 32k, 50k, 100k+)
Pros
- You can include more chat history / larger documents
- Better for âanalyze this long reportâ if your hardware can handle it
Cons
- Uses a lot more RAM (can exceed your 64GB quickly)
- Slower to start responding (it has to read/process more before it can talk)
- If you push it too far, it can get unusable (minutes of waiting, or it thrashes the SSD)
Practical advice for your machine (64GB RAM, CPU-only)
- Default to 8k or 16k
- Go to 32k only if you truly need it and it still feels okay
- Avoid 50k+ unless youâre doing something very specific and accept it being slow
- 262k is basically âserver settingsâ, not miniâPC settings
If you tell me what youâre trying to do (chat? coding? summarizing PDFs? long documents?), Iâll suggest a context number that wonât melt your machine.
Lowered to 16384 and it says ârequest abortedâ after 10 minutes
ârequest aborted after 10 minutesâ usually means the app/UI gave up waiting (timeout) â not that the model finished and returned an error.
At 16k context, a 14B Q4 model should not take 10 minutes to answer âhiâ, so something is still off. The three most common causes:
-
Your UI is still sending a huge context anyway
- Even if you changed the slider, the chat might still contain a ton of hidden text (system prompt, previous messages, RAG snippets).
- Fix: start a brand new chat (not the same thread/history) and try again.
-
Ollama is still effectively using the giant context setting
- Sometimes the change doesnât apply until you restart Ollama.
- Fix: restart Ollama, then retry.
-
Your machine is swapping (RAM full)
- If RAM fills up, it starts using the SSD as âfake RAMâ, and everything becomes painfully slow.
- Fix: watch Task Manager / Activity Monitor: if Memory is near 100% and Disk is busy, thatâs the culprit.
Quick isolation test (important)
Run it without any UI, directly:
- Open a terminal and run:
ollama run qwen3:14b - Then type:
say hi
If this responds quickly, your UI settings/timeout are the issue (very common).
If this also hangs, itâs Ollama/system resource (swap, stuck model load, etc.).
If you tell me which UI youâre using (Open WebUI?) + your OS, and paste the output of ollama ps, I can pinpoint which of the above it is.
I have been using telegram
Got it â thatâs a big clue.
Telegram isnât the âUIâ that runs the model. Itâs just the chat app. So your setup is really:
Telegram (phone/desktop) â some bot/bridge/server â Ollama â bot/bridge â Telegram
That means the ârequest aborted after 10 minutesâ could be happening in the Telegram bot/bridge layer (timeouts are very common), even if Ollama is still grinding away.
The fastest way to figure out where the problem is
On the same machine thatâs running Ollama, open a terminal and run:
ollama run qwen3:14b- then type:
say hi
If that responds quickly:
- Ollama is fine
- Your Telegram integration is timing out / not streaming / waiting too long for first output
If that still hangs:
- then itâs an Ollama/performance setting issue (RAM/swap/context still too high, etc.)
One more important Telegram gotcha
Many Telegram bot frameworks donât stream tokens. They wait for the full answer before sending anything back. So even a small slowdown can look like ânothing is happeningâ until it hits a timeout.
Tell me:
- Is Ollama running on the GMKtec mini PC?
- Whatâs the âbridgeâ between Telegram and Ollama (a Telegram bot you set up? Open WebUI plugin? something else)?
With that, I can tell you exactly where to adjust the timeout / streaming behavior.
Over 2 min and counting waiting directly on ollama no gui or telegram
2 minutes on a direct terminal run is still âsomethingâs wrong / misconfiguredâ for a 14B Q4 saying hi.
The most likely explanation: Ollama is still configured to use that gigantic context internally, so even though you think you lowered it, itâs still trying to set up a huge memory buffer and crawling (or swapping).
Do this simplest test (no chat history)
Cancel the current run (Ctrl+C), then run a one-shot prompt:
ollama run qwen3:14b "say hi"
That avoids any hidden âconversation historyâ inside the interactive session.
Check what Ollama thinks the context is
Run:
ollama show qwen3:14b
Look for something like num_ctx / context settings in the output. If itâs still huge, thatâs the smoking gun.
Quick fix: make a ânormal contextâ copy of the model
Create a file called Modelfile with this inside:
FROM qwen3:14b
PARAMETER num_ctx 8192
Then run:
ollama create qwen3:14b-8k -f Modelfile
ollama run qwen3:14b-8k "say hi"
If that suddenly responds quickly, weâve confirmed the issue was the oversized context setting.
Also: watch RAM
While itâs âthinkingâ, open Task Manager / Activity Monitor:
- If RAM is near full and disk is busy, itâs swapping â everything becomes minutes.
If you paste the output of ollama show qwen3:14b here, I can tell you immediately if the context/config is still stuck on a huge value.
It responded quickly to âollama run qwen3:14b âsay hiââ. Iâm talking seconds
Perfect â that tells us two important things:
- Your model files are fine (not corrupted).
- Your PC can run Qwen3 14B Q4 totally нОŃПаНŃнО â seconds-to-first-token is exactly what weâd expect.
So the â10 minutes â request abortedâ problem is not Ollama itself. Itâs whatever layer you were using before (Telegram bridge / GUI) doing one (or more) of these:
Whatâs probably happening
- Itâs sending a giant amount of text along with your âsay hiâ (old chat history, hidden system prompt, RAG snippets, etc.).
- Or itâs still telling Ollama to use a massive context length (like 262k), which makes it allocate huge memory and crawl.
- Or the Telegram/GUI layer doesnât stream and has a 10-minute timeout, so if it doesnât get output fast enough, it aborts.
What to do next (practical)
- In the Telegram/GUI tool, set context / num_ctx to 8k or 16k (not 262k).
- Start a brand new chat (old history can silently bloat the prompt).
- Look for a setting like âstream responsesâ (turn on if available) and/or increase request timeout if it exists.
If you tell me exactly what youâre using to connect Telegram to Ollama (name of the bot/bridge/app), I can tell you where those settings live.
Itâs the telegram bot
Got it â then the bottleneck is almost certainly how the Telegram bot is calling Ollama, not Ollama itself.
Since ollama run ... "say hi" is fast, the Telegram bot is probably doing one of these:
1) Re-sending the entire chat history every time
Many bots build a big âmessages so farâ payload and send it on every prompt. As the Telegram chat gets longer, the bot keeps sending more and more text, so even âsay hiâ turns into âsay hi + 40 pages of previous chatâ, which gets slow.
Fix: look for a bot command like /reset, /new, clear history, etc.
If you control the bot code/config: limit history to âlast N messagesâ or âlast N tokensâ.
2) Itâs still setting a gigantic context length (num_ctx) in the API call
Even if you lowered it somewhere else, the bot may still be sending num_ctx: 262144 (or similar) in the Ollama request.
Fix: set num_ctx to 8192 (or 16384) in the bot config.
3) Bot has a hard timeout (10 minutes) + no streaming
So it waits⌠then aborts.
Fix: enable streaming (if the bot supports it) or increase the timeout. But honestly, if âsay hiâ was timing out, thatâs usually because of #1 or #2.
To be specific: which Telegram bot is it (name/repo/link), or is it something you wrote yourself? If you paste the config snippet (redact tokens), I can point to the exact setting to change (history length / num_ctx / timeout).
Itâs just BotFather
BotFather isnât actually âthe botâ that talks to Ollama.
Think of BotFather like the clerk at the DMV: it helps you create a bot and gives you the token/password. After that, something else has to run 24/7 (a program, Docker container, server, etc.) that:
reads your Telegram messages â sends them to Ollama â sends the reply back to Telegram
So if youâre getting ârequest abortedâ / slow replies, thatâs coming from the program youâre using as the bridge, not from BotFather.
Two quick questions to find it:
- What did you install to connect Telegram to Ollama? (a GitHub project? Docker? Open WebUI? OpenClaw? something else)
- Where did you paste the BotFather token? (that location usually is the bridge app)
If you tell me that, I can tell you exactly where to change the settings (history length / context / timeout).
Openclaw
Openclaw config file
Ahh, that explains everything.
In your case Telegram is âjust the chat surfaceâ â the thing actually talking to Ollama is OpenClaw. And OpenClaw can (depending on config) accidentally force Ollama into that insane context size again.
Whatâs happening (simple)
If your OpenClaw config points Ollama at the OpenAI-compatible endpoint (.../v1) and/or uses api: "openai-completions", OpenClaw will often inject num_ctx based on your configured contextWindow.
So if you told OpenClaw something like âcontextWindow = 262144â, it will effectively tell Ollama:
âallocate a 262k context KV cacheâ
âŚand youâre right back to the â10 minutes then abortâ problem.
Docs call this out here (especially the warning about not using /v1 for Ollama with OpenClaw):
https://docs.openclaw.ai/providers/ollama
What to fix in openclaw.json
Open your OpenClaw config (usually ~/.openclaw/openclaw.json) and look for your Ollama provider.
You want the native Ollama API, like:
models: {
providers: {
ollama: {
baseUrl: "http://127.0.0.1:11434", // IMPORTANT: no /v1
api: "ollama", // native Ollama API
apiKey: "ollama-local"
}
}
}
Then either:
- remove any huge
contextWindowoverride you added, or - set it to something sane like 8192 or 16384 for this machine.
After editing, restart:
openclaw gateway restart
If you paste this snippet, Iâll tell you exactly what line is causing it
Paste (redacting tokens) the models.providers.ollama block + the model entry youâre using (the part where contextWindow is set). Thatâs the part thatâs almost certainly forcing 262144 again.
"custom-127-0-0-1-11434": {
"baseUrl": "http://127.0.0.1:11434/v1",
"apiKey": "ollama",
"api": "openai-completions",
"models": [
{
"id": "qwen3:14b",
"name": "qwen3:14b (Custom Provider)",
"reasoning": false,
"input": [
"text"
],
"cost": {
"input": 0,
"output": 0,
"cacheRead": 0,
"cacheWrite": 0
},
"contextWindow": 16384,
"maxTokens": 4096
}
]
Yep â that config snippet is the problem.
Youâre currently using Ollamaâs OpenAI-compatible endpoint:
baseUrl: "http://127.0.0.1:11434/v1"api: "openai-completions"
OpenClawâs docs are pretty explicit: donât use /v1 with Ollama in OpenClaw â it can break streaming/tool calling and generally behaves weird compared to Ollamaâs native API.
Source: https://docs.openclaw.ai/providers/ollama (see the warning at the top)
Fix (minimal change)
Keep your provider name the same, just change these two lines:
"custom-127-0-0-1-11434": {
"baseUrl": "http://127.0.0.1:11434", // <- remove /v1
"api": "ollama", // <- switch to native
"apiKey": "ollama",
...
}
Leave your model block as-is (your contextWindow: 16384 is fine).
Then restart the gateway:
openclaw gateway restart
One more thing (Telegram session may still be âpoisonedâ)
In Telegram, send /new to start a fresh session, then try âsay hiâ again.
If itâs still slow after that, paste your agents.defaults.model.primary line too â I want to make sure youâre actually targeting custom-127-0-0-1-11434/qwen3:14b (and not some other model/provider silently).
i made those changes - no response or even a "typing" signal.
Two key things here:
- Telegram âtypingâ isnât guaranteed (OpenClaw can do draft streaming, but it depends on
channels.telegram.streamingetc.), so donât rely on that as the signal. - No reply at all usually means OpenClaw is erroring before it can send anything back (or the gateway/channel isnât running).
Most common mistake after that edit
If you changed only the baseUrl (removed /v1) but left:
"api": "openai-completions"
then OpenClaw will try to call OpenAI-style endpoints on a non-OpenAI URL and it will basically 404/fail â no response.
For native Ollama it must be both:
baseUrl: "http://127.0.0.1:11434"
api: "ollama"
Fast debug checklist (takes 60 seconds)
On the machine running OpenClaw:
- Restart gateway (just to be sure config applied):
openclaw gateway restart
- Check if Telegram channel + gateway are healthy:
openclaw status
openclaw channels status
- Tail logs, then send a Telegram message (âhiâ) and watch what error shows up:
openclaw logs --follow
Next thing I need from you
Paste your updated provider block (the same snippet you pasted before, after your edits). That will tell immediately if the api/baseUrl combination is mismatched.
(If you can also paste openclaw status --all, itâs safe to shareâtokens are redactedâand itâll usually point right at the failure.)
"custom-127-0-0-1-11434": {
"baseUrl": "http://127.0.0.1:11434",
"apiKey": "ollama",
"api": "ollama",
"models": [
{
"id": "qwen3:14b",
"name": "qwen3:14b (Custom Provider)",
"reasoning": false,
"input": [
"text"
],
"cost": {
how long do i have to wait after typing hi for the error to show up in the logs?
If you have openclaw logs --follow running before you send the message, you should normally see something in the logs within 1â5 seconds of sending âhiâ (at least an âinbound Telegram update/messageâ line).
If you see nothing at all after ~10â15 seconds, that usually means the Gateway isnât receiving Telegram updates (channel not running, polling stuck, wrong config file, bot token issue, etc.) â not a model/Ollama error.
A couple nuances:
- If the âerrorâ is a model timeout, then yeah, the log line might only show up after the timeout period (could be minutes). But youâd still typically see an inbound message log immediately.
- For fast failures (bad URL, 404, connection refused), you usually see the error almost immediately.
Quick next check (while youâve got this open): run in another terminal:
openclaw channels status
If Telegram is unhealthy or not started, itâll usually say so right there.
Gateway reachable.
- Telegram default: enabled, configured, running, out:4m ago, mode:polling, token:config
Tip: status --deep adds gateway health probes to status output (requires a reachable gateway).
Cool â that output means Telegram is up and polling, and the Gateway can talk to Telegram (it even shows an outbound send happened ~4 minutes ago).
At this point we need to answer one question:
Is OpenClaw seeing your âhiâ message at all?
1) Check inbound (this is the key step)
Run this, then immediately send âhiâ to the bot in Telegram:
openclaw logs --follow --json
You should see an inbound Telegram event within a couple seconds. If you paste the first ~20 lines that appear after you send âhiâ, weâll know exactly where itâs getting stuck (access control vs model vs something else).
2) Common ânothing happensâ causes
- Youâre chatting in a group and didnât mention the bot. By default groups often require
@botnamemention. Try a DM, or mention it once.
- Model selection mismatch: your provider is named
custom-127-0-0-1-11434, so the model id is typicallycustom-127-0-0-1-11434/qwen3:14b. If your config still saysagents.defaults.model.primary: "ollama/qwen3:14b"(or something else), the agent may be failing to pick a working model.
If you can paste your agents.defaults.model.primary line (or the whole agents: { defaults: { model: ... }} block), I can confirm that part too.
"type":"meta","file":"/tmp/openclaw/openclaw-2026-03-04.log","cursor":103635,"size":103635}
{"type":"log","time":"2026-03-04T05:30:39.205Z","level":"info","subsystem":"gateway/reload","message":"{"subsystem":"gateway/reload"} config change detected; evaluating reload (models.providers.custom-127-0-0-1-11434.baseUrl, models.providers.custom-127-0-0-1-11434.api, models.providers.custom-127-0-0-1-11434.models, agents.defaults.compaction)","raw":"{"0":"{\"subsystem\":\"gateway/reload\"}","1":"config change detected; evaluating reload (models.providers.custom-127-0-0-1-11434.baseUrl, models.providers.custom-127-0-0-1-11434.api, models.providers.custom-127-0-0-1-11434.models, agents.defaults.compaction)","_meta":{"runtime":"node","runtimeVersion":"22.22.0","hostname":"unknown","name":"{\"subsystem\":\"gateway/reload\"}","parentNames":["openclaw"],"date":"2026-03-04T05:30:39.204Z","logLevelId":3,"logLevelName":"INFO","path":{"fullFilePath":"file:///home/johnny-mangual/.npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js:1170:14","fileName":"subsystem-DypCPrmP.js","fileNameWithLine":"subsystem-DypCPrmP.js:1170","fileColumn":"14","fileLine":"1170","filePath":".npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js","filePathWithLine":".npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js:1170","method":"logToFile"}},"time":"2026-03-04T05:30:39.205Z"}"}
{"type":"log","time":"2026-03-04T05:30:39.210Z","level":"info","subsystem":"gateway/reload","message":"{"subsystem":"gateway/reload"} config change applied (dynamic reads: models.providers.custom-127-0-0-1-11434.baseUrl, models.providers.custom-127-0-0-1-11434.api, models.providers.custom-127-0-0-1-11434.models, agents.defaults.compaction)","raw":"{"0":"{\"subsystem\":\"gateway/reload\"}","1":"config change applied (dynamic reads: models.providers.custom-127-0-0-1-11434.baseUrl,
"agents": {
"defaults": {
"model": "custom-127-0-0-1-11434/qwen3:14b",
"models": {
"minimax/MiniMax-M2.5": {
"alias": "Minimax"
},
"openai/gpt-5.1-codex": {
"alias": "GPT"
},
"openai/gpt-5": {},
},
"workspace": "/home/johnny-mangual/.openclaw/workspace",
"contextTokens": 50000,
"memorySearch": {
"sources": [
"memory",
"sessions"
],
"experimental": {
"sessionMemory": true
},
"query": {
"hybrid": {
"enabled": true,
The log lines you pasted are only showing âconfig change appliedâ â I donât see any Telegram inbound message in that snippet yet.
So either:
- you didnât send âhiâ after starting
openclaw logs --follow --json, or - OpenClaw is not receiving your Telegram message (wrong chat / group-without-mention / wrong bot token / pairing/access block).
Do this exact test
- In one terminal:
openclaw logs --follow --json
-
Immediately (within a few seconds) send a DM to the bot in Telegram (not a group), just:
hi -
Wait ~5 seconds and paste the new log lines that appear after you sent
hi.
You should see something that mentions Telegram / an update / a message. If you see nothing at all, OpenClaw isnât seeing the message.
Quick âDM accessâ check (takes 5 seconds)
Run:
openclaw pairing list telegram
- If DM policy is pairing and you arenât approved, itâll show up there.
- If itâs approved and still nothing shows in logs, weâre likely talking to the wrong bot username/token or youâre messaging in a group where mention/privacy mode blocks it.
Paste whatever openclaw pairing list telegram prints (itâs safe).
Nice â your agents.defaults.model: "custom-127-0-0-1-11434/qwen3:14b" looks correct. So model selection isnât obviously the issue.
At this point, if you DM âhiâ and get absolutely nothing back, itâs usually one of these:
1) OpenClaw isnât seeing your DM (or itâs dropping it for auth)
Even if Telegram is ârunningâ, it might be ignoring your message due to DM policy / pairing / allowlist.
Run:
openclaw pairing list telegram
If you see a pending code, approve it:
openclaw pairing approve telegram <CODE>
(From the docs: Telegram DMs default to dmPolicy: "pairing".)
https://docs.openclaw.ai/channels/telegram
2) Youâre not actually DMâing the bot (group mention requirement)
If youâre testing in a group, by default it often requires an @botname mention. Try a direct DM to the bot to eliminate that variable.
3) Get the Telegram-specific logs (much easier to read than the full log)
Right after you send âhiâ, run:
openclaw channels logs --channel telegram
âŚand paste the last chunk it prints. That usually contains the exact âwhyâ (ignored sender, pairing required, mention required, etc.).
One more performance note (not the âno replyâ issue, but important): you have contextTokens: 50000 + session memory enabled. Once itâs replying again, if it feels slow, we should probably lower that for a local 14B model. But first letâs confirm itâs receiving and authorizing your DM.
Log file: /tmp/openclaw/openclaw-2026-03-04.log
Channel: telegram
2026-03-04T05:30:55.781Z info {"subsystem":"gateway/channels/telegram"} [default] starting provider (@Nacho_2_bot)
2026-03-04T05:35:22.043Z info {"subsystem":"gateway/channels/telegram"} [default] starting provider (@Nacho_2_bot)
2026-03-04T05:45:23.945Z info {"subsystem":"gateway/channels/telegram"} telegram sendMessage ok chat=7506591428 message=394
That channel log is actually useful:
- OpenClaw is running a Telegram bot named @Nacho_2_bot
- It successfully sent a Telegram message at 05:45:23 (
sendMessage ok chat=âŚ)
So the âno typingâ part isnât the key issue â the real question is: are you messaging the same bot, and is your DM allowed?
1) First sanity check
In Telegram, make sure you are DMâing exactly: @Nacho_2_bot
(If you accidentally DM a different bot you created earlier, OpenClaw will never see it.)
2) Check DM policy / pairing (this often results in âsilenceâ)
Run these and paste the output:
openclaw config get channels.telegram.dmPolicy
openclaw config get channels.telegram.allowFrom
openclaw pairing list telegram
What weâre looking for:
- If
dmPolicyis pairing:pairing listshould show a pending code the first time you DM. - If
dmPolicyis allowlist: your Telegram numeric user id must be inallowFromor it will ignore you.
(From the docs: allowFrom must be a numeric Telegram user ID, not a username.)
https://docs.openclaw.ai/channels/telegram#dm-policy
3) One more log request (to confirm inbound)
Right after you send âhiâ in the DM, run:
openclaw channels logs --channel telegram
and paste the newest lines. If we donât see any âreceived update/messageâ type lines around that time, it means OpenClaw isnât receiving your DMs (wrong bot / auth / polling issue).
openclaw config get channels.telegram.dmPolicy
đŚ OpenClaw 2026.3.1 (2a8ac97) â I'm the reason your shell history looks like a hacker-movie montage.
pairing
johnny-mangual@johnny-mangual-NucBox-K10:~$ openclaw config get channels.telegram.allowFrom
openclaw pairing list telegram
đŚ OpenClaw 2026.3.1 (2a8ac97)
If it's repetitive, I'll automate it; if it's hard, I'll bring jokes and a rollback plan.
Config path not found: channels.telegram.allowFrom
đŚ OpenClaw 2026.3.1 (2a8ac97) â The UNIX philosophy meets your DMs.
â
â Doctor warnings âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââŽ
â â
â - channels.telegram.groupPolicy is "allowlist" but groupAllowFrom (and allowFrom) is â
â empty â all group messages will be silently dropped. Add sender IDs to â
â channels.telegram.groupAllowFrom or channels.telegram.allowFrom, or set groupPolicy to â
â "open". â
â â
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââŻ
No pending telegram pairing requests.
johnny-mangual@johnny-mangual-NucBox-K10:~$ openclaw channels logs --channel telegram
Log file: /tmp/openclaw/openclaw-2026-03-04.log
Channel: telegram
2026-03-04T05:30:55.781Z info {"subsystem":"gateway/channels/telegram"} [default] starting provider (@Nacho_2_bot)
2026-03-04T05:35:22.043Z info {"subsystem":"gateway/channels/telegram"} [default] starting provider (@Nacho_2_bot)
2026-03-04T05:45:23.945Z info {"subsystem":"gateway/channels/telegram"} telegram sendMessage ok chat=7506591428 message=394
johnny-mangual@
That Doctor warning is the smoking gun:
channels.telegram.groupPolicy is "allowlist" but groupAllowFrom (and allowFrom) is empty â all group messages will be silently dropped.
So if youâre testing the bot in a Telegram group, OpenClaw is currently configured to drop everything from groups, with no reply and no pairing prompt (pairing is DM-only).
Fix (pick one)
Option A (simplest): allow groups openly (good for a private group you control)
In your openclaw.json:
channels: {
telegram: {
groupPolicy: "open",
}
}
Restart:
openclaw gateway restart
Option B (safer): allow only you in groups
Add your Telegram numeric user id to groupAllowFrom:
channels: {
telegram: {
groupPolicy: "allowlist",
groupAllowFrom: ["tg:123456789"], // <- your Telegram user id
}
}
(IDs must be numeric; usernames wonât work. Docs: https://docs.openclaw.ai/channels/telegram#dm-policy)
Quick check: are you DMâing or in a group?
- DM: pairing applies. Youâd see a pending request in
openclaw pairing list telegramthe first time. - Group: pairing does not apply. GroupPolicy/allowlists decide everything.
If you tell me whether youâre trying to use it in a DM or a group, Iâll give you the exact minimal config block (including requireMention if needed).
dm
If youâre testing in a DM, then groupPolicy/allowFrom doesnât matter â good.
Given:
dmPolicy: pairingpairing list telegramshows no pending requests- channel logs show it can send (
sendMessage ok âŚ)
âŚthen either youâre already paired or OpenClaw is not actually receiving your DM updates.
Quick sanity check
Are you DMâing the same bot OpenClaw is running?
Your logs say itâs:
@Nacho_2_bot
If you DM a different bot, OpenClaw will never see it.
The decisive test (DM inbound)
- Run this:
openclaw logs --follow --json
- DM @Nacho_2_bot the message:
hi
You should see an inbound Telegram log line within a couple seconds.
If you see nothing at all, then OpenClaw isnât receiving updates (polling conflict, webhook set somewhere, wrong bot token, etc.).
If inbound logs are still missing, run this next
This checks if a webhook is set (webhook breaks polling):
openclaw channels capabilities --channel telegram
(or if you prefer the Telegram API route, we can do getWebhookInfo too)
Tell me: when you DM hi, do you see any new log line in openclaw logs --follow --json? Even a warning/error.
{"type":"log","time":"2026-03-04T05:55:26.622Z","level":"debug","subsystem":"diagnostic","message":"{"subsystem":"diagnostic"} run registered: sessionId=64f3438e-f003-4ded-9842-552c35ef937c totalActive=1","raw":"{"0":"{\"subsystem\":\"diagnostic\"}","1":"run registered: sessionId=64f3438e-f003-4ded-9842-552c35ef937c totalActive=1","_meta":{"runtime":"node","runtimeVersion":"22.22.0","hostname":"unknown","name":"{\"subsystem\":\"diagnostic\"}","parentNames":["openclaw"],"date":"2026-03-04T05:55:26.621Z","logLevelId":2,"logLevelName":"DEBUG","path":{"fullFilePath":"file:///home/johnny-mangual/.npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js:1170:14","fileName":"subsystem-DypCPrmP.js","fileNameWithLine":"subsystem-DypCPrmP.js:1170","fileColumn":"14","fileLine":"1170","filePath":".npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js","filePathWithLine":".npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js:1170","method":"logToFile"}},"time":"2026-03-04T05:55:26.622Z"}"}
{"type":"log","time":"2026-03-04T05:55:26.623Z","level":"debug","subsystem":"agent/embedded","message":"{"subsystem":"agent/embedded"} embedded run prompt start: runId=cfae997b-bcf4-480c-906c-28466fa786ca sessionId=64f3438e-f003-4ded-9842-552c35ef937c","raw":"{"0":"{\"subsystem\":\"agent/embedd
ed\"}","1":"embedded run prompt start: runId=cfae997b-bcf4-480c-906c-28466fa786ca sessionId=64f3438e-f003-4ded-9842-552c35ef937c","_meta":{"runtime":"node","runtimeVersion":"22.22.0","hostname":"unknown","name":"{\"subsystem\":\"agent/embedded\"}","parentNames":["openclaw"],"date":"2026-03-04T05:55:26.623Z","logLevelId":2,"logLevelName":"DEBUG","path":{"fullFilePath":"file:///home/johnny-mangual/.npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js:1170:14","fileName":"subsystem-DypCPrmP.js","fileNameWithLine":"subsystem-DypCPrmP.js:1170","fileColumn":"14","fileLine":"1170","filePath":".npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js","filePathWithLine":".npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js:1170","method":"logToFile"}},"time":"2026-03-04T05:55:26.623Z"}"}
{"type":"log","time":"2026-03-04T05:55:26.626Z","level":"debug","subsystem":"agent/embedded","message":"{"subsystem":"agent/embedded"} embedded run agent start: runId=cfae997b-bcf4-480c-906c-28466fa786ca","raw":"{"0":"{\"subsystem\":\"agent/embedded\"}","1":"embedded run agent start: runId=cfae997b-bcf4-480c-906c-28466fa786ca","_meta":{"runtime":"node","runtimeVersion":"22.22.0","hostname":"unknown","name":"{\"subsystem\":\"agent/embedded\"}","parentNames":["openclaw"],"date":"2026-03-04T05:55:26.626Z","logLevelId":2,"logLevelName":"DEBUG","path":{"fullFilePath":"file:///home/johnny-mangual/.npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js:1170:14","fileName":"subsystem-DypCPrmP.js","fileNameWithLine":"subsystem-DypCPrmP.js:1170","fileColumn":"14","fileLine":"1170","filePath":".npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js","filePathWithLine":".npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js:1170","method":"logToFile"}},"time":"202
T05:55:26.626Z"}"}
{"type":"log","time":"2026-03-04T05:57:25.715Z","level":"info","message":"typing TTL reached (2m); stopping typing indicator","raw":"{"0":"typing TTL reached (2m); stopping typing indicator","_meta":{"runtime":"node","runtimeVersion":"22.22.0","hostname":"unknown","name":"openclaw","date":"2026-03-04T05:57:25.715Z","logLevelId":3,"logLevelName":"INFO","path":{"fullFilePath":"file:///home/johnny-mangual/.npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js:1010:46","fileName":"subsystem-DypCPrmP.js","fileNameWithLine":"subsystem-DypCPrmP.js:1010","fileColumn":"46","fileLine":"1010","filePath":".npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js","filePathWithLine":".npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js:1010","method":"console.log"}},"time":"2026-03-04T05:57:25.715Z"}"}
Good news: those debug lines mean OpenClaw did receive your DM and it started a run:
run registered ⌠totalActive=1embedded run prompt start âŚ
So weâre past âTelegram isnât workingâ â now itâs âthe run is taking a long timeâ.
Most likely reason itâs slow right now
In the config you pasted earlier you have:
contextTokens: 50000memorySearch.sources: ["memory","sessions"]experimental.sessionMemory: true
That combo can make the prompt/context huge (or trigger extra retrieval/indexing work), which is brutal for a local 14B model.
Quick speed fix (recommended for local 14B)
Change your agent defaults to something like:
agents: {
defaults: {
contextTokens: 16384, // or even 8192
memorySearch: {
experimental: { sessionMemory: false },
sources: ["memory"]
}
}
}
Then:
openclaw gateway restart
One thing I need from the logs
After you send âhiâ, wait ~10â20 seconds and paste the next few log lines after embedded run prompt start â especially anything mentioning ollama, llm, memorySearch, or an error/timeout.
That will tell us if itâs:
- spending forever building context / memory retrieval, or
- actually calling Ollama and getting stuck there.
Those log lines show the run starts, but then it goes quiet â that usually means itâs spending a long time in âbuild a giant prompt + run the modelâ (and it doesnât emit many debug logs while doing it).
Given your config, the biggest foot-gun is:
contextTokens: 50000memorySearch.sources: ["memory","sessions"]withsessionMemory: true
That can make every DM effectively âhi + a ton of historyâ, which is painfully slow on a local 14B.
Fast fix (copy/paste)
Run these on the gateway host:
openclaw config set agents.defaults.contextTokens 16384 --strict-json
openclaw config set agents.defaults.memorySearch.experimental.sessionMemory false --strict-json
openclaw config set agents.defaults.memorySearch.sources '["memory"]' --strict-json
openclaw gateway restart
Then in Telegram DM, send:
/new- then
hi
Why this helps
It forces OpenClaw to keep the âworking memoryâ closer to what your Ollama model can actually handle quickly, instead of trying to drag along 50k tokens worth of old session text.
If after doing that itâs still slow, the next thing Iâd check is openclaw models status to confirm OpenClaw is actually using custom-127-0-0-1-11434/qwen3:14b and not falling back.
That line is actually a good sign:
typing TTL reached (2m); stopping typing indicator
Meaning: OpenClaw did start processing your DM, and it even started a typing indicator â it just hasnât produced a reply within 2 minutes, so Telegram stops showing âtypingâ.
So weâre back to âitâs working, but itâs WAY too slowâ.
Do this now
- In the Telegram DM, send:
stop- then
/new
(âstopâ is an abort trigger; it should cancel the stuck run.)
- Apply the speed config changes + restart:
openclaw config set agents.defaults.contextTokens 16384 --strict-json
openclaw config set agents.defaults.memorySearch.experimental.sessionMemory false --strict-json
openclaw config set agents.defaults.memorySearch.sources '["memory"]' --strict-json
openclaw gateway restart
- DM the bot:
hi
Why this should fix it
Right now your bot is likely trying to shove a lot of context/history into every request (50k tokens + session memory), which turns even âhiâ into a huge prompt that a local 14B model will take minutes to chew through.
If after this itâs still taking >30 seconds for âhiâ, tell me what your CPU usage looks like during the run (is it pegged at 100% or mostly idle?). That tells us whether itâs âslow prefillâ vs âstuck callâ.
im ready to send hi but i see it says "typing" after telling me "agent was aborted"
Thatâs normal.
The typing indicator is âbest effortâ and it can lag a bit behind reality â especially if:
- a run was aborted mid-flight, and
- Telegram is still showing the last âtypingâŚâ state until it times out / gets updated.
If OpenClaw already told you âagent was abortedâ, youâre safe to proceed.
Do this order (clean test)
- Send (as a standalone message in the DM):
/new
- Then send:
hi
If you still see âtypingâŚâ after the abort, ignore it â it should clear on its own (thereâs a TTL). If it never clears and it never responds, tell me whether you already ran the config changes + openclaw gateway restart (the contextTokens/memorySearch tweaks).
nada...
If you sent /new and then hi in the DM and got nothing, the two most common causes are:
- Thereâs still a run stuck âactiveâ and your new messages are being queued/ignored
- The Gateway/channel is fine, but we need to see what the logs say at the moment you send
hi
Fast reset (clears stuck runs)
On the machine running OpenClaw:
openclaw gateway restart
Then verify itâs back:
openclaw status
Confirm the âspeed settingsâ actually applied
openclaw config get agents.defaults.contextTokens
openclaw config get agents.defaults.memorySearch.sources
openclaw config get agents.defaults.memorySearch.experimental.sessionMemory
Then do the decisive log test again
- Run:
openclaw logs --follow --json
- Immediately DM the bot:
hi
Paste the first new log lines that appear right after you send it.
If we donât see an inbound message / run start line, then Telegram isnât reaching the agent. If we do see a run start, weâll know exactly where itâs stalling.
is this anything /subsystem-DypCPrmP.js","filePathWithLine":".npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js:1170","method":"logToFile"}},"time":"2026-03-04T06:05:31.780Z"}"}
{"type":"log","time":"2026-03-04T06:05:31.785Z","level":"info","subsystem":"gateway/ws","message":"{"subsystem":"gateway/ws"} â res â status 922ms conn=7e6ed3c8âŚ88f5 id=61b4d803âŚ0cfd","raw":"{"0":"{\"subsystem\":\"gateway/ws\"}","1":"â res â status 922ms conn=7e6ed3c8âŚ88f5 id=61b4d803âŚ0cfd","_meta":{"runtime":"node","runtimeVersion":"22.22.0","hostname":"unknown","name":"{\"subsystem\":\"gateway/ws\"}","parentNames":["openclaw"],"date":"2026-03-04T06:05:31.785Z","logLevelId":3,"logLevelName":"INFO","path":{"fullFilePath":"file:///home/johnny-mangual/.npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js:1170:14","fileName":"subsystem-DypCPrmP.js","fileNameWithLine":"subsystem-DypCPrmP.js:1170","fileColumn":"14","fileLine":"1170","filePath":".npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js","filePathWithLine":".npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js:1170","method":"logToFile"}},"time":"2026-03-04T06:05:31.785Z"}"}
{"type":"notice","message":"Log tail truncated (increase --max-bytes)."}
That line:
subsystem: "gateway/ws" â res â status âŚ
is basically just âthe Gateway answered a status request over WebSocketâ (often from you running openclaw status, the Control UI, etc.). Itâs a good sign (gateway is alive), but itâs not your Telegram âhiâ being processed, and not an Ollama call.
The important logs for your DM will mention subsystems like:
gateway/channels/telegram(inbound update / message handling)agent/embedded(run start)- something with
ollama/llm(model request)
How to grab the right lines
- Start the tail with a bigger buffer (your output says it truncated):
openclaw logs --follow --json --max-bytes 2000000
-
Then immediately DM the bot:
hi -
Paste the first new lines that show up after you send
hi(weâre looking foragent/embedded/telegram).
Also: did you already run the config changes to drop contextTokens + turn off session memory? If not, do that firstâotherwise even a âhiâ can still take minutes.
yes i did those things. no new lines showed up
If no new lines show up at all when you DM hi, that means OpenClaw is not seeing the inbound Telegram message (so it never even starts a run).
Since outbound worked earlier, the top things to check next are webhook vs polling and polling health.
1) Run the Telegram probe (safe to paste)
On the gateway host:
openclaw channels capabilities --channel telegram
Paste the output. This usually reveals stuff like âwebhook is setâ (which will break polling) or other Telegram-side constraints.
2) Confirm polling is actually receiving anything
Run:
openclaw channels status
openclaw channels logs --channel telegram
Then DM the bot hi again and immediately re-run:
openclaw channels logs --channel telegram
If the log still shows only startup + old sendMessage, itâs not receiving updates.
3) Sanity check: are you DMâing the right bot?
Your gateway logs say the bot is:
@Nacho_2_bot
If you DM a different bot, youâll get exactly âno new linesâ.
Reply with the output of openclaw channels capabilities --channel telegram and we can usually pinpoint it in one step.
{"type":"log","time":"2026-03-04T06:10:25.857Z","level":"warn","subsystem":"agent/embedded","message":"{"subsystem":"agent/embedded"} embedded run agent end: runId=abd485e4-0b13-4331-83ee-700fa362160b isError=true error=fetch failed","raw":"{"0":"{\"subsystem\":\"agent/embedded\"}","1":"embedded run agent end: runId=abd485e4-0b13-4331-83ee-700fa362160b isError=true error=fetch failed","_meta":{"runtime":"node","runtimeVersion":"22.22.0","hostname":"unknown","name":"{\"subsystem\":\"agent/embedded\"}","parentNames":["openclaw"],"date":"2026-03-04T06:10:25.857Z","logLevelId":4,"logLevelName":"WARN","path":{"fullFilePath":"file:///home/johnny-mangual/.npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js:1170:14","fileName":"subsystem-DypCPrmP.js","fileNameWithLine":"subsystem-DypCPrmP.js:1170","fileColumn":"14","fileLine":"1170","filePath":".npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js","filePathWithLine":".npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js:1170","method":"logToFile"}},"time":"2026-03-04T06:10:25.857Z"}"}
{"type":"log","time":"2026-03-04T06:10:27.864Z","level":"debug","subsystem":"agent/embedded","message":"{"subsystem":"agent/embedded"} embedded run agent start: runId=abd485e4-0b13-4331-83ee-700fa362160b","raw":"{"0":"{\"subsystem\":\"agent/embedded\"}","1":"embedded run agent start: runId=abd485e4-0b13-4331-83ee-700fa362160b","_meta":{"runtime":"node","runtimeVersion":"22.22.0","hostname":"unknown","name":"{\"subsystem\":\"agent/embedded\"}","parentNames":["openclaw"],"date":"2026-03-04T06:10:27.863Z","logLevelId":2,"logLevelName":"DEBUG","path":{"fullFilePath":"file
22.22.0","hostname":"unknown","name":"{\"subsystem\":\"agent/embedded\"}","parentNames":["openclaw"],"date":"2026-03-04T06:10:27.863Z","logLevelId":2,"logLevelName":"DEBUG","path":{"fullFilePath":"file:///home/johnny-mangual/.npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js:1170:14","fileName":"subsystem-DypCPrmP.js","fileNameWithLine":"subsystem-DypCPrmP.js:1170","fileColumn":"14","fileLine":"1170","filePath":".npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js","filePathWithLine":".npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js:1170","method":"logToFile"}},"time":"2026-03-04T06:10:27.864Z"}"}
Yes â thatâs very relevant.
embedded run agent end ⌠isError=true error=fetch failed
means: OpenClaw tried to make an HTTP request and the network call itself failed (timeout / connection refused / connection reset). Itâs not a âmodel answered but wrongâ type of error â itâs âcouldnât reach the serverâ.
In your setup, the #1 suspect is the Ollama call to:
http://127.0.0.1:11434 (your custom provider)
Fast way to confirm whatâs failing
- From the same machine, run:
curl -sS http://127.0.0.1:11434/api/tags | head
If this fails/hangs, OpenClaw will fail too â itâs an Ollama reachability issue.
- Run:
openclaw models status
and paste the part that mentions your provider custom-127-0-0-1-11434 (it usually prints a clearer reason than just âfetch failedâ).
Common causes
- Ollama isnât running (or restarted/crashed)
- Ollama is running but bound differently (less likely if
ollama run âŚworks)
- OpenClaw is running in a different network namespace (Docker) where
127.0.0.1isnât the host - Request is hanging until timeout (so you see âtypingâŚâ then eventually âfetch failedâ)
Post the output of the curl /api/tags test + the relevant chunk of openclaw models status and we can pinpoint it quickly.
That snippet doesnât really add anything new â itâs just more metadata for the same run.
We need to confirm what âfetch failedâ is failing to reach.
Please run these two commands and paste the outputs
1) Test Ollama HTTP directly:
curl -sS http://127.0.0.1:11434/api/tags | head
2) Test using Nodeâs fetch (this matches what OpenClaw uses):
node -e "fetch('http://127.0.0.1:11434/api/tags').then(r=>r.text()).then(t=>console.log(t.slice(0,200))).catch(e=>{console.error(e); process.exit(1)})"
Interpretation:
- If both fail â Ollama isnât reachable on that URL/port (or not running).
- If curl works but node fetch fails â itâs usually proxy/env/network-stack weirdness, and the Node error output will tell us the real reason.
- If both work â then the âfetch failedâ is likely happening on a different URL (and weâll pull that from
openclaw models statusnext).
After that, if needed, run:
openclaw models status
and paste just the section for custom-127-0-0-1-11434.
It just responded to hi after 20+ minutes. Like a proper response
Good â that means the whole chain is working (Telegram â OpenClaw â Ollama â back to Telegram).
But 20+ minutes for âhiâ is not remotely normal, even on CPU. That usually means it was doing one of:
- chewing through a huge prompt/context (history/memory/tools), or
- thrashing/loading something cold (model unload/reload, swapping), or
- retrying behind the scenes until something finally returned.
Quick sanity check
Send one more DM like:
hi again
If the second reply comes back in seconds / <1 minute, then the first one was a one-time cold-start / backlog situation.
If itâs still many minutes, then we need to reduce what OpenClaw is stuffing into each request (because a local 14B on CPU canât handle âagent-styleâ giant prompts quickly).
Two knobs that matter most (for local CPU)
Confirm these are actually set how we intended:
openclaw config get agents.defaults.contextTokens
openclaw config get agents.defaults.memorySearch.sources
openclaw config get agents.defaults.memorySearch.experimental.sessionMemory
For a local 14B, Iâd keep contextTokens at 8kâ16k, and Iâd keep session memory search off.
Also worth reading (itâs blunt, but accurate about local models + agent prompts):
https://docs.openclaw.ai/gateway/local-models
Tell me how fast the second âhi againâ is, and paste those 3 config values â then we can tune it to something usable.
second hi takes forever. context tokens and memory search are as they should be
If the second âhiâ is also taking forever, then itâs not a one-time warmup â itâs your per-message workload.
On this hardware (CPU + iGPU), a local 14B can answer fast in Ollama when the prompt is small. OpenClawâs prompts are often not small (system prompt + tools + skills + session plumbing), so the model ends up âreading a bookâ before it can say âhiâ.
Quick A/B test (proves whether itâs âOpenClaw prompt bloatâ)
Temporarily shrink the tool prompt by setting a minimal tool profile:
openclaw config set tools.profile "minimal"
openclaw gateway restart
Then DM the bot: hi
- If that becomes fast, the slowdown is mainly tool/skill/system prompt size (expected with local CPU models).
- If itâs still slow, then something else is wrong (weâd go back to Ollama/network/system load).
Tool profiles are documented here (minimal/messaging/full):
https://docs.openclaw.ai/gateway/configuration-reference#tools
Practical reality check
OpenClaw + Telegram + âagent with toolsâ is a much heavier prompt than âollama run say hiâ. On CPU-only boxes, that often means minutes even for simple messages.
If you want it usable locally on that machine, the usual approach is:
- keep tools/skills very limited (or off) for the local model, or
- use a hosted model for the âagent brainâ and keep local models for simple offline chat.
Try the tools.profile="minimal" test and tell me how long âhiâ takes after that.
at one minute and counting
1 minute (with tools.profile="minimal") is already a huge improvement vs 20 minutes â so that strongly suggests the slowdown is prompt size / âagent baggageâ, not Telegram.
If it still takes ~1â2 minutes even in minimal mode, the next biggest chunk of prompt bloat is usually skills.
Next speed test: disable bundled skills (shrinks the system prompt a lot)
Run:
openclaw config set skills.allowBundled '[]' --strict-json
openclaw gateway restart
Then DM: hi
- If that becomes âfast-ishâ (seconds to ~20s), then youâve confirmed the bottleneck was the skill/tool prompt size.
- If itâs still ~1â2 minutes, then youâre basically at the limit of what that CPU-only box can do for an âassistant-styleâ prompt with a 14B model.
Also: once you do get a reply, try a third message right away (âhi3â). If hi3 is much faster, then part of the delay is still just the model warming up / caching.
Tell me how long âhiâ takes after disabling bundled skills.
no you misinterpreted. it still hasn't returned anything to hi. I meant i was going on over 1 minute. now im at 3:30 and still going
Got it â thanks for clarifying. If youâre at 3:30 for a plain âhiâ, that means the model is spending ages just processing the prompt (prefill). On CPU, that can happen if the prompt is still huge.
Even with tools.profile="minimal", OpenClaw can still be feeding a lot of system text (skills, policies, etc.) + whatever context it keeps.
Do this âmake it tinyâ test (to prove itâs prompt size)
-
Abort the current run (DM the bot):
stop -
On the gateway machine, set these and restart:
openclaw config set agents.defaults.contextTokens 4096 --strict-json
openclaw config set tools.profile "minimal"
openclaw config set skills.allowBundled '[]' --strict-json
openclaw gateway restart
- In Telegram DM:
- send
/new - then
hi
If that drops your âhiâ latency from minutes to something reasonable, weâve confirmed the core issue is OpenClaw prompt bloat vs CPU-only local model. Then we can re-enable things gradually (messaging tools, a small set of skills, etc.) until it becomes too slow again.
If itâs still taking minutes even with that ultra-minimal setup, then weâre looking at a deeper runtime issue (Ollama hanging under OpenClaw load, swapping, etc.) and Iâd want to see CPU/RAM usage while itâs running.
says agent failed before reply: model context window too small (4096 tokens). minimum is 16000. logs: openclaw logs --follow
That error is actually very specific and helpful:
model context window too small (4096 tokens). minimum is 16000.
Meaning: OpenClaw is currently talking to Ollama in a way where Ollama is using a 4k context, but OpenClaw needs ~16k+ just to run (system prompt + safety + tooling scaffold).
So even if your model could support 16k, Ollama is effectively running it at 4096 right now.
Fix (recommended): create an Ollama variant with 16k context
On the machine with Ollama:
- Create a file named
Modelfile:
FROM qwen3:14b
PARAMETER num_ctx 16384
- Create the new model:
ollama create qwen3:14b-16k -f Modelfile
- Update OpenClaw config so the model id matches (both places):
- in your providerâs
models: [{ id: ... }]setid: "qwen3:14b-16k" - set
agents.defaults.modeltocustom-127-0-0-1-11434/qwen3:14b-16k - keep
contextWindow: 16384
- Restart gateway:
openclaw gateway restart
Then in Telegram DM do /new and try again.
Why this happens
Ollama defaults to a smaller context unless itâs explicitly set (either by the modelâs num_ctx or by a client injecting it). OpenClaw is currently seeing/using 4096, so it refuses to run.
If you paste your updated provider models[] entry + agents.defaults.model line after you make the -16k model, Iâll sanity-check it before you restart.
FROM: command not found
PARAMETER: command not found
Yep â that happened because those lines are not shell commands. Theyâre the contents of a file called Modelfile that Ollama reads.
Do it like this (Linux/macOS)
Run these exactly in your terminal:
cat > Modelfile <<'EOF'
FROM qwen3:14b
PARAMETER num_ctx 16384
EOF
ollama create qwen3:14b-16k -f Modelfile
Then verify it exists:
ollama list | grep qwen3
If youâre on Windows
Create a text file named Modelfile (no extension) with:
FROM qwen3:14b
PARAMETER num_ctx 16384
Then run:
ollama create qwen3:14b-16k -f Modelfile
After youâve created it, update OpenClaw to use qwen3:14b-16k (and restart the gateway). If you paste your updated OpenClaw model/provider snippet, Iâll sanity-check it before you restart.
im on linux, i did the list } grep qwen3
Nice â can you paste the actual output of:
ollama list | grep qwen3
Iâm looking to confirm you now have something like qwen3:14b-16k (or similar) in the list.
Next step (once the new model shows up)
Update OpenClaw to point at the new Ollama model id and put contextTokens back to âĽ16000 (because setting it to 4096 is what triggered the âminimum is 16000â failure).
Example commands (adjust the model id to whatever your ollama list shows):
openclaw config set models.providers.custom-127-0-0-1-11434.models[0].id "qwen3:14b-16k"
openclaw config set agents.defaults.model "custom-127-0-0-1-11434/qwen3:14b-16k"
openclaw config set agents.defaults.contextTokens 16384 --strict-json
openclaw gateway restart
Then DM the bot: /new â hi.
Paste your ollama list | grep qwen3 output and Iâll tell you the exact model id string to use in those config lines.
it has not responded yet after 1 min. it's not even showiong that it's typing
1 minute with no typing doesnât necessarily mean itâs broken â but it does mean we need to look at the logs again to see whether:
- OpenClaw even started a run for that message, or
- it failed immediately (context too small, model not found, etc.), or
- it started and is just slow again.
Do this exact check
On the gateway host:
openclaw logs --follow --json
Then DM the bot: hi
Within a few seconds you should see either:
- an
agent/embedded ⌠startline (run started), or
- an error line explaining why it didnât start.
If you paste the first ~10 new log lines that appear right after you send hi, I can tell you which case it is.
Quick config sanity (since we changed a lot)
Also paste these outputs:
openclaw config get agents.defaults.model
openclaw config get agents.defaults.contextTokens
Because if contextTokens accidentally stayed at 4096, OpenClaw will refuse to run (it needs ~16000+).
the logs do not update after a few seconds. it has been 1 minute since sending hi and the logs have not updated yet
If openclaw logs --follow --json doesnât print anything new after you DM hi, that usually means the Gateway never saw the Telegram message (so it never even started a run).
Before we chase Telegram, letâs make sure your log tail is actually âliveâ:
1) Prove the log tail is working
Keep openclaw logs --follow --json running, and in another terminal run:
openclaw status
You should see new log lines appear in the tail (often gateway/ws ⌠status).
- If nothing appears, your tail session isnât actually following live logs (wrong terminal, command exited, etc.).
- If you do see new lines from
openclaw status, then the tail is fine â Telegram DM isnât reaching OpenClaw.
2) If the tail is fine, check Telegram receive health
Run:
openclaw channels status
openclaw channels capabilities --channel telegram
Paste those outputs.
Common causes when send works but receive doesnât:
- A webhook is set for that bot (polling wonât receive updates)
- Another process/OpenClaw instance is also polling the same bot token (Telegram âgetUpdatesâ conflicts)
Also double-check youâre DMâing the exact bot your logs show (@Nacho_2_bot).
the bot is right. Gateway reachable.
- Telegram default: enabled, configured, running, out:6m ago, mode:polling, token:config
Tip: status --deep adds gateway health probes to status output (requires a reachable gateway).
đŚ OpenClaw 2026.3.1 (2a8ac97) â IPC, but it's your phone.
â
â Doctor warnings âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââŽ
â â
â - channels.telegram.groupPolicy is "allowlist" but groupAllowFrom (and allowFrom) is â
â empty â all group messages will be silently dropped. Add sender IDs to â
â channels.telegram.groupAllowFrom or channels.telegram.allowFrom, or set groupPolicy to â
â "open". â
â â
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââŻ
Telegram default
Support: chatTypes=direct,group,channel,thread polls reactions threads media nativeCommands blockStreaming
Actions: send, broadcast, react, delete, edit, topic-create
Bot: @Nacho_2_bot (8762250895)
Flags: joinGroups=true readAllGroupMessages=false inlineQueries=false
Webhook: none
That output is actually great â it rules out the big obvious blocker:
- Webhook: none â (so polling can work)
- Bot identity matches â
- Telegram channel is ârunningâ â
So if you DM hi and (a) you get no typing and (b) the logs donât show any new lines, the gateway is basically not receiving Telegram updates right now (even though it can send).
Two common causes:
1) Another process is polling the same bot token
Telegram long-polling (getUpdates) does not like two consumers. If you have any other bot runner / old OpenClaw instance / test script using that same token, it can âstealâ updates.
Quick check: do you have OpenClaw running anywhere else with the same token (another terminal, another machine, a Docker container)?
2) Polling is failing due to network/IPv6 weirdness
OpenClawâs Telegram docs call this out (broken IPv6 egress can make getUpdates flake). Easiest forced-IPv4 fix:
openclaw config set channels.telegram.network.autoSelectFamily false --strict-json
openclaw gateway restart
Then DM hi again and immediately run:
openclaw channels logs --channel telegram
If it still receives nothing, the âtwo pollersâ situation is the next thing to hunt down (itâs the most common âsend works, receive doesnâtâ failure mode).
- i just transfered from another machine but i ran a stop command on it so i thought it wasn't running it anymore. deleted a bunch of lines but here are some/tmp/openclaw/openclaw-2026-03-04.log
Channel: telegram
2026-03-04T05:30:55.781Z info {"subsystem":"gateway/channels/telegram"} [default] starting provider (@Nacho_2_bot)
2026-03-04T05:35:22.043Z info {"subsystem":"gateway/channels/telegram"} [default] starting provider (@Nacho_2_bot)
2026-03-04T05:45:23.945Z info {"subsystem":"gateway/channels/telegram"} telegram sendMessage ok chat=7506591428 message=394
2026-03-04T05:55:25.436Z info {"subsystem":"gateway/channels/telegram"} telegram sendMessage ok chat=7506591428 message=398
2026-03-04T06:01:29.467Z info {"subsystem":"gateway/channels/telegram"} [default] starting provider (@Nacho_2_bot)
2026-03-04T06:05:22.995Z info {"subsystem":"gateway/channels/telegram"} [default] starting provider (@Nacho_2_bot)
2026-03-04T06:15:25.694Z info {"subsystem":"gateway/channels/telegram"} telegram sendMessage ok chat=7506591428 message=407
2026-03-04T06:25:26.665Z info {"subsystem":"gateway/channels/telegram"} telegram sendMessage ok chat=7506591428 message=409
2026-0
2026-03-04T07:24:16.231Z info {"subsystem":"gateway/channels/telegram"} telegram sendMessage ok chat=7506591428 message=415
2026-03-04T07:24:16.429Z info {"subsystem":"gateway/channels/telegram"} [default] starting provider (@Nacho_2_bot)
2026-03-04T07:55:22.728Z info {"subsystem":"gateway/channels/telegram"} [default] starting provider (@Nacho_2_bot)
2026-03-04T08:30:22.741nels/telegram"} [default] starting provider (@Nacho_2_bot)
2026-03-04T23:25:22.793Z info {"subsystem":"gateway/channels/telegram"} [default] starting provider (@Nacho_2_bot)
2026-03-05T00:00:32.107Z info {"subsystem":"gateway/channels/telegram"} [default] starting provider
2026-03-05T00:00:42.595Z error {"subsystem":"gateway/channels/telegram"} telegram deleteWebhook failed: Network request for 'deleteWebhook' failed!
2
Yeah â this strongly points to the âtwo machines are fighting over the same Telegram bot tokenâ situation.
Two key clarifications:
-
Sending âstopâ in chat only aborts the current agent run.
It does not stop the old machineâs Gateway service (the thing that polls Telegram). -
With Telegram long polling (
getUpdates), you really want exactly one active poller per bot token.
What to do
On the old machine (the one you migrated from), run:
openclaw gateway status
openclaw gateway stop
Then verify itâs actually down:
openclaw gateway status
(If you installed it as a service, this is the important part â otherwise it keeps running in the background.)
On the new machine, do:
openclaw gateway restart
About that log line
telegram deleteWebhook failed: Network request for 'deleteWebhook' failed!
Thatâs a separate network/DNS/IPv6 issue talking to api.telegram.org (the docs mention IPv6 weirdness). But first fix the two pollers problem â that alone often resolves the âno inbound messagesâ symptom.
After you stop the old gateway, if inbound is still flaky, weâll apply the IPv4 forcing fix (channels.telegram.network.autoSelectFamily: false) you already saw.
can i just turn the old machine off?
Yes â powering the old machine off will absolutely stop it from polling Telegram, and thatâs the quickest way to eliminate the âtwo pollersâ problem.
After you turn it off:
- On the new machine run:
openclaw gateway restart
- Then DM the bot again.
If you ever turn the old machine back on later, itâll likely conflict again unless you also run openclaw gateway stop (or uninstall/disable the service) on that old box.
turned it off and restareted gateway. still nothing
If the old machine is truly off and you still get zero inbound replies, then weâre likely dealing with the other issue that showed up in your logs:
deleteWebhook failed: Network request ⌠failed
That points to Telegram API connectivity from the new machine (often IPv6/DNS weirdness on Node 22).
Apply the IPv4/polling stability fix (from the Telegram docs)
On the new machine:
openclaw config set channels.telegram.network.autoSelectFamily false --strict-json
openclaw config set channels.telegram.network.dnsResultOrder "ipv4first"
openclaw gateway restart
Then DM the bot again.
Immediately check Telegram channel logs
openclaw channels logs --channel telegram
If itâs still failing to poll, you should now see explicit network errors in there (getUpdates failures, DNS, etc.).
If you paste the fresh output of openclaw channels logs --channel telegram after that restart, we can pinpoint whether itâs DNS/IPv6, a proxy issue, or something else.
-03-04T23:25:22.793Z info {"subsystem":"gateway/channels/telegram"} [default] starting provider (@Nacho_2_bot)
2026-03-05T00:00:32.107Z info {"subsystem":"gateway/channels/telegram"} [default] starting provider
2026-03-05T00:00:42.595Z error {"subsystem":"gateway/channels/telegram"} telegram deleteWebhook failed: Network request for 'deleteWebhook' failed!
2026-03-05T00:00:42.598Z error {"subsystem":"gateway/channels/telegram"} Telegram webhook cleanup failed: Network request for 'deleteWebhook' failed!; retrying in 2.37s.
2026-03-05T00:35:22.792Z info {"subsystem":"gateway/channels/telegram"} [default] starting provider (@Nacho_2_bot)
Those log lines are the core problem:
telegram deleteWebhook failed: Network request for 'deleteWebhook' failed!
That means the gateway cannot reliably reach api.telegram.org from this machine. If it canât reach Telegramâs API, it canât poll updates â you get ânothingâ in DMs.
Before we touch any more OpenClaw settings, we need to answer: is this an OS/network problem or a Node/IPv6 selection problem?
Run these 2 tests on the gateway machine
(No token needed.)
curl -4 -I https://api.telegram.org
curl -6 -I https://api.telegram.org
- If
-4works but-6fails/hangs â your IPv6 is broken, and OpenClaw/Node may be tripping over it.
- If both fail â your machine canât reach Telegram at all (DNS/firewall/proxy/captive portal/VPN issue).
- If both work â then itâs likely Node fetch behaving differently, and weâll look at the OpenClaw
channels.telegram.network.*settings and logs after restart.
Also, please run this so we know the config fix actually stuck:
openclaw config get channels.telegram.network.autoSelectFamily
openclaw config get channels.telegram.network.dnsResultOrder
Paste the outputs of those four commands and weâll zero in fast.
elegram.org
HTTP/2 302
server: nginx/1.18.0
date: Thu, 05 Mar 2026 04:15:52 GMT
content-type: text/html
content-length: 145
location: https://core.telegram.org/bots
strict-transport-security: max-age=31536000; includeSubDomains; preload
access-control-allow-origin: *
access-control-allow-methods: GET, POST, OPTIONS
access-control-expose-headers: Content-Length,Content-Type,Date,Server,Connection
curl: (7) Failed to connect to api.telegram.org port 443 after 10 ms: Couldn't connect to server
johnny-mangual@johnny-mangual-NucBox-K10:~$ openclaw config get channels.telegram.network.autoSelectFamily
openclaw config get channels.telegram.network.dnsResultOrder
đŚ OpenClaw 2026.3.1 (2a8ac97) â I'll butter your workflow like a lobster roll: messy, delicious, effective.
false
đŚ OpenClaw 2026.3.1 (2a8ac97) â iMessage green bubble energy, but for everyone.
ipv4first
Perfect â that test basically confirms the diagnosis:
- IPv4 to
api.telegram.orgworks (you got the 302) - IPv6 to
api.telegram.orgis broken (curl: (7) ⌠Couldn't connect) - Your OpenClaw config is set to force the IPv4-ish behavior:
autoSelectFamily: falsednsResultOrder: ipv4first
So now the goal is simply: make sure the running gateway process is actually using those settings (and not still doing IPv6).
Do this now
- Restart the gateway (so the Telegram client is re-created with the new network settings):
openclaw gateway restart
- Immediately check for fresh Telegram startup errors:
openclaw channels logs --channel telegram
You should not see deleteWebhook failed anymore.
If it still shows deleteWebhook failed
Then the service likely isnât picking up the config for that process. Use the env overrides the Telegram doc mentions (these are read at process start):
Put this in ~/.openclaw/.env:
OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=1
OPENCLAW_TELEGRAM_DNS_RESULT_ORDER=ipv4first
Then:
openclaw gateway restart
After that, DM the bot again.
If you paste the new channels logs --channel telegram lines after the restart, weâll see immediately whether itâs still trying IPv6 or if itâs clean.
webhook still fails
If deleteWebhook is still failing after you proved IPv4 works with curl, the missing piece is almost always:
Nodeâs fetch (undici) is still trying IPv6 first and not falling back.
Letâs confirm that directly with a 10âsecond test.
1) Test Node fetch to Telegram (same stack OpenClaw uses)
Run:
node -e "fetch('https://api.telegram.org').then(r=>console.log('OK', r.status)).catch(e=>console.error('FAIL', e))"
If that prints FAIL âŚ, then OpenClaw will also fail.
2) Force IPv4 preference for Node and re-test
Run:
NODE_OPTIONS="--dns-result-order=ipv4first" node -e "fetch('https://api.telegram.org').then(r=>console.log('OK', r.status)).catch(e=>console.error('FAIL', e))"
- If this one prints
OK 302(or similar), then weâve nailed it: you need thatNODE_OPTIONSfor the gateway service.
3) Make it permanent for the OpenClaw service
Put this in ~/.openclaw/.env:
NODE_OPTIONS=--dns-result-order=ipv4first
OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=1
OPENCLAW_TELEGRAM_DNS_RESULT_ORDER=ipv4first
Then:
openclaw gateway restart
openclaw channels logs --channel telegram
If you paste the output of steps (1) and (2), I can tell you immediately which path youâre on.
nacho's responses to the earlier his are just coming in now. whats the command for opening up the .env?
On Linux, ~/.openclaw/.env is just a normal text file. Easiest way to edit it:
mkdir -p ~/.openclaw
nano ~/.openclaw/.env
In nano:
- save:
Ctrl+OthenEnter - exit:
Ctrl+X
Then restart OpenClaw so the service picks up the env vars:
openclaw gateway restart
(If you prefer one-liner editing instead of an editor, tell me and Iâll give you a safe cat >> ~/.openclaw/.env version.)
ok added
Now restart the gateway so it actually picks up the .env values:
openclaw gateway restart
Then confirm Telegram is clean (no more deleteWebhook failed):
openclaw channels logs --channel telegram
If that looks good, DM the bot /new and then hi again and see if replies come back normally (no 20âminute backlog).
idk if i did it right subsystem":"gateway/channels/telegram"} [default] starting provider
2026-03-05T00:00:42.595Z error {"subsystem":"gateway/channels/telegram"} telegram deleteWebhook failed: Network request for 'deleteWebhook' failed!
2026-03-05T00:00:42.598Z error {"subsystem":"gateway/channels/telegram"} Telegram webhook cleanup failed: Network request for 'deleteWebhook' failed!; retrying in 2.37s.
Those lines are from 00:00:42Z â theyâre old (from before you edited .env). openclaw channels logs is showing you historical entries, not just âright nowâ.
What we need to know is: after your .env change + restart, are there any new deleteWebhook failed lines?
Do this
- Restart again (to be 100% sure it picked up the env):
openclaw gateway restart
- Show only the most recent Telegram channel log lines:
openclaw channels logs --channel telegram | tail -n 30
(or if you prefer:)
openclaw logs --limit 50
If you still see deleteWebhook failed with a current timestamp, then the fix didnât apply. If you donât see it anymore, youâre good â those midnight errors were just history.
Also safe check: paste your .env contents (it shouldnât contain secrets in our case):
cat ~/.openclaw/.env
04:28:37 error gateway {"subsystem":"gateway"} shutdown timed out; exiting without full cleanup
johnny-mangual@johnny-mangual-NucBox-K10:~$ cat ~/.openclaw/.env
NODE_OPTIONS=--dns-result-order=ipv4first
OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=1
OPENCLAW_TELEGRAM_DNS_RESULT_ORDER=ipv4first
That .env looks correct â those are exactly the lines we want.
The message you saw:
shutdown timed out; exiting without full cleanup
just means the gateway was busy/hung when it tried to restart (common if a run is stuck waiting on a model/network call). Itâs not a config syntax problem.
Do this now
- Check whether the gateway is actually running:
openclaw gateway status
- If itâs not running, start it:
openclaw gateway start
(or if it says itâs running but feels wedged, do a clean stop/start:)
openclaw gateway stop
openclaw gateway start
- Now check the latest Telegram logs (we want to see if
deleteWebhook failedis still happening after 04:28):
openclaw channels logs --channel telegram | tail -n 30
If you paste that tail output, weâll know immediately whether the IPv4 env fix actually took effect.
2026-03-05T04:28:40.445Z info {"subsystem":"gateway/channels/telegram"} [default] starting provider (@Nacho_2_bot)
Nice â that timestamp (04:28:40Z) is the important part. It means your gateway restarted after the .env change and Telegram is starting cleanly on the new machine.
Now we just need to confirm the old error is gone.
1) Check if deleteWebhook failed still happens after 04:28:40
openclaw channels logs --channel telegram | tail -n 50
If you donât see any new deleteWebhook failed lines after that 04:28:40 start line, Telegram connectivity is fixed.
2) Then test a DM and watch logs
- DM the bot:
hi - In another terminal:
openclaw logs --follow --json
You should see an inbound message + agent/embedded run start within a couple seconds. If you paste the first few lines after sending hi, we can verify itâs processing normally again.
{"type":"log","time":"2026-03-05T04:35:05.672Z","level":"warn","subsystem":"compaction-safeguard","message":"{"subsystem":"compaction-safeguard"} Compaction safeguard: cancelling compaction with no real conversation messages to summarize.","raw":"{"0":"{\"subsystem\":\"compaction-safeguard\"}","1":"Compaction safeguard: cancelling compaction with no real conversation messages to summarize.","_meta":{"runtime":"node","runtimeVersion":"22.22.0","hostname":"unknown","name":"{\"subsystem\":\"compaction-safeguard\"}","parentNames":["openclaw"],"date":"2026-03-05T04:35:05.672Z","logLevelId":4,"logLevelName":"WARN","path":{"fullFilePath":"file:///home/johnny-mangual/.npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js:1170:14","fileName":"subsystem-DypCPrmP.js","fileNameWithLine":"subsystem-DypCPrmP.js:1170","fileColumn":"14","fileLine":"1170","filePath":".npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js","filePathWithLine":".npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js:1170","method":"logToFile"}},"time":"2026-03-05T04:35:05.672Z"}"}
{"type":"log","time":"2026-03-05T04:35:05.673Z","level":"debug","subsystem":"agent/embedded","message":"{"subsystem":"agent/embedded"} embedded run agent start: runId=a8ef0149-7fb6-4d42-b622-8ebe02e3386e","raw":"{"0":"{\"subsystem\":\"agent/embedded\"}","1":"embedded run agent start: runId=a8ef0149-7fb6-4d42-b622-8ebe02e3386e","_meta":{"runtime":"node","runtimeVersion":"22.22.0","hostname":"unknown","name":"{\"subsystem\":\"agent/embedded\"}","parentNames":["openclaw"],"date":"2026-03-05T04:35:05.673Z","logLevelId":2,"logLevelName":"DEBUG","path":{"fullFilePath":"file:///home/johnny-mangual/.npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js:1170:14","fileName":"subsystem-D
Perfect â this is the âgoodâ kind of log output:
- Telegram DM made it into the gateway
- The agent run actually started (
agent/embedded ⌠start)
And this line:
Compaction safeguard: cancelling compaction with no real conversation messages to summarize.
is harmless. It basically means OpenClaw considered doing a compaction step, noticed thereâs nothing meaningful to summarize yet, and skipped it.
Now the next thing to watch for in the log stream is anything mentioning the model call (Ollama) or an error. If you paste the next ~10â20 lines after that embedded run agent start, we can see whether itâs:
- actually calling Ollama and just slow, or
- still hitting a network/context/config issue.
"type":"log","time":"2026-03-05T04:36:36.553Z","level":"debug","subsystem":"diagnostic","message":"{"subsystem":"diagnostic"} lane task done: lane=main durationMs=91001 active=0 queued=0","raw":"{"0":"{\"subsystem\":\"diagnostic\"}","1":"lane task done: lane=main durationMs=91001 active=0 queued=0","_meta":{"runtime":"node","runtimeVersion":"22.22.0","hostname":"unknown","name":"{\"subsystem\":\"diagnostic\"}","parentNames":["openclaw"],"date":"2026-03-05T04:36:36.553Z","logLevelId":2,"logLevelName":"DEBUG","path":{"fullFilePath":"file:///home/johnny-mangual/.npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js:1170:14","fileName":"subsystem-DypCPrmP.js","fileNameWithLine":"subsystem-DypCPrmP.js:1170","fileColumn":"14","fileLine":"1170","filePath":".npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js","filePathWithLine":".npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js:1170","method":"logToFile"}},"time":"2026-03-05T04:36:36.553Z"}"}
{"type":"log","time":"2026-03-05T04:36:36.554Z","level":"debug","subsystem":"diagnostic","message":"{"subsystem":"diagnostic"} lane task done: lane=session:agent:main:main durationMs=91005 active=0 queued=0","raw":"{"0":"{\"subsystem\":\"diagnostic\"}","1":"lane task done: lane=session:agent:main:main durationMs=91005 active=0 queued=0","_meta":{"runtime":"node","runtimeVersion":"22.22.0","hostname":"unknown","name":"{\"subsystem\":\"diagnostic\"}","parentNames":["openclaw"],"date":"2026-03-05T04:36:36.553Z","logLevelId":2,"logLevelName":"DEBUG","path":{"fullFilePath":"file:///home/johnny-mangual/.npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js:1170:14","fileName":"subsystem-DypCPrmP.js","fileNameWithLine":"subsystem-DypCPrmP.js:1170","fileColumn":"14","fileLine this is the latest no answer yet
That log line is actually telling us something important:
- The bot did run (took ~91 seconds):
durationMs=91001 - And it thinks the lane is done:
active=0 queued=0
So the âthinkingâ part finished â the missing piece is delivery to Telegram.
Two likely reasons:
1) It did deliver, but as a Telegram âdraftâ (easy to miss)
By default, Telegram streaming in DMs can use native drafts (sendMessageDraft). That means the response may show up in your message compose box (where you type), not as a new chat bubble.
Check the DM with the bot: do you see any text sitting in the input field?
2) It finished, but never successfully sent a message
To confirm, check for a sendMessage ok line around 04:36:36:
openclaw channels logs --channel telegram | tail -n 50
Quick fix to make behavior obvious (disable draft streaming)
Temporarily turn Telegram streaming off so it always sends a normal message:
openclaw config set channels.telegram.streaming "off"
openclaw gateway restart
Then DM hi again. If you get a normal message bubble back, weâve found the issue (draft streaming UI confusion).
Oh wait. It shows it answered in one minute
Nice â thatâs the ânormalâ outcome for this setup.
On that machine, ~1 minute per turn with OpenClaw + a local 14B on CPU isnât crazy, because OpenClawâs prompt (system + safety + routing + whatever tools/skills are enabled) is way heavier than a plain ollama run "hi".
A couple practical takeaways:
- If 14B is ~1 min/turn, then 32B locally on CPU/iGPU is going to feel painfully slow (think many minutes per reply).
- If you want it faster, the levers are:
- use a smaller local model, or
- keep OpenClaw âlightâ (minimal tools/skills, smaller context), or
- use a GPU / hosted model for the agent brain.
Also: keep the old machineâs gateway off (or openclaw gateway stop on it) so you donât get back into the âtwo pollersâ Telegram weirdness.
If you tell me what âacceptable latencyâ is for you (5s? 15s? 30s?), I can suggest the most realistic config path for this hardware.
Iâm not getting notifications for it
Thatâs expected with how OpenClaw does Telegram streaming in DMs.
By default (channels.telegram.streaming: "partial"), OpenClaw can stream replies via native drafts (sendMessageDraft) and/or message edits. Draft updates/edits generally donât trigger push notifications the way a brandânew incoming message does.
Fix: disable Telegram streaming so replies are normal messages
On the gateway host:
openclaw config set channels.telegram.streaming "off"
openclaw gateway restart
Then try again â you should start getting normal Telegram notifications (assuming the chat isnât muted).
Also check Telegram-side (easy gotcha)
In Telegram, open the DM with the bot â tap the name â make sure Notifications arenât muted for that chat (and that your OS notifications for Telegram are enabled).
I asked whatâs your most recent memory. No response for 3 minutes and counting
If itâs been 3 minutes, first: abort the run in Telegram by sending:
stop
Then: did you previously set tools.profile to minimal for speed? If yes, thatâs likely why this question stalls â âmemoryâ questions often need the memory tools (memory_search / memory_get), and minimal disables almost everything.
Enable just memory tools (without turning everything on)
On the gateway host:
openclaw config set tools.profile "messaging"
openclaw config set tools.allow '["group:memory"]' --strict-json
openclaw gateway restart
Then in Telegram DM do:
/new- ask again: âwhatâs your most recent memory?â
This keeps the bot lightweight (no browser/etc), but allows it to actually read/search its memory files.
I opened the dashboard in the web browser and this seems to hang. I just typed "/new" into it and it's been five minutes. and now it says " fetch failed type":"log","time":"2026-03-05T12:59:00.543Z","level":"debug","subsystem":"diagnostic","message":"{"subsystem":"diagnostic"} lane task done: lane=main durationMs=600175 active=0 queued=0","raw":"{"0":"{\"subsystem\":\"diagnostic\"}","1":"lane task done: lane=main durationMs=600175 active=0 queued=0","_meta":{"runtime":"node","runtimeVersion":"22.22.0","hostname":"unknown","name":"{\"subsystem\":\"diagnostic\"}","parentNames":["openclaw"],"date":"2026-03-05T12:59:00.543Z","logLevelId":2,"logLevelName":"DEBUG","path":{"fullFilePath":"file:///home/johnny-mangual/.npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js:1170:14","fileName":"subsystem-DypCPrmP.js","fileNameWithLine":"subsystem-DypCPrmP.js:1170","fileColumn":"14","fileLine":"1170","filePath":".npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js","filePathWithLine":".npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js:1170","method":"logToFile"}},"time":"2026-03-05T12:59:00.543Z"}"}
{"type":"log","time":"2026-03-05T12:59:00.545Z","level":"debug","subsystem":"diagnostic","message":"{"subsystem":"diagnostic"} lane task done: lane=session:agent:main:main durationMs=600179 active=0 queued=0","raw":"{"0":"{\"subsystem\":\"diagnostic\"}","1":"lane task done: lane=session:agent:main:main durationMs=600179 active=0 queued=0","_meta":{"runtime":"node","runtimeVersion":"22.22.0","hostname":"unknown","name":"{\"subsystem\":\"diagnostic\"}","parentNames":["openclaw"],"date":"2026-03-05T12:59:00.545Z","logLevelId":2,"logLevelNa
In the Dashboard/WebChat, /new should be instant (itâs a gateway command; it shouldnât wait on Ollama at all).
If it hung for minutes and then timed out with fetch failed + a durationMs=600175 (â10 minutes), that means /new is being treated as a normal chat message and sent to the model, not as a command.
That usually happens when slash commands arenât being applied for that sender/surface (disabled or not authorized).
Quick checks (run on the gateway host)
openclaw config get commands.text
openclaw config get commands.allowFrom
What you want:
commands.textshould betruecommands.allowFromshould ideally be unset (or include the WebChat sender), otherwise commands can get treated as plain text and forwarded to the model.
Fast test in the WebChat UI
Send:
/whoami
If commands are working, it should reply immediately with your sender id. If it hangs, commands arenât being applied there.
If you paste the output of those two openclaw config get ⌠commands (and whether /whoami hangs), I can tell you exactly what to change.
Config path not found: commands.allowFrom
responds immediately to whoami with đ§ Identity
Channel: webchat
User id: openclaw-control-ui
AllowFrom: openclaw-control-ui
Good â that means you donât have commands.allowFrom set, so weâre not dealing with an explicit command allowlist.
Next check is whether commands are enabled and whether WebChat is considered âauthorizedâ for commands.
1) Check command settings
Run:
openclaw config get commands.text
openclaw config get commands.useAccessGroups
2) Get your WebChat sender id (so we can allow commands there if needed)
Since /whoami in WebChat might be hanging, the easiest way is to look at logs:
- In a terminal:
openclaw logs --follow --json
- In the WebChat UI, send a simple message like:
ping
In the log output, look for something like a from.id / sender id for that WebChat message and paste that line here. Once we have that id, we can (safely) set commands.allowFrom to allow commands for just you on WebChat, so /new wonât get forwarded to the model and time out.
If you paste the outputs of commands.text + commands.useAccessGroups, I can tell you which branch youâre on before we touch config.
Great â that proves WebChat commands are working and youâre authorized:
- Channel:
webchat - User id:
openclaw-control-ui
So /new should be recognized.
Whatâs probably happening is simpler: there was already a run in progress, and /new doesnât magically cancel it â it just resets the session for the next turn. The thing that actually cancels an inâflight run is /stop (or plain stop).
In WebChat, when it âhangsâ, do this:
- Send:
/stop
- Then send:
/new
If you still see fetch failed after ~10 minutes, thatâs the model request timing out (your log showing ~600,000ms is the default 600s timeout).
If you want, paste the fetch failed log line that appears right after the timeout (it often includes which fetch target failed), and we can tell whether itâs Ollama hanging vs something else.
ngual/.npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js:1170:14","fileName":"subsystem-DypCPrmP.js","fileNameWithLine":"subsystem-DypCPrmP.js:1170","fileColumn":"14","fileLine":"1170","filePath":".npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js","filePathWithLine":".npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js:1170","method":"logToFile"}},"time":"2026-03-05T13:57:30.879Z"}"}
{"type":"log","time":"2026-03-05T13:57:31.260Z","level":"info","subsystem":"gateway/channels/telegram","message":"{"subsystem":"gateway/channels/telegram"} [default] starting provider (@Nacho_2_bot)","raw":"{"0":"{\"subsystem\":\"gateway/channels/telegram\"}","1":"[default] starting provider (@Nacho_2_bot)","_meta":{"runtime":"node","runtimeVersion":"22.22.0","hostname":"unknown","name":"{\"subsystem\":\"gateway/channels/telegram\"}","parentNames":["openclaw"],"date":"2026-03-05T13:57:31.259Z","logLevelId":3,"logLevelName":"INFO","path":{"fullFilePath":"file:///home/johnny-mangual/.npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js:1170:14","fileName":"subsystem-DypCPrmP.js","fileNameWithLine":"subsystem-DypCPrmP.js:1170","fileColumn":"14","fileLine":"1170","filePath":".npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js","filePathWithLine":".npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js:1170","method":"logToFile"}},"time":"2026-03-05T13:57:31.260Z"}"}
That line:
gateway/channels/telegram ⌠starting provider (@Nacho_2_bot)
is normal â it just means the Telegram channel runner restarted (usually because you restarted the gateway, or the channel crashed and auto-recovered).
What matters is what comes immediately after:
- If you see
deleteWebhook failed/getUpdates failed/fetch failedright after â Telegram API connectivity is still broken. - If it starts cleanly with no errors â Telegram is fine, and any âhangâ youâre seeing is almost certainly the model run (Ollama being slow / timing out).
If you paste the next ~10 lines after that âstarting providerâ line (especially any error lines), I can tell which bucket youâre in.
pm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js:1170:14","fileName":"subsystem-DypCPrmP.js","fileNameWithLine":"subsystem-DypCPrmP.js:1170","fileColumn":"14","fileLine":"1170","filePath":".npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js","filePathWithLine":".npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js:1170","method":"logToFile"}},"time":"2026-03-06T00:52:30.920Z"}"}
{"type":"log","time":"2026-03-06T00:52:31.302Z","level":"info","subsystem":"gateway/channels/telegram","message":"{"subsystem":"gateway/channels/telegram"} [default] starting provider (@Nacho_2_bot)","raw":"{"0":"{\"subsystem\":\"gateway/channels/telegram\"}","1":"[default] starting provider (@Nacho_2_bot)","_meta":{"runtime":"node","runtimeVersion":"22.22.0","hostname":"unknown","name":"{\"subsystem\":\"gateway/channels/telegram\"}","parentNames":["openclaw"],"date":"2026-03-06T00:52:31.302Z","logLevelId":3,"logLevelName":"INFO","path":{"fullFilePath":"file:///home/johnny-mangual/.npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js:1170:14","fileName":"subsystem-DypCPrmP.js","fileNameWithLine":"subsystem-DypCPrmP.js:1170","fileColumn":"14","fileLine":"1170","filePath":".npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js","filePathWithLine":".npm-global/lib/node_modules/openclaw/dist/subsystem-DypCPrmP.js:1170","method":"logToFile"}},"time":"2026-03-06T00:52:31.302Z"}"}
That line by itself is not an error â it just means the Telegram runner restarted:
[default] starting provider (@Nacho_2_bot)
To see why it restarted (or whether itâs immediately failing), you need the lines right after it, especially any error lines.
Best way to grab that in one go:
openclaw channels logs --channel telegram | tail -n 200
If you want to narrow it further:
openclaw channels logs --channel telegram | tail -n 200 | grep -i error
Paste that output â if itâs restarting due to a conflict/network issue, the reason will be in those lines (e.g. getUpdates failed, deleteWebhook failed, Conflict: terminated by other getUpdates request, etc.).
no errors in that
If there are no errors after the âstarting providerâ line, then Telegram itself is probably fine â that line just means the Telegram runner (re)initialized (usually on gateway restart, config reload, or a reconnect).
So at that point:
- If you are receiving replies: you can ignore it.
- If youâre not receiving replies: then itâs not a Telegram âcrashâ, itâs either:
- the message isnât being received/authorized, or
- the agent/model run is slow/timing out.
Quick way to tell which:
- Run this:
openclaw logs --follow --json
- Send a DM to the bot:
ping
- If you see
agent/embedded ⌠start, then Telegram is receiving and the model is the bottleneck. - If you see nothing at all, then Telegram isnât delivering updates (but youâd usually see errors if that were the case).
What symptom are you seeing right now â âmessages arrive but replies are slowâ, or âno replies at allâ?
im trying to message in the web browser but it's not working. still says fetch failked
âfetch failedâ in the browser almost always means the UI canât reach (or canât authenticate to) the Gateway WebSocket.
Two quick checks:
1) Are you opening the dashboard/WebChat on the same machine as the gateway?
Run on the gateway machine:
openclaw gateway status
If itâs listening on 127.0.0.1:18789 and youâre trying to open it from another computer/phone, it will fail. In that case you need an SSH tunnel (or Tailscale Serve/bind).
2) Use the âknown goodâ URL + token flow
From the gateway machine run:
openclaw dashboard
Then in the UI, paste the token from:
openclaw config get gateway.auth.token
(If the browser got into a bad state, open in an incognito window or restart the browser.)
Tell me: are you opening the web UI locally on the NucBox, or from a different device?
Locally on the nuc
Cool â if youâre opening it locally, then âfetch failedâ is usually one of two things:
- The UI isnât connected/authenticated to the gateway WS, or
- The UI is connected, but the agent run failed and itâs showing the error text.
Quick way to tell which one youâre in
A. Gateway connection/auth check (Control UI)
- In the dashboard, go to Control â Overview â Gateway Access
- Paste the token from:
openclaw config get gateway.auth.token
Then click Connect.
(If itâs still weird, hard-refresh the page or open an incognito window â stale localStorage can wedge it.)
B. If it only fails when you send a chat message
Tail logs while you send a message from the browser:
openclaw logs --follow --json
If you see agent/embedded ⌠error=fetch failed, then the model provider fetch is failing (usually Ollama hanging/timeout), not the browser UI.
Also: where exactly are you typing /new â the Chat tab message box, or the Agents/Tools panel? /new only behaves like a command in the actual chat surfaces; in other panels it can get treated as plain text and sent to the model.
In the chat tab.
Do you think all these problems go away if I drop again to the 8b?
Dropping to 8B will help with the âit takes forever / times out / UI feels hungâ part, because youâre CPUâbound and OpenClaw prompts are heavy. Youâll likely see a noticeable speedup (often multiple times faster).
But it wonât magically fix everything we hit:
What 8B will improve
- Timeâtoâfirstâtoken and overall latency (WebChat/Telegram feels less âstuckâ)
- Fewer 10âminute timeouts just from being too slow
What 8B wonât fix (model size doesnât matter)
- Telegram polling issues from two gateways fighting over the same bot token
- Telegram API problems from broken IPv6 / Node DNS behavior (
deleteWebhook failed, etc.) - Any auth/token/UI connection issues (those are gateway/browser)
Tradeoff
8B will be less reliable (more mistakes, weaker instruction-following), especially once you re-enable tools/skills. If you keep it mostly chat + light tasks, itâs fine.
If your goal is âusable latency on this NucBoxâ, yeah â 8B is a very reasonable next step. If your goal is âtool-using assistant that feels snappyâ, youâll eventually want either a GPU box or a hosted model for the brain.
So 8b is not agentic is what youâre saying
Not exactly. 8B can still be âagenticâ in the sense that it can plan + call tools + iterate â itâs just much less reliable at it, especially when you give it a big toolset and expect it to run unattended.
Think of âagenticâ as a spectrum:
8B is often fine for
- simple back-and-forth chat
- summarizing, rewriting, drafting
- very constrained tool use (one tool, one step, clear inputs/outputs)
- âdo X, then stop and ask meâ workflows
8B tends to fall over with
- long multi-step tasks with lots of branching
- coordinating many tools (web + files + exec + messaging)
- strict JSON/tool schemas (more malformed tool calls / hallucinations)
- anything where being wrong has a high cost
So: 8B isnât ânon-agenticâ, itâs just not the model you want for hands-off automation. If you keep it supervised and keep tools narrow, it can work.
So i can't drop my context window below 16000, is that normal?
Yeah â for OpenClaw thatâs pretty normal.
OpenClaw isnât âjust a chat promptâ; it carries a fairly chunky system prompt + safety scaffolding + (optionally) tools/skills descriptions + session plumbing. Below a certain point, the gateway basically says âthis model/session canât even fit the minimum prompt budget safelyâ, and youâll see a floor around ~16k.
A couple clarifications:
- The limit you hit is usually the effective context budget OpenClaw needs, not some magical property of Qwen itself.
- You can sometimes push it lower by stripping things down (minimal tools profile, fewer skills), but OpenClaw is fundamentally designed assuming large-context models.
If you want to see exactly where the tokens go, run this (in WebChat/Telegram â itâs a command and should be fast):
/context detail
It will show you the system prompt + tools + skills sizes, and youâll immediately see why 4k/8k isnât viable in your config.
So i dropped down to the 8b and still need this 16000 context window. is it possibkle that my machine just isn't good enough cause it's cpu only????
The 16,000 context requirement isnât about your CPU â itâs about OpenClawâs minimum prompt size/budget. Dropping from 14B â 8B changes speed, not the minimum context OpenClaw wants available.
So:
- Needing ~16k context: normal for OpenClaw, regardless of model size or CPU/GPU.
- CPU-only ânot good enoughâ: depends on what you mean by âgood enoughâ.
On your i9 + 64GB (CPU-only):
- It will run 8B at 16k context, but expect higher latency (often tens of seconds to a minute) because OpenClaw prompts are big and CPU prompt-processing is slow.
- 32B on CPU will be painful for interactive âassistantâ use.
If you want it to feel snappy (single-digit seconds), you generally need a discrete GPU with plenty of VRAM or a hosted model.
If you run /context detail, youâll see exactly why the baseline is so high â and what you can trim (tools/skills) to reduce the prompt and speed it up.
What is the fastest you would expect my current machine to answer "hey" with the 8b qwen
On that i9â13900HK CPUâonly box, with OpenClaw + Ollama + an 8B Q4-ish model, the bottleneck is usually prompt processing (OpenClawâs system prompt + whatever context it injects), not generating the word âheyâ.
Realistic latency to first visible text:
- Best case (warm model, fresh
/new, minimal tools/skills): ~5â20 seconds - More typical (normal OpenClaw prompt + some history): ~20â90 seconds
- Worst case (cold start / swapping / huge context): multiple minutes
If you want to sanity-check whether youâre in the âbest caseâ setup, run /context detail â if the system/tools/skills prompt is huge, no 8B model on CPU will feel instant.
something claude noted when reviewing /context detail - message tool: 1,070 tok with 86 params â that's enormous for a tool schema
Yep â Claudeâs observation is spot on. On smaller/local models, the tool schema can dominate the entire context, and message is one of the worst offenders because it has to describe a giant âsend/edit/react/poll/components/etcâ surface for multiple providers.
For a local 8B on CPU, paying ~1k tokens of schema every turn is brutal.
The pragmatic fix: donât show the message tool to the model
Replies on Telegram/WebChat do not require the message tool (the gateway delivers replies itself). The message tool is mainly for âsend to some other target/channelâ behavior.
So you can safely restrict tools for your local provider to shrink the prompt.
Best pattern: keep your normal models âfullâ, but make the local Ollama provider âminimalâ.
Example (edit to match your provider key):
tools: {
profile: "full",
byProvider: {
"custom-127-0-0-1-11434": {
profile: "minimal",
allow: ["group:memory"], // optional: keep memory_search/memory_get
}
}
}
Then:
openclaw gateway restart
That should drop a lot of schema weight (including message) and make âheyâ noticeably faster.
If you want, paste your current tools: block and Iâll tell you the smallest safe set for âchat + memoryâ on the local model.
"tools": {
"profile": "messaging",
"allow": [
"group:memory"
],
Nice â that config explains why the message tool schema is showing up:
tools: {
profile: "messaging",
allow: ["group:memory"]
}
profile: "messaging" includes the message tool by default, and that toolâs schema is huge.
Easiest win: keep the profile, but deny just message
Add a deny list:
openclaw config set tools.deny '["message"]' --strict-json
openclaw gateway restart
What this does:
- Keeps the useful âmessaging profileâ stuff (sessions tools, etc.)
- Removes the gigantic
messagetool schema from the model prompt - Doesnât break normal replies on Telegram/WebChat (the gateway replies without the model needing the
messagetool)
If you want it even lighter (fastest)
You can go all the way down to:
tools.profile: "minimal"- plus
group:memory
âŚbut Iâd try the deny ["message"] first since itâs a smaller change.
After restarting, run /context detail again â you should see the tool schema size drop a lot.
is this something that should be reinstated when i go back to a larger Llm?
Only if you want the model to be able to do âagent-y messaging actionsâ (send to other chats, broadcast, edit/delete messages, reactions, etc.).
A few practical points:
- Normal replies donât need the
messagetool. Telegram/WebChat replies still work without it. - Keeping
messagedisabled is safer (it removes an entire class of âoops it messaged someoneâ risks) and it shrinks the prompt. - A larger/stronger model can handle the extra schema better, but itâs still overhead.
Best practice (what Iâd do)
Instead of a global tools.deny: ["message"] forever, make it model/provider-specific:
- Keep your default profile âmessagingâ (for strong models)
- Override your local Ollama provider to a lighter profile that doesnât include
message
Example shape:
tools: {
profile: "messaging",
allow: ["group:memory"],
byProvider: {
"custom-127-0-0-1-11434": { profile: "minimal", allow: ["group:memory"] }
}
}
That way:
- Big/hosted model gets the full messaging toolset if you want it
- Local model stays lean (faster, less schema bloat)
So: you donât have to reinstate it, but if you later want cross-chat âagent sendsâ, switch to the byProvider pattern instead of keeping a global deny.
made the change and now heres the context detail ontext breakdown (detailed)
Workspace: /home/johnny-mangual/.openclaw/workspace
Bootstrap max/file: 20,000 chars
Bootstrap max/total: 150,000 chars
Sandbox: mode=off sandboxed=false
System prompt (run): 29,521 chars (~7,381 tok) (Project Context 18,491 chars (~4,623 tok))
Injected workspace files:
Skills list (system prompt text): 3,076 chars (~769 tok) (7 skills)
Skills: healthcheck, openai-image-gen, openai-whisper-api, skill-creator, weather, wordpress-publisher, xlsx-cn
Top skills (prompt entry size):
⢠wordpress-publisher: 649 chars (~163 tok)
⢠healthcheck: 491 chars (~123 tok)
⢠weather: 416 chars (~104 tok)
⢠xlsx-cn: 316 chars (~79 tok)
⢠skill-creator: 296 chars (~74 tok)
⢠openai-image-gen: 272 chars (~68 tok)
⢠openai-whisper-api: 249 chars (~63 tok)
Tool list (system prompt text): 429 chars (~108 tok)
Tool schemas (JSON): 5,012 chars (~1,253 tok) (counts toward context; not shown as text)
Tools: message, sessions_list, sessions_history, sessions_send, session_status
Top tools (schema size):
⢠message: 4,277 chars (~1,070 tok)
⢠sessions_send: 273 chars (~69 tok)
⢠sessions_list: 212 chars (~53 tok)
⢠sessions_history: 161 chars (~41 tok)
⢠session_status: 89 chars (~23 tok)
Top tools (summary text size):
⢠session_status: 207 chars (~52 tok)
⢠message: 132 chars (~33 tok)
⢠sessions_send: 84 chars (~21 tok)
⢠sessions_list: 54 chars (~14 tok)
⢠sessions_history: 36 chars (~9 tok)
Tools (param count):
⢠message: 86 params
⢠sessions_send: 5 params
⢠sessions_list: 4 params
⢠sessions_history: 3 params
⢠session_status: 2 params
Session tokens (cached): unknown / ctx=16384
Inline shortcut: a command token inside normal text (e.g. âhey /statusâ) that runs immediately (allowlisted senders only) and is stripped before the model sees the remaining message.
This /context detail output is super useful â and it shows the key problem:
- Tool schemas: ~1,253 tok
messagetool alone: ~1,070 tok (86 params)
So yeah, message is the bulk of your tool-schema tax.
But: your change didnât take effect yet, because message is still listed under Tools:.
Verify what OpenClaw thinks your tool policy is
Run these on the gateway host and paste the output:
openclaw config get tools.profile
openclaw config get tools.allow
openclaw config get tools.deny
openclaw config get tools.byProvider
The âmake it actually go awayâ command (global)
If tools.deny is empty/not set, set it like this:
openclaw config set tools.deny '["message"]' --strict-json
openclaw gateway restart
Then rerun:
/context detail
You should see message disappear from the Tools list and the schema tokens drop a lot.
Optional next cut: skills
Youâre also spending ~769 tok on skills list (7 skills). Thatâs not crazy, but on CPU every token counts. Once message is gone, we can trim skills if needed.
get tools.profile
openclaw config get tools.allow
openclaw config get tools.deny
đŚ OpenClaw 2026.3.1 (2a8ac97) â Ah, the fruit tree company! đ
messaging
đŚ OpenClaw 2026.3.1 (2a8ac97)
Pairing codes exist because even bots believe in consentâand good security hygiene.
[
"group:memory"
]
đŚ OpenClaw 2026.3.1 (2a8ac97) â Chat APIs that don't require a Senate hearing.
Config path not found: tools.deny
johnny-mangual@johnny-mangual-NucBox-K10:~$ openclaw config get tools.byProvider
đŚ OpenClaw 2026.3.1 (2a8ac97)
I keep secrets like a vault... unless you print them in debug logs again.
{
"custom-127-0-0-1-11434": {
"allow": [
"group:memory"
],
"profile": "minimal"
}
}
This is actually super informative:
- Global tools:
tools.profile = "messaging"(this is whymessageshows up)tools.allow = ["group:memory"]tools.denyis not set
- You do have a per-provider override:
tools.byProvider.custom-127-0-0-1-11434.profile = "minimal"
So in theory, when the active model provider is custom-127-0-0-1-11434, the agent should not see message.
If /context detail is still showing message, one of these is true:
- That session is currently running on a different provider/model (pinned via
/model), or - Thereâs a bug/quirk where
byProviderisnât affecting the/context detailtool listing the way we expect.
Fastest âmake it go away no matter whatâ fix
Just deny message globally:
openclaw config set tools.deny '["message"]' --strict-json
openclaw gateway restart
Then rerun:
/context detail
You should see the tool schema drop by ~1,070 tokens immediately.
Also check which model/provider the session is actually using
In the same chat where you ran /context detail, run:
/model status
If itâs not using custom-127-0-0-1-11434/..., that explains why the per-provider override didnât help.
Current: custom-127-0-0-1-11434/qwen3:8b (selected)
Active: custom-127-0-0-1-11434/qwen3:14b-16k (runtime)
Default: custom-127-0-0-1-11434/qwen3:8b
Agent: main
Auth file: ~/.openclaw/agents/main/agent/auth-profiles.json
[custom-127-0-0-1-11434] endpoint: http://127.0.0.1:11434 api: ollama auth: o...a (models.json: ~/.openclaw/agents/main/agent/models.json)
⢠custom-127-0-0-1-11434/qwen3:8b
[minimax] endpoint: https://api.minimax.io/anthropic api: anthropic-messages auth: minimax:default=redacted (next, lastGood) (auth-profiles.json: ~/.openclaw/agents/main/agent/auth-profiles.json)
⢠minimax/MiniMax-M2.5 (Minimax)
[openai] endpoint: default auth: redacted (env: OPENAI_API_KEY)
⢠openai/gpt-5
⢠openai/gpt-5.1-codex (GPT)
That /model status output explains a lot:
- Current (selected):
âŚ/qwen3:8b - Active (runtime):
âŚ/qwen3:14b-16k
So even though you picked 8B, OpenClaw is still actually running the 14Bâ16k model right now.
That typically happens when either:
- you switched models while a run was already in-flight (the next turn uses the selected model), or
- the 8B model canât satisfy OpenClawâs minimum context requirements (so it falls back to the 14Bâ16k variant that can).
To truly run 8B with OpenClaw, make an 8B â16k contextâ Ollama variant
On Linux:
cat > Modelfile8b <<'EOF'
FROM qwen3:8b
PARAMETER num_ctx 16384
EOF
ollama create qwen3:8b-16k -f Modelfile8b
Then point OpenClaw at qwen3:8b-16k (and keep contextWindow: 16384 in your provider config), restart the gateway, and in chat do /new.
After that, run /model status again â you want Active (runtime) to show the 8B-16k model, not the 14B-16k.
If you paste your models.providers.custom-127-0-0-1-11434.models array, I can tell you the exact config edit to add the new qwen3:8b-16k model alongside the 14B one.
how do I disable qwen3 thinking mode for a local Ollama model?
If youâre running it through OpenClaw, the easiest way is to turn thinking off at the session level:
Per-session (recommended)
Send as a standalone message in your chat (Telegram/WebChat/etc):
/think off
Aliases also work:
/thinking off
Make it the default (persistent)
Set the agent default in config and restart the gateway:
openclaw config set agents.defaults.thinkingDefault "off"
openclaw gateway restart
Notes:
- This controls OpenClawâs âthinking levelâ directive. If the Ollama model is inherently a reasoning/thinking checkpoint, turning thinking âoffâ may reduce (or hide) reasoning behavior, but some models will still be slow because the prompt is large and CPU-only inference is the bottleneck.
is that 5k prompt injection, which i cant control, the hold up here at 16k context window?
Itâs not âprompt injectionâ in the scary/untrusted-content sense â itâs OpenClawâs system prompt scaffolding (plus tool/skill schemas + âproject contextâ files).
But yes: that big prompt is a huge part of your latency on CPU. The model has to read/process those thousands of tokens (âprefillâ) before it can output even âheyâ, and CPU-only inference makes that step slow.
A couple key points:
- The 16k context window requirement is basically a guardrail: OpenClaw needs enough room for
system prompt + tools/skills + some chat history + your reply.
Itâs not because you always use 16k every turn. - The actual âhold upâ is the prompt length you showed (system prompt ~7.4k tok + tool schemas + skills + any injected workspace files). Thatâs what gets processed every turn.
What you can control (and it helps)
- Tools: removing the giant
messagetool schema is a big win (you already identified it). - Skills: disable/allowlist skills so fewer are described in the prompt.
- Project context files: if you have big workspace files being injected, trim them or remove them from what gets included.
Keep using /context detail after each change â itâs the right way to see exactly whatâs bloating the prompt.
đ§ Context breakdown (detailed)
Workspace: /home/johnny-mangual/.openclaw/workspace
Bootstrap max/file: 20,000 chars
Bootstrap max/total: 150,000 chars
Sandbox: mode=off sandboxed=false
System prompt (run): 25,554 chars (~6,389 tok) (Project Context 15,318 chars (~3,830 tok))
Injected workspace files:
⢠AGENTS.md: OK | raw 5,645 chars (~1,412 tok) | injected 5,645 chars (~1,412 tok)
⢠SOUL.md: OK | raw 1,664 chars (~416 tok) | injected 1,664 chars (~416 tok)
⢠TOOLS.md: OK | raw 981 chars (~246 tok) | injected 981 chars (~246 tok)
⢠IDENTITY.md: OK | raw 852 chars (~213 tok) | injected 852 chars (~213 tok)
⢠USER.md: OK | raw 648 chars (~162 tok) | injected 648 chars (~162 tok)
⢠HEARTBEAT.md: OK | raw 119 chars (~30 tok) | injected 119 chars (~30 tok)
⢠BOOTSTRAP.md: OK | raw 1,449 chars (~363 tok) | injected 1,449 chars (~363 tok)
⢠MEMORY.md: OK | raw 3,294 chars (~824 tok) | injected 3,294 chars (~824 tok)
Skills list (system prompt text): 3,076 chars (~769 tok) (7 skills)
Skills: healthcheck, openai-image-gen, openai-whisper-api, skill-creator, weather, wordpress-publisher, xlsx-cn
Top skills (prompt entry size):
⢠wordpress-publisher: 649 chars (~163 tok)
⢠healthcheck: 491 chars (~123 tok)
⢠weather: 416 chars (~104 tok)
⢠xlsx-cn: 316 chars (~79 tok)
⢠skill-creator: 296 chars (~74 tok)
⢠openai-image-gen: 272 chars (~68 tok)
⢠openai-whisper-api: 249 chars (~63 tok)
Tool list (system prompt text): 185 chars (~47 tok)
Tool schemas (JSON): 89 chars (~23 tok) (counts toward context; not shown as text)
Tools: session_status
Top tools (schema size):
⢠session_status: 89 chars (~23 tok)
Top tools (summary text size):
⢠session_status: 207 chars (~52 tok)
Tools (param count):
⢠session_status: 2 params
Session tokens (cached): unknown / ctx=16384
Inline shortcut: a command token inside normal text (e.g. âhey /statusâ) that runs immediately (allowlisted senders only) and is stripped before the model sees the remaining message.
Did the message adjustment take?
Yes â it took.
Your /context detail now shows:
- Tools:
session_statusonly - Tool schemas (JSON): ~23 tokens
- No
messagetool (and no 1,070âtoken schema monster)
So the message tool is successfully removed from the prompt.
If you want the next big wins for speed, the largest remaining chunks are:
AGENTS.md(~1,412 tok)MEMORY.md(~824 tok)- the skills list (~769 tok for 7 skills)
Trimming/disableâallowlisting those is where the next noticeable latency improvements will come from on CPU.
Honestly, would getting rid of those allow a sub-one minute response?
Probably yes â prompt size is the main reason youâre waiting on CPU, because the model has to âreadâ all of that before it can answer.
Right now your baseline prompt is roughly:
- ~6.4k tokens system prompt
- including ~3.8k tokens of injected workspace files
-
- ~0.77k tokens skills list
On an 8B CPU-only model, chopping a few thousand tokens off the front can absolutely be the difference between â~60â120sâ and â~20â50sâ for a tiny reply like âheyâ.
Two reality checks though:
- Itâs not a guarantee (cold starts / swapping / load can still blow it up).
- âSubâone minuteâ is realistic; âsubâ10 seconds consistentlyâ is usually not on CPU-only with OpenClaw.
If you want the biggest wins with the least pain, start by trimming:
AGENTS.md(1.4k tok)
MEMORY.md(0.8k tok)- disable/allowlist skills so the skills list is tiny
Then rerun /context detail and time âheyâ again.
How do you disable skills
You can disable skills in config in two main ways.
Option A (most direct): disable specific skills
Set skills.entries.<skillKey>.enabled = false.
Example (disable the ones showing in your /context detail):
openclaw config set skills.entries.healthcheck.enabled false --strict-json
openclaw config set skills.entries.weather.enabled false --strict-json
openclaw config set skills.entries.skill-creator.enabled false --strict-json
openclaw config set skills.entries.openai-image-gen.enabled false --strict-json
openclaw config set skills.entries.openai-whisper-api.enabled false --strict-json
openclaw config set skills.entries.wordpress-publisher.enabled false --strict-json
openclaw config set skills.entries.xlsx-cn.enabled false --strict-json
Then restart:
openclaw gateway restart
Run /context detail again to confirm the skills list shrank.
Option B: allowlist bundled skills (bundled-only)
This only limits bundled skills (doesnât affect skills living in your workspace/managed dirs):
openclaw config set skills.allowBundled '[]' --strict-json
openclaw gateway restart
For your case (where you have workspace skills like wordpress-publisher / xlsx-cn), Option A is the one that really removes them from the prompt.
sages to see if there's context. Wait, there's no prior conversation.","done":true,"done_reason":"length","context":[151644,872,198,35561,608,26865,151645,198,151644,77091,198,151667,198,32313,11,279,1196,1101,3208,330,35561,608,26865,3263,2938,594,264,2699,10322,13,2379,2578,387,7497,421,358,2776,29338,12440,13,6771,752,1779,279,3681,6605,311,1490,421,1052,594,2266,13,13824,11,1052,594,902,4867,10435,13],"total_duration":34787703100,"load_duration":29685400136,"prompt_eval_count":11,"prompt_eval_duration":491593690,"eval_count":50,"eval_duration":4507258571}12:59 PMFound it. Look at the thinking field:
"Okay, the user just sent 'hey /think'"
Ollama is seeing hey /think as the prompt â thinking is still being injected at the Ollama level despite thinkingDefault off. The model is running in thinking mode every time.
Also notice load_duration: 29.6 seconds just to load the model â that's your cold start tax right there.
The /think flag is being appended somewhere in OpenClaw's prompt construction. Check:
bashopenclaw config get agents.defaults.thinkingDefault
openclaw config get agents.defaults
And ask in the OpenClaw Discord â "why is /think being injected into prompts even with thinkingDefault set to off?" This looks like a bug or the config key is wrong
That snippet is actually telling you two separate things:
1) The âthinking fieldâ showing hey /think is almost certainly your prompt, not âinjectionâ
If you literally sent something like hey /think while benchmarking, and OpenClaw didnât strip the directive (or you werenât sending it as a standalone directive), then Ollama will see the raw text and the model will react to it.
For clean benchmarking, do it in two messages:
- Directive-only (sets the session state):
/think off
- Then your real test:
hey
Donât include /think inline in the âheyâ message while youâre timing performance.
2) load_duration: ~29.6s is your real âwhy does this feel slow?â culprit
Thatâs the model cold-starting/loading weights. If that happens often, youâll never feel snappy even with an 8B.
Once the model is warm, you want to see load_duration near-zero and only eval_duration dominate.
If you tell me:
- are you restarting the gateway a lot, and
- does Ollama show the model staying loaded (
ollama ps),
âŚI can point you to the best way to reduce cold starts (itâs usually âstop unloading the modelâ / increase keep-alive, or just avoid restarts).
i didnt include "/think" in my message
Got it. Then the most likely explanations are:
- Itâs coming from earlier context in that same session (you or the system mentioned
/thinkbefore), and the model is referring back to it. - The model is hallucinating/mislabeling what the user sent inside its âthinkingâ text (reasoning models do this sometimes).
- Less likely, but possible: the UI/plugin youâre using is appending something (but we should prove it before assuming).
Fast way to rule out #1 and #2
Do a totally clean run:
- Send:
/new
- Then send (directive-only):
/think off
- Then send:
hey
If it still says âuser sent hey /thinkâ in the thinking field after a fresh /new, then itâs either hallucination or something is actually being appended.
I need one concrete artifact
Where exactly are you seeing this âthinking fieldâ?
- In raw Ollama JSON (from
/api/chatoutput / logs)? - In OpenClaw logs?
- In the UI somewhere?
If you can paste a small snippet showing the field name and the surrounding JSON (redact anything sensitive), I can tell whether itâs:
- the modelâs own reasoning text, or
- something OpenClaw is passing through as part of the user message/history.
we got a response in under 3 imnutes