#how do i never get this error dude, its so repetitive
1 messages · Page 1 of 1 (latest)
That warning is usually not a Telegram-specific failure. It means the agent run ended without a user-visible final response after it had already used a tool, so OpenClaw is warning you not to blindly retry because something may already have happened.
To reduce it instead of just chasing the same popup:
openclaw --version
openclaw status --all
openclaw models status
openclaw doctor --fix
openclaw channels status --probe
openclaw logs --follow
Then reproduce it once and look in the logs right before the warning. The useful line is usually a provider/model error, timeout, malformed tool call, auth/rate-limit, or context/session issue. If you paste the redacted openclaw status --all plus the few log lines around the failure, people can tell which one it is.
A few practical fixes that often stop the repeat loop:
- update first if you are on
2026.5.6/ “5.6”; these run-completion edge cases get fixed pretty often - use a tool-reliable cloud model for Telegram tasks that browse/click/send/write; weak local/OpenAI-compatible models commonly fail after tool calls
- start a fresh Telegram session if the thread is long or has several failed retries
- after seeing “some tool actions may have already been executed”, verify the external state before saying “try again”
Docs for the exact triage flow:
https://docs.openclaw.ai/help/faq#first-60-seconds-if-something-is-broken
https://docs.openclaw.ai/channels/troubleshooting
https://docs.openclaw.ai/concepts/models
so your saying i should update?
Yes, I would update first. 2026.5.6 is old enough that you may be hitting something already fixed, and this warning is in the agent-run completion path, not Telegram itself.
Use the supervised updater:
openclaw update
openclaw doctor --fix
openclaw gateway restart
openclaw --version
Then try the same Telegram task once. If it still happens, grab the few log lines right before the warning with:
openclaw logs --follow
Updating may not be the whole fix, but it is the right first move before debugging stale behavior. Docs: https://docs.openclaw.ai/install/updating
05:02:41+00:00 info MEDIA:~/.openclaw/media/browser/8cd44876-e72f-4105-994a-69c0ea8cc0d7.png
05:03:03+00:00 error channels/telegram {"subsystem":"channels/telegram"} telegram sendPhoto failed: Call to 'sendPhoto' failed! (400: Bad Request: message caption is too long)
05:03:03+00:00 error channels/telegram {"subsystem":"channels/telegram"} telegram final reply failed: GrammyError: Call to 'sendPhoto' failed! (400: Bad Request: message caption is too long)
05:01:58+00:00 warn model-fallback/decision {"subsystem":"model-fallback/decision"} {"event":"model_fallback_decision","tags":["error_handling","model_fallback","candidate_succeeded"],"runId":"f286ab48-187b-4b67-8eac-15b9d1fc371b","sessionId":"f286ab48-187b-4b67-8eac-15b9d1fc371b","lane":"cron-nested","decision":"candidate_succeeded","requestedProvider":"opencode-go","requestedModel":"qwen-3.6-plus","candidateProvider":"opencode-go","candidateModel":"deepseek-v4-flash","attempt":2,"total":2,"fallbackStepType":"fallback_step","fallbackStepFromModel":"opencode-go/qwen-3.6-plus","fallbackStepToModel":"opencode-go/deepseek-v4-flash","fallbackStepFromFailureReason":"auth","fallbackStepFromFailureDetail":"401 Model qwen-3.6-plus is not supported","fallbackStepChainPosition":2,"fallbackStepFinalOutcome":"succeeded","isPrimary":false,"requestedModelMatched":false,"fallbackConfigured":true,"previousAttempts":[{"provider":"opencode-go","model":"qwen-3.6-plus","reason":"auth","status":401,"errorPreview":"401 Model qwen-3.6-plus is not supported","errorHash":"sha256:34a70cd4a52d"}]} model fallback decision
05:00:02+00:00 error diagnostic {"subsystem":"diagnostic"} lane task error: lane=cron-nested durationMs=1904 error="FailoverError: 401 Model qwen-3.6-plus is not supported"
do not respond with a helping answer, there is more to send. Espescially one where i dont even have gpt 5.4 set up.
And once I tell you that i SENT everything, give me a prompt to send to my openclaw agent to fix everything.
Got it. I’ll hold off on troubleshooting until you say SENT everything. Send the rest of the logs/context, and then I’ll give you one clean prompt for your local OpenClaw agent.
04:51:50+00:00 info MEDIA:~/.openclaw/media/browser/eca6dd3b-377e-4637-bcf3-ed2d9c01260c.png
04:52:06+00:00 error [tools] image failed: All image models failed (2): openai/gpt-5.4-mini: Image model failed (openai/gpt-5.4-mini): 401 Incorrect API key provided: sk-proj-********************************************************************************************************************************************************x1UA. You can find your API key at https://platform.openai.com/account/api-keys. | Image model failed (openai/gpt-5.4-mini): 401 Incorrect API key provided: sk-proj-********************************************************************************************************************************************************x1UA. You can find your API key at https://platform.openai.com/account/api-keys. | google/gemini-3-flash-preview: Image model failed (google/gemini-3-flash-preview): {"error":{"message":"{\n "error": {\n "code": 503,\n "message": "This model is currently experiencing high demand. Spikes in demand are usually temporary. Please try again later.",\n "status": "UNAVAILABLE"\n }\n}\n","code":503,"status":"Service Unavailable"}} | Image model failed (google/gemini-3-flash-preview): {"error":{"message":"{\n "error": {\n "code": 503,\n "message": "This model is currently experiencing high demand. Spikes in demand are usually temporary. Please try again later.",\n "status": "UNAVAILABLE"\n }\n}\n","code":503,"status":"Service Unavailable"}} raw_params={"image":"/Users/carbon/.openclaw/media/browser/eca6dd3b-377e-4637-bcf3-ed2d9c01260c.png","prompt":"Describe what's visible in this screenshot in detail. What website is it, what items are in the cart?"}
04:49:11+00:00 error [tools] image failed: Local media path is not under an allowed directory: /tmp/lulu_cart.png raw_params={"image":"/tmp/lulu_cart.png","prompt":"What's in this screenshot? Describe the browser content."}
this is all of them.
Yep, now there’s enough signal. Copy/paste this to your local OpenClaw agent:
You are fixing my local OpenClaw setup. Do not guess config keys; inspect the installed docs/config schema and current config first. I am using Telegram and I keep getting: “Agent couldn't generate a response. Note: some tool actions may have already been executed — please verify before retrying.”
Known log evidence:
1. Telegram final reply failed:
channels/telegram: sendPhoto failed: 400 Bad Request: message caption is too long
channels/telegram: telegram final reply failed: GrammyError: sendPhoto caption is too long
2. Image tool failed:
openai/gpt-5.4-mini returned 401 Incorrect API key
google/gemini-3-flash-preview returned 503 high demand / UNAVAILABLE
The image input was under ~/.openclaw/media/browser/...
3. Image tool also failed on:
Local media path is not under an allowed directory: /tmp/lulu_cart.png
4. Model fallback / cron-nested failed:
opencode-go/qwen-3.6-plus returned 401 Model qwen-3.6-plus is not supported
fallback to opencode-go/deepseek-v4-flash succeeded once, but there is also a lane task error:
FailoverError: 401 Model qwen-3.6-plus is not supported
Please do this end to end:
- Run: openclaw --version, openclaw status --all, openclaw models status, openclaw doctor --fix, openclaw channels status --probe.
- Inspect my OpenClaw config and find every reference to unsupported or broken models, especially opencode-go/qwen-3.6-plus and image/vision models that route to openai/gpt-5.4-mini with a bad key.
- Fix model routing so normal agents, cron/nested runs, and the image tool use only models that are actually available and authenticated on this machine. If a provider key is invalid, either replace it only if I provide a valid key, or remove that provider/model from active defaults and fallbacks.
- Specifically check agents.defaults.model and agents.defaults.imageModel. The image tool uses agents.defaults.imageModel, not imageGenerationModel.
- Fix the Telegram sendPhoto caption issue by making replies with screenshots/images send a short caption or send the long text separately from the image. Verify whether this is configurable in my current OpenClaw version; if it is a code bug in the installed version, update OpenClaw first and retest.
- Fix the /tmp/lulu_cart.png failure by changing the workflow to use an allowed path, preferably a path under the OpenClaw media store or the agent workspace, instead of /tmp. Do not broaden file-read permissions unless absolutely necessary; prefer copying/staging the image into an allowed location.
- Update OpenClaw if I am behind: openclaw update, then openclaw doctor --fix, then restart the gateway.
- After changes, restart the gateway and run a minimal verification: one Telegram text reply, one Telegram reply involving a screenshot/image, and one image describe call using the configured image model.
- Show me exactly what config files/keys changed and summarize any remaining issue that requires a new API key or upstream provider availability.
Two notes from the logs: the gpt-5.4-mini mention is coming from image-tool routing/fallback, not necessarily your main chat model. And the repeated warning is probably a symptom of the final Telegram/image reply failing after tools ran, not the root error itself.
Thanks very much, also how do I queue stuff like telling it "Update qwen-3.6-plus to qwen3.6-plus"
And I am not yet done with everything, currently updating.
For chat-side queuing, use the /queue directive in the same Telegram conversation/session.
Useful modes:
/queue followup
That makes messages you send while the agent is already running queue as follow-up turns, instead of interrupting/dropping weirdly.
For batching several quick instructions:
/queue collect debounce:2s cap:10 drop:summarize
Then send your fix messages one after another, e.g.:
Update every config reference from opencode-go/qwen-3.6-plus to opencode-go/qwen3.6-plus. Inspect config first, make the smallest safe change, then restart the gateway and verify with openclaw models status.
When you want default behavior back:
/queue reset
Tiny caution: for config edits, don’t phrase it as only “update qwen-3.6-plus to qwen3.6-plus” unless you’re sure that exact model exists. Better prompt it to verify availability with openclaw models status first, then update the config key/model reference.
Makes sense. Finish the update first, then run:
openclaw --version
openclaw doctor --fix
openclaw gateway restart
openclaw models status
openclaw channels status --probe
After that, if the same warning comes back, send the new log slice. The old logs are useful, but the post-update errors are the ones to fix.
my current queue is interrupt how do i keep the queue but give it a steer
interrupt and steer are different queue modes, so you can’t keep the active session in interrupt and also have normal messages steer that same run.
Use a temporary switch:
/queue steer
Then send the steering instruction:
Don’t restart. Continue the current fix, but first replace qwen-3.6-plus with the verified supported qwen model name.
Then put it back:
/queue interrupt
If you want the steer to also be kept as a follow-up after the current run finishes, use:
/queue steer+backlog
For spawned subagents specifically, /steer <id|#> <message> is the one-off steer command and won’t change your main queue mode.
whats a backlog?
A backlog is the saved list of messages waiting to run after the current agent run finishes.
So:
/queue steer= inject this message into the current run now; usually no separate later turn/queue followup= don’t touch the current run; save it for the next turn/queue steer+backlog= do both: inject it now, and also save it to run again as a follow-up
For your case, backlog is probably not what you want unless the instruction needs to be acted on twice. Use /queue steer for a quick correction while it’s running, then switch back to /queue interrupt after.
🪢 Queue: interrupt (depth 0)
what is depth and all of the silly settings
depth is how many messages are currently waiting in that session’s queue.
Queue: interrupt (depth 0) means: your mode is interrupt, and nothing is waiting right now.
The useful settings:
interrupt: new message aborts the current run and starts fresh with the newest messagesteer: new message is injected into the current run while it’s runningfollowup: new message waits until the current run finishes, then runs nextcollect: batches quick messages together and sends them as one follow-up turn; this is the defaultsteer+backlog: injects now and also saves it for a later follow-up
Options:
debounce:2s: wait for 2 seconds of quiet before running queued follow-ups, useful when you type several messagescap:10: keep at most 10 waiting messagesdrop:summarize: if the queue overflows, summarize dropped messages instead of silently losing context
drop:old: drop oldest waiting messagesdrop:new: reject/drop newest incoming messages
My practical recommendation for Telegram:
/queue collect debounce:2s cap:20 drop:summarize
Use interrupt only when you often want “stop what you’re doing and do this instead.” Use steer temporarily when you want to correct a running task.
i am using interrupt its not changing anything, it keeps wasting its time and also what is process?
[5/26/2026 8:37 AM] Openclaw: Thinking...
đź§° Process: marine-lobster
[5/26/2026 8:37 AM] Openclaw: Thinking...
đź§° Process
[5/26/2026 8:37 AM] Openclaw: npm is having issues. Let me check disk space and try a more direct approach.
[5/26/2026 8:37 AM] Openclaw: 249GB free, no disk issue. Let me try something simpler.
[5/26/2026 8:37 AM] Carbon: You can search online for solutions..
[5/26/2026 8:37 AM] Openclaw: Thinking...
🛠️ Exec: Kill any stuck npm….openclaw" 2>/dev/null sleep 3 …
🛠️ Exec
🛠️ Exec: Kill any stuck npm….openclaw" 2>/dev/null sleep 3 …
[5/26/2026 8:38 AM] Carbon: /status
[5/26/2026 8:38 AM] Openclaw: 🦞 OpenClaw 2026.5.6 (c97b9f7)
⏱️ Uptime: gateway 21m 46s · system 1d 21h
🧠Model: opencode-go/deepseek-v4-flash · 🔑 api-key (models.json)
🔄 Fallbacks: opencode-go/deepseek-v4-flash
đź§® Tokens: 187k in / 13k out
🗄️ Cache: 97% hit · 6.5m cached, 0 new
📚 Context: 52k/128k (41%) · 🧹 Compactions: 28
🧵 Session: agent:main:telegram:direct:8398889290 • updated just now
⚙️ Execution: direct · Runtime: OpenClaw Pi Default · Think: off
🪢 Queue: interrupt (depth 0)
interrupt only controls what happens when a new normal message arrives while an agent run is active: it should abort that run and start a new one with your latest message.
It does not mean “force the agent to make better choices.” If the new message is short/vague like “you can search online,” it may restart and still choose a weird local shell path.
If it is actively wasting time, send this as a standalone Telegram message:
stop
or:
abort
Then send a clean replacement instruction, for example:
Stop trying npm workarounds. First run openclaw update --dry-run and show me the exact blocker. Do not kill npm or edit config until you show the blocker.
Process is the tool that manages long-running shell commands started by exec. So 🧰 Process: marine-lobster means it is checking/polling/killing/logging a background command session. 🛠️ Exec means it is actually running a shell command.
If a background process is stuck, tell it:
List running process sessions, show their sessionIds and commands, then kill only the stuck npm/openclaw update process. Do not kill unrelated processes.
And yeah, in your screenshot /status just reports state; it doesn’t stop the current run. Use stop/abort for that. Docs: https://docs.openclaw.ai/help/faq#how-do-i-stopcancel-a-running-task and https://docs.openclaw.ai/gateway/background-process
should i change my queue, because i always send short responses like suggestions
Yes. If you often send short suggestion-style messages, interrupt is probably the worst fit because every small message can abort the current run and restart the task.
I’d use this:
/queue collect debounce:2s cap:20 drop:summarize
That lets you send a few short messages and OpenClaw batches them into one follow-up instead of constantly restarting.
Use modes like this:
- normal chatting / lots of short additions:
collect - “do this next after you finish”:
followup - “adjust what you’re doing right now”: temporarily
/queue steer - “stop current task and replace it”:
interrupt, or just sendstopthen the new task
For your style, set collect as the default and only switch to steer or interrupt when you intentionally need that behavior.
but i want it to adjust right now
Then use steer for that moment.
Send:
/queue steer
Then send the adjustment as a complete instruction, not just a hint:
Adjust the current run now: stop trying npm-kill workarounds, search the docs/web for the update failure, and show me the exact blocker before changing anything else.
After it accepts the correction, switch back to your normal mode:
/queue collect debounce:2s cap:20 drop:summarize
Shortcut rule: steer = “listen to this now while continuing.” interrupt = “throw away the current run and restart.”
when i use steer it doesnt even adjust now
That can happen. steer is not an instant keyboard interrupt; it gets injected when the active run reaches a place where OpenClaw can accept it, usually around the next model/tool boundary. If the agent is stuck inside a long exec, npm install, browser action, or process poll, it may not react until that tool returns.
For “adjust immediately,” use this sequence instead:
stop
Wait for it to acknowledge/stop, then send the full replacement instruction:
Continue from where you were, but change course: do not try npm-kill workarounds. First show the exact update blocker, then ask before changing anything else.
Also, your /status still showed OpenClaw 2026.5.6, so if the update is still in progress or failed, queue behavior may be older/rougher. After the update actually completes, check:
openclaw --version
Practical setup for you: keep /queue collect debounce:2s cap:20 drop:summarize as normal mode, and use standalone stop when you need a hard course correction.
⚠️ Auto-compaction could not recover this turn. I kept this conversation mapped to the current session. Please try again, use /compact, or use /new to start a fresh session.
To prevent this, increase your compaction buffer by setting agents.defaults.compaction.reserveTokensFloor to 20000 or higher in your config.
That one means the session got too full and OpenClaw failed while trying to summarize/compact it.
Immediate fix:
/compact
If that fails again, start clean:
/new
Since your status showed 52k/128k but 28 compactions, this session is pretty churned up. I’d use /new after the update/config repair finishes, because you’re debugging setup and the old session now has a lot of stale failed attempts in it.
To reduce repeats, add/increase this config value:
{
agents: {
defaults: {
compaction: {
reserveTokensFloor: 24000
}
}
}
}
Then restart the gateway. Docs: https://docs.openclaw.ai/gateway/configuration-reference#agentsdefaultscompaction and https://docs.openclaw.ai/concepts/compaction
Practical sequence now: /new, set /queue collect debounce:2s cap:20 drop:summarize, then give the agent the clean fix prompt again.
my reserve token floor is already at 100k
100k is probably too high for your current model/context.
Your /status showed Context: 52k/128k. If reserveTokensFloor is 100000, you’re telling OpenClaw to keep ~100k tokens of headroom and only leave a small slice for the actual conversation/tools. Newer builds cap this somewhat, but it can still make compaction happen constantly and make recovery fragile.
I’d lower it, not raise it:
{
agents: {
defaults: {
compaction: {
reserveTokensFloor: 24000
}
}
}
}
Then restart the gateway and start a fresh session:
/new
For your setup, the bigger issue is probably the long messy session plus failing update/model/image attempts, not “reserve too low.” 100k is a huge reserve unless you’re on a much larger context model. Docs: https://docs.openclaw.ai/gateway/configuration-reference#agentsdefaultscompaction
wont it forget the last conversation if i do new like the fix we are trying to do, also I want to edit it from /config instead
/new starts a fresh chat session, so yes: it won’t automatically carry the messy previous conversation. It does not delete your config/files, but it will lose the conversational context unless you paste a short handoff prompt.
Use this after /new:
Context: we are fixing OpenClaw Telegram. Problems seen: Telegram sendPhoto caption too long, image tool bad OpenAI key / Gemini 503, /tmp image path blocked, opencode-go/qwen-3.6-plus unsupported, update/config repair in progress. Continue by inspecting config and logs first; do not guess keys; show exact blockers before changing anything risky.
For /config, first check if it’s enabled and what the current value is:
/config show agents.defaults.compaction.reserveTokensFloor
Then set it from chat:
/config set agents.defaults.compaction.reserveTokensFloor=24000
Then restart:
/restart
If /config says disabled, enable it from your local config/CLI first. The key is:
{
commands: {
config: true
}
}
/config set is owner/admin-gated because it writes openclaw.json, so if it refuses, that’s a permissions/configWrites issue, not the syntax. Docs: https://docs.openclaw.ai/gateway/configuration-reference#commands
done, alright. It works now, so how do I close this, I dont know which message is the solution.
Nice, glad it’s working now.
For Answer Overflow, mark the message that best captures the actual fix. In this thread I’d pick the prompt/fix checklist message I sent after you said “this is all of them” — the one that listed the real root causes: Telegram caption too long, bad image model auth/fallbacks, blocked /tmp image path, and unsupported qwen-3.6-plus.
Right-click that message → Apps → ✅ Mark Solution.
If the final fix was specifically lowering reserveTokensFloor and starting fresh, mark that later config message instead. The goal is just: future users should land on the message that explains what fixed it.