windmill-labs/windmill · error · Exception
You can't use 'request_interactive_slack_approval' function…
Error message
You can't use 'request_interactive_slack_approval' function in a standalone script or flow step preview. Please use it in a flow or a flow preview.
What it means
request_interactive_slack_approval is flow-only: it requires WM_FLOW_JOB_ID (and WM_FLOW_STEP_ID), which Windmill sets only when executing a step inside a real flow run. Standalone scripts and flow step previews lack these variables, so no approval job could be created and the library refuses early with this explicit message.
Solutions
- Move the call into a flow step and run the whole flow
- Use full flow preview instead of step preview
- For standalone scenarios, poll Slack or use webhooks instead of this function
- Keep the approval in the flow and extract only pure helpers into the script
Example fix
// before
# script executed standalone
wm.get_client().request_interactive_slack_approval("Approve?")
// after
# inside a step of a flow run / full flow preview
approval = wm.get_client().request_interactive_slack_approval("Approve?") Defensive patterns
Strategy: validation
Validate before calling
import os
def can_request_slack_approval() -> bool:
return bool(os.environ.get("WM_FLOW_JOB_ID")) Try / catch
try:
approval = client.request_interactive_slack_approval("Approve?")
except Exception as e:
if "standalone script" in str(e):
raise RuntimeError("Move this call into a flow step and run the full flow") from e
raise Prevention
- Keep approval calls in flow steps, never in standalone scripts
- Use full flow preview, not step preview, when testing approvals
- Guard the call site with an os.environ check on WM_FLOW_JOB_ID
- Mark scripts using this function as flow-only in docs/naming
When it happens
Trigger: Calling client.request_interactive_slack_approval(...) from a script run directly (Run button on the script editor), from a scheduled/standalone job, or from a flow STEP preview instead of a full flow run/preview.
Common situations: Testing a Slack-approval script standalone before wiring it into a flow; migrating approval logic out of a flow into a plain script; running a single step in isolation via step preview.
Related errors
- You can't use this function in a standalone script or flow…
- State path not found
- resume request already sent
- the flow is not in a suspended state anymore
- This function can only be called as a flow step
AI-assisted analysis of windmill-labs/windmill@e474e8803c (2026-09-03).
Data as JSON: /api/errors/7cf6e3866654020e.
Report an issue: GitHub.
Appendix: source
Thrown at python-client/wmill/wmill/client.py:1373
**Usage Example:**
>>> client.request_interactive_slack_approval(
... slack_resource_path="/u/alex/my_slack_resource",
... channel_id="admins-slack-channel",
... message="Please approve this request",
... approver="approver123",
... default_args_json={"key1": "value1", "key2": 42},
... dynamic_enums_json={"foo": ["choice1", "choice2"], "bar": ["optionA", "optionB"]},
... )
**Notes:**
- This function must be executed within a Windmill flow or flow preview.
- The function checks for required environment variables (`WM_FLOW_JOB_ID`, `WM_FLOW_STEP_ID`) to ensure it is run in the appropriate context.
"""
workspace = self.workspace
flow_job_id = os.environ.get("WM_FLOW_JOB_ID")
if not flow_job_id:
raise Exception(
"You can't use 'request_interactive_slack_approval' function in a standalone script or flow step preview. Please use it in a flow or a flow preview."
)
# Only include non-empty parameters
params = {}
if message:
params["message"] = message
if approver:
params["approver"] = approver
if slack_resource_path:
params["slack_resource_path"] = slack_resource_path
if channel_id:
params["channel_id"] = channel_id
if os.environ.get("WM_FLOW_STEP_ID"):
params["flow_step_id"] = os.environ.get("WM_FLOW_STEP_ID")
if default_args_json:
params["default_args_json"] = json.dumps(default_args_json)
if dynamic_enums_json:View on GitHub (pinned to e474e8803c)