coleam00/Archon · error

Node '${node.id}': unknown provider '${provider}'. Registere

Error message

Node '${node.id}': unknown provider '${provider}'. Registered: ${getRegisteredProviders().map(p => p.id).join(', ')}

What it means

The DAG executor validates, at node dispatch time, that the node's model provider is registered in the provider registry. If isRegisteredProvider(provider) is false it throws immediately rather than falling back, listing all registered provider ids to make the typo obvious.

Source

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

      },
      'dag.model_provider_conflict'
    );
    const delivered = await safeSendMessage(
      platform,
      conversationId,
      `Warning: Node '${node.id}' sets provider '${conflict.declared}' but model '${conflict.modelRef}' resolves to provider '${conflict.resolved}' — using '${conflict.resolved}'.`,
      { workflowId: workflowRunId, nodeName: node.id }
    );
    if (!delivered) {
      getLog().error(
        { nodeId: node.id, workflowRunId },
        'dag.model_provider_conflict_warning_delivery_failed'
      );
    }
  }

  if (!isRegisteredProvider(provider)) {
    throw new Error(
      `Node '${node.id}': unknown provider '${provider}'. ` +
        `Registered: ${getRegisteredProviders()
          .map(p => p.id)
          .join(', ')}`
    );
  }

  // Get provider capabilities for capability warnings (static lookup, no instantiation)
  const caps = getProviderCapabilities(provider);

  // `webSearchMode:` is Codex's alone — no other provider reads it, and #2556
  // decided it keeps no node-level form, making it the single workflow-level
  // field with no per-node counterpart. There is deliberately no
  // ProviderCapabilities axis for one provider's one field.
  //
  // Reasoning depth is NOT in this category any more: the loader translates the
  // deprecated `modelReasoningEffort:` into `effort:`, so the executor sees one
  // provider-agnostic field and needs no Codex branch for it.

View on GitHub (pinned to 0773b97458)

Solutions

  1. Set the node's provider to one of the ids listed in the error's 'Registered:' list.
  2. Fix casing/spelling of the provider id (ids are exact strings).
  3. Ensure the provider package/registration code is loaded before the run starts (check provider pack setup).
  4. If the id was renamed in a new version, migrate node configs to the new provider id.

Example fix

// before
provider: "anthropic"
// after
provider: "claude"
Defensive patterns

Strategy: validation

Validate before calling

import { isRegisteredProvider, getRegisteredProviders } from '@archon/providers';
if (!isRegisteredProvider(node.model.provider)) {
  throw new Error(`Provider '${node.model.provider}' not registered. Available: ${getRegisteredProviders().map(p => p.id).join(', ')}`);
}

Type guard

function isKnownProvider(p: string, known: readonly string[]): p is typeof known[number] {
  return (known as readonly string[]).includes(p);
}

Try / catch

try {
  await runWorkflow(wf);
} catch (e) {
  if (String(e).includes('unknown provider')) console.error('Fix provider id; registered:', listProviders());
  else throw e;
}

Prevention

When it happens

Trigger: A node (or run config) sets model provider to an id string that is not registered — e.g. 'Claude', 'gpt4', 'anthropic' instead of a registered id like 'claude', or a plugin/provider package was not loaded before the run.

Common situations: Typo or wrong casing in the provider field of a workflow node; using a provider from a provider pack that failed to register or was never imported; upgrading Archon and a provider id was renamed; custom provider registration code not running before the DAG starts.

Related errors


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