Upgrade OpenClaw to 2026.4.25 - #26
Open
github-actions[bot] wants to merge 1 commit into
Open
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Automated Upgrade: 2026.3.11 → 2026.4.25
Test Results
Review these before merging.
Release Notes
OpenClaw 2026.4.25
2026.4.25
Highlights
/tts latest, chat-scoped auto-TTS controls, personas, per-agent/per-account overrides, and new Azure Speech, Xiaomi, Local CLI, Inworld, Volcengine, and ElevenLabs v3 provider coverage. Thanks @leonchui, @zoujiejun, @solar2ain, @cshape, @xuruiray, @itsuzef, and @barronlroth.Changes
/tts latestread-aloud support with duplicate suppression and/tts chat on|off|defaultsession-scoped auto-TTS overrides, completing the on-demand voice-note UX for current-chat replies. Fixes #66032.channels.<channel>.accounts.<id>.ttsover global and per-agent TTS config. Thanks @sahilsatralkar.agents.list[].ttsto override globalmessages.ttsfor per-agent voices, and make/tts audio,/tts status, and thettsagent tool honor the active voice/provider override while keeping shared provider credentials and preferences in the existing TTS config surface.openclaw browser doctor --deeplive snapshot probing.--backgroundonopenclaw infer image generateandopenclaw infer image edit, keep--openai-backgroundas an OpenAI alias, and let fal image generation honor--output-format png|jpeg.channels.discord.voice.modelto override the LLM used for voice channel responses while keeping STT and TTS on their existing media settings. (#64368) Thanks @mrdavey.openclaw browser start --headlessas a one-shot local managed browser launch override without rewriting persisted browser config. Thanks @BenediktSchackenberg.openclaw doctor --fixrefresh the plugin index and cold registry index when needed without treating plugin install records as authored config. Thanks @vincentkoc and @shakkernerd.jobIdhook context, bounded native permission fingerprints, and Codex MCP hook relay support. (#71765, #71758, #71707) Thanks @vincentkoc and @pashpashpash.gen_ai.systemby default while emittinggen_ai.provider.nameunderOTEL_SEMCONV_STABILITY_OPT_IN=gen_ai_latest_experimental. Thanks @vincentkoc.openclaw.harness.runspans andopenclaw.harness.duration_msmetrics so QA-lab, Codex, and future harnesses share one trace shape. Thanks @vincentkoc.traceparentheaders from trusted model-call trace context to provider transports while replacing caller-supplied traceparent values. Thanks @vincentkoc.diagnostics-prometheusplugin with a protected gateway scrape route for low-cardinality diagnostics metrics. Thanks @vincentkoc.openclaw plugins registryfor explicit persisted-registry inspection and--refreshrepair without making normal startup rescan plugin locations. Thanks @vincentkoc.openclaw plugins listread the cold persisted registry snapshot by default, leaving module-aware diagnostics toplugins doctorandplugins inspect. Thanks @vincentkoc.models list --all --provider <id>for static manifest-backed providers by loading catalog rows through the installed plugin index instead of broad manifest scans or runtime suppression hooks. Thanks @shakkernerd.model auth loginactually runs. Thanks @vincentkoc./plugins enableand/plugins disable, matching the CLI mutation path. Thanks @vincentkoc.OPENCLAW_DISABLE_PERSISTED_PLUGIN_REGISTRYas a deprecated break-glass switch and point operators at registry repair instead. Thanks @vincentkoc.model_call_startedandmodel_call_endedhooks for provider/model call telemetry without exposing prompts, responses, headers, request bodies, or raw provider request IDs. Thanks @vincentkoc.openclaw.context.assembledspans with prompt/history sizes but no prompt, history, response, or session-key content. Thanks @vincentkoc.openclaw.tool.loopcounters and spans without loop messages, session identifiers, params, or tool output. Thanks @vincentkoc.gen_ai.client.token.usagehistogram for input/output model usage while keeping session identifiers and aggregate cache counters out of the semantic metric. Thanks @vincentkoc.openclaw.agentlabel to OpenClaw token metrics so per-agent Grafana dashboards can group usage without exporting session identifiers. Thanks @oc-factus.plugins/installs.json, replacing the temporaryplugins/installed-index.jsonpath and removingplugins.installsas an authored config surface. Thanks @vincentkoc and @shakkernerd.gen_ai.client.operation.durationhistogram for model-call latency in seconds with bounded provider/model/API and error attributes. Thanks @vincentkoc.gen_ai.systemunless latest experimental GenAI conventions are enabled. Thanks @vincentkoc.gen_ai.request.modelpresent on GenAI token usage metrics with a boundedunknownfallback when model usage events do not include a model. Thanks @vincentkoc.OTEL_SEMCONV_STABILITY_OPT_IN=gen_ai_latest_experimentalprovider-attribute behavior. Thanks @vincentkoc.openclaw.execspans without exposing command text, working directories, or container identifiers. (#71451) Thanks @vincentkoc and @jlapenna.OPENCLAW_OTEL_PRELOADED=1so the plugin can reuse an already-registered OpenTelemetry SDK while keeping OpenClaw diagnostic listeners wired. (#71450) Thanks @vincentkoc and @jlapenna.eleven_v3in the bundled TTS model catalog so model selection surfaces can offer ElevenLabs v3. (#68321) Thanks @itsuzef.litellmas an image-generation provider soimage_generate model=litellm/...calls andagents.defaults.imageGenerationModel.fallbacksentries resolve through the LiteLLM proxy. Thanks @zqchris.video_generate. Thanks @shivanker.0.125.0or newer and cover native MCPPreToolUse,PostToolUse, andPermissionRequestpayloads through the OpenClaw hook relay.agents_listto surface native Codex app-server availability so agents prefer/codex ...over Codex ACP unless ACP/acpx is explicit. Thanks @vincentkoc..factorysettings staging,FACTORY_API_KEYforwarding, and the single-agenttest:docker:live-acp-bind:droidrecipe./tts personacontrols, gateway/CLI persona state, Google Geminiaudio-profile-v1prompt wrapping, and OpenAI instruction mapping. (#70748) Thanks @barronlroth.Fixes
web_searchrequests to the lowest supported reasoning effort instead of sending a rejected minimal payload.bundle-mcpallowlist token when deciding whether bundled MCP tools are available, so restricted tool policies can still enable bundled MCP without exposing unrelated tools.openclaw channels addinstall the selected channel plugin from its default source without opening an interactive prompt, fixing published npm Telegram setup in stdin-closed automation.memory-coreslot during Gateway startup when permitted so active-memory recall can callmemory_searchandmemory_getwithout requiring an explicitplugins.slots.memoryentry, while preservingplugins.slots.memory: "none".plugins listentries.plugins updatewhen tracked plugin or hook updates error, keep bundled runtime-dependency repair behind restrictive allowlists, and reject package installs with unloadable extension entries.chat.sendretries with the same idempotency key on the documented in-flight path so aborts still target the real active run. Fixes #70139. Thanks @Feelw00.runtimeExtensions, and cache bundled runtime-dependency manifest reads during scans.OPENCLAW_SERVICE_REPAIR_POLICY=externalby reporting gateway service health while skipping service install/start/restart/bootstrap, supervisor rewrites, and legacy service cleanup for externally managed environments. Thanks @shakkernerd.--fixso package updates repair config migrations before restart. Thanks @shakkernerd.--omit=optionaland ignore the superseded first failure when the fallback succeeds. Thanks @shakkernerd.plugins.slots.contextEnginealongside memory slots when plugin ids change or selected plugins are removed. Thanks @shakkernerd.Agent failed before replyrunner failures out of Discord group/channel chats and show detailed runner errors in direct chats only when/verboseis enabled..cmdlauncher paths before spawning UI install/build/test commands so Node installs underC:\Program Filesno longer fail asC:\Program. Fixes #45275. Thanks @Kobevictor, @stoppieboy, and @iubns.--thinking minimaltolowfor modern Codex models (gpt-5.5, gpt-5.4, gpt-5.4-mini, gpt-5.2) at request build time so the first turn is accepted instead of paying a wasted call + retry-with-low fallback. Older Codex models still receiveminimaldirectly. Fixes #71946. Thanks @hclsys.openclaw plugins uninstall --forcedoes not leave the plugin discoverable. Thanks @shakkernerd.agentRuntime.idas the canonical config key, migrate legacy runtime-policy configs withopenclaw doctor --fix, route canonical Anthropic models throughclaude-cliwithout passing CLI backend aliases to embedded harness selection, and load CLI backend owner plugins before channel startup. Fixes #71957. Thanks @WolvenRA.schtasks /Endbefore stale-listener cleanup. Fixes #69970. Thanks @yangswld and @sherlock-huang.pnpm.exedirectly whennpm_execpathpoints at the native pnpm binary, add an installed-package fallback for the Lobster embedded runtime, and include the Lobster runner regression test in Windows CI. Fixes #69456. Thanks @igormf..openclaw-install-stagedirectories during global install verification and packaged dist pruning so leftover runtime-dep staging files do not turn successful updates intounexpected packaged dist filefailures. Fixes #71752. Thanks @waynegault..openclaw-install-stagedirectories, including mixed-case path variants, before package inventory generation so release tarballs cannot ship poisoned runtime-dependency staging debris. Fixes #71752. Thanks @hclsys.channels.whatsappis absent, avoiding npm/git stalls on packaged Linux installs. Fixes #71994. Thanks @xiao398008.#channelsubjects, using only already-loaded channel capabilities on that path. Thanks @shakkernerd.autodefaults on static channel metadata so config, audit, and command-list checks do not load channel runtime just to read those defaults. Thanks @shakkernerd.models list --all --provider <id>when the owning provider plugin is disabled, preserving config authority for cold catalog fallbacks. Thanks @shakkernerd.openclaw infer model runon explicit OpenRouter models from loading the full provider catalog or inheriting chat-agent silent-reply policy, restoring non-empty one-shot probe output. Fixes #68791. Thanks @limpredator.node@24was installed when the Homebrew keg binary is missing. Fixes #70411. Thanks @1fanwang and @dad-io.curl | bashinstalls respect nvm-managed Node instead of stale system Node. Fixes #49556. Thanks @heavenlxj.iwr ... | iexreturns control to the current shell while direct script-file runs still exit non-zero. Fixes #38054. Thanks @PwrSrg.openclawCLI runs through the namednodeshim when the current Node executable resolves tovolta-shim, avoiding direct shim execution failures in non-interactive shells. Fixes #68672. Thanks @sanchezm86.lost, reducing falsebacking session missingaudit errors for isolated cron runs and keeping offline CLI audit from treating its empty local cron active-job set as authoritative. Fixes #71963.pnpm installlayers keep working. Fixes #69224. Thanks @gucasbrg.patchedDependencies. (#69224) Thanks @gucasbrg and @vincentkoc.undefinedas unavailable instead of crashing config and help paths. Fixes #69044. Thanks @frankhli843 and @vincentkoc.gateway:watchfails during watcher startup, without double-logging unrelated import failures. (#58780) Thanks @roytong9 and @vincentkoc./usr/local. Fixes #59601. Thanks @chanjarster and @vincentkoc.openclaw node installenable and restart theopenclaw-nodesystemd unit instead of the gateway unit on node-only VMs. Fixes #68287. Thanks @dlebee-agent.systemctl --user enableafter a second daemon reload when the freshly written gateway unit is not visible yet on migrated systemd installs. Fixes #65184. Thanks @liushuaiiu.openclaw plugins listoutput without importing plugin runtime. Thanks @shakkernerd./plugins list,/plugins enable, and/plugins disableon the persisted plugin index path so chat plugin management does not load diagnostic/runtime plugin registries before execution. Thanks @shakkernerd.agents listoutput instead of the loaded channel registry. Thanks @shakkernerd./healthzand/readyzahead of plugin, canvas, and Control UI HTTP stages so liveness/readiness probes still answer when a later route handler stalls. Fixes #69674. Thanks @Xike-Creek.logging.fileand redaction settings directly from the active OpenClaw config path in bundled runtimes, so packaged gateways stop falling back to/tmp/openclaw. Fixes #59370, #67168, and #61295. Thanks @KeaneYan, @Pan9hu, and @zsjlovelike.logging.maxFileBytes, keep bounded numbered archives, and make long-lived rolling loggers follow the current-day file instead of suppressing diagnostics or writing stale dated files. Fixes #58583 and #62381. Thanks @jpeghead and @zhaoleink.NO_REPLYonly for always-on groups where silent replies are allowed, while keeping direct and mention-gated sessions on the incomplete-turn retry path. Thanks @MagnaAI.browser.proxy, start browser-capable CLI node services through the restoredopenclaw node startcommand, and show an actionable browser-control error when the local control service is missing. Fixes #66637.aliases/default/binin generated service PATHs and let doctor accept either modern fnm aliases or the legacycurrent/binsymlink, avoiding false PATH repair prompts. Fixes #68169. Thanks @richard-scott.curl | bashinstalls do not hang while installing Node.js, Git, or build tools. Fixes #41146. Thanks @iht76, @alexcarv318, @cs3gallery, @firofame, and @cgdusek.node@24installation fails and avoid printing PATH advice for missing Homebrew Node installs. Fixes #70411. Thanks @1fanwang.messages.removeAckAfterReplyis enabled, matching other reaction-capable channels. Fixes #26183. Thanks @MrUnforsaken.thinkingpayload and add opt-in preserved thinking replay viaparams.preserveThinking, so GLM 5.x can keep priorreasoning_contentwhen requested. Fixes #58680. Thanks @xuanmingguo.openclaw.json. Thanks @shakkernerd.videoandaudioin configured modelinputvalues and preserve them in provider catalog entries. Fixes #20721. Thanks @alvinttang.--agentflag for auth write commands (add,login,setup-token,paste-token, and the GitHub Copilot shortcut) so OAuth/API-key/token results are written to the requested agent store instead of the default agent. Fixes #71864. (#71933) Thanks @balric-seo.provider=...directive keys scoped to that provider and warn on unsupported keys instead of letting another speech provider consume overlapping keys. Fixes #60131.file_keypayloads out of message text. Fixes #67120 and #61876./status, preserve OpenAI-compatible TTS instructions on custom endpoints, and retry empty Microsoft/Edge TTS output once. Addresses #46602, #47232, and #43936. Thanks @leekuangtao, @Huntterxx, and @rex993.gatewaytool, documentconfig.schema.lookupas the field-doc source, and warn against usinggateway stop && gateway startas a restart substitute on macOS. Fixes #71929. Thanks @ygc3817922006-sketch.This is an automated version bump. Only the Dockerfile was changed.
If release notes mention config/schema changes, manual review is required.
Do not merge if there are known regressions above.
Docker test output