Troubleshooting
Common problems and how to fix them. The gateway log is your first stop - the plugin logs the handshake result, session lifecycle, and provider errors for every call.
The bridge can’t connect / handshake rejected
Section titled “The bridge can’t connect / handshake rejected”Symptom: StandIn reports it cannot reach or authenticate with your agent; no session.start
ever appears in the gateway log.
Causes & fixes:
- Secret mismatch (most common) -
secretin your plugin config does not equal the value StandIn holds. They must be byte-for-byte identical. Re-copy it from the StandIn sandbox page or dashboard. - Bind address - the default
bindAddressis127.0.0.1, which only accepts local connections. SetbindAddress: "0.0.0.0"so the hosted bridge can reach the plugin. - Port not reachable - confirm
port(default9442) is open to StandIn (firewall/NAT) and not taken by another process. - Clock skew - the handshake enforces a 60 s replay window on the signed timestamp. If the host clock is far off, every handshake is rejected. Sync time (NTP).
- No secret at all - the plugin fails closed: with an empty or non-string
secret, it rejects every handshake. Set a real secret.
The plugin isn’t loading
Section titled “The plugin isn’t loading”Symptom: the gateway starts but the voice endpoint is not listening; no plugin banner in the log.
- Confirm the plugin is installed:
openclaw plugins listshould showmsteams-bridge. Reinstall withopenclaw plugins install npm:@komaa/openclaw-msteams-bridgeif not. - Confirm
enabledis not set tofalseunderplugins.entries."msteams-bridge".config. - Check the log for a config validation error - the schema is
additionalProperties: false, so one unknown key invalidates the whole config and the plugin never loads. The error names the key it rejected; the StandIn connection secret is the flatsecret. - Restart the gateway after any install or config change:
openclaw gateway restart.
Config changes don’t take effect
Section titled “Config changes don’t take effect”Restart the gateway after editing config:
openclaw gateway restartAlso confirm the config is under plugins.entries."msteams-bridge".config and that keys match the
schema exactly - unknown keys are rejected (additionalProperties: false), so a typo makes the
whole config invalid rather than being silently ignored.
The agent answers but stays silent / no audio
Section titled “The agent answers but stays silent / no audio”- Recording gate - with
requireRecordingStatus: true(default), nothing is processed until Teams reports recordingactive. If the meeting is not being recorded, the agent stays silent. Start recording, or (for testing only) setrequireRecordingStatus: false. - No realtime provider resolved - if you intended realtime but no provider key resolves, the
runtime falls back to streaming, which needs your OpenClaw STT/TTS configured. Check
realtime.providerand the providerapiKey. - Realtime provider errors - an invalid key, missing model access, or a wrong
azureEndpoint/azureDeploymentshows up as a provider connect error in the log. Verify the key and model/deployment name. - Group gate - in a meeting (2+ people) the agent only speaks when addressed by a wake
phrase (
groupCall.wakePhrases). Say its name, or disablegroupCall.requireAddress.
Calls are declined (not-allowed in the log)
Section titled “Calls are declined (not-allowed in the log)”The inbound gate is deny-by-default:
- With
inboundPolicyunset (the default) ordisabled, every inbound call is denied - including your first sandbox call. Set a policy to receive calls. - With
inboundPolicy: "allowlist"and an emptyallowFrom, every caller is denied too. - Callers are matched by AAD object id (case-insensitive) or phone number (digits only) -
add the caller to
allowFrom. pairingcurrently behaves exactly likeallowlist- callers still must be inallowFrom.openaccepts any caller (use for sandbox testing only).
The gateway log’s rejection line names the policy and the caller id it saw, so you can paste that
id straight into allowFrom.
The agent interrupts itself / barge-in feels off
Section titled “The agent interrupts itself / barge-in feels off”- If the agent keeps cutting itself off (hearing its own voice as a barge-in), raise
realtime.echoBargeInRmsand/or enablerealtime.suppressInputDuringPlayback. - If real barge-in feels unresponsive, lower
realtime.echoBargeInRmsor shortenrealtime.echoSuppressionWindowMs.
The call drops itself mid-conversation
Section titled “The call drops itself mid-conversation”- Stale-call reaper - a call that stops being serviced is torn down after
staleCallReaperSeconds(default 120). If long silent periods are expected, raise it. - Duration cap - if
maxDurationSecondsis set, the call is closed once it exceeds that wall-clock budget. Raise it or leave it unset (unlimited). - Concurrency cap - beyond
maxConcurrentCalls(default 4), additional calls are declined.
The call ends with a goodbye after a few minutes
Section titled “The call ends with a goodbye after a few minutes”That is the StandIn tier cutoff, not a bug. The sandbox and free tiers are daily-capped
(about 5 minutes/day); a subscription may have a max-minutes governor. StandIn sends an
assistant.say goodbye that the agent speaks, then the call ends gracefully. For longer calls,
move to a subscription tier - see
Connecting to StandIn.
Outbound never connects
Section titled “Outbound never connects”outbound.enabledmust betrueandoutbound.workerBaseUrlset.- The place-call request is signed with
secret; a mismatch fails it. - Check
outbound.tenantIdis the callee’s AAD tenant. - No answer: after
outbound.answerTimeoutMs(default 120,000 ms) the plugin treats the call as unanswered and cancels the ringing call so the callee’s Teams stops ringing. A late answer after that point is declined by design.
The agent says it can’t see my screen or camera
Section titled “The agent says it can’t see my screen or camera”The agent’s own wording tells you which layer to look at - each answer has a different cause:
-
“I can’t see anything yet - make sure your camera or screen-share is on.” No frame has arrived at the plugin yet. Start (or restart) the share; the first frame can take a few seconds. If it never arrives, confirm the call is actually connected through StandIn (you can hear the agent) and that your Agent calling URL points at this plugin instance.
-
“I’m not receiving the shared-screen image.” Frames ARE arriving, but they were not attached to the agent’s look. This is the pre-v0.4.1 bug: on every published OpenClaw host, the image was silently dropped between the plugin and the agent, so a fully working setup still produced this answer. Upgrade the plugin, then restart the gateway.
-
“I’ve been looking quite a lot in the last minute…” The
maxVisionPerMinutebudget (default 30 looks/min per call). Wait a few seconds or raise it. If it says this on the FIRST look of every call, the cap is set to0: that is the kill switch for all vision spend, not “unlimited”, so nothing is ever allowed through. Remove the key for the default of 30, or set a large number for a cap that never bites. -
The agent never even tries to look.
realtime.toolPolicyis"none"- the look tool is deliberately withheld on locked-down calls. Any other value (the default"safe-read-only", or"owner") exposes it. -
Lookups fail generally, not just vision (an
Unknown modelerror in the gateway log). That is the agent model, not vision: it is inherited fromagents.defaults.model.primaryin your OpenClaw config. Fixed resolution shipped in v0.3.1.
To tell case 1 from case 2 without guessing, open the newest file in
~/.openclaw/agents/<agentId>/sessions/*.jsonl and find the look consult turn: a working look shows
the user message carrying image parts; a broken one is text-only. The spoken answers sound
identical - the session log is what distinguishes them.
And after ANY upgrade: restart the gateway. Plugin code loads at startup, so a fix on disk changes nothing until you do.
Where to look for logs
Section titled “Where to look for logs”Everything the plugin does is logged through the OpenClaw gateway log: handshake accept/reject
reasons, session.start/session.end, recording-status changes, provider connects and errors, and
teardown reasons. Watch it live while you place a test call.
Still stuck?
Section titled “Still stuck?”Open an issue on GitHub with the mode
you used (realtime/streaming), the gateway log around the failed call, and your
(secret-redacted) config. Hosted-service questions (account, pairing, dashboard) belong at
docs.komaa.com.