{"record":{"id":"d93fc6275fce617c","repo":"coleam00/Archon","slug":"tier-tier-has-no-configured-preset-and-no-bui","errorCode":null,"errorMessage":"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","messagePattern":"Tier '(.+?)' has no configured preset and no built-in default for provider '(.+?)'\\. 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","errorType":"exception","errorClass":"TierResolutionError","httpStatus":null,"severity":"error","filePath":"packages/workflows/src/model-validation.ts","lineNumber":568,"sourceCode":" * format errors for users (core's classifyAndFormatError) deliver instances\n * verbatim so the CLI command, console panel, and docs pointers survive.\n */\nexport class TierResolutionError extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = 'TierResolutionError';\n  }\n}\n\nexport function resolveTierWithFallback(\n  profile: ResolvedAiProfile,\n  tier: TierName\n): { preset: ModelAliasPreset; matchedTier: TierName } {\n  for (const candidate of TIER_FALLBACK[tier]) {\n    const preset = profile.aliases[candidate];\n    if (preset) return { preset, matchedTier: candidate };\n  }\n  throw new TierResolutionError(\n    `Tier '${tier}' has no configured preset and no built-in default for provider '${profile.defaultProvider}'. ` +\n      'Built-in tier defaults exist only for claude and codex; every other provider must configure its own. ' +\n      \"Set tiers with 'archon ai tier set <tier> <provider> <model>', the console AI Settings -> Model Tiers panel, \" +\n      \"or 'tiers.small/medium/large' in .archon/config.yaml. Docs: https://archon.diy/getting-started/ai-assistants/#per-user-credentials-and-ai-settings\"\n  );\n}\n\n/**\n * Classify a `model:` reference and resolve it against the profile.\n *   - tier ('small' | 'medium' | 'large') → preset via fallback chain\n *   - '@<name>' → preset from profile.aliases, or throw if unknown\n *   - anything else → { literal: ref } pass-through\n */\nexport function resolveModelSpec(profile: ResolvedAiProfile, ref: string): ResolvedModelSpec {\n  if (isTierName(ref)) {\n    return resolveTierWithFallback(profile, ref).preset;\n  }\n","sourceCodeStart":550,"sourceCodeEnd":586,"githubUrl":"https://github.com/coleam00/Archon/blob/0773b9745896ef0612e709c80845a0f7db315b19/packages/workflows/src/model-validation.ts#L550-L586","documentation":"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.","triggerScenarios":"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).","commonSituations":"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.","solutions":["Configure the tier: run `archon ai tier set <tier> <provider> <model>` for each tier the workflow uses.","Or set `tiers.small`, `tiers.medium`, `tiers.large` in .archon/config.yaml.","Or set presets in the console AI Settings -> Model Tiers panel.","Or switch defaultProvider back to `claude` or `codex`, which have built-in tier defaults."],"exampleFix":"// before (.archon/config.yaml)\ndefaultProvider: anthropic\n// after\ndefaultProvider: anthropic\ntiers:\n  small: anthropic/claude-3-5-haiku\n  medium: anthropic/claude-sonnet-4\n  large: anthropic/claude-opus-4","handlingStrategy":"validation","validationCode":"// before launching a run with a non-builtin provider\nconst provider = profile.defaultProvider;\nconst builtin = ['claude', 'codex'];\nif (!builtin.includes(provider)) {\n  for (const tier of ['small', 'medium', 'large']) {\n    if (!profile.aliases[tier] && !config.tiers?.[tier]) {\n      throw new Error(`Provider '${provider}' is missing tier '${tier}'; run 'archon ai tier set ${tier} <provider> <model>'`);\n    }\n  }\n}","typeGuard":"function hasTierPreset(profile: ProviderProfile, tier: TierName): boolean {\n  return TIER_FALLBACK[tier].some(t => profile.aliases[t] !== undefined);\n}","tryCatchPattern":"try {\n  const spec = resolveModelSpec(profile, '@small');\n  runNode(node, spec);\n} catch (err) {\n  if (err instanceof TierResolutionError) {\n    console.error(err.message); // includes exact `archon ai tier set` fix\n    process.exitCode = 2;\n  } else throw err;\n}","preventionTips":["After changing defaultProvider, always set tiers.small/medium/large for that provider.","Smoke-test `archon ai tier get small` per user profile before running workflows.","Remember built-in defaults exist only for claude and codex.","Set tiers in .archon/config.yaml so they are versioned with the repo."],"tags":["configuration","model-tiers","providers"],"backgroundTag":"unconfigured-model-tier","analyzedSha":"0773b9745896ef0612e709c80845a0f7db315b19","analyzedAt":"2026-09-01T02:28:07.064Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T05:18:18.240Z"}