#Updating to 2026.4.25 removed claude-cli oauth capabilities

1 messages Ā· Page 1 of 1 (latest)

quaint forge
#

after updating onboarding no longer shows claude-cli as an option for model selection.

āš ļø API provider returned a billing error — your API key has run out of credits or has an insufficient balance. Check your provider's billing dashboard and top up or switch to a different API key.

tame solsticeBOT
#

To help others find answers, you can mark your question as solved via Right click solution message -> Apps -> āœ… Mark Solution

opaque briarBOT
#

Mike — I think this is the new provider/runtime split, plus possibly a 2026.4.25 regression.

claude-cli is no longer meant to show as a normal model provider. New shape is:

anthropic/claude-opus-4-7
# plus runtime:
agents.defaults.agentRuntime.id = "claude-cli"

If you’re getting the Anthropic billing error, OpenClaw is probably hitting the Anthropic API path, not Claude CLI. Docs describe Claude CLI reuse as separate from API-key billing, and current model docs say CLI runtimes should use canonical anthropic/claude-* refs plus agentRuntime.id: "claude-cli". (docs.openclaw.ai)

Can you paste:

openclaw --version
#
openclaw models status
openclaw config get agents.defaults.model
openclaw config get agents.defaults.agentRuntime

Likely fix/workaround:

claude auth status --text
openclaw models auth login --provider anthropic --method cli --set-default
openclaw doctor --fix
openclaw gateway restart

Then start a new/reset session, because runtime choice can be pinned per existing session.

#

There’s also a follow-up fix already on main/beta for ā€œinclude cli backend owners in provider metadata filters,ā€ which looks very related if the CLI option is missing from discovery entirely. (github.com)

quaint forge
#

cat@cats-Mac-mini ~ % openclaw --version
OpenClaw 2026.4.25 (aa36ee6)
cat@cats-Mac-mini ~ % openclaw models status
openclaw config get agents.defaults.model
openclaw config get agents.defaults.agentRuntime

šŸ¦ž OpenClaw 2026.4.25 (aa36ee6) — I speak fluent bash, mild sarcasm, and aggressive tab-completion energy.

Config : ~/.openclaw/openclaw.json
Agent dir : ~/.openclaw/agents/main/agent
Default : anthropic/claude-opus-4-7
Fallbacks (2) : anthropic/claude-sonnet-4-6, anthropic/claude-opus-4-6
Image model : -
Image fallbacks (0): -
Aliases (2) : opus -> anthropic/claude-opus-4-7, sonnet -> anthropic/claude-sonnet-4-6
Configured models (7): lmstudio/google/gemma-4-e4b, anthropic/claude-opus-4-5, anthropic/claude-opus-4-6, anthropic/claude-sonnet-4-5, anthropic/claude-sonnet-4-6, anthropic/claude-opus-4-7, anthropic/claude-haiku-4-5

Auth overview
Auth store : ~/.openclaw/agents/main/agent/auth-profiles.json
Shell env : off
Providers w/ OAuth/tokens (4): anthropic (3), claude-cli (3), google (1), openai-codex (1)

  • anthropic effective=profiles:~/.openclaw/agents/main/agent/auth-profiles.json | profiles=3 (oauth=1, token=2, api_key=0) | anthropic:cat=token:sk-ant-o...TnY16QAA, anthropic:default=token:sk-ant-o...K_5EcQAA [disabled:billing 47m], anthropic:claude-cli=OAuth [disabled:billing 47m]
  • claude-cli effective=profiles:~/.openclaw/agents/main/agent/auth-profiles.json | profiles=3 (oauth=1, token=2, api_key=0) | anthropic:cat=token:sk-ant-o...TnY16QAA, anthropic:default=token:sk-ant-o...K_5EcQAA [disabled:billing 47m], anthropic:claude-cli=OAuth [disabled:billing 47m] | synthetic=plugin-owned | source=Claude CLI native auth
  • google effective=profiles:~/.openclaw/agents/main/agent/auth-profiles.json | profiles=1 (oauth=0, token=1, api_key=0) | google:default=token:AIzaSyA9...ysWEEVBo
  • lmstudio effective=profiles:~/.openclaw/agents/main/agent/auth-profiles.json | profiles=1 (oauth=0, token=0, api_key=1) | lmstudio:default=sk-lm-7N...wNazma96 | models.json=LM...EN | source=models.json: ~/.openclaw/agents/main/agent/models.json
  • openai-codex effective=profiles:~/.openclaw/agents/main/agent/auth-profiles.json | profiles=1 (oauth=1, token=0, api_key=0) | openai-codex:xxxxxxxxx=OAuth (xxxxxxxxx)
  • xai effective=env:xai-v5wB...OiNBoGKR | env=xai-v5wB...OiNBoGKR | source=env: XAI_API_KEY | synthetic=plugin-owned | source=xAI plugin config

OAuth/token status

  • anthropic usage: 5h 98% left ā±4h 30m Ā· Week 84% left ā±3d 16h
    • anthropic:cat static
    • anthropic:default static
  • claude-cli
    • anthropic:claude-cli expiring expires in 6h
  • google
    • google:default static
  • openai-codex usage: 5h 100% left ā±5h Ā· Week 97% left ā±2d 22h
    • openai-codex:xxxxxxxxx (xxxxxxxxx) expiring expires in 13h

šŸ¦ž OpenClaw 2026.4.25 (aa36ee6) — I don't just autocomplete—I auto-commit (emotionally), then ask you to review (logically).

{
"primary": "anthropic/claude-opus-4-7",
"fallbacks": [
"anthropic/claude-sonnet-4-6",
"anthropic/claude-opus-4-6"
]
}

šŸ¦ž OpenClaw 2026.4.25 (aa36ee6) — I'm basically a Swiss Army knife, but with more opinions and fewer sharp edges.

{
"id": "claude-cli"
}

opaque briarBOT
#

Yep — your config is already in the correct Claude CLI shape:

model: anthropic/claude-opus-4-7
agentRuntime.id: claude-cli

The suspicious bit is this:

anthropic:claude-cli=OAuth [disabled:billing 47m]

So OpenClaw has temporarily marked the Claude CLI auth profile as ā€œbilling-disabledā€ because a previous Anthropic API-path failure poisoned that profile. Re-running CLI auth should clear stale lockouts:

#
claude auth status --text
openclaw models auth login --provider anthropic --method cli --set-default
openclaw doctor --fix
openclaw gateway restart

Then start a new OpenClaw session / /reset the current one. Runtime selection is pinned per session, so an old thread may still be using Pi/API even though config now says claude-cli.

Also: the onboarding picker missing claude-cli on 2026.4.25 looks like the discovery bug that’s fixed in 2026.4.26-beta.1. If the commands above don’t fix the picker/runtime behavior:

openclaw update --channel beta

Docs: https://docs.openclaw.ai/providers/anthropic and https://docs.openclaw.ai/gateway/cli-backends

quaint forge
#

general chatting works again. but cron jobs still think they're using extra usage, when they should be oauth

opaque briarBOT
#

Nice, that narrows it down.

Cron has its own session state, so chat being fixed doesn’t necessarily clear old cron auth/model pins. Check the cron session pins:

openclaw cron list
openclaw cron show <jobId>
openclaw cron runs --id <jobId> --limit 5

Then force Anthropic rotation to the Claude CLI OAuth profile:

openclaw models auth order set --provider anthropic anthropic:claude-cli
openclaw cron edit <jobId> --model anthropic/claude-opus-4-7
openclaw gateway restart
#

If that job still routes wrong, it probably has a stale per-cron-session authProfileOverride from before the fix. In that case, paste the cron show + latest cron runs output — especially anything mentioning model/profile — and we can confirm before touching session metadata.

Also still worth updating to beta if you haven’t:

openclaw update --channel beta

2026.4.25 has a related CLI-backend discovery regression; 2026.4.26-beta.1 has the fix.

hollow socket
#

I had the same issue after upgrading from 2026.4.23 but my problem with the new setup is that agentRuntime.id: claude-cli does not work well when using multi provider as I use OpenAI, Claude and Github accounts.

agentRuntime.id: auto does not change the behaviour either, I use the same agent using all 3 providers, the gateway keeps restarting every time I change the provider and start in /new conversation. Downgrading to 2026.4.23 worked. but a shame this was not highlighted as a breaking change.

opaque briarBOT
#

Yeah, that pain is real. For a mixed-provider single agent, I would not set this globally:

agentRuntime: { id: "claude-cli" }

That forced runtime applies to the agent/session, so it’s bad when the same agent switches between Anthropic, OpenAI, and GitHub/Copilot-style providers.

Safer setup:

openclaw config set agents.defaults.agentRuntime.id auto
# or unset the default runtime entirely if you want plain PI/default behavior

Then select Claude CLI only when choosing Claude:

#
/model anthropic/claude-opus-4-7 --runtime claude-cli

And when switching back:

/model openai/<model> --runtime default
/model github-copilot/<model> --runtime default

If you use Claude CLI a lot, the cleaner long-term setup is a dedicated Claude agent with agentRuntime.id: "claude-cli", and keep your main mixed-provider agent on auto/default.

The gateway restarting on provider switch + /new does not sound expected though. If it still happens on 2026.4.26-beta.1, that’s issue-worthy. Please grab:

hollow socket
#

`openclaw logs --limit 300 --plain | grep -Ei 'restart|config reload|agentRuntime|claude-cli|fatal|error'
2026-04-28T02:41:26.408Z warn gateway/reload {"subsystem":"gateway/reload"} config change requires gateway restart (auth.order)
2026-04-28T02:41:26.412Z info gateway {"subsystem":"gateway"} received SIGUSR1; restarting
2026-04-28T02:41:27.190Z info gateway {"subsystem":"gateway"} restart mode: full process restart (supervisor restart)
2026-04-28T02:43:41.034Z info gateway {"subsystem":"gateway"} received SIGTERM; restarting
2026-04-28T02:43:41.177Z info gateway {"subsystem":"gateway"} restart mode: full process restart (supervisor restart)
2026-04-28T02:44:52.389Z warn plugins {"subsystem":"plugins"} bonjour: restarting advertiser (service stuck in announcing for 46466ms (gateway fqdn=ubuntu (OpenClaw)._openclaw-gw._tcp.local. host=ubuntu.local. port=18789 state=announcing))
2026-04-28T02:51:40.111Z info agent/cli-backend {"subsystem":"agent/cli-backend"} cli session reset: provider=claude-cli reason=mcp
2026-04-28T02:51:40.205Z info agent/cli-backend {"subsystem":"agent/cli-backend"} cli exec: provider=claude-cli model=claude-haiku-4-5 promptChars=995
2026-04-28T02:51:40.222Z info agent/cli-backend {"subsystem":"agent/cli-backend"} claude live session start: provider=claude-cli model=claude-haiku-4-5 activeSessions=1
2026-04-28T02:51:57.202Z info agent/cli-backend {"subsystem":"agent/cli-backend"} claude live session turn: provider=claude-cli model=claude-haiku-4-5 durationMs=16972 rawLines=51
2026-04-28T02:56:41.955Z info gateway {"subsystem":"gateway"} received SIGTERM; restarting
2026-04-28T02:56:42.154Z info gateway {"subsystem":"gateway"} restart mode: full process restart (supervisor restart)
2026-04-28T02:57:55.095Z warn plugins {"subsystem":"plugins"} bonjour: restarting advertiser (service stuck in announcing for 47665ms (gateway fqdn=ubuntu (OpenClaw)._openclaw-gw._tcp.local. host=ubuntu.local. port=18789 state=announcing))

opaque briarBOT
#

This log actually helps: it doesn’t show a crash/fatal provider-switch failure.

What it shows:

  • config change requires gateway restart (auth.order) → expected after changing auth order. That’s a config write, so Gateway restarts to apply it.
  • received SIGTERM; restarting → external stop/restart signal, not obviously /new or model switching by itself.
  • bonjour: restarting advertiser... → noisy/unrelated mDNS/Bonjour advertiser issue.
  • claude live session ... provider=claude-cli ... turn → Claude CLI runtime itself did run successfully.

So I’d separate two things:

  1. Auth/order config changes restart Gateway — annoying, but expected.
  2. Provider switch + /new should not SIGTERM Gateway — if that happens without any config command, that’s bug-worthy.

For mixed-provider setup, I’d avoid changing auth.order repeatedly and avoid global claude-cli runtime:

#
openclaw config get agents.defaults.agentRuntime
openclaw models auth order get --provider anthropic

Then in chat, use per-session runtime selection:

/model anthropic/claude-haiku-4-5 --runtime claude-cli
/model openai/<model> --runtime default
/model github-copilot/<model> --runtime default

If you can reproduce a SIGTERM from only /model ... + /new — no config set, no auth order change, no gateway restart command — please grab unfiltered context around it:

quaint forge
opaque briarBOT
#

Yes — 2026.4.26 should resolve the missing claude-cli discovery/model-listing side of this. I checked the tag locally too: it includes the fix we were pointing at, fix: include cli backend owners in provider metadata filters.

The release is now marked Latest, and the notes include model-listing/provider discovery work plus a specific Claude CLI fix for new live sessions failing when OpenClaw starts Claude with stream-json input. (github.com)

Update path:

openclaw update
openclaw --version
openclaw models auth login --provider anthropic --method cli --set-default
openclaw doctor --fix
openclaw gateway restart

Then /reset or start a new session.

Caveat: if cron jobs still use the old billing/API profile, that may be stale cron session/auth pinning rather than the release bug itself. Check with:

#
openclaw cron show <jobId>
openclaw cron runs --id <jobId> --limit 5
hidden berry
#

so we can still use Claude CLI then? I had troubles with billing errors last night and justmoved back to API tokens...

opaque briarBOT
#

Yes — you can still use Claude CLI.

The current/new shape is just different:

model: "anthropic/claude-opus-4-7"
agentRuntime: { id: "claude-cli" }

Not claude-cli/... as the main model provider.

If you moved back to API tokens, I’d update to 2026.4.26 first, then re-enable Claude CLI like this:

openclaw update
claude auth status --text
#
openclaw models auth login --provider anthropic --method cli --set-default
openclaw doctor --fix
openclaw gateway restart

Then start a fresh session or /reset.

If you use one agent with several providers — OpenAI + Claude + GitHub/Copilot — don’t force agentRuntime.id: "claude-cli" globally unless that agent is Claude-only. For mixed-provider use, keep runtime default/auto and select Claude CLI per session:

/model anthropic/claude-opus-4-7 --runtime claude-cli

Docs: https://docs.openclaw.ai/providers/anthropic

hollow socket
#

Nah I just updated it and /model command does not show claude-cli as a provider

opaque briarBOT
#

Ah — then I should phrase this more carefully: claude-cli may not show as a /model provider anymore, and that can be expected.

In the new split, claude-cli is the runtime, not the model provider. The model provider stays anthropic.

Try:

/model anthropic/claude-opus-4-7 --runtime claude-cli
/model status

You’re looking for /model status to show an Anthropic model plus a Claude CLI runtime, not necessarily a claude-cli/* provider row.

For mixed-provider use, don’t set Claude CLI globally. Keep default/auto runtime, then only use Claude CLI on Claude sessions:

#
/model anthropic/claude-opus-4-7 --runtime claude-cli
/model openai/<model> --runtime default
/model github-copilot/<model> --runtime default

If that first command fails or /model status still routes Anthropic through API billing, paste:

openclaw --version
openclaw models status
openclaw config get agents.defaults.agentRuntime

Docs: https://docs.openclaw.ai/concepts/agent-runtimes

quaint forge
#

this is unsettling šŸ™

opaque briarBOT
#

Yeah, fair reaction šŸ™ — this was a confusing migration, and the UI not showing claude-cli where people used to expect it makes it feel like support disappeared.

The important bit: Claude CLI support is still there, but it moved from ā€œprovider-looking thingā€ to ā€œruntime behind Anthropic models.ā€

So the mental model is now:

Provider/model: anthropic/claude-opus-4-7
Runtime:        claude-cli

instead of:

Provider/model: claude-cli/claude-opus-...
#

To verify it’s actually using Claude CLI, don’t rely on the provider picker — check /model status or logs. You should see provider=claude-cli in cli-backend logs when it runs, like OutlawWizard’s log did:

agent/cli-backend ... provider=claude-cli ... claude live session turn

I do think the docs/UI need to make this louder. For now, safest setup:

  • Claude-only agent: set agentRuntime.id: "claude-cli"
  • Mixed-provider agent: keep runtime default/auto, then use:
    /model anthropic/claude-opus-4-7 --runtime claude-cli
    

If this still hits billing after 2026.4.26 + re-login, that’s not ā€œexpected migration weirdnessā€ anymore — that’s a bug we should capture with models status + logs.

timid moss
#

How do I remove my cdeox from both the accounts? I wanna just delete that there’s only one model that I’m using.

opaque briarBOT
#

Exec approval is required, but no interactive approval client is currently available.

Approve it from the Web UI or terminal UI, or enable a native chat approval client such as Discord. If those accounts already know your owner ID via allowFrom or owner config, OpenClaw can often infer approvers automatically. Then retry the command. You can usually leave execApprovals.approvers unset when owner config already identifies the approvers.

timid moss
#

Let me restate. I’m just looking to remove Kodex from my model selection so there’s only one model which is Anthropic

#

Codex

opaque briarBOT
#

Automatic session resume failed, so sending the status directly.

Exec denied (gateway id=65e45d87-5d2d-492a-b6c8-e7f117d6b36e, approval-timeout (allowlist-miss)): rg -n "codex|openai-codex|claude-cli|auth|profile|account|remove|delete" /home/krill/openclaw-ref/docs /home/krill/openclaw-ref/src /home/krill/openclaw-ref/packages 2>/dev/null | head -200

#

If by cdeox you mean Codex / openai-codex: there isn’t really a clean ā€œlogout/remove auth profileā€ button/command yet. Easiest safe path:

openclaw --version
openclaw models status
openclaw models auth order get --provider openai-codex --json

Then for each agent/account you use, remove Codex from the auth order:

openclaw models auth order clear --provider openai-codex --agent main

If you want only one model to show/use, rerun the model wizard and select just that model:

#
openclaw configure --section model

The Codex tokens live per-agent in:

~/.openclaw/agents/<agentId>/agent/auth-profiles.json

You can manually delete the openai-codex:* entries there, but make a backup first and don’t paste that file here because it contains secrets. Docs: models status shows auth profiles, auth ordering controls which profile is tried, and auth profiles are stored per-agent. (docs.openclaw.ai)

OpenClaw
#

Quick correction: my local source search got blocked by approval timeout, so I’m sticking to the docs-confirmed path.

If you mean Codex / openai-codex, and you only want OpenClaw to use one model:

  1. First check what’s selected:
openclaw --version
openclaw models status
  1. Set the one model you actually want:
openclaw models set anthropic/claude-opus-4-6
#

Replace with your desired provider/model.

  1. Clear model fallbacks if Codex is there:
openclaw models fallbacks list
openclaw models fallbacks remove openai-codex/gpt-5.5

If you truly want to delete the stored Codex OAuth accounts, the docs say auth profiles live here:

~/.openclaw/agents/<agentId>/agent/auth-profiles.json

There isn’t a documented models auth remove command yet. Make a backup, then remove the openai-codex:* profiles from that JSON for each agent/account. Don’t paste that file here — it contains secrets.

timid moss
#

Is there a known issue if I don’t use IPV6 for routing?

opaque briarBOT
#

No known OpenClaw requires IPv6 issue that I’m aware of. IPv4-only should be fine.

Two caveats:

  • If you connect via localhost, try 127.0.0.1 instead — avoids clients trying ::1 first:
    openclaw gateway probe --url ws://127.0.0.1:18789
    
  • If you expose the gateway through DNS/reverse proxy/Tailscale and your hostname has a broken AAAA record, clients may try IPv6 and hang. In that case remove/fix the AAAA, or use an IPv4/tailnet MagicDNS route.

That billing error is almost certainly provider auth/billing, not IPv6 routing. IPv6 problems usually show up as timeout/connection errors, not ā€œinsufficient balanceā€.

Can you paste:

openclaw --version
#

Yep — sorry, I overcomplicated that.

To make the model picker show only Anthropic and remove Codex:

openclaw models status --plain

Copy the Anthropic model ref you want, then:

openclaw models set "anthropic/<your-model-id>"
openclaw models fallbacks clear
openclaw config set agents.defaults.models '{"anthropic/<your-model-id>":{}}' --strict-json --replace
openclaw config validate
openclaw gateway restart
timid moss
#

Are you really sure Claude Saul is fixed because I’m getting all kinds of bullshit API error and LLM request rejected out of extra storage error

opaque briarBOT
#

I’m not going to say ā€œdefinitely fixedā€ from that error — this sounds like you may still be hitting the Anthropic API/OAuth provider path, not the local claude-cli runtime.

Two likely cases:

  1. Extra usage is required for long context requests
    That means context1m: true is enabled, but your Anthropic credential isn’t eligible for the 1M context beta. Disable/remove context1m. OpenClaw docs call this out directly. (docs.openclaw.ai)

  2. Claude CLI not showing in model picker
    That part is expected now: claude-cli is a runtime/backend, not a model. The model should stay anthropic/..., and runtime should be agentRuntime.id: "claude-cli". Config changes only affect new/reset sessions, so use /reset or /new after changing it. (docs.openclaw.ai)

Try this clean Anthropic-only reset:

openclaw models set anthropic/claude-opus-4-6
openclaw models fallbacks clear
openclaw config set agents.defaults.models '{"anthropic/claude-opus-4-6":{}}' --strict-json --replace
#
openclaw config set agents.defaults.agentRuntime '{"id":"claude-cli"}' --strict-json
openclaw config validate
openclaw gateway restart

Then in Discord/chat:

/reset

If it still errors, paste the exact redacted error line from:

openclaw logs --follow
#

The wording matters a lot here — ā€œbilling errorā€, ā€œthird-party apps draw from extra usageā€, and ā€œlong context extra usageā€ are different fixes.

timid moss
#

API provider returned the billing error. Your key has run out of credit or has insufficient balance.

opaque briarBOT
#

That specific error means it’s still trying an API-key/provider billing path somewhere. If Claude CLI were actually the active runtime, I would not expect ā€œyour key has run out of creditā€ to be the main failure.

Please check these two things:

openclaw --version
openclaw models status
openclaw config get agents.defaults.model
openclaw config get agents.defaults.agentRuntime

For Claude CLI, the shape should be roughly:

agents: {
  defaults: {
#
    model: "anthropic/<your-claude-model>",
    agentRuntime: { id: "claude-cli" }
  }
}

Then restart + reset the chat session:

openclaw gateway restart

In Discord/chat:

#
/reset

Also make sure Codex is not still a fallback:

openclaw models fallbacks list
openclaw models fallbacks clear

If models status shows Anthropic API key auth with billing/credit failure, that’s the issue: it’s not using the Claude CLI path for that run. Docs: https://docs.openclaw.ai/concepts/agent-runtimes

last bough
#

can you elaborate on how to fix the cron jobs please? Thank you for explaining all you have explained so far. I have claude cli working for everything it seems except for the cron jobs that still point to the API billing and extra usage when I don't want it to.

opaque briarBOT
#

Yep — cron has its own stored job config, so fixing chat/session model routing doesn’t always fix existing cron jobs.

If you run from source, prefix these with pnpm openclaw; otherwise use openclaw.

1. First confirm version/config:

openclaw --version
openclaw models status
openclaw config get agents.defaults.agentRuntime
openclaw config get agents.defaults.model

For Claude CLI, the desired default shape is roughly:

openclaw config set agents.defaults.model.primary anthropic/claude-opus-4-7
#
openclaw config set agents.defaults.agentRuntime.id claude-cli

2. Remove API fallback usage if you don’t want surprise billing:

openclaw models fallbacks clear

Cron --model is only the job’s primary model; configured fallbacks can still run after that. So if fallbacks point at API-backed models, cron may still hit billing.

3. Inspect existing cron jobs:

openclaw cron list
openclaw cron show <job-id>
#

If a job has an old/stale model override, edit it:

openclaw cron edit <job-id> --model anthropic/claude-opus-4-7

4. If 2026.4.25 cron still hits direct Anthropic API anyway, use the compatibility workaround for that cron job:

openclaw config set agents.defaults.models '{"claude-cli/claude-opus-4-7":{},"claude-cli/claude-sonnet-4-6":{}}' --strict-json --merge
openclaw cron edit <job-id> --model claude-cli/claude-opus-4-7
openclaw gateway restart

Then test:

last bough
#

thank you. the compatibility workaround is what seemed to get it to work. Not sure if this is related because heartbeats work just fine sending to my telegram channel which I've had one done today and chatting works just fine but now that the cron job is fixed it's failing to send to the telegram channel I'm not sure if that's related to this update but I think that's strange as well.

Error: Telegram send failed: chat not found (chat_id=-12345). Likely: bot not started in DM, bot removed from group/channel, group migrated (new -100… id), or wrong bot token. Input was: "-12345".

telegram message failed: Call to 'sendMessage' failed! (400: Bad Request: chat not found)

the id is correct, bot was not removed from group channel ..nothing was migrated as far as I know. Not sure what that could mean.

opaque briarBOT
#

That sounds separate from the Claude CLI workaround — cron is now getting far enough to hit delivery.

The key clue is:

Input was: "-12345"

For Telegram channels/supergroups, the delivery target usually needs the full -100... chat id, e.g.:

pnpm openclaw cron edit <job-id> \
  --announce \
  --channel telegram \
  --to "-1001234567890"
#

If it’s a forum topic:

pnpm openclaw cron edit <job-id> \
  --announce \
  --channel telegram \
  --to "-1001234567890" \
  --thread-id 42

I’d compare what heartbeat is using vs what cron stored:

pnpm openclaw cron show <job-id>
pnpm openclaw cron runs --id <job-id> --limit 5
#

Then test the exact cron target directly:

pnpm openclaw message send --channel telegram --target "-12345" --message "cron delivery test"

If that fails too, it’s definitely the target/account/token, not cron. If you have multiple Telegram accounts/bots configured, also check whether cron has the wrong account:

pnpm openclaw channels status --probe
pnpm openclaw cron edit <job-id> --account <telegram-account-id>

Fastest way to rediscover the real chat id: tail logs, send a message in that Telegram group/channel/topic, and copy the chat.id OpenClaw sees:

last bough
#

the delivery test works when I run:

pnpm openclaw message send --channel telegram --target "-12345" --message "cron delivery test"

so why wouldn't the cron job work when it delivers to that target? Also I omitted my actual telegram id and using -12345 for this chat

opaque briarBOT
#

Yep, if message send works, then the Telegram chat id itself is probably fine.

Cron isn’t necessarily using the exact same route as that test. It may also have stored:

  • a different Telegram account/bot (delivery.accountId)
  • a stale threadId / topic id
  • channel: last resolving from an old session
  • an agent message tool send path vs the cron fallback announce path

Most likely: wrong Telegram account/bot for cron. Same chat id + different bot token = Telegram says chat not found.

Check this:

pnpm openclaw cron show <job-id>
pnpm openclaw cron runs --id <job-id> --limit 1
#

Look for delivery, resolvedDelivery, accountId, threadId, and whether fallbackUsed vs messageToolSentTo appears.

Then force the cron job to the exact route:

pnpm openclaw cron edit <job-id> \
  --announce \
  --channel telegram \
  --to "<actual telegram id>" \
  --account default

If cron show has a non-empty threadId and this is not a Telegram forum topic, recreate the job or remove that stale thread id from the cron job config — that can make cron delivery differ from your simple message send test.

Also please include: