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
- 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.
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
- 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.
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
- No chat in context
- Gitea API error: ${String(response.status)} ${response.statu
- Gitea API error: ${String(response.status)}
- Cannot access repository at ${repoPath}: ${err.code ?? err.m
- Failed to sync repository to ${defaultBranch}. Try /reset or
AI-assisted analysis of coleam00/Archon@0773b97458 (2026-09-01).
Data as JSON: /api/errors/d93fc6275fce617c.
Report an issue: GitHub.