crewAIInc/crewAI · error · SystemExit

Error: Trigger must be in format 'app_slug/trigger_slug'

Error message

Error: Trigger must be in format 'app_slug/trigger_slug'

What it means

Printed with SystemExit(1) by TriggerCommand.execute_with_trigger() when the trigger_path argument contains no '/'. Triggers are addressed as 'app_slug/trigger_slug'; the slash is required so the CLI can split the path into the app and trigger identifiers for the Plus API call.

Source

Thrown at lib/cli/src/crewai_cli/triggers/main.py:44

            console.print("[bold blue]Fetching available triggers...[/bold blue]")
            response = self.plus_api_client.get_triggers()
            self._validate_response(response)

            triggers_data = response.json()
            self._display_triggers(triggers_data)

        except Exception as e:
            console.print(f"[bold red]Error fetching triggers: {e}[/bold red]")
            raise SystemExit(1) from e

    def execute_with_trigger(self, trigger_path: str) -> None:
        """Execute crew with trigger payload."""
        try:
            if "/" not in trigger_path:
                console.print(
                    "[bold red]Error: Trigger must be in format 'app_slug/trigger_slug'[/bold red]"
                )
                raise SystemExit(1)

            app_slug, trigger_slug = trigger_path.split("/", 1)

            console.print(
                f"[bold blue]Fetching trigger payload for {app_slug}/{trigger_slug}...[/bold blue]"
            )
            response = self.plus_api_client.get_trigger_payload(app_slug, trigger_slug)

            if response.status_code == 404:
                error_data = response.json()
                console.print(
                    f"[bold red]Error: {error_data.get('error', 'Trigger not found')}[/bold red]"
                )
                raise SystemExit(1)

            self._validate_response(response)

            trigger_data = response.json()

View on GitHub (pinned to 754d7323be)

Solutions

  1. Use the full path format: `crewai trigger execute my-app/my-trigger`.
  2. List valid triggers first with `crewai trigger list` and copy the exact app_slug/trigger_slug pair shown.
Defensive patterns

Strategy: validation

Validate before calling

import sys
path = sys.argv[1]
if "/" not in path or len(path.split("/", 1)) != 2 or not all(path.split("/", 1)):
    raise SystemExit("Trigger must be 'app_slug/trigger_slug'")

Type guard

def is_trigger_path(path: str) -> bool:
    parts = path.split("/", 1)
    return len(parts) == 2 and all(p.strip() for p in parts)

Prevention

When it happens

Trigger: Running `crewai trigger execute mytrigger` (no slash), passing just the app slug, or passing a trigger id/uuid copied from elsewhere instead of the app/trigger slug pair.

Common situations: Developer copies only the trigger name from the Plus dashboard; mixes up `crewai trigger execute` argument format with other commands that take bare ids.

Related errors


AI-assisted analysis of crewAIInc/crewAI@754d7323be (2026-08-15). Data as JSON: /api/errors/fba8ccb1b4ae0a7b. Report an issue: GitHub.