Troubleshooting
Diagnose Action Agent activation, triggers, capabilities, sessions, streaming, and generated artifacts without exposing credentials.
Troubleshooting
Diagnose from the narrowest shared failure to the outer transport. This order prevents configuration and capability problems from being mistaken for model or network failures.
Never paste API keys, model-provider keys, OAuth access or refresh tokens, webhook secrets, encrypted header values, authorization headers, or raw signed request bodies into an issue. It is safe to record organization, Agent, session, collection, tool, binding, and connection IDs; status values; timestamps; and stable error codes.
Safe diagnostic order
- Reproduce in Action Agent Studio chat. Action Agent Studio can run while the Agent is passive. If Action Agent Studio also fails, inspect the saved model, credentials, credits, and capabilities before investigating an external route.
- Confirm scope and lifecycle. Check the exact
organizationId,actionAgentId, andsessionId. Confirm whether the operation creates a session, continues one, or ingests a trigger. - Check readiness. Confirm the Agent is active for external execution, the model selection is complete, required provider credentials or platform credits are available, and any attached binding or connection is ready.
- Check one capability at a time. Test Knowledge without tools, then named HTTP, then MCP. Disable unrelated capabilities while isolating a failure.
- Check transport state. For a session failure, verify the Agent/organization/session triple. For a stream failure, resume the existing stream instead of sending the message again.
- Inspect sanitized runtime evidence. Use Agent logs and stable UI error codes. Redact IDs if your support process requires it, and never include secret-bearing values.
Passive or inactive Agent
Symptom: Action Agent Studio chat works, but a REST, SDK, hosted MCP, channel, or scheduled start is rejected or ignored.
- Confirm
active: truefor the Agent in the same organization. - Remember that draft and passive Agents both store
active: false. - Confirm the organization has not reached its active-Agent allowance. Activation can fail even when configuration looks complete.
- Test a saved turn in Action Agent Studio before activating again.
Action Agent Studio is the only source that can start a new session while the Agent is passive. Deactivation also blocks new trigger ingress, but it does not revoke an existing public sessionId. See Action Agent lifecycle.
Trigger event is accepted but no Agent turn runs
A successful vendor response does not prove that an Agent ran. Slack, Discord, and Teams commonly return 200 { "ok": true } after ignoring a bot message, missing workspace connection, inactive binding, disabled event, scope mismatch, or a caught processing error.
Check these conditions in order:
- The Agent is active and belongs to the routed organization.
- Exactly one binding exists for that Agent and channel, and its status is
active, notneeds_config. - The inbound event is enabled and maps to the expected event name. An empty
eventsarray is a runtime wildcard for otherwise eligible channel events, so save at least one intended event name. - The event matches the saved channel scope.
- The organization connection or integration credential can still authenticate.
- The turn can obtain model configuration, provider credentials, platform credits when applicable, and required tool connections.
| Channel | Readiness fields |
|---|---|
| Slack | OAuth or integration credential plus at least one channel ID |
| Discord | OAuth or integration credential plus at least one channel ID |
| Teams | OAuth or integration credential, channel ID, and team ID |
| Organization connection, mailbox, and the binding's generated webhook secret | |
| Scheduled | A valid recurring schedule and non-empty prompt; no connection |
For Slack, Discord, and Teams, the event's workspace or tenant must resolve through the platform integration to an organization OAuth connection saved on the binding. The current platform ingress handlers do not route events to a binding that has only an integrationCredentialId; use an OAuth connection for these channels.
For email, use the exact URL generated by Action Agent Studio, including both actionAgentId and organizationId. A missing email query ID is rejected before authentication and before the trigger limiter, and returns 400. After that check, an invalid email secret or HMAC returns 401; invalid JSON returns 400.
Slack, Discord, and Teams use vendor authentication rather than the email binding secret. A 401 there usually means the Slack signature, Discord Ed25519 signature, or Teams Bot Framework authorization did not validate. A 429 can come from the 10-per-10-second trigger window or the broader API per-IP limiter.
Do not copy the email secret from an old binding into a new one. Saving an email binding creates a per-binding secret, and Action Agent Studio reveals it only when it is first generated. See Triggers.
Scheduled trigger does not run
- Confirm the Agent and scheduled binding are active.
- Confirm a positive interval, valid time/timezone fields, and a non-empty prompt are saved.
- Remember that the scheduler checks once per minute. It advances from the current claim time and does not backfill every missed interval.
- Compare
nextRunAtwith the expected timezone conversion. Each due tick creates a new scheduled session and uses thesilentreply policy.
If starting or sending a claimed scheduled run fails, ActionFlows restores the prior nextRunAt so the binding can be retried on a later scheduler pass.
Knowledge search returns no results
- Confirm the collection belongs to the same organization as the Agent.
- Confirm the collection is still attached and not deleted.
- Open the collection and check each document's extraction status:
pending: extraction has not completed.ready: extracted text is stored. A ready document can still contain the markerno text extractedwhen no text could be extracted.failed: the latest extraction attempt failed. Any olderextractedTextis not cleared, so stale content can remain searchable.
- Search for a distinctive term from the document body. Current search also matches the file name when full-text extraction has no match.
- If search returns a document, call
read_documentwith itsdocumentId. A successful search is not a guarantee that the document has useful extracted text.
Search returns at most 8 hits, and each read returns at most 4,000 characters. Read later offsets when more content is needed. The current search query does not explicitly filter on extractStatus; a pending document normally has no extracted text, while a failed document can still expose stale extracted text from an earlier successful run. The no-text marker is stored as ready content. See Knowledge.
The model ignores tools or reports unsupported tool calls
- Save the tool configuration, then start a new message so the runtime reloads it.
- For BYOK, select an enabled model whose catalog metadata includes
functionCalling. - For a platform model, verify that the specific platform model supports tool use. The current platform picker filters chat model types, not a
functionCallingcapability field. - Confirm the named tool has a non-empty name and an HTTP(S) URL template. Its description and parameter schema affect what the model sees, but are not part of the current readiness check.
- For named HTTP tools, verify required parameters and
{placeholders}in the URL template. - For
httpRequest, use an HTTP or HTTPS URL. URLs with embedded credentials, private addresses, and unsafe redirects are blocked. - Test the capability in Action Agent Studio and inspect the tool call state. The model chooses whether to call a tool; attaching one does not force a call.
There is no automatic fallback from an unsupported or unavailable selected model. Select a compatible model explicitly. See Tools and Model selection.
Named HTTP tool fails
Check the tool output in Action Agent Studio without copying authorization data into the issue. Save/update validation and runtime httpRequest failures use different messages.
Save/update validation:
INVALID_URL: the saved template is malformed or uses a non-HTTP(S) scheme.UNSAFE_URL: the saved template's sample URL contains embedded URL credentials or resolves to a private, loopback, link-local, reserved, or otherwise blocked address. This is a save validation code, not the runtime text below.
Named-tool execution:
Missing required parameter: the model omitted a required declared parameter.Missing path parameter: a{name}placeholder had no input value.Unsupported HTTP method: stored outsideDELETE,GET,HEAD,OPTIONS,PATCH,POST, orPUT.- Runtime URL failures are returned as messages such as
URL must use HTTP or HTTPS protocol,URL must not include credentials,Blocked unsafe remote URL: ..., orToo many redirects while fetching .... - Timeout or response-size error: the call exceeded 1-300 seconds or the response exceeded 5 MiB.
- HTTP error status: the remote API returned a non-2xx response. The tool reports the HTTP status in its error, but check whether the response body is safe to retain in a transcript.
Static named-tool headers are currently stored in headersJson rather than encrypted. Authentication payloads are encrypted, but do not put reusable secrets in static headers unless you accept that current storage behavior.
MCP server is missing or disconnected
In the MCP panel, inspect each connection's stable status and lastError code:
| Code | Meaning | Recovery |
|---|---|---|
INCOMPLETE_CONFIGURATION | URL or mapped authentication is missing, or readiness is otherwise false | Add the HTTPS URL, required OAuth connection, or headers, then save |
OAUTH_TOKEN_UNAVAILABLE | The linked OAuth connection could not produce an access token | Reconnect or replace the organization OAuth connection |
UNSAFE_URL_BLOCKED | The URL or a resolved address failed the SSRF boundary | Use a public HTTPS endpoint |
PROBE_FAILED | The save-time tool probe failed | Check URL, transport, auth, and server availability, then probe again |
CONNECTION_FAILED | The Agent runtime could not connect or list tools | Probe again and inspect sanitized server/runtime logs |
A failing MCP server does not fail the whole turn. Its tools are omitted while other tools can continue. Probe refreshes the displayed catalog; the runtime only exposes names in enabledToolNames, and an empty list means no tools, not all tools. Save an Agent MCP change or let the session suspend and resume to force runtime reconnection. See MCP.
Session not found or not ready
NOT_FOUND means no open session matches all of:
- the requested
sessionId; - the requested
actionAgentId; and - the authenticated or supplied
organizationId.
A closed, deleted, or foreign session fails instead of opening another conversation. Do not substitute externalId for sessionId.
AGENT_SESSION_NOT_READY means the session row exists but its Trigger chat binding did not appear within the 120-second cold-start wait. Check queue/runtime availability and retry the same send later. Do not create repeated sessions while diagnosing one queued start. If the CMS concurrent-run limit is 0, the organization cannot admit any new Agent run; queueing does not bypass that setting.
Every REST, SDK, or hosted MCP start call creates a new session. endUserId does not look up or reopen an existing public session. See Sessions & chat.
Stream interrupts or returns an empty result
- Keep the same Agent, organization, and session IDs.
- Do not send the user message again solely because delivery disconnected; the original turn may already be completing or persisted.
- Reconnect with
GET /api/action-agents/{actionAgentId}/sessions/{sessionId}/stream?organizationId={organizationId}. - Use
Last-Event-IDonly if the client captured a cursor. The current public encoder does not emitid:fields; otherwise omit both cursor inputs so the server uses the persisted session cursor. - Treat an SSE
errorevent as the end of public delivery. Provider details are intentionally replaced withAn error occurred..
If reconnect finds no resumable live stream, the route emits a done event with an empty text field. See Sessions & chat.
Generated artifact is missing
- Confirm the turn reached completion. Artifact persistence is a turn-completion side effect.
- Confirm the assistant output contains a recognized file part or file-shaped tool result. Ordinary text and ordinary JSON tool results are ignored. A string field named
datacan be collected but is not resolved by the current Agent artifact path. - Confirm the payload reaches the resolver as a non-empty buffer, supported URL/data-URI/base64 form, or supported byte-array/Buffer form of at most 25 MiB.
- For a remote URL, confirm it is HTTP(S), has no embedded credentials, passes DNS and redirect SSRF checks, and returns a successful response.
- Inspect Agent/runtime logs for
Agent artifact exceeds size limitorFailed to persist agent generated artifactwithout copying the payload or its signed URL.
Artifact persistence failures are logged and do not fail the chat turn. A missing artifact therefore does not imply a missing text reply. See Artifacts.
Related
Limits
Hard Action Agent runtime limits, CMS-configured organization limits, and current enforcement gaps.
AI Vendors
Discover the AI providers and models behind ActionFlows AI nodes. Add a provider key under Organization → Integrations → AI Vendors, then select models in Actionflow Studio or Action Agent Studio.