OpenBMB/ChatDev · error · ConfigError

startup_timeout must be numeric

Error message

startup_timeout must be numeric

What it means

Raised when the stdio tooling 'startup_timeout' is present but non-numeric. It bounds how long the launcher waits for the process to become ready; only int/float are accepted (default 10.0).

Source

Thrown at entity/configs/node/tooling.py:534

        inherit_env = optional_bool(mapping, "inherit_env", path, default=True)
        if inherit_env is None:
            inherit_env = True

        env_mapping = mapping.get("env")
        if env_mapping is not None:
            if not isinstance(env_mapping, Mapping):
                raise ConfigError("env must be a mapping", extend_path(path, "env"))
            env = {str(k): str(v) for k, v in env_mapping.items()}
        else:
            env = {}

        timeout_value = mapping.get("startup_timeout", 10.0)
        if timeout_value is None:
            startup_timeout = 10.0
        elif isinstance(timeout_value, (int, float)):
            startup_timeout = float(timeout_value)
        else:
            raise ConfigError("startup_timeout must be numeric", extend_path(path, "startup_timeout"))

        wait_for_log = optional_str(mapping, "wait_for_log", path)
        cache_ttl_value = mapping.get("cache_ttl", 0.0)
        if cache_ttl_value is None:
            cache_ttl = 0.0
        elif isinstance(cache_ttl_value, (int, float)):
            cache_ttl = float(cache_ttl_value)
        else:
            raise ConfigError("cache_ttl must be numeric", extend_path(path, "cache_ttl"))
        return cls(
            command=command,
            args=normalized_args,
            cwd=cwd,
            env=env,
            inherit_env=bool(inherit_env),
            startup_timeout=startup_timeout,
            wait_for_log=wait_for_log,
            cache_ttl=cache_ttl,

View on GitHub (pinned to 4fb2db0ea9)

Solutions

  1. Write the value unquoted: startup_timeout: 15
  2. Or use float(...) coercion upstream before from_dict
  3. Drop the key to accept the 10.0 default

Example fix

# before
startup_timeout: "15"
# after
startup_timeout: 15
Defensive patterns

Strategy: validation

Validate before calling

v = cfg.get("startup_timeout", 10.0)
assert v is None or isinstance(v, (int, float)) and not isinstance(v, bool)

Type guard

def numeric_or_none(v) -> bool:
    return v is None or (isinstance(v, (int, float)) and not isinstance(v, bool))

Try / catch

except ConfigError as e:
    if "startup_timeout" in str(e):
        cfg["startup_timeout"] = float(cfg["startup_timeout"])

Prevention

When it happens

Trigger: startup_timeout: "15" in the tooling config; YAML quoting; value null is allowed (falls back to 10.0) but strings/bools are not.

Common situations: Tuning slow-starting MCP servers by copying a quoted example value; config templating that emits strings.

Understand the failure class

Related errors


AI-assisted analysis of OpenBMB/ChatDev@4fb2db0ea9 (2026-08-27). Data as JSON: /api/errors/600f8724240f12a2. Report an issue: GitHub.