#Issues with Tools - Part 2
1 messages ¡ Page 1 of 1 (latest)
In Docker, anything you brew install inside the running container lives on the containerâs writable layer â so it disappears as soon as the container gets recreated (common with docker compose down && up, updates, some ârestartâ flows, etc.). Only mounted volumes persist.
Best fix (recommended): bake ffmpeg into the image so itâs always there.
If youâre using OpenClawâs docker-setup.sh
Thereâs an official knob for this:
export OPENCLAW_DOCKER_APT_PACKAGES="ffmpeg"
./docker-setup.sh # rebuilds the image with ffmpeg inside
Docs: https://docs.openclaw.ai/install/docker (section âInstall extra apt packagesâ).
This makes ffmpeg + ffprobe persist across container recreation.
If you have your own Dockerfile
Install via the base distro package manager during build, e.g. Debian/Ubuntu:
RUN apt-get update && apt-get install -y ffmpeg && rm -rf /var/lib/apt/lists/*
(Alpine would be apk add --no-cache ffmpeg.)
âInstall into /dataâ option (works, but Iâd only do it as a fallback)
You can put a static ffmpeg binary into a mounted volume (e.g. /data/bin/ffmpeg) and add that to PATH, but baking it into the image is cleaner and avoids weird missing shared-libs issues.
If you tell me how you start the container (compose? docker-setup.sh? Portainer?) and what base image it is (Debian/Ubuntu/Alpine), I can give you the exact commands for your setup.
I've seen YouTubers install it completely automatically. Why is my bot having trouble installing it itself? Is it a configuration issue?
Do we need to check any settings or configurations?
Itâs usually not a âbot configâ issue â itâs the environment youâre running the gateway in.
Why YouTubers look like it âinstalls automaticallyâ
Most demos are running in one of these setups:
- Normal host install (macOS/Linux VM):
brew/aptinstalls persist, so onceffmpegis installed it stays. - A prebuilt image that already contains
ffmpeg. - A container running as root (or with sudo), where scripts can install OS packages at runtime.
OpenClawâs default Docker setup is intentionally security-first: it runs as the non-root node user and doesnât try to auto-install system packages at runtime. Letting an LLM do apt install / brew install in a container is also a pretty big security footgun.
Whatâs happening to you
If ffmpeg âvanishes after restartâ, whatâs likely happening is container recreation, not a simple process restart. When the container is recreated, anything installed into the container filesystem (like /home/linuxbrew/...) is gone unless that path is on a volume.
You can confirm quickly: check whether the container ID changes after your ârestartâ.
What settings matter in OpenClaw Docker
If youâre using docker-setup.sh, the intended way is to bake deps into the image:
export OPENCLAW_DOCKER_APT_PACKAGES="ffmpeg"
./docker-setup.sh
Thatâs the âconfiguration knobâ for this case, and it makes ffmpeg persist across container deletion/recreate.
Docs: https://docs.openclaw.ai/install/docker (Install extra apt packages)
What I need from you (1-liner)
Are you using OpenClawâs docker-setup.sh + compose, or a custom Dockerfile/Portainer? (And does the container ID change when you ârestartâ?)
Okay, I see your point that it makes more sense to install it on the host. But my bot already had problems installing it in the container. This wasn't the case in the video, and it worked for a friend of mine as well.
Yeah â that mismatch (âworks in the video / for my friendâ) almost always comes down to their container lifecycle + image version being different from yours, not you being âbad at installingâ.
A few concrete reasons this happens:
-
Your ârestartâ is actually a recreate
If something is doingdown/up,pull && up, Watchtower, Portainer ârecreateâ, etc., then anything installed into the container filesystem (including Homebrew under/home/linuxbrew/...) is gone.
Your friend/video may simply not be recreating the container. -
OpenClawâs Docker image is security-first (non-root)
So âlet the bot install system packages for meâ is intentionally not the default. It might work in a demo where they run root / different image / older version, but itâs fragile and not meant to be relied on. -
Homebrew-in-container is extra brittle
Even when it does install, itâs not the intended path here (paths, symlinks, runtime libs, persistence).
The stable fix (still âin the containerâ, but correctly): bake it into the image via apt:
export OPENCLAW_DOCKER_APT_PACKAGES="ffmpeg"
./docker-setup.sh
Thatâs exactly what this knob is for, and it survives container recreation.
Two quick checks to align with the video/friend:
- Whatâs your
openclaw --version? - When it ârestartsâ, does the container ID change? (If yes, youâre recreating, so brew installs will always vanish unless you mount that path as a volume.)
Iâm running OpenClaw via Hostingerâs 1-click VPS installation.
There is no local docker project, no docker-setup.sh, and no Dockerfile on the host.
I only have the running container based on ghcr.io/hostinger/hvps-openclaw:latest.
So there is currently no build context outside the container that I can modify.
When I run docker compose down && up -d, the container gets recreated and anything installed inside (e.g. via brew) disappears.
Given that this is a prebuilt image without a custom build setup â what is the correct way to persist ffmpeg in this scenario?
Should I:
Create a custom Dockerfile that extends the Hostinger image?
Replace the 1-click install with a self-managed docker-setup.sh install?
Or is there an officially supported override mechanism in the Hostinger image?
In that Hostinger 1âclick setup youâre basically consuming a thirdâparty, prebuilt Docker image (ghcr.io/hostinger/hvps-openclaw:latest). OpenClaw itself doesnât have a magic âpersist extra OS packagesâ knob inside someone elseâs image â persistence comes from normal Docker mechanics: image build layers or mounted volumes.
So your options are essentially:
Option A (recommended): build a tiny âwrapper imageâ that adds ffmpeg
This keeps the Hostinger base, but makes ffmpeg part of the image (so it survives down && up).
Create a Dockerfile on the VPS:
FROM ghcr.io/hostinger/hvps-openclaw:latest
USER root
RUN apt-get update && apt-get install -y ffmpeg && rm -rf /var/lib/apt/lists/*
USER node
Then build it:
docker build -t hvps-openclaw:ffmpeg .
âŚand update whatever compose/template Hostinger installed to use image: hvps-openclaw:ffmpeg instead of :latest.
This is the cleanest âstay on Hostinger template, but make deps persistentâ path.
Option B: replace the 1âclick install with the official OpenClaw Docker setup
If you switch to the official setup, you get the supported knobs like:
OPENCLAW_DOCKER_APT_PACKAGES="ffmpeg"(bakes ffmpeg into the image)- better documented volume persistence
- generally fewer âHostinger-specific surprisesâ
Docs: https://docs.openclaw.ai/install/docker
Option C (not recommended): persist Homebrew by mounting its directory as a volume
You can mount /home/linuxbrew/.linuxbrew into a named volume so brew installs survive container recreation â but brew-in-container tends to be brittle and youâre still fighting the intended model.
âIs there an officially supported override mechanism in the Hostinger image?â
Not from the OpenClaw side. If Hostinger added one, it would be Hostinger-specific documentation, not OpenClaw docs.
If you paste:
- the output of
docker compose ls - and the path to the compose file Hostinger installed (or
docker inspect <container>mounts/env)
âŚI can tell you exactly where to change it to point at a wrapper image (Option A).
The container is recreated when I run docker compose down && up -d, so anything installed inside the container (e.g. brew install ffmpeg) disappears.
I attempted to build a wrapper image:
apt-get is blocked (âapt is not available. Please use brew instead.â)
brew is not available during Docker build (brew: not found)
So the Hostinger image appears to restrict both apt and brew during build.
Given that:
I cannot modify the base image directly
I cannot use apt during build
brew is not available in the build context
What is the correct, supported way to persist ffmpeg in the Hostinger 1-click setup?
Should I:
Mount a static ffmpeg binary from the host?
Override the container entrypoint?
Or is extending this image officially unsupported and I must move to the official docker-setup installation?
root@silberlocke:~/openclaw-wrapper# nano Dockerfile
root@silberlocke:~/openclaw-wrapper# docker build -t hvps-openclaw:ffmpeg .
[+] Building 0.3s (5/5) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 126B 0.0s
=> [internal] load metadata for ghcr.io/hostinger/hvps-openclaw:latest 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> CACHED [1/2] FROM ghcr.io/hostinger/hvps-openclaw:latest 0.0s
=> ERROR [2/2] RUN brew install ffmpeg 0.2s
[2/2] RUN brew install ffmpeg:
0.186 /bin/sh: 1: brew: not found
Dockerfile:4
2 |
3 | USER root
4 | >>> RUN brew install ffmpeg
5 | USER node
| 6 |
|---|
| ERROR: failed to build: failed to solve: process "/bin/sh -c brew install ffmpeg" did not complete successfully: exit code: 127 |
| root@silberlocke:~/openclaw-wrapper# nano Dockerfile |
| root@silberlocke:~/openclaw-wrapper# |
If youâre on Hostingerâs 1âclick image, then from the OpenClaw side: there isnât a âsupported override mechanismâ we can point to. Itâs just Docker. If that image doesnât ship a package manager (apt) and you didnât have brew in the base image, then âinstall ffmpeg inside the containerâ will always be fragile unless you make it part of the image or mount it in.
Given your constraints, the realistic choices are:
1) Best âstay on Hostingerâ fix: build a wrapper image that copies in a static ffmpeg
You donât need apt/brew in the Hostinger image for this. Use a multi-stage build: download/extract ffmpeg in a Debian builder stage, then copy ffmpeg + ffprobe into the final image.
Example (amd64 static build):
# stage 1: fetch static ffmpeg
FROM debian:bookworm-slim AS ff
RUN apt-get update && apt-get install -y curl xz-utils && rm -rf /var/lib/apt/lists/*
RUN mkdir -p /out && \
curl -L https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz \
| tar -xJ && \
cp ffmpeg-*-static/ffmpeg ffmpeg-*-static/ffprobe /out/
# stage 2: your actual image
FROM ghcr.io/hostinger/hvps-openclaw:latest
USER root
COPY --from=ff /out/ffmpeg /usr/local/bin/ffmpeg
COPY --from=ff /out/ffprobe /usr/local/bin/ffprobe
RUN chmod +x /usr/local/bin/ffmpeg /usr/local/bin/ffprobe
USER node
Then point your compose to this new image tag. This survives down && up because itâs part of the image.
(If youâre on arm64, youâd use the arm64 static archive instead.)
2) âMount host ffmpeg into the containerâ
I donât recommend this unless you use a static ffmpeg binary, because a host-installed /usr/bin/ffmpeg usually depends on shared libs that wonât exist in the container.
3) Most supported long-term: migrate off the 1âclick template to the official Docker setup
If you want an actually documented path for âadd system deps like ffmpegâ, the official install is the one with the supported knobs (like baking packages during build). Hostingerâs image/template can change without notice.
If you tell me whether your VPS is amd64 or arm64, I can give you the exact static ffmpeg URL + Dockerfile for that architecture. Also: where is Hostingerâs docker-compose.yml located on disk? (That determines how you swap the image cleanly.)
brew: not found during docker build makes sense here: the Hostinger base image does not include Homebrew. You only had brew inside the running container because you installed it there manually â but a Docker build always starts from a clean base image layer.
So: donât try to RUN brew install ffmpeg in the Dockerfile.
The practical workaround: copy in a static ffmpeg/ffprobe via a multi-stage build
This avoids needing apt or brew in the Hostinger image at all.
Paste this Dockerfile (works for amd64 + arm64):
# syntax=docker/dockerfile:1
FROM debian:bookworm-slim AS ff
ARG TARGETARCH
RUN apt-get update && apt-get install -y --no-install-recommends curl xz-utils ca-certificates \
&& rm -rf /var/lib/apt/lists/*
RUN set -eux; \
case "${TARGETARCH}" in \
amd64) url="https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz" ;; \
arm64) url="https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-arm64-static.tar.xz" ;; \
*) echo "Unsupported arch: ${TARGETARCH}"; exit 1 ;; \
esac; \
mkdir -p /tmp/ff /out; \
curl -L "$url" -o /tmp/ff/ffmpeg.tar.xz; \
tar -xJf /tmp/ff/ffmpeg.tar.xz -C /tmp/ff; \
cp /tmp/ff/ffmpeg-*-static/ffmpeg /tmp/ff/ffmpeg-*-static/ffprobe /out/
FROM ghcr.io/hostinger/hvps-openclaw:latest
USER root
COPY --from=ff /out/ffmpeg /usr/local/bin/ffmpeg
COPY --from=ff /out/ffprobe /usr/local/bin/ffprobe
RUN chmod 0755 /usr/local/bin/ffmpeg /usr/local/bin/ffprobe
USER node
Build it:
docker build -t hvps-openclaw:ffmpeg .
Then update your Hostinger compose file to use hvps-openclaw:ffmpeg instead of ghcr.io/hostinger/hvps-openclaw:latest.
If you donât know where that compose file lives, run:
docker ps --format 'table {{.ID}}\t{{.Image}}\t{{.Names}}'
docker inspect <containerId> --format '{{ index .Config.Labels "com.docker.compose.project.config_files" }}'
âSupportedâ answer
Hostingerâs 1-click image/template is not the officially supported OpenClaw Docker path, so if you want the documented knobs and fewer surprises, migrating to the official install is the long-term âsupportedâ move. But the wrapper-image approach above is the cleanest way to keep Hostinger while making ffmpeg persistent.
If you paste uname -m from the VPS + the compose file path you find, I can sanity-check youâre using the right arch and tell you exactly what line to change in compose.
I am running OpenClaw via Hostingerâs 1-click VPS installation using the image:
ghcr.io/hostinger/hvps-openclaw:latest
The original container works fine.
My goal is to make ffmpeg persist across:
docker compose down
docker compose up -d
Installing ffmpeg inside the running container (via brew) works temporarily but disappears after container recreation, which is expected.
I attempted to build a wrapper image using a multi-stage build:
Stage 1:
Use debian:bookworm-slim
Download static ffmpeg (johnvansickle build)
Extract ffmpeg and ffprobe
Stage 2:
FROM ghcr.io/hostinger/hvps-openclaw:latest
COPY ffmpeg and ffprobe into /usr/local/bin
chmod 0755 on both binaries
Keep USER node
Do NOT modify ENTRYPOINT
Do NOT modify CMD
The image builds successfully.
I then updated the Hostinger docker-compose file to use:
image: local/hvps-openclaw:ffmpeg
pull_policy: never
After running docker compose up -d, the container starts but immediately enters a restart loop.
The logs show:
Error: Cannot find module '/openclaw'
The original Hostinger image does NOT produce this error.
Inspection shows:
Original image Entrypoint: /entrypoint.sh
Wrapper image Entrypoint matches the original
Architecture: amd64 (x86_64)
No other changes were made
Question:
Does the Hostinger 1-click OpenClaw image rely on internal filesystem or startup assumptions that break when extending the image with additional layers?
Is extending this image officially supported, or is it intentionally not designed to be extended?
What is the correct supported way to persist ffmpeg in the Hostinger 1-click setup?
Adding extra layers (copying ffmpeg into /usr/local/bin) should not break a normal image. The error youâre getting:
Error: Cannot find module '/openclaw'
almost always means the file/dir at /openclaw that the container tries to run is missing or being shadowed by a mount â not that âDocker extensions are unsupportedâ.
Whatâs most likely happening
In the Hostinger 1âclick setup, the running container often relies on a bind mount or named volume that provides the OpenClaw runtime at /openclaw (or it gets initialized into a volume). When you switched to a new image/tag/project, you likely ended up with one of these:
/openclawis now an empty bind mount (host dir exists but has no app files)/openclawis now a new/empty volume (different compose project name / different volume name)- Your wrapper container has a different CMD than you think (less likely, but easy to verify)
3 quick checks to pinpoint it
Run these and compare original image vs wrapper image:
A) Does /openclaw exist in the image at all?
docker run --rm --entrypoint sh ghcr.io/hostinger/hvps-openclaw:latest -lc 'ls -la /openclaw || true'
docker run --rm --entrypoint sh local/hvps-openclaw:ffmpeg -lc 'ls -la /openclaw || true'
B) Is /openclaw getting mounted over by compose?
docker inspect <the_restarting_container_id> --format '{{json .Mounts}}' | jq '.[] | select(.Destination=="/openclaw")'
If that prints anything, your compose is overmounting /openclaw (and if the source is empty/new, Node wonât find the module).
C) Did CMD/Entrypoint/Workdir change?
docker image inspect ghcr.io/hostinger/hvps-openclaw:latest --format 'E={{json .Config.Entrypoint}} C={{json .Config.Cmd}} W={{json .Config.WorkingDir}} U={{json .Config.User}}'
docker image inspect local/hvps-openclaw:ffmpeg --format 'E={{json .Config.Entrypoint}} C={{json .Config.Cmd}} W={{json .Config.WorkingDir}} U={{json .Config.User}}'
Is extending Hostingerâs image âofficially supportedâ?
From the OpenClaw project side: Hostingerâs 1âclick template isnât the officially supported Docker path, so we canât promise they designed it to be cleanly extensible. But technically, extending it should work â your failure mode screams âmissing /openclaw payload / mount mismatchâ, not âextension blockedâ.
The âsupportedâ way to persist ffmpeg
If you want the deployment model we can fully stand behind and document: migrate to the official Docker setup (or host install) where baking deps is straightforward and repeatable.
If you paste the volumes: section of the Hostinger docker-compose (and whether it mentions /openclaw), I can tell you exactly whatâs shadowing it and how to keep the working mounts while swapping images.
root@silberlocke:~# docker run --rm --entrypoint sh ghcr.io/hostinger/hvps-openclaw:latest -lc 'ls -la /openclaw || true'
ls: cannot access '/openclaw': No such file or directory
root@silberlocke:~# docker run --rm --entrypoint sh local/hvps-openclaw:ffmpeg -lc 'ls -la /openclaw || true'
ls: cannot access '/openclaw': No such file or directory
root@silberlocke:~#
That docker run --entrypoint sh ... ls /openclaw result is actually a big clue:
/openclawis not part of the image filesystem at all- so the working container must be getting
/openclawcreated at startup (by/entrypoint.sh) or provided by a mount/volume in the Hostinger compose.
The reason your wrapper image can break while âonly adding ffmpegâ is one subtle thing you did change:
Most likely root cause: your wrapper changed the default USER
In your wrapper Dockerfile you said âkeep USER nodeâ.
But if the original Hostinger image runs as root by default (i.e. Config.User is empty or root), then /entrypoint.sh may rely on root permissions to set up /openclaw (symlink/copy/download) before dropping privileges.
If your wrapper ends with USER node, the entrypoint now runs as node and may fail to create /openclaw â then Node tries to start and you get:
Cannot find module
/openclaw
Quick verification (run these)
docker image inspect ghcr.io/hostinger/hvps-openclaw:latest --format 'USER={{json .Config.User}} CMD={{json .Config.Cmd}} ENTRY={{json .Config.Entrypoint}}'
docker image inspect local/hvps-openclaw:ffmpeg --format 'USER={{json .Config.User}} CMD={{json .Config.Cmd}} ENTRY={{json .Config.Entrypoint}}'
and also:
docker run --rm --entrypoint sh ghcr.io/hostinger/hvps-openclaw:latest -lc 'id; head -n 80 /entrypoint.sh'
Fix
Rebuild the wrapper without forcing USER node. Keep the base imageâs default user.
In practice: in your final stage, do the copy/chmod as root, then donât set USER at all (or set it back to whatever the base image uses once youâve confirmed it).
So your final stage should look like:
FROM ghcr.io/hostinger/hvps-openclaw:latest
USER root
# COPY ffmpeg/ffprobe + chmod âŚ
# (then DO NOT add `USER node` unless base image already uses it)
If you paste the docker image inspect ... output for both images (USER/CMD/ENTRY), I can tell you exactly what USER to use so the entrypoint behaves like the original.
docker image inspect ghcr.io/hostinger/hvps-openclaw:latest --format 'USER={{json .Config.User}} CMD={{json .Config.Cmd}} ENTRY={{json .Config.Entrypoint}}'
docker image inspect local/hvps-openclaw:ffmpeg --format 'USER={{json .Config.User}} CMD={{json .Config.Cmd}} ENTRY={{json .Config.Entrypoint}}'
USER="root" CMD=["node","server.mjs"] ENTRY=["/entrypoint.sh"]
USER="node" CMD=["node","server.mjs"] ENTRY=["/entrypoint.sh"]
docker run --rm --entrypoint sh ghcr.io/hostinger/hvps-openclaw:latest -lc 'id; head -n 80 /entrypoint.sh'
uid=0(root) gid=0(root) groups=0(root)
#!/bin/bash
set -e
echo "Fixing data permissions"
chown -R node:node /data
cd /hostinger
exec runuser -u node -- "$@"
/docker/openclaw-9yo9# docker exec -it openclaw-9yo9-openclaw-1 ffmpeg -version
ffmpeg version 7.0.2-static https://johnvansickle.com/ffmpeg/ Copyright (c) 2000-2024 the FFmpeg developers
built with gcc 8 (Debian 8.3.0-6)
configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gmp --enable-libgme --enable-gray --enable-libaom --enable-libfribidi --enable-libass --enable-libvmaf --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librubberband --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libvorbis --enable-libopus --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libdav1d --enable-libxvid --enable-libzvbi --enable-libzimg
libavutil 59. 8.100 / 59. 8.100
libavcodec 61. 3.100 / 61. 3.100
libavformat 61. 1.100 / 61. 1.100
libavdevice 61. 1.100 / 61. 1.100
libavfilter 10. 1.100 / 10. 1.100
libswscale 8. 1.100 / 8. 1.100
libswresample 5. 1.100 / 5. 1.100
libpostproc 58. 1.100 / 58. 1.100
Thatâs the smoking gun:
- Original Hostinger image:
USER="root"and/entrypoint.shdoeschown -R node:node /datathenrunuser -u node -- "$@" - Your wrapper image:
USER="node"
So in your wrapper, the entrypoint is running as node, canât chown /data, and startup falls over â then you end up with the âcannot find /openclawâ style failure/restart loop.
Fix: keep the base image USER (root). Donât force USER node.
In your final stage, do your ffmpeg copy as root, and do not switch to node at the end:
FROM ghcr.io/hostinger/hvps-openclaw:latest
USER root
COPY --from=ff /out/ffmpeg /usr/local/bin/ffmpeg
COPY --from=ff /out/ffprobe /usr/local/bin/ffprobe
RUN chmod 0755 /usr/local/bin/ffmpeg /usr/local/bin/ffprobe
# IMPORTANT: do NOT set USER node here (leave it root like the base image)
Then rebuild + docker compose up -d again.
After that, persistence should be solved
Because ffmpeg/ffprobe are now in the image, they will survive docker compose down + up -d (as long as youâre starting from your wrapper image and not pulling the plain Hostinger :latest again).
One more practical tip: consider pinning the Hostinger base by digest in your FROM ...@sha256:... so a surprise :latest update doesnât change things underneath you.
openclaw-9yo9-openclaw-1 local/hvps-openclaw:ffmpeg Up About a minute
Now my bot will have permissions to use ffmpeg?
Yep â with the wrapper image running, OpenClaw should be able to use ffmpeg now.
Why: even though the container default user is root, the Hostinger /entrypoint.sh starts the actual gateway process as node (runuser -u node ...). Your ffmpeg/ffprobe in /usr/local/bin with 0755 permissions are executable by node, so Whisper (and Discord voice waveform stuff) can call them.
Quick sanity checks:
docker exec --user node -it openclaw-9yo9-openclaw-1 which ffmpeg
docker exec --user node -it openclaw-9yo9-openclaw-1 ffmpeg -version
docker exec --user node -it openclaw-9yo9-openclaw-1 ffprobe -version
One nuance: if you ever want the agent to run ffmpeg via the exec tool (not just OpenClawâs internal usage), ffmpeg is not a âsafe binâ, so it may trigger exec-approvals. In that case youâd allowlist it (e.g. /usr/local/bin/ffmpeg and /usr/local/bin/ffprobe) via Control UI â Nodes â Exec approvals, or the CLI openclaw approvals allowlist add ....
If Whisper was failing purely with âffmpeg not foundâ, this should fix it across docker compose down/up.
My Chatbot says:
Follow-up: Tool Availability Issue - Still Persisting
Status Update:
Despite previous suggestions (including ffmpeg being fixed on host), the tool execution problem remains.
Current State:
Still NOT working:
â exec â "Tool not found"
â cron â "Tool not found"
â browser â "Tool not found"
â web_fetch â "Tool not found"
â process â "Tool not found"
Still working:
â
read â file reading OK
â
write â file writing OK
â
edit â file editing OK
What changed:
Host-side ffmpeg was installed (thanks!)
But I cannot verify or use it because exec remains unavailable
Cannot run which ffmpeg, ffmpeg -version, or whisper
Error Pattern:
Tools appear to be categorized:
File system tools: Working
External execution/network tools: Not working
Environment:
Channel: webchat
Runtime: agent=main | host=696f1d0689a2
Container: Docker on Hostinger VPS
Model: ollama/kimi-k2.5:cloud
Questions:
Is there a Gateway service issue causing tool registration to fail?
Could it be a container permission problem for external tools?
Is there a way to reload/refresh tool registry from inside the container?
Should I try spawning an isolated session (sub-agent) to see if tools work there?
Current impact:
Cannot execute any shell commands
Cannot schedule cron jobs
Cannot browse web or fetch URLs
Cannot verify ffmpeg installation
Any suggestions appreciated! đ
That âTool not foundâ pattern is almost never a permissions/ffmpeg/container issue â it means the gateway is not exposing those tools to the model in that session, usually because of tool policy (tools.profile, tools.allow, tools.deny, or tools.byProvider).
The fact that read/write/edit work but everything in:
group:runtime(exec,process)group:web(web_fetch)group:ui(browser)group:automation(cron)
is missing strongly suggests youâre currently running with something like:
tools.allow: ["group:fs"]ortools.profile: "coding"plus adeny: ["group:runtime"], and/or provider-specific restrictions forollama/...viatools.byProvider.
What to do (fastest)
- Check your tool policy in config (this is the key step).
On Hostinger itâs typically in the persisted config under/data/.openclaw/openclaw.json. Please paste just thetools: { ... }section (and anyagents.list[].toolsoverrides, if present).
- If you want âeverything backâ, set one of these:
Simplest:
tools: { profile: "full" }
Or explicit allowlist:
tools: {
allow: ["group:fs", "group:runtime", "group:web", "group:ui", "group:automation", "group:sessions", "group:memory", "message", "nodes"],
}
Also check/remove any tools.byProvider entries that narrow tools for ollama or ollama/kimi-k2.5:cloud.
- Restart the gateway/container after changing config (tool set is determined at startup / session init).
Answers to your questions
- Gateway service issue / tool registry failing to load? Unlikely, because some tools do load. This looks like an intentional restriction from config.
- Container permission problem? Would show as âdenied/approval required/ENOENTâ, not âTool not foundâ.
- Reload tool registry without restart? Not really â treat it as a config + restart.
- Spawning a sub-agent? Wonât help if the global/per-provider tool policy is restricting tools (subagents inherit policy unless explicitly overridden).
Paste your tools config block and Iâll tell you exactly what line is causing the tool set to collapse to fs-only.
Okay, i deleted my Tokens....
root@silberlocke:/docker/openclaw-9yo9# docker exec -it openclaw-9yo9-openclaw-1 cat /data/.openclaw/openclaw.json | grep -A30 '"tools"'
"tools": {
"profile": "full",
"web": {
"search": {
"enabled": true,
"apiKey": âdeleted by meâ
},
"fetch": {
"enabled": true
}
}
},
"commands": {
"native": "auto",
"nativeSkills": "auto",
"bash": true,
"restart": true,
"ownerDisplay": "raw"
},
"hooks": {
"token": âdeleted by meâ
},
"gateway": {
"mode": "local",
"controlUi": {
"dangerouslyAllowHostHeaderOriginFallback": true,
"allowInsecureAuth": true,
"dangerouslyDisableDeviceAuth": true
},
"auth": {
"mode": "token",
root@silberlocke:/docker/openclaw-9yo9#
tools.profile: "full" is the right setting â so if youâre still seeing âTool not foundâ for exec/cron/browser/web_fetch/process, something else is going on (tool policy isnât the blocker anymore).
Two things jump out from what you pasted:
1) Your openclaw.json may now be invalid JSON5
In your snippet the values use German-style quotes:
"apiKey": âdeleted by meâ
Those â ⌠â quotes are not valid JSON/JSON5 string delimiters. If thatâs actually in the file (not just how you pasted it), the gateway may fail to parse openclaw.json and silently fall back to defaults / partial config â which can absolutely lead to weird âtools missing / not behavingâ symptoms.
Fix: either remove those fields entirely, or replace with normal quotes:
apiKey: "REDACTED"
Then restart the container.
If you want to confirm quickly, check logs right after restart:
docker logs --tail 200 openclaw-9yo9-openclaw-1
Youâre looking for any âconfig parseâ / âfailed to load configâ messages.
2) Ollama config pitfall: using /v1 breaks tool calling
If your ollama provider is pointed at an OpenAI-compatible /v1 URL (common on VPS setups), OpenClaw docs explicitly warn it breaks tool calling for Ollama.
Docs: https://docs.openclaw.ai/providers/ollama (warning box)
So please also paste (redact tokens) your:
agents.defaults.modelmodels.providers.ollamablock (especiallybaseUrlandapi)
Quick âwhat tools does the gateway think it has?â check (no model involved)
In WebChat, send this as a standalone message:
/context list
It should show the tool catalog injected into the model. If exec/browser/web_fetch/cron arenât listed there, the gateway isnât offering them (config not loaded, provider restriction, etc.). If they are listed, then weâre dealing with model/tool-calling compatibility.
If you paste /context list output + the models.providers.ollama block, I can tell you exactly which of the above is biting you.
Context breakdown
Workspace: /data/.openclaw/workspace
Bootstrap max/file: 20,000 chars
Bootstrap max/total: 150,000 chars
Sandbox: mode=off sandboxed=false
System prompt (run): 25,972 chars (~6,493 tok) (Project Context 13,419 chars (~3,355 tok))
Injected workspace files:
AGENTS.md: OK | raw 7,907 chars (~1,977 tok) | injected 7,907 chars (~1,977 tok)
SOUL.md: OK | raw 1,894 chars (~474 tok) | injected 1,894 chars (~474 tok)
TOOLS.md: OK | raw 952 chars (~238 tok) | injected 952 chars (~238 tok)
IDENTITY.md: OK | raw 292 chars (~73 tok) | injected 292 chars (~73 tok)
USER.md: OK | raw 627 chars (~157 tok) | injected 627 chars (~157 tok)
HEARTBEAT.md: OK | raw 273 chars (~69 tok) | injected 273 chars (~69 tok)
BOOTSTRAP.md: MISSING | raw 0 | injected 0
MEMORY.md: OK | raw 867 chars (~217 tok) | injected 867 chars (~217 tok)
Skills list (system prompt text): 2,384 chars (~596 tok) (5 skills)
Skills: clawhub, healthcheck, himalaya, skill-creator, weather
Tool list (system prompt text): 1,912 chars (~478 tok)
Tool schemas (JSON): 16,289 chars (~4,073 tok) (counts toward context; not shown as text)
Tools: read, edit, write, exec, process, whatsapp_login, browser, canvas, nodes, cron, message, tts, gateway, agents_list, sessions_list, sessions_history, sessions_send, sessions_spawn, subagents, session_status, web_search, web_fetch
Session tokens (cached): 95,453 total / ctx=200000
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.
},
"models": {
"mode": "merge",
"providers": {
"ollama": {
"baseUrl": "http://172.17.0.1:32768",
"apiKey": "redacted",
"api": "ollama",
"models": [
{
"id": "kimi-k2.5:cloud",
"name": "kimi-k2.5:cloud",
"api": "ollama",
"reasoning": false,
"input": [
"text"
],
"cost": {
"input": 0,
"output": 0,
"cacheRead": 0,
"cacheWrite": 0
},
"contextWindow": 200000,
"maxTokens": 8192
Nice â that /context output changes the story a lot:
- The gateway is injecting all the tools (
exec,process,cron,browser,web_fetch, etc.) - so this is not a âtools arenât registered / tool policy is blocking themâ problem.
If you still see âTool not foundâ during runs, that usually means the model is emitting a tool call with the wrong tool name / wrong tool-call format, so the gateway canât match it to the real tool catalog (even though the catalog exists).
The #1 culprit with provider=ollama
From the docs: if your Ollama provider is configured against the OpenAI-compatible /v1 URL, tool calling breaks and models can output tool JSON as plain text.
Docs: https://docs.openclaw.ai/providers/ollama (warning: donât use http://host:11434/v1)
So the next thing I need is your model/provider config, not tools:
Please paste (redact tokens) these parts from openclaw.json:
agents.defaults.model(and/oragents.list[]forid: "main"if you override it)
models.providers.ollama(especiallybaseUrlandapi)
Quick sanity checks
- If
models.providers.ollama.baseUrlends in/v1â change it to the native base (http://âŚ:11434with no/v1) and ensure itâs using the native Ollama API mode (per the provider docs), then restart the container. - If youâre not actually talking to a real Ollama native API (no
/api/chat), then you shouldnât configure it as providerollamaat all â it needs to be configured as an OpenAI-compatible provider instead.
Also helpful: paste one exact âTool not foundâ line
Specifically: which tool name does it claim is missing (e.g. web.fetch vs web_fetch)? That will confirm itâs a name/format mismatch from the model.
Once you paste those config blocks, Iâll tell you the exact edit to make.
Thanks â this looks correctly configured as ânative Ollamaâ on the OpenClaw side:
api: "ollama"baseUrl: "http://172.17.0.1:32768"(no/v1)
So the remaining question is: is there actually a real Ollama server (native API) running at that URL, and does kimi-k2.5:cloud truly support tools there?
1) Verify itâs really Ollama (native API)
From the VPS host, run:
curl -s http://172.17.0.1:32768/api/version
curl -s http://172.17.0.1:32768/api/tags | head
- If
/api/versionfails / returns HTML / 404, then that endpoint is not Ollamaâs native API â OpenClaw will think itâs talking to Ollama, but tool calling will be broken/weird.- In that case you must reconfigure this provider as an OpenAI-compatible provider instead (and usually use a
/v1URL), or pointbaseUrlat a real Ollama instance.
- In that case you must reconfigure this provider as an OpenAI-compatible provider instead (and usually use a
2) Check whether that model reports tool capability
Ollama tool calling only works if the model supports it. Check:
curl -s http://172.17.0.1:32768/api/show -d '{"name":"kimi-k2.5:cloud"}' | head -n 60
Youâre looking for anything that indicates tools/function-calling support.
Why you can still see âTool not foundâ even though /context lists tools
Your /context output proves OpenClaw offered tools to the model. âTool not foundâ at runtime then usually means the model emitted an invalid tool call (wrong tool name/shape), which is common when the backend isnât actually Ollama-native or the model doesnât support tools.
If you paste the output of /api/version (and the first ~30 lines of /api/show), we can tell immediately which side is lying: the endpoint (not Ollama), or the model (not tool-capable).
"agents": {
"defaults": {
"model": {
"primary": "ollama/kimi-k2.5:cloud"
},
"models": {
"ollama/kimi-k2.5:cloud": {
"alias": "kimi-k2.5"
}
},
"memorySearch": {
"enabled": true,
"sources": [
"memory",
"sessions"
],
"experimental": {
"sessionMemory": true
},
"provider": "local"
},
"compaction": {
"mode": "safeguard",
"memoryFlush": {
"enabled": true
}
}
Cool, that confirms youâre intending to run everything through:
agents.defaults.model.primary = "ollama/kimi-k2.5:cloud"
models.providers.ollama.api = "ollama"
models.providers.ollama.baseUrl = "http://172.17.0.1:32768"
So the next step is not in agents.defaults anymore â itâs: âis that thing at 172.17.0.1:32768 really an Ollama native API, and does this model actually do tool-calls correctly?â
1) Please run these two probes from the VPS host
curl -s http://172.17.0.1:32768/api/version
curl -s http://172.17.0.1:32768/api/tags | head
- If
/api/versionfails / returns HTML / 404 â itâs not an Ollama-native server. In that case OpenClaw is using the wrong provider adapter (api:"ollama"), and tool calling will be unreliable/broken.
- If it works â we can then check whether
kimi-k2.5:cloudreports tool capability via/api/show.
2) Grab the actual tool-not-found name from logs
Since /context shows the gateway does inject exec, browser, web_fetch, etc., the âTool not foundâ error is almost certainly the model calling something like web.fetch or browser.goto (wrong name).
Run:
docker logs --tail 300 openclaw-9yo9-openclaw-1 | grep -i "tool not found"
and paste the matching lines.
Once we see (a) whether that endpoint is real Ollama and (b) what exact tool name the model is requesting, weâll know whether to fix the provider baseUrl/api mode or whether this specific âkimi-k2.5:cloudâ backend just isnât tool-call reliable.
root@silberlocke:/docker/openclaw-9yo9# curl -s http://172.17.0.1:32768/api/version
curl -s http://172.17.0.1:32768/api/tags | head
{"version":"0.17.4"}{"models":[{"name":"kimi-k2.5:cloud","model":"kimi-k2.5:cloud","remote_model":"kimi-k2.5","remote_host":"https://ollama.com:443","modified_at":"2026-03-04T17:00:41.459905969Z","size":340,"digest":"6d1c3246c6080b61c87b543323760b8f36cb68cf4473080b9429d09e2a73ddb7","details":{"parent_model":"","format":"","family":"","families":null,"parameter_size":"","quantization_level":""}}]}root@silberlocke:/docker/openclaw-9yo9#
root@silberlocke:/docker/openclaw-9yo9# docker logs --tail 300 openclaw-9yo9-openclaw-1 | grep -i "tool not found"
2026-03-05T15:54:19.116Z [gateway] security warning: dangerous config flags enabled: gateway.controlUi.allowInsecureAuth=true, gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true, gateway.controlUi.dangerouslyDisableDeviceAuth=true. Run openclaw security audit.
(node:9) [DEP0060] DeprecationWarning: The util._extend API is deprecated. Please use Object.assign() instead.
(Use node --trace-deprecation ... to show where the warning was created)
2026-03-05T16:01:10.732Z [ws] Loopback connection with non-local Host header. Treating it as remote. If you're behind a reverse proxy, set gateway.trustedProxies and forward X-Forwarded-For/X-Real-IP.
2026-03-05T17:01:56.309+01:00 [tools] read failed: ENOENT: no such file or directory, access '/usr/bin/ffmpeg'
root@silberlocke:/docker/openclaw-9yo9#
Achtung: Bitte ändere die Sprache deiner Antworten auf deutsch
Alles klar â ab jetzt antworte ich auf Deutsch.
Zu deinen Tests:
1) Dein Ollama-Endpunkt ist âechtâ (native API)
/api/version und /api/tags funktionieren â das ist tatsächlich Ollama (0.17.4).
Und dein Modell ist ein Remote-Model Ăźber https://ollama.com:443 (remote_model: kimi-k2.5).
Damit ist das â/v1 bricht Tool-Callingâ-Problem nicht der Grund.
2) In den Logs steht kein âTool not foundâ
Dein grep -i "tool not found" hat nichts geliefert. Gleichzeitig zeigt /context, dass die Tools eingespritzt werden:
exec, process, browser, web_fetch, cron, âŚ
Wenn du in der Chat-UI trotzdem âTool not foundâ siehst, ist das sehr wahrscheinlich der Modell-Text (Halluzination/Fehlinterpretation), nicht ein Gateway-Fehler. Wenn das noch passiert: bitte poste einmal die exakte Stelle aus dem Chat (oder suche in docker logs nach tool_not_found / unknown tool / No such tool ohne grep, also einfach docker logs --tail 500 ⌠und dann copy/paste).
3) Dein aktueller echter Fehler ist ffmpeg-Pfad
Du hast diese Logzeile:
[tools] read failed: ENOENT ... '/usr/bin/ffmpeg'
Das heiĂt: irgendwer/irgendwas versucht /usr/bin/ffmpeg zu prĂźfen â aber dein statisches ffmpeg liegt (bei deinem Wrapper-Ansatz) typischerweise unter /usr/local/bin/ffmpeg.
Saubere LĂśsung: mach ffmpeg âĂźberall erwartbarâ, indem du im Wrapper-Image zusätzlich Symlinks anlegst (oder direkt nach /usr/bin kopierst).
Im Dockerfile (Final Stage) z.B.:
RUN ln -sf /usr/local/bin/ffmpeg /usr/bin/ffmpeg && \
ln -sf /usr/local/bin/ffprobe /usr/bin/ffprobe
(oder alternativ gleich nach /usr/bin kopieren statt /usr/local/bin).
Danach rebuild + docker compose up -d.
4) Nebenbei: Security-Warnung
Du hast aktuell sehr riskante Flags aktiv (allowInsecureAuth, dangerouslyDisableDeviceAuth, âŚ). Das ist okay zum Debuggen, aber ich wĂźrde das wieder zurĂźckdrehen, sobald es läuft, und einmal openclaw security audit machen.
Wenn du mir kurz sagst, wo genau im WebChat du âTool not foundâ siehst (und den Text kopierst), kann ich dir sagen, ob es ein echtes Gateway-Problem ist oder ânurâ das Kimi/Ollama-Remote-Modell, das Tool-Namen falsch rausrotzt.
Ich habe meinen OpenClaw Bot gesagt: Use the exec tool to run: echo hello
Seine Antwort:
Die Tools sind immer noch instabil! đ¤
Was passiert:
â
echo hello â funktioniert
â which ffmpeg â "Tool not found"
â cron â "Tool not found"
Das ist seltsam â einfache Commands gehen, aber komplexere oder spezifische Tools nicht. Das deutet auf ein Tool-Registrierungsproblem hin, nicht auf ein generelles Exec-Problem.
Ich kann ffmpeg nicht verifizieren, solange which oder command -v nicht funktionieren...
Workaround: Kannst du mir sagen, wo ffmpeg installiert wurde? Dann kann ich es direkt aufrufen ohne which:
Auf dem Host oder im Container:
ls -la /usr/bin/ffmpeg /usr/local/bin/ffmpeg /home/linuxbrew/.linuxbrew/bin/ffmpeg 2>/dev/null | grep ffmpeg
Oder teste direkt:
ffmpeg -version | head -1
Sobald ich den Pfad kenne, kann ich es so aufrufen: /pfad/zu/ffmpeg đď¸
Das Verhalten passt nicht zu einem Gateway-âTool-Registrierungsproblemâ, sondern zu einem Modell-/Tool-Calling-Problem:
echo helloklappt â derexec-Tool-Call funktioniert grundsätzlich.- Bei
which ffmpegmacht dein Modell sehr wahrscheinlich den Fehler,whichals eigenes Tool aufzurufen (ein Tool namenswhichgibtâs aber nicht) â deshalb âTool not foundâ. - Gleiches kann bei
cronpassieren, wenn das Modell z.B. die falsche Schreibweise / ein falsches Schema callt (obwohlcronlaut/contexteigentlich vorhanden ist).
Was du jetzt sofort machen kannst (ohne which)
Da du ffmpeg als statisches Binary in den Wrapper gelegt hast, ist es praktisch sicher hier:
/usr/local/bin/ffmpeg/usr/local/bin/ffprobe
Sag deinem Bot (wirklich explizit), dass er exec benutzen soll und das als Shell-Befehl ausfĂźhrt:
Use exec and run exactly:
ls -la /usr/local/bin/ffmpeg /usr/local/bin/ffprobe && /usr/local/bin/ffmpeg -version | head -1
Stabiler Fix (damit auch /usr/bin/ffmpeg existiert)
Weil du Logs hattest, die /usr/bin/ffmpeg prßfen: pack in dein Wrapper-Dockerfile zusätzlich Symlinks rein:
RUN ln -sf /usr/local/bin/ffmpeg /usr/bin/ffmpeg && \
ln -sf /usr/local/bin/ffprobe /usr/bin/ffprobe
Dann rebuild + docker compose up -d.
Wie du âTool not found (which)â dauerhaft abstellst
Das ist ein Prompting-/Modellproblem. Hilft oft, dem Bot klar zu sagen:
whichist kein Tool, sondern ein Shell-Command â immer Ăźberexeclaufen lassen.- Nur Tool-Namen aus der Tool-Liste verwenden (die du ja in
/contextsiehst).
Wenn du willst, poste den exakten âTool not foundâ-Text (welcher Tool-Name wurde angeblich nicht gefunden?). Dann kann ich dir sagen, ob es which/falsches Tool-Schema ist oder ob wirklich cron fehlschlägt.
Stabiler Fix (damit auch /usr/bin/ffmpeg existiert) <<<< das hatte ich getan.
Also was soll ich meinem Bot genau sagen???
Wenn du willst, dass dein Bot nicht wieder âwhichâ als Tool halluziniert, dann gib ihm eine Anweisung, die ihn auf genau ein Tool festnagelt und die PrĂźfung ohne which macht.
Hier sind zwei Copy/PasteâPrompts, die du deinem Bot 1:1 schicken kannst:
A) ffmpeg verifizieren (ohne which, nur Ăźber exec)
Prompt an den Bot:
Benutze ausschlieĂlich das Tool
exec(kein anderes Tool) und fĂźhre exakt diesen ShellâBefehl aus. Behandlels,ffmpeg,ffprobeals Shell-Commands, nicht als Tools. Gib danach nur stdout/stderr aus:set -e ls -la /usr/bin/ffmpeg /usr/local/bin/ffmpeg /usr/bin/ffprobe /usr/local/bin/ffprobe 2>/dev/null || true /usr/bin/ffmpeg -version | head -n 1 || /usr/local/bin/ffmpeg -version | head -n 1 /usr/bin/ffprobe -version | head -n 1 || /usr/local/bin/ffprobe -version | head -n 1
Damit umgehst du komplett which/command -v.
B) Cron-Tool testen (direkt das cron Tool aufrufen)
Prompt an den Bot:
Rufe das Tool
cronauf (nichtexec). Verwendeaction="status"und gib das Ergebnis aus.
(Alternativ: action="list".)
Wenn er bei A) trotzdem âTool not found: whichâ schreibt, dann ist das 100% Modellverhalten (halluziniert Tool-Namen), nicht dein Gateway. In dem Fall sag mir bitte den exakten âTool not found âŚâ-Text (welcher Tool-Name wird genannt), dann kann ich dir eine noch strengere âTool-Disziplinâ-Anweisung formulieren (oder wir wechseln testweise kurz das Modell, um Tool-Calling als Ursache zu verifizieren).
A) Habe das dem Bot mitgeteilt
Seine Antwort: Jetzt geht gar nichts mehr â die Tools sind komplett down! đ¤
Status:
â exec â "Tool not found" (wieder)
Vorhin ging noch echo hello und ls -la /usr/local/bin/ffmpeg
Jetzt: Gar nichts mehr
Das Problem ist definitiv auf Gateway/Container-Ebene, nicht bei ffmpeg oder den Commands.
Mein Vorschlag:
Da ich gerade keine Tools ausfĂźhren kann, teste es selbst direkt auf dem Server:
SSH in den Container oder Host:
docker exec -it openclaw /bin/bash
Dann teste:
ls -la /usr/local/bin/ffmpeg /usr/local/bin/ffprobe
/usr/local/bin/ffmpeg -version | head -1
/usr/local/bin/ffprobe -version | head -1
Wenn das läuft, teste Whisper:
export PATH="/data/.local/bin:$PATH"
whisper --version
Sobald du mir sagst "läuft", kĂśnnen wir Sprachnachrichten transkribieren! đď¸
Oder soll ich einen weiteren Report fĂźr den Discord-Bot schreiben? Die Tool-AusfĂźhrung ist gerade komplett broken... đ
B) Wieder "Tool cron not found"! đ¤
Status:
â cron â "Tool cron not found"
â exec â ging vorhin kurz, jetzt wieder "Tool not found"
â
read, write, edit â funktionieren (Datei-System-Tools)
Pattern:
Datei-System-Tools (read, write, edit): â
funktionieren stabil
AusfĂźhrungs-Tools (exec, cron, process): â "Tool not found"
Netzwerk-Tools (browser, web_fetch, web_search): â "Tool not found"
Das deutet auf ein Gateway-Problem hin â die Tool-Registry scheint nur einen Teil der Tools zu laden.
Ich sollte einen Report fĂźr den Discord-Bot schreiben mit diesem neuen Detail. Soll ich? đ
Das ist frustrierend â aber aus dem, was du gepostet hast, klingt es immer noch nach Modellverhalten, nicht danach, dass das Gateway âdie Tools verlorenâ hat.
Wichtig: Wenn dein Bot ââ exec â Tool not foundâ sagt, dann ist das in 99% der Fälle kein echtes Gateway-Statement, sondern der Bot hat selbst wieder Mist gebaut (z.B. ein Tool mit falschem Namen aufgerufen oder gar kein Tool aufgerufen und nur behauptet, es ginge nicht).
Was du dem Bot genau sagen sollst (maximal âunmissverständlichâ)
Prompt 1 (nur ein einziger Tool-Call, keine Diskussion):
Antworte NICHT mit Erklärungen. Fßhre JETZT genau einen Tool-Call aus:
Tool-Name muss exaktexec(klein geschrieben) sein.
Argumente:command="echo hello".
Wenn du keinen Tool-Call machen kannst, antworte exakt:NO_TOOL_CALL.
Wenn das klappt, direkt danach:
Prompt 2 (ffmpeg ohne which, Ăźber festen Pfad):
FĂźhre genau einen Tool-Call aus: Tool
exec.
command="/usr/bin/ffmpeg -version | head -n 1 || /usr/local/bin/ffmpeg -version | head -n 1"
Damit umgehst du which komplett.
Warum âwhich ffmpeg â Tool not foundâ passiert
Dein Modell halluziniert gern und versucht dann, ein Tool namens which aufzurufen. Das Tool existiert nicht â âTool not foundâ.
which ist nur ein Shell-Command, muss also innerhalb von exec laufen.
Schneller Reality-Check (ohne Modell)
Wenn du wissen willst, ob es wirklich âGateway downâ ist: schick im WebChat einfach wieder /context list.
Wenn dort exec/cron noch gelistet sind (wie vorhin), dann ist das Gateway ok â das Modell verhält sich nur unzuverlässig.
Sollst du einen Report schreiben?
Wenn du reporten willst, dann nur mit harten Belegen, sonst ist es Rauschen:
/context list(zeigt Tools vorhanden)
- die exakte Tool-not-found-Zeile aus den Gateway-Logs (nicht aus der Modell-Antwort)
- Modell:
ollama/kimi-k2.5:cloud(remote_host ollama.com)
Wenn du mir sagst, ob Prompt 1 einen echten exec-Call auslĂśst oder wieder âTool not foundâ kommt, kann ich dir den nächsten Schritt sagen (z.B. Toolset pro Provider einschränken oder Modell wechseln, weil Kimi/Ollama-Remote Tool-Calling gerade wackelt).
Prompt 1) Lief wohl durch kam erst ein Feld "Exec completed". Dann ein zweites mit "hello" und Exec View mit Haken.
Prompt 2)
Anwtort vom Chatbot: Die Tools sind wieder instabil â aber ich habe ffmpeg bestätigt! đ
Ergebnisse:
â
echo hello â funktioniert
â
ffmpeg -version â ffmpeg version 7.0.2-static đ
â ffprobe -version â "Tool not found" (wieder instabil)
Fazit:
â
ffmpeg ist unter /usr/bin/ffmpeg oder /usr/local/bin/ffmpeg installiert
â
Version 7.0.2-static (von John Van Sickle â das ist die portable/static Version!)
â ffprobe konnte ich noch nicht testen
Das ist schonmal ein Riesenerfolg! đ ffmpeg läuft!
Soll ich versuchen, Whisper jetzt zu nutzen? đ
Sehr gut â das ist genau das Ergebnis, das wir wollten: exec läuft, und ffmpeg ist da (statischer Build).
Das ââ ffprobe â Tool not foundâ ist mit hoher Wahrscheinlichkeit wieder nur das Modell, das ffprobe fälschlich als Tool aufrufen will (so wie vorher which). ffprobe muss einfach als Shell-Command innerhalb von exec laufen.
1) ffprobe sauber testen (copy/paste Prompt)
Schick deinem Bot das:
Benutze nur das Tool
execund fĂźhre exakt diesen Befehl aus:ls -la /usr/bin/ffprobe /usr/local/bin/ffprobe 2>/dev/null || true /usr/bin/ffprobe -version | head -n 1 || /usr/local/bin/ffprobe -version | head -n 1
Wenn da rauskommt, dass ffprobe wirklich fehlt: dann fehlt entweder das Binary im Image oder nur der Symlink. (Dann musst du im Wrapper genauso wie bei ffmpeg auch ffprobe kopieren/symlinken.)
2) Ja: Whisper als Nächstes testen
Mach erst nur einen Version-Check:
Benutze nur
execund fĂźhre aus:export PATH="/data/.local/bin:$PATH" whisper --version
Wenn das geht, dann eine echte Probe-Transkription (du brauchst dafĂźr einen lokalen Audio-Dateipfad im Container). Beispiel:
export PATH="/data/.local/bin:$PATH"
whisper /pfad/zur/datei.ogg --model base --output_format txt --output_dir /data/.openclaw/workspace
Wenn du mir sagst, wo die Audio-Datei liegt (Pfad), kann ich dir den Whisper-Befehl passend dazu formulieren.
Und: FĂźr Discord-Voice/Waveform braucht OpenClaw meist ffmpeg + ffprobe, also lohnt es sich, ffprobe wirklich sauber zu haben.
Whisper läuft! đ
Status:
â
ffmpeg 7.0.2-static
â
ffprobe
â
Whisper installiert
Aber: exec spinnt wieder (ging kurz, jetzt wieder "Tool not found").
Sprachnachrichten transkribieren: Sobald exec stabil läuft, kĂśnnen wir loslegen! đď¸
Soll ich einen Report fĂźr Discord schreiben oder wartest du auf den Fix dort? đ
<<<<< soll ich jetzt trotzdem mal eine Telegram Audio-Nachricht senden?
Ja â schick ruhig mal eine kurze TelegramâSprachnachricht (5â10 Sekunden) zum Testen.
Wichtig dabei:
- FĂźrs Transkribieren muss dein Agent nicht zwingend das
execâTool âim Chatâ sauber benutzen â wenn Whisper/ffmpeg im System verfĂźgbar sind, läuft die Transkription typischerweise Ăźber die Audio-Pipeline intern. - Dieses â
execâ Tool not foundâ klingt weiterhin nach Modell-Halluzination (Tool-Name/Tool-Call falsch), nicht nach âGateway kann exec wirklich nichtâ.
Vorgehen
- Sende eine kurze Voice Note in Telegram an deinen Bot.
- Schau, ob du eine Transkription/Antwort bekommst.
- Falls nicht: poste die letzten ~100 Zeilen aus
docker logs --tail 200 openclaw-9yo9-openclaw-1
Report fĂźr Discord?
Ich wĂźrde erst reporten, wenn du einen echten Gateway-Log hast Ă la âtool not found: execâ (also nicht nur die Bot-Antwort). Im Moment wirktâs eher wie Kimi/OllamaâToolcalling-Wackler.
Wenn die Telegram-Transkription klappt, ist dein ursprĂźngliches Ziel (ffmpeg/ffprobe/whisper persistent) im Prinzip erreicht.
Der Chatbot reagiert in Telegram grad gar nicht mehr. Oh man, ständig âneue Baustellenâ
Klingt nach genau der Sorte âNebenschadenâ, die passiert, wenn man zwischendurch Tokens/Config anfasst oder der Container neu startet. Lass uns das sauber eingrenzen â entweder kommen Telegram-Updates gar nicht mehr rein, oder sie kommen rein, aber der Agent crasht / antwortet nicht.
1) Läuft der Container ßberhaupt stabil?
Auf dem VPS:
docker ps --format 'table {{.Names}}\t{{.Status}}'
docker logs --tail 80 openclaw-9yo9-openclaw-1
Wenn du da Restarts/Crashloops siehst â erst das fixen.
2) Sieht OpenClaw Ăźberhaupt Telegram-Nachrichten?
Filter in den Logs:
docker logs --tail 300 openclaw-9yo9-openclaw-1 | grep -i telegram
docker logs --tail 300 openclaw-9yo9-openclaw-1 | grep -Ei "401|unauthorized|forbidden|bot was blocked|token|poll|webhook|error"
- 401/Unauthorized â fast sicher: Telegram Bot Token ist weg/kaputt (du hattest ja âTokens gelĂśschtâ).
- Keine Telegram-Einträge â Bot verbindet sich nicht (Token/Netz/Webhook/Polling).
3) Bitte check: Hast du den Telegram Token aus openclaw.json gelĂśscht?
Schau (redacte den Token beim Posten, aber im File muss er korrekt sein):
docker exec -it openclaw-9yo9-openclaw-1 sh -lc 'grep -n "telegram" -A8 /data/.openclaw/openclaw.json'
Wenn da kein Token mehr drin ist bzw. âdeleted by meâ o.ä. â Telegram kann nicht gehen.
4) Quick sanity: Reagiert der Bot in WebChat noch?
Wenn WebChat noch antwortet, ist Gateway+Modell ok â Problem ist dann sehr wahrscheinlich Telegram-Channel-Config/Token.
Post mir am besten:
docker psStatuszeile vonopenclaw-9yo9-openclaw-1- die relevantesten 20â40 Zeilen aus
docker logs --tail 300 ... | grep -Ei "telegram|401|unauthorized|error"
Dann kann man ziemlich schnell sagen, ob es Token/Config oder ein Laufzeit-Problem ist.
Nach 4 Minuten hat der Chatbor geantwortet:
Ah, eine neue Sprachnachricht! đď¸ Lass mich versuchen, sie zu transkribieren:
Wieder "Tool not found"! đ¤
exec ist gerade wieder down. Ich kann die Sprachnachricht nicht transkribieren, solange die Tools nicht stabil laufen.
Aber: Whisper, ffmpeg und ffprobe sind alle installiert und funktionsbereit! đ Sobald die Tool-AusfĂźhrung stabil läuft, geht's los.
Soll ich einen Discord-Report schreiben mit dem Hinweis, dass exec jetzt sporadisch funktioniert (ging kurz fĂźr ffmpeg-Tests, jetzt wieder down)? đ
Ja, bin noch da! đ
Lass mich versuchen, deine Sprachnachricht zu transkribieren:
Verdammt, wieder "Tool not found"! đ¤
Ich bin hier, aber exec spinnt immer noch. Die Sprachnachricht kann ich nicht transkribieren, solange die Tool-Ausfßhrung nicht stabil läuft.
Was wir haben:
⢠â
ffmpeg 7.0.2-static installiert
⢠â
ffprobe installiert
⢠â
Whisper installiert
⢠â exec Tool â sporadisch verfĂźgbar (gerade wieder down)
Sobald exec stabil läuft, kĂśnnen wir Sprachnachrichten transkribieren! đď¸
Soll ich einen Discord-Report schreiben? đ
Das Verhalten in Telegram (âlass mich transkribieren ⌠exec ist down ⌠Tool not foundâ) ist ein ziemlich starkes Signal, dass die automatische Audio-Transkription in OpenClaw bei dir gerade nicht greift â sonst wĂźrde OpenClaw die Voice Note vor dem Modell transkribieren und der Bot mĂźsste gar nicht âper Handâ exec benutzen.
HeiĂt: statt exec âstabil zu betenâ, ist der robustere Fix:
Audio/Voice-Notes so konfigurieren, dass OpenClaw Whisper automatisch nutzt
Dann hängt die Transkription nicht davon ab, ob Kimi gerade Tool-Namen halluziniert.
In openclaw.json unter tools hinzufĂźgen (oder erweitern):
{
tools: {
// ⌠dein bestehendes tools.profile/web bleibt
media: {
audio: {
enabled: true,
echoTranscript: true, // optional, aber super zum Debuggen
models: [
{
type: "cli",
command: "/data/.local/bin/whisper",
args: ["--model", "base", "{{MediaPath}}"],
timeoutSeconds: 60,
},
],
},
},
},
}
Wichtig:
- Damit das klappt, mĂźssen
ffmpeg/ffprobeim Container auffindbar sein (am besten via Symlink nach/usr/bin, wie duâs schon gemacht hast). whispermuss wirklich unter/data/.local/bin/whisperliegen (oder du passt den Pfad an).
Dann Container/Gateway neu starten.
Docs dazu: https://docs.openclaw.ai/nodes/audio (Auto-detection & tools.media.audio.models)
Warum ich aktuell keinen Discord-Report schreiben wĂźrde
Solange wir keine Gateway-Logs haben, die âtool not found: execâ zeigen, ist das sehr wahrscheinlich nur das Modell (Kimi/Ollama Remote) das manchmal BlĂśdsinn redet (âexec downâ), obwohl exec eigentlich existiert.
Ja/Nein: Telegram Audio-Nachricht senden?
Ja â aber erst nachdem tools.media.audio wie oben gesetzt + neu gestartet ist.
Dann sollte OpenClaw dir idealerweise sofort ein đ Transcript âechoenâ (wenn echoTranscript: true aktiv ist), und danach normal antworten.
Wenn du willst, poste kurz:
ls -la /data/.local/bin/whisper- und deinen aktuellen
tools.mediaBlock (redacted)
Dann sag ich dir, ob der Pfad stimmt.
Ich bin grad unterwegs und habe momentan kein Zugriff auf Shell/Terminal.
Aber eine Frage hab ich dazu. kimi K2.5 gilt eigentlich als sehr gutes Modell was viele nutzen Y warum halluziniert es so viel? Bei einem Freund von mir läuft es einwandfrei
Das ist eine faire Frage â und ja, Kimi K2.5 kann âals Sprachmodellâ richtig gut sein, aber Tool-Calling ist leider eine eigene Disziplin. Das, was du als âHalluzinationâ siehst, ist oft eher:
- Tool-Name/Format-Drift (z.B. er behandelt
which/ffprobewie ein eigenes Tool) - Ausreden-Text (âTools sind downâ), obwohl erâs schlicht nicht sauber aufruft
Warum passiert das bei dir, aber beim Freund nicht? Typische Ursachen (meistens istâs eine Kombi):
Unterschiede im Setup (auch wenn âgleiches Modellâ draufsteht)
- Anderer Provider-/Adapterpfad: du nutzt
kimi-k2.5:cloudĂźber Ollama Remote (remote_host: https://ollama.com). Dein Freund nutzt evtl. lokal/anderes Endpoint/anderen Adapter. Tool-Calling kann sich da massiv unterscheiden. - Andere OpenClaw-Version / andere Tool-Schemas: Schon kleine Unterschiede an Tool-Schema oder Systemprompt machen manche Modelle âwackligâ.
- Anderer Tool-Umfang: Mit
tools.profile: fullsieht das Modell viele Tools + groĂe Schemas. Manche Modelle werden dann unsauber und âerfindenâ Tool-Namen. (Weniger Tools = weniger MĂśglichkeiten zu verkacken.) - Andere Modell-Parameter (Temperatur, etc.): HĂśhere Temperatur = kreativer = mehr Drift bei exakten Tool-Namen.
- Session/Context-Länge: Je länger der Chat + je mehr Kontext (AGENTS.md, Skills, etc.), desto eher passieren Formatfehler.
Wichtig: Das ist nicht âdummâ, sondern ânicht deterministisch genugâ
Tool-Namen mĂźssen exakt passen. Ein einziges falsches Token (ffprobe als Tool statt Shell-Command in exec) â âTool not foundâ. Bei Text merkst du so kleine Abweichungen nicht, bei Tools sofort.
Was du dagegen tun kannst (ohne Terminal)
- Transkription deterministisch machen (wie ich oben vorgeschlagen habe mit
tools.media.audio.models), damit der Bot nicht jedes Mal selber entscheiden muss, ob/wie erexecnutzt. - Toolset verkleinern, statt âfullâ: nur
exec+ das NĂśtigste. Das reduziert Halluzinationen drastisch.
Wenn du wieder am Rechner bist, sag kurz:
- nutzt dein Freund auch
kimi-k2.5:cloudßber Ollama Remote? - läuft ihr beide auf derselben OpenClaw-Version?
Dann kann man ziemlich gezielt sagen, welcher Unterschied es ist.
Meinen Anweisung an den Bot:
Probieren wir es nochmal:
Kannst du mir die neuesten Einträge aus diesen RSS-Feeds und mach mir eine kompakte Zusammenfassung.
Feeds:
- https://the-decoder.com/feed/
- https://venturebeat.com/category/ai/feed/
- https://techcrunch.com/feed/
- https://bensbites.beehiiv.com/feed
- https://kiupdate.podigee.io/feed/mp3
Output:
- Max. 10 Highlights
- Pro Highlight: 1 Satz âworum gehtâs?â, 1 Satz âwarum wichtig?â
- Danach: 3 Trends des Tages (bullet points)
- Am Ende: Links zu den Originalartikeln (nur URL-Liste)
Sprache: Deutsch.
Vermeide es, mir doppelte News zu geben.
Ich hätte das gerne 2x am Tag. Morgens um 8:30 Uhr und Abends um 18:30 Uhr.
Geht das?
Seine Antwort:
Lass mich testen, ob die Tools jetzt laufen: Verdammt, web_fetch ist immer noch down! đ¤
Aktueller Stand:
⢠â web_fetch â "Tool not found"
⢠â browser â "Tool not found"
⢠â
exec â ging vorhin, aktuell unklar
Also: Ich kann die RSS-Feeds gerade nicht abrufen. Weder per HTTP-Request noch per Browser.
Was ich tun kĂśnnte:
- Warten bis die Tools wieder laufen
- Du gibst mir die Feed-Inhalte (copy-paste) und ich mache die Zusammenfassung
- Alternative: Ich richte die Cron-Jobs ein (fĂźr 8:30 und 18:30 Uhr) und hoffe, dass die Tools bis dahin wieder laufen
Soll ich die Cron-Jobs trotzdem einrichten? Dann wĂźrden sie erst funktionieren, sobald web_fetch/browser wieder da ist. Oder willst du die Feed-Inhalte manuell geben? đ
Bei einem anderen Cron Job heute morgen ging das einwandfrei
Ja, das geht â am besten Ăźber cron (GatewayâScheduler).
Wie duâs in OpenClaw umsetzt (Konzept)
web_fetchholt die RSS-Feeds (das sind einfach XMLâURLs).- Der Agent extrahiert die neuesten Items, dedupliziert (mind. innerhalb des Runs nach URL) und formatiert wie gewĂźnscht.
cronstartet das Ganze automatisch 2à täglich.
Zeitplan (8:30 + 18:30)
Du kannst dafĂźr entweder 2 Jobs anlegen oder 1 Job mit Cron-Expr:
- Cron-Expr:
30 8,18 * * * - Timezone z.B.
Europe/Vienna(oderEurope/Berlin)
Beispiel (Cron-Job als âisolated agent turnâ)
Den Inhalt kannst du deinem Bot geben mit âBitte fĂźge per cron add diesen Job hinzu âŚâ:
{
"name": "AI RSS Digest (08:30/18:30)",
"schedule": { "kind": "cron", "expr": "30 8,18 * * *", "tz": "Europe/Vienna" },
"sessionTarget": "isolated",
"payload": {
"kind": "agentTurn",
"message": "Hole diese RSS-Feeds per web_fetch und erstelle auf Deutsch max. 10 Highlights: pro Highlight 1 Satz 'worum gehtâs?' + 1 Satz 'warum wichtig?'. Danach 3 Trends des Tages (Bullets). Am Ende nur URL-Liste. Vermeide doppelte News (dedupe nach URL + sehr ähnlichem Titel) Ăźber alle Feeds hinweg.\nFeeds:\n- https://the-decoder.com/feed/\n- https://venturebeat.com/category/ai/feed/\n- https://techcrunch.com/feed/\n- https://bensbites.beehiiv.com/feed\n- https://kiupdate.podigee.io/feed/mp3"
},
"delivery": { "mode": "announce", "channel": "last", "bestEffort": true }
}
Hinweis: channel: "last" sendet an die âletzte Routeâ (z.B. Telegram, wenn du zuletzt dort gechattet hast). FĂźr wirklich stabilen Versand wĂźrde man delivery.channel: "telegram" + delivery.to: "<chatId>" setzen.
Aber: bei dir ist ToolâCalling gerade wacklig
Wenn Kimi bei exec/web_fetch/cron Tool-Namen halluziniert, wird so ein Cron-Job unzuverlässig. In dem Fall hilft:
- Toolset fĂźr den Job kleiner machen (nur
web_fetch,cron,read/write), oder - fĂźr CronâJobs ein toolâcallârobusteres Modell verwenden.
Wenn du magst: Sag mir, wo du den Digest haben willst (Telegram? WebChat?), dann sag ich dir, welche delivery.channel/to Werte du brauchst.
Das klingt wieder nach dem gleichen Muster wie mit which/ffprobe: Dein Bot behauptet, web_fetch sei âdownâ, aber sehr oft ist das einfach nur Tool-Calling-Drift vom Modell (âTool not foundâ), weil es den Tool-Namen falsch aufruft oder gar nicht erst probiert.
Bevor du Cron baust, wĂźrde ichâs so machen:
1) Erst einen MiniâTest: funktioniert web_fetch Ăźberhaupt?
Sag deinem Bot (Copy/Paste):
Bitte mache genau einen Tool-Call: Tool-Name exakt
web_fetch(klein geschrieben).
URL:https://example.com
Gib danach die ersten 200 Zeichen der Antwort aus. Keine Erklärungen.
Wenn das klappt, ist web_fetch nicht âdownâ â dann kann er auch RSS abrufen.
Wenn er wieder âTool not foundâ sagt, dann bitte exakt zurĂźckfragen:
âWelcher Tool-Name wurde genau als ânot foundâ gemeldet?â
(weil oft steht da dann sowas wie web.fetch statt web_fetch).
2) Cron-Jobs wĂźrde ich erst anlegen, wenn der LiveâTest stabil ist
Sonst hast du nur 2Ă täglich failing Jobs und keine Ahnung, obâs am Feed, am Netz oder am Modell liegt.
3) Workaround, falls web_fetch mit Kimi echt nicht zuverlässig geht
Dann hast du im Prinzip zwei saubere Wege:
- FĂźr diesen Job ein toolâcallârobusteres Modell verwenden (per CronâJob
payload.modeloverride, falls du eins konfiguriert hast), oder - RSS per
exec+curl/pythonholen (deterministischer), dann nur noch zusammenfassen lassen.
Wenn du willst, sag kurz: Hast du auĂer Kimi noch ein zweites Modell/Provider in deiner Config? Dann kann man den Cron-Job so bauen, dass nur die RSS-Zusammenfassung damit läuft.
Wenn du mir den Output vom web_fetch https://example.com Test postest, kann ich dir sagen, ob es wirklich Gateway/Tool-Registry ist (eher unwahrscheinlich) oder wieder âModell ruft falsches Tool aufâ.
Das ist eigentlich die beste Info bisher: wenn ein anderer Cron-Job heute Morgen sauber lief, dann sind web_fetch/Tools nicht grundsätzlich âwegâ oder kaputt. Das spricht stark gegen âToolâRegistry lädt nur halbâ und eher fĂźr Intermittency durch Kontext/Modellverhalten.
Warum wirkt Cron oft stabiler als âLiveâChatâ?
- Cron läuft i.d.R. âisoliertâ (frische Session, wenig ChatâBallast) â weniger Prompt-/KontextâDrift â Modelle halten sich eher an Tool-Namen.
- Im LiveâChat hast du schnell viel Kontext + Nebenbaustellen â Modelle fangen eher an, Tool-Namen zu âratenâ (
web.fetchstattweb_fetch,whichals Tool, usw.).
Empfehlung
Bau den RSSâDigest genau so wie den funktionierenden CronâJob:
sessionTarget: "isolated"- die komplette Anweisung im
payload.message(selbstâenthaltend) - ggf. mit einem extra Satz ganz oben: âNutze ausschlieĂlich
web_fetchfĂźr die Feed-URLs.â
Dann ist die Chance hoch, dass es im Cron stabil läuft, auch wenn es im LiveâChat manchmal wackelt.
Wenn du magst: Kannst du kurz sagen, was der CronâJob heute Morgen gemacht hat (grob) und ob der als âisolatedâ läuft? Oder paste (redacted) den cron list Eintrag/die Job-JSON â dann kann ich dir den RSSâJob in exakt dem gleichen Stil formulieren.
Sorry, aber das Verhalten ist nicht normal. Das kann kein Halluzinieren sein! Ich habe permanent Probleme!
Ich: bitte installiere https://clawhub.ai/JimLiuxinghai/find-skills
antwort:
Verdammt, clawhub Tool ist "not found"! đ¤
Lass mich es Ăźber exec versuchen:
Verdammt, das clawhub Tool ist auch "not found"! đ¤
Lass mich versuchen, es Ăźber exec zu machen (falls clawhub CLI installiert ist):
Auch exec ist wieder "not found"! đ¤
Aktueller Stand:
⢠â clawhub Tool â "not found"
⢠â exec â "not found" (wieder instabil)
⢠â cron â "not found"
⢠â web_fetch â "not found"
Ich kann den Skill gerade nicht installieren, weil alle relevanten Tools down sind.
Was du tun kannst:
Im Container oder auf dem Host:
clawhub install find-skills --workdir /data/.openclaw/workspace
Oder, wenn clawhub CLI nicht verfĂźgbar ist:
Manuell installieren:
cd /data/.openclaw/workspace/skills
git clone https://github.com/JimLiuxinghai/find-skills.git find-skills
Sobald die Tools wieder laufen, kann ich es fĂźr dich machen. Aktuell: Alles down auĂer read, write, edit. đ
Soll ich einen Discord-Report schreiben? đ
Ich versteh den Frust â aber in dem Beispiel mit ClawHub ist tatsächlich ein Teil ânormalâ, auch wennâs sich komplett kaputt anfĂźhlt:
1) âclawhub Tool not foundâ ist wĂśrtlich genommen korrekt
Es gibt in OpenClaw kein Function-Tool namens clawhub.
ClawHub ist ein CLI-Programm (clawhub âŚ), und âclawhubâ ist bei dir (laut /context) eher als Skill/Anleitung vorhanden, nicht als Tool.
Der richtige Weg ist deshalb immer:
execTool â fĂźhrtclawhub install âŚals Shell-Command aus
oder- manuell per
git clonein denworkspace/skillsOrdner.
Wenn dein Bot âclawhub Tool not foundâ sagt, dann hat er schlicht die Systeme verwechselt (Tool vs CLI).
2) Das wirklich Unnormale ist: âexec Tool not foundâ (mal ja, mal nein)
Das kann zwei Ursachen haben:
A) Modell-Drift / Tool-Calling-Fehler (am häufigsten bei dir)
Dann behauptet der Bot âexec not foundâ, obwohl es im /context list drin ist. Das ist Text vom Modell, nicht zwingend Gateway-Realität.
B) Gateway wirft wirklich âtool not foundâ Fehler
Dann mĂźsste das auch in den Gateway-Logs stehen (nicht nur in der Bot-Antwort).
3) Was du tun solltest (ohne Spekulation)
Wenn du wieder Zugriff hast, mach genau diese 2 Checks â die sind âGround Truthâ:
- /context list (im Chat) â zeigt, ob
exec/web_fetch/cronwirklich injected sind. - Logs:
docker logs --tail 500 openclaw-9yo9-openclaw-1 | grep -Ei "tool not found|unknown tool|exec.*not found"
Wenn in den Logs nichts dazu steht, ist es fast sicher Modell-Gelaber.
4) Skill âfind-skillsâ installieren (robust, ohne dass der Bot raten muss)
Sobald exec einmal sauber geht, lass ihn genau das machen:
clawhub search "find-skills"
clawhub install <slug> --workdir /data/.openclaw/workspace
(Und dann Gateway neu starten oder neue Session, damit Skills geladen werden.)
Wenn clawhub CLI nicht installiert ist, musst du sie zuerst installieren (oder ins Wrapper-Image backen).
5) Report?
Wenn du reporten willst, dann bitte nicht als âTools sind downâ, sondern mit Belegen:
/context listOutput- die exakte Logzeile(n) mit âtool not foundâ
- Modell:
ollama/kimi-k2.5:cloud (remote_host ollama.com)
- Repro-Schritte
Dann als GitHub Issue: https://github.com/openclaw/openclaw/issues
Wenn du mir sagst, ob in deinen Logs wirklich âtool not found: execâ auftaucht (mit Timestamp), kann ich dir sagen, ob das ein echtes Gateway-Bug-Signal ist oder ânurâ Kimi, das wieder Quatsch erzählt.
Bei meinem Kumpel - ebenfalls Ollama/Kimi K 2.5. Ebenfalls Hostinger 1-Klick Installation:
Prompt: Kannst du bitte https://clawhub.ai/pskoett/self-improving-agent installieren
Antwort: â
Skill installiert!
Details:
Name: self-improving-agent
Location: /data/.openclaw/workspace/skills/self-improving-agent
Registry: clawhub.ai
Soll ich dir den SKILL.md anzeigen, um zu sehen was das Skill macht? đŚ
Bei mir - Ollama/Kimi K 2.5 (Hostinger 1-Klick-Installation):
Lass mich den Skill installieren:
Verdammt, clawhub Tool ist "not found"! đ¤
Lass mich es Ăźber exec versuchen:
Verdammt, das clawhub Tool ist auch "not found"! đ¤
Lass mich versuchen, es Ăźber exec zu machen (falls clawhub CLI installiert ist):
Auch exec ist wieder "not found"! đ¤
Aktueller Stand:
⢠â clawhub Tool â "not found"
⢠â exec â "not found" (wieder instabil)
⢠â cron â "not found"
⢠â web_fetch â "not found"
Ich kann den Skill gerade nicht installieren, weil alle relevanten Tools down sind.
Was du tun kannst:
Bash
î§

Im Container oder auf dem Host:
clawhub install find-skills --workdir /data/.openclaw/workspace
Oder, wenn clawhub CLI nicht verfĂźgbar ist:
Bash
î§

Manuell installieren:
cd /data/.openclaw/workspace/skills
git clone https://github.com/JimLiuxinghai/find-skills.git find-skills
Sobald die Tools wieder laufen, kann ich es fĂźr dich machen. Aktuell: Alles down auĂer read, write, edit. đ
<<<< Das MUSS ein Konfigurationsproblem sein. Das kann keine Halluznationen sein
Ich glaub dir, dass es sich âkaputtâ anfĂźhlt â aber aus dem konkreten Beispiel kann man zwei Dinge gleichzeitig ableiten:
A) Ja: Es gibt sehr wahrscheinlich einen echten SetupâUnterschied zwischen dir und deinem Kumpel
Wenn er reproduzierbar Skills per ClawHub installiert und du nicht, dann fehlt bei dir meist eins von:
clawhubCLI ist nicht installiert / nicht imPATH(oder nicht imPATHdesnodeUsers, unter dem die GatewayâTurns laufen)- du hast durch Wrapper/ConfigâĂnderungen etwas âaus Versehenâ verändert (PATH, globale npm bins, etc.)
- oder eure OpenClawâVersionen/Images sind nicht identisch
B) Trotzdem: âclawhub Tool not foundâ ist kein Beweis, sondern ein ModellâDurcheinander
Es gibt kein FunctionâTool namens clawhub. ClawHub ist ein CLI.
Die korrekte Aktion ist: exec â clawhub install ...
Wenn dein Bot âclawhub Tool not foundâ sagt, heiĂt das nur: er hat âTool vs ShellâCommandâ verwechselt.
Der schnellste, harte Check (ohne Halluzinationen)
Sobald du wieder Terminal hast, bitte genau das ausfĂźhren (auf deinem VPS):
docker exec --user node -it openclaw-9yo9-openclaw-1 sh -lc 'command -v clawhub && clawhub --version'
Ergebnisse:
- Wenn
command -v clawhubnichts findet â dann ist der Grund klar: dein Kumpel hatclawhubim Image/PATH, du nicht. - Wenn es da ist â dann kĂśnnen wir als Nächstes direkt testen:
docker exec --user node -it openclaw-9yo9-openclaw-1 sh -lc 'clawhub search "self-improving-agent" --limit 5'
Workaround (deterministisch, ohne URL-Parsing)
Sag deinem Bot nicht die URL, sondern den Slug und einen exakten Befehl:
Nutze nur
execund fĂźhre aus:
clawhub install pskoett/self-improving-agent --workdir /data/.openclaw/workspace
(Das ist exakt das, was bei deinem Kumpel âhintenrumâ passiert.)
Wenn du mir das Ergebnis von command -v clawhub && clawhub --version postest, kann ich dir sofort sagen, ob du clawhub in dein WrapperâImage backen musst (z.B. per npm i -g clawhub) oder ob es ânurâ PATH/Permissions sind.
root@silberlocke:~# docker exec --user node -it openclaw-9yo9-openclaw-1 sh -lc 'command -v clawhub && clawhub --version'
/usr/local/bin/clawhub
error: unknown option '--version'
Usage: clawhub [options] [command]
ClawHub CLI v0.7.0
install, update, search, and publish agent skills.
root@silberlocke:~# docker exec --user node -it openclaw-9yo9-openclaw-1 sh -lc 'clawhub search "self-improving-agent" --limit 5'
self-improving Self-Improving Agent (With Self-Reflection) (2.393)
self-evolve Self-Evolve (1.224)
agent-autonomy-kit Agent Autonomy Kit (1.207)
agent-orchestrator Agent Orchestrator (1.168)
ai-agent-helper AI Agent Helper (1.158)
root@silberlocke:~#
Perfekt â das klärtâs eindeutig:
clawhubist bei dir installiert (/usr/local/bin/clawhub)- und
clawhub search âŚfunktioniert sauber.
Damit ist âclawhub Tool not foundâ in den Bot-Antworten wirklich nur Durcheinander vom Modell (Tool vs. CLI vs. exec) â nicht âGateway kaputtâ.
Nächster Schritt: Skill jetzt einfach installieren (deterministisch)
Aus deinem search Output ist der Slug sehr wahrscheinlich self-improving.
Probier das:
docker exec --user node -it openclaw-9yo9-openclaw-1 sh -lc \
'clawhub install self-improving --workdir /data/.openclaw/workspace'
Danach prĂźfen:
docker exec --user node -it openclaw-9yo9-openclaw-1 sh -lc \
'ls -la /data/.openclaw/workspace/skills | head'
Wenn OpenClaw den Skill nicht sofort âsiehtâ: starte eine neue Session (z.B. /reset im Chat) oder restart den Gateway/Container (Skills werden âon next sessionâ geladen).
Und fĂźr deinen ursprĂźnglichen Link pskoett/self-improving-agent
ClawHub-URLs kĂśnnen manchmal âOwner/Slugâ anzeigen, aber installiert wird oft Ăźber den Registry-Slug. Dein search zeigt dir den Slug, und der ist die sicherste Quelle.
Wenn du willst, kÜnnen wir als nächstes auch find-skills sauber installieren:
docker exec --user node -it openclaw-9yo9-openclaw-1 sh -lc \
'clawhub search "find-skills" --limit 10'
âŚund dann den passenden Slug installieren.
Sag kurz, ob clawhub install self-improving ⌠durchläuft (und wie der Ordnername unter workspace/skills danach heiĂt).
Nächster Schritt: Skill jetzt einfach installieren (deterministisch) <<<< Mir gehts nicht darum dass ich den Skill installieren will. Es geht darum dass OpenClaw einen Skill installieren soll von der Clawhub Webseite. Bei meinem Kumpel gehts (ich hab die Befehle dort ja selbst eingegeben) und bei meinem OpenClaw nicht
Verstanden â du willst nicht âich kann es im Terminalâ, sondern: OpenClaw (der Agent) soll es selbst aus dem Chat heraus installieren, so wie bei deinem Kumpel.
Die gute Nachricht: die Voraussetzungen sind bei dir da (ClawHubâCLI ist installiert und funktioniert).
Die schlechte: Dieses âinstalliere von clawhub.aiâ ist in OpenClaw kein garantiert deterministischer BuiltâinâMechanismus, sondern (heute) im Kern:
- Modell bekommt die Anweisung/Skill â
- Modell muss korrekt das Tool
execverwenden â execfĂźhrt dannclawhub install âŚaus.
Wenn das Modell manchmal statt exec ein Fantasie-Tool (clawhub, which, etc.) aufruft oder behauptet âexec not foundâ, wirktâs wie âKonfig kaputtâ, ist aber oft schlicht Tool-Calling-Unzuverlässigkeit. Dein Kumpel hatte dann einfach den âgutenâ Lauf.
Was du jetzt tun kannst, damit OpenClaw es zuverlässig kann (ohne Glßck)
Option 1 (am stabilsten): nutze OpenClawâs Bash-Command statt Modell
Wenn commands.bash bei dir aktiv ist (ist es), kannst du in Telegram/WebChat als Standalone Message probieren:
! clawhub install self-improving --workdir /data/.openclaw/workspace
oder
/bash clawhub install self-improving --workdir /data/.openclaw/workspace
Das läuft gateway-seitig und umgeht das Modell-Halluzinieren komplett.
Option 2: Agent trotzdem machen lassen, aber ohne URL und ohne Raten
Sag dem Agenten nicht die URL, sondern zwing ihn auf den exakten ShellâBefehl:
Benutze ausschlieĂlich
execund fĂźhre exakt aus:
clawhub install self-improving --workdir /data/.openclaw/workspace
(Erst search, dann install ist okay, aber erhĂśht die Chance, dass er wieder âTool not foundâ spielt.)
Warum dein Kumpel âpskoett/âŚâ URL kann und du nicht
Das ist genau der Teil, der modellabhängig ist: URL â slug extrahieren â Tool korrekt aufrufen. Bei ihm hatâs geklappt, bei dir driftetâs.