NousResearch/hermes-agent · error · TimeoutError

Cron job '{job_name}' idle for {int(_secs_ago)}s (limit {int

Error message

Cron job '{job_name}' idle for {int(_secs_ago)}s (limit {int(_cron_inactivity_limit)}s) — last activity: {_last_desc}

What it means

Error "Cron job '{job_name}' idle for {int(_secs_ago)}s (limit {int(_cron_inactivity_limit)}s) — last activity: {_last_desc}" thrown in NousResearch/hermes-agent.

Source

Thrown at cron/scheduler.py:4515

                try:
                    _activity = agent.get_activity_summary()
                except Exception:
                    pass
            _last_desc = _activity.get("last_activity_desc", "unknown")
            _secs_ago = _activity.get("seconds_since_activity", 0)
            _cur_tool = _activity.get("current_tool")
            _iter_n = _activity.get("api_call_count", 0)
            _iter_max = _activity.get("max_iterations", 0)

            logger.error(
                "Job '%s' idle for %.0fs (inactivity limit %.0fs) "
                "| last_activity=%s | iteration=%s/%s | tool=%s",
                job_name, _secs_ago, _cron_inactivity_limit,
                _last_desc, _iter_n, _iter_max,
                _cur_tool or "none",
            )
            request_hard_interrupt(agent, "Cron job timed out (inactivity)")
            raise TimeoutError(
                f"Cron job '{job_name}' idle for "
                f"{int(_secs_ago)}s (limit {int(_cron_inactivity_limit)}s) "
                f"— last activity: {_last_desc}"
            )

        # Guard against non-dict returns from run_conversation under error conditions
        if not isinstance(result, dict):
            raise RuntimeError(
                f"agent.run_conversation returned {type(result).__name__} instead of dict: {result!r}"
            )

        # If the agent itself reported failure (e.g. all retries exhausted on
        # API errors, model abort, mid-run interrupt), do not silently mark the
        # job as successful. run_agent populates `failed=True`/`completed=False`
        # on these paths and may put the error into `final_response`, which
        # would otherwise be delivered as if it were the agent's reply and the
        # job's `last_status` set to "ok". Raise so the except handler below
        # builds the proper failure tuple. (issue #17855)

View on GitHub (pinned to c896c09c42)

Solutions

  1. Investigate why the job stalled (provider hang, long tool call) and rerun.
  2. Raise the cron inactivity limit only if the workload legitimately runs longer.

When it happens

Trigger: Thrown at cron/scheduler.py:4515 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of NousResearch/hermes-agent@c896c09c42 (2026-08-14). Data as JSON: /api/errors/ccbb49e5f126a805. Report an issue: GitHub.