#Agent couldn’t generate a response despite healthy gateway and channels

1 messages · Page 1 of 1 (latest)

hollow gazelle
#

Hi, I’m running OpenClaw (2026.4.21) in Docker on a VPS and intermittently getting:

“Agent couldn’t generate a response. Please try again.”

Environment seems healthy:

  • Gateway running on port 18789 (connectivity OK)
  • Discord and Telegram both configured and working
  • Expected warnings for Docker (no systemd)

Notable findings:

  • openai-codex:default auth is broken (refresh_token_reused, expired)
  • AGENTS.md is slightly truncated (~4%)
  • Warning: voice-gateway plugin disabled but config present
  • Some orphan agent dirs (codex, flash)

Current setup:

  • Default model: modal/zai-org/GLM-5-FP8
  • Fallbacks include Gemini, OpenRouter, GLM, and Codex

My suspicion is a model/provider/fallback failure, not a channel issue.

Questions:

  • Can a broken Codex auth in fallbacks cause this generic failure?
  • Could truncated AGENTS.md lead to no final response?
  • Do orphan agent dirs affect model resolution or routing?
    @round breach
round breachBOT
#

Let me check the docs and source so I don’t guess.

#

I think you’re on the right trail. This looks much more like model/runtime exhaustion than a channel problem.

  • Broken Codex auth in fallbacks: Yes, but only if the run reaches that fallback. OpenClaw tries the active model first, then fallbacks in order, with auth-profile rotation inside a provider before moving on. So bad Codex auth will not poison successful runs, but it can absolutely contribute to the final generic failure if earlier candidates fail and the chain eventually lands on Codex.
  • Truncated AGENTS.md: Usually no. Large bootstrap files are intentionally truncated into prompt context, with warnings/config for that. That is normally a quality/instruction-loss issue, not a hard “no response” cause. I’d treat 4% truncation as secondary unless the missing tail contained critical rules.
  • Orphan agent dirs: Generally no for routing/model selection. The code/tests explicitly treat dirs without matching agents.list entries as ignored for config-driven routing, identity, and model selection. Worth cleaning up, but unlikely to be the root cause.

A couple of extra notes:

  • The voice-gateway warning is almost certainly unrelated.
  • The generic text is also used when a model ends the turn with no usable assistant text after retries, not just on obvious auth failures. There is code specifically handling “empty/incomplete turn” cases.

What I’d do next:

  1. Temporarily remove/disable the broken Codex fallback and retest.
  2. Swap the primary to a known-good provider/model for a few runs, just to isolate whether modal/zai-org/GLM-5-FP8 is the trigger.
  3. Capture:
hollow gazelle
# round breach ```bash openclaw models status --probe openclaw logs --follow ``` du...

Thanks — one more question, slightly different topic: is the disabled voice-gateway plugin required for Discord voice calls?

I’ve never been able to get OpenClaw to actually join a Discord voice channel, hear me in real time, and respond back in real time. What I want is basically this: I join a Discord voice channel, the AI listens to me live, and replies live using the Microsoft Edge Portuguese voice (Francisca), which is the same voice I already use for audio replies.

Is that currently possible in OpenClaw? If yes:

  • do I need the voice-gateway plugin for that?
  • if yes, how should it be enabled/configured?
  • if not, what is the correct way to set up Discord real-time voice?

And if this is not supported yet, please let me know as well.

round breachBOT
#

I’m checking the Discord voice docs and the voice-call plugin docs, because those are the pieces that usually decide whether this is supported or not.

#

Short answer: yes, partially.

What’s supported today:

  • Yes: OpenClaw can join a Discord voice channel and have a continuous voice conversation.
  • No, not in the fully-duplex “live streaming assistant” sense: current Discord voice does not use the Voice Call plugin’s realtime STT/voice path. The docs say Discord voice currently uses short recorded segments + batch transcription via tools.media.audio, then speaks back.

So:

  • “Join VC, hear me, reply with TTS”yes
  • “True low-latency streaming, barge-in, uninterrupted live duplex”not really yet

About voice-gateway

I don’t see that as the current documented path for Discord voice.

For Discord VC, the documented setup is:

#
  • channels.discord.voice
  • native Discord command /vc join|leave|status

The separate voice-call plugin is for phone/telephony, not Discord voice channels.

What you need for Discord voice

  1. Enable native commands
  2. Configure channels.discord.voice
  3. Give the bot Connect + Speak in the voice channel
  4. Make sure audio transcription works, ideally via tools.media.audio

Minimal shape:

{
  channels: {
#
    discord: {
      commands: {
        native: true,
      },
      voice: {
        enabled: true,
        daveEncryption: true,
        decryptionFailureTolerance: 24,

        // optional, only if you want Discord VC to override your normal TTS
        tts: {
          provider: "microsoft",
          providers: {
            microsoft: {
              voice: "pt-BR-FranciscaNeural",
#
              lang: "pt-BR",
            },
          },
        },
      },
    },
  },

  tools: {
    media: {
      audio: {
        enabled: true,
        models: [
          { provider: "openai", model: "gpt-4o-mini-transcribe" },
        ],
#
      },
    },
  },
}

Good news about Francisca

If you already use Microsoft/Edge Francisca for normal audio replies, you may not need a separate Discord voice TTS override at all. channels.discord.voice.tts only overrides messages.tts for voice playback. If you want the same voice everywhere, you can often just keep your existing messages.tts config.

Important nuance

For Discord voice, Microsoft TTS should be fine.
The “Microsoft speech is ignored” limitation in the docs is for the Voice Call plugin / telephony path, not the Discord voice-channel path.

How to control it

Use the native Discord command: