FoundationAgents/OpenManus · warning · ToolError

Parameter `title` is required for command: create

Error message

Parameter `title` is required for command: create

What it means

Raised by _create_plan (app/tool/planning.py:133) when command='create' is dispatched with plan_id present but title empty/None. Title is stored on the plan and rendered in listings (_list_plans shows it), so the tool rejects untitled plans. Validation order: plan_id first, uniqueness second, then title, then steps.

Source

Thrown at app/tool/planning.py:133

        else:
            raise ToolError(
                f"Unrecognized command: {command}. Allowed commands are: create, update, list, get, set_active, mark_step, delete"
            )

    def _create_plan(
        self, plan_id: Optional[str], title: Optional[str], steps: Optional[List[str]]
    ) -> ToolResult:
        """Create a new plan with the given ID, title, and steps."""
        if not plan_id:
            raise ToolError("Parameter `plan_id` is required for command: create")

        if plan_id in self.plans:
            raise ToolError(
                f"A plan with ID '{plan_id}' already exists. Use 'update' to modify existing plans."
            )

        if not title:
            raise ToolError("Parameter `title` is required for command: create")

        if (
            not steps
            or not isinstance(steps, list)
            or not all(isinstance(step, str) for step in steps)
        ):
            raise ToolError(
                "Parameter `steps` must be a non-empty list of strings for command: create"
            )

        # Create a new plan with initialized step statuses
        plan = {
            "plan_id": plan_id,
            "title": title,
            "steps": steps,
            "step_statuses": ["not_started"] * len(steps),
            "step_notes": [""] * len(steps),
        }

View on GitHub (pinned to 52a13f2a57)

Solutions

  1. Supply a non-empty title: `planning.execute(command='create', plan_id='p1', title='Ship v2', steps=[...])`.
  2. In the calling layer, derive a title when missing (e.g. from the first step or a default like 'Untitled plan') before invoking create.
  3. Validate in your wrapper: reject call if not (plan_id and plan_id not in used and title and steps).

Example fix

// before
await planning.execute(command='create', plan_id='p1', steps=['a'])

// after
await planning.execute(command='create', plan_id='p1', title='Setup tasks', steps=['a'])
Defensive patterns

Strategy: validation

Validate before calling

title = (title or '').strip() or 'Untitled plan'
await planning.execute(command='create', plan_id=plan_id, title=title, steps=steps)

Type guard

def is_non_empty_title(t: str | None) -> bool:
    return isinstance(t, str) and bool(t.strip())

Prevention

When it happens

Trigger: Calling `planning.execute(command='create', plan_id='p1', steps=['a'])` without title, or with title='' (empty string is falsy and rejected).

Common situations: Models that see title as optional because the JSON schema only marks 'command' required; callers passing None as a default; whitespace-only titles are accepted, so empty-string checks at the caller should strip first if you want stricter behavior.

Related errors


AI-assisted analysis of FoundationAgents/OpenManus@52a13f2a57 (2026-08-15). Data as JSON: /api/errors/cc2e9bce002facdf. Report an issue: GitHub.