coleam00/Archon · error · Error

Node '${node.id}': timed out (no output for ${String(effecti

Error message

Node '${node.id}': timed out (no output for ${String(effectiveIdleTimeout / 60000)} min) before producing the required structured output.

What it means

When a node declares output_format and the turn ends via idle timeout (no output for effectiveIdleTimeout minutes) before any structured output was produced, the executor throws this dedicated timeout error rather than the generic 'no schema-valid structured output' message, so the real cause (a timeout/abort) is not misreported as the model replying with prose.

Source

Thrown at packages/workflows/src/dag-executor.ts:3069

        }
        throw new Error(
          `Node '${node.id}': output_format declared but the provider's structured output failed schema validation: ${validation.errors.join('; ')}`
        );
      }

      // No structured output at all (prose / refusal / parse miss / timeout).
      getLog().warn(
        { nodeId: node.id, workflowRunId: workflowRun.id },
        'dag.structured_output_missing'
      );
      if (canReask) {
        await scheduleReask(['no JSON object was found in the response']);
        continue;
      }
      // Surface the real cause: a timeout/abort produces no structured output too,
      // and reporting it as "the model replied with prose" would mislead.
      if (nodeIdleTimedOut) {
        throw new Error(
          `Node '${node.id}': timed out (no output for ${String(effectiveIdleTimeout / 60000)} min) before producing the required structured output.`
        );
      }
      throw new Error(
        `Node '${node.id}': output_format declared but the provider returned no schema-valid structured output. ` +
          'The model likely replied with prose, refused, or emitted unparseable JSON.'
      );
    }

    // Only post "completed via idle timeout" when output exists — zero-output timeout falls through to the empty-output guard below.
    if (nodeIdleTimedOut && (nodeOutputText.trim() !== '' || structuredOutput !== undefined)) {
      getLog().warn(
        { nodeId: node.id, timeoutMs: effectiveIdleTimeout },
        'dag_node_completed_via_idle_timeout'
      );
      await safeSendMessage(
        platform,
        conversationId,

View on GitHub (pinned to 0773b97458)

Solutions

  1. Increase the node's idle timeout so long generations are not cut off.
  2. Check provider status/network — a stalled stream is often environmental.
  3. Reduce output size or use a faster model so generation fits the idle window.
  4. Add retry so a timed-out attempt is retried instead of failing the run.

Example fix

// before
node:
  idle_timeout_ms: 60000
// after
node:
  idle_timeout_ms: 600000
Defensive patterns

Strategy: retry

Validate before calling

// ensure idle timeout is generous relative to expected generation time
if (node.idle_timeout_ms !== undefined && node.idle_timeout_ms < 120000) console.warn('idle_timeout_ms < 2min may cut off slow generations');

Try / catch

try {
  await runNode(node);
} catch (e) {
  if (String(e).includes('timed out (no output')) await retryWithBackoff(() => runNode(node), { attempts: 2 });
  else throw e;
}

Prevention

When it happens

Trigger: The node's idle-timeout fired (no streaming output for effectiveIdleTimeout/60000 minutes) while output_format was declared and no valid structured output had arrived yet.

Common situations: Model hung or provider stalled mid-generation; extremely long generation exceeding the idle window; network stall; idle timeout configured too aggressively for a slow model or big output.

Understand the failure class

Related errors


AI-assisted analysis of coleam00/Archon@0773b97458 (2026-09-01). Data as JSON: /api/errors/ba44b3bd8c7e04e1. Report an issue: GitHub.