Significant-Gravitas/AutoGPT · warning · ExpertRunPausedError

{expert.name}'s schedules are paused.

Error message

{expert.name}'s schedules are paused.

What it means

ExpertRunPausedError raised at scheduling.py:303 when expert.schedulesPausedAt is not None: schedules were previously paused (typically by the weekly-budget breach path or an explicit pause) and the pause has not been resumed. The run is refused at the gate before any cost is metered.

Source

Thrown at autogpt_platform/backend/backend/api/features/experts/scheduling.py:303

    The spend read is a snapshot, not an atomic reservation: N runs firing
    in the same instant can each pass the check before any of them meters
    cost. That overshoot is bounded by per-run cost × concurrent firings,
    the next gate check pauses her, and the durable wallet (credit system)
    is charged correctly regardless — this gate is a churn guardrail, not
    the billing ledger, so the simpler check is the deliberate trade-off.
    """
    expert = await prisma.models.Expert.prisma().find_first(
        where={"id": expert_id, "ownerUserId": user_id, "isTemplate": False}
    )
    if expert is None:
        return
    if expert.isArchived:
        raise ExpertRunPausedError(
            f"{expert.name} is archived; her schedules do not run.", expert_id
        )
    if expert.schedulesPausedAt is not None:
        raise ExpertRunPausedError(f"{expert.name}'s schedules are paused.", expert_id)
    budget = effective_weekly_budget(expert)
    if budget is None:
        return
    spent = await get_weekly_spend(expert_id)
    if spent >= budget:
        await pause_expert_schedules(
            user_id,
            expert_id,
            reason=f"Weekly credit budget reached ({spent}/{budget})",
        )
        await _post_budget_message(user_id, expert, spent, budget, breached=True)
        raise ExpertRunPausedError(
            f"{expert.name} hit her weekly credit budget ({spent}/{budget}); "
            "schedules are paused until you resume them.",
            expert_id,
        )
    if spent >= int(budget * _BUDGET_WARN_FRACTION):
        await _post_budget_message(user_id, expert, spent, budget, breached=False)

View on GitHub (pinned to 9c8bb5550f)

Solutions

  1. Call POST /experts/{expert_id}/schedules/resume (the one-click reversal route) and re-test the trigger.
  2. If the pause came from a budget breach, raise the expert's weekly budget or wait for the spend window to reset before resuming.
  3. Check the expert's state via GET /experts to distinguish paused vs archived before resuming.

Example fix

// before: trigger silently fails with 'schedules are paused'
// after: resume first, then fire
await api.post(`/experts/${expertId}/schedules/resume`);
await fireTrigger();
Defensive patterns

Strategy: validation

Validate before calling

expert = await get_expert(user_id, expert_id)
if expert and expert.schedules_paused_at is not None:
    await resume_expert_schedules(user_id, expert_id)  # clear the pause before firing

Type guard

def schedule_runnable(e: Expert) -> bool:
    return (not e.is_archived) and e.schedules_paused_at is None

Try / catch

try:
    await run_schedule(...)
except ExpertRunPausedError:
    await resume_expert_schedules(user_id, expert_id)  # or surface 'paused' to the user

Prevention

When it happens

Trigger: A trigger fires for an expert whose schedulesPausedAt was set earlier — most commonly after error 188 (budget reached) auto-paused her, or after a user-initiated pause — before POST /experts/{id}/schedules/resume was called.

Common situations: User hit the weekly credit budget last week, budgets reset, but nobody resumed schedules; stale trigger still attached after a pause; confusion between archived (186) and paused (this) states.

Related errors


AI-assisted analysis of Significant-Gravitas/AutoGPT@9c8bb5550f (2026-08-14). Data as JSON: /api/errors/ebaaf3ef77b1d789. Report an issue: GitHub.