coleam00/Archon · error · TierResolutionError

Tier '${tier}' has no configured preset and no built-in defa

Error message

Tier '${tier}' has no configured preset and no built-in default for provider '${profile.defaultProvider}'. Built-in tier defaults exist only for claude and codex; every other provider must configure its own. Set tiers with 'archon ai tier set <tier> <provider> <model>', the console AI Settings -> Model Tiers panel, or 'tiers.small/medium/large' in .archon/config.yaml. Docs: https://archon.diy/getting-started/ai-assistants/#per-user-credentials-and-ai-settings

What it means

resolveTierWithFallback walks the tier fallback chain (small→medium→large and built-in defaults) looking for an alias preset on the provider profile, and throws when none exists. Built-in tier defaults are shipped only for the `claude` and `codex` providers; every other provider must define its own tier presets, so an unconfigured third-party provider cannot resolve e.g. the `small` tier.

Source

Thrown at packages/workflows/src/model-validation.ts:568

 * format errors for users (core's classifyAndFormatError) deliver instances
 * verbatim so the CLI command, console panel, and docs pointers survive.
 */
export class TierResolutionError extends Error {
  constructor(message: string) {
    super(message);
    this.name = 'TierResolutionError';
  }
}

export function resolveTierWithFallback(
  profile: ResolvedAiProfile,
  tier: TierName
): { preset: ModelAliasPreset; matchedTier: TierName } {
  for (const candidate of TIER_FALLBACK[tier]) {
    const preset = profile.aliases[candidate];
    if (preset) return { preset, matchedTier: candidate };
  }
  throw new TierResolutionError(
    `Tier '${tier}' has no configured preset and no built-in default for provider '${profile.defaultProvider}'. ` +
      'Built-in tier defaults exist only for claude and codex; every other provider must configure its own. ' +
      "Set tiers with 'archon ai tier set <tier> <provider> <model>', the console AI Settings -> Model Tiers panel, " +
      "or 'tiers.small/medium/large' in .archon/config.yaml. Docs: https://archon.diy/getting-started/ai-assistants/#per-user-credentials-and-ai-settings"
  );
}

/**
 * Classify a `model:` reference and resolve it against the profile.
 *   - tier ('small' | 'medium' | 'large') → preset via fallback chain
 *   - '@<name>' → preset from profile.aliases, or throw if unknown
 *   - anything else → { literal: ref } pass-through
 */
export function resolveModelSpec(profile: ResolvedAiProfile, ref: string): ResolvedModelSpec {
  if (isTierName(ref)) {
    return resolveTierWithFallback(profile, ref).preset;
  }

View on GitHub (pinned to 0773b97458)

Solutions

  1. Configure the tier: run `archon ai tier set <tier> <provider> <model>` for each tier the workflow uses.
  2. Or set `tiers.small`, `tiers.medium`, `tiers.large` in .archon/config.yaml.
  3. Or set presets in the console AI Settings -> Model Tiers panel.
  4. Or switch defaultProvider back to `claude` or `codex`, which have built-in tier defaults.

Example fix

// before (.archon/config.yaml)
defaultProvider: anthropic
// after
defaultProvider: anthropic
tiers:
  small: anthropic/claude-3-5-haiku
  medium: anthropic/claude-sonnet-4
  large: anthropic/claude-opus-4
Defensive patterns

Strategy: validation

Validate before calling

// before launching a run with a non-builtin provider
const provider = profile.defaultProvider;
const builtin = ['claude', 'codex'];
if (!builtin.includes(provider)) {
  for (const tier of ['small', 'medium', 'large']) {
    if (!profile.aliases[tier] && !config.tiers?.[tier]) {
      throw new Error(`Provider '${provider}' is missing tier '${tier}'; run 'archon ai tier set ${tier} <provider> <model>'`);
    }
  }
}

Type guard

function hasTierPreset(profile: ProviderProfile, tier: TierName): boolean {
  return TIER_FALLBACK[tier].some(t => profile.aliases[t] !== undefined);
}

Try / catch

try {
  const spec = resolveModelSpec(profile, '@small');
  runNode(node, spec);
} catch (err) {
  if (err instanceof TierResolutionError) {
    console.error(err.message); // includes exact `archon ai tier set` fix
    process.exitCode = 2;
  } else throw err;
}

Prevention

When it happens

Trigger: A workflow or AI node requests a tier (or a default tier is applied) while `profile.defaultProvider` is a provider other than claude/codex and `profile.aliases` has no preset for the tier or any of its fallback candidates (TIER_FALLBACK).

Common situations: Switching defaultProvider to anthropic/openai/ollama in .archon/config.yaml without setting tiers.small/medium/large; a fresh per-user profile that inherited defaults from a claude-based setup; adding a custom provider alias without tier presets.

Related errors


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