{"record":{"id":"06f959a608029fd7","repo":"coleam00/Archon","slug":"alias-name-has-invalid-provider-must-be-a-n","errorCode":null,"errorMessage":"Alias '${name}' has invalid provider — must be a non-empty string.","messagePattern":"Alias '(.+?)' has invalid provider — must be a non-empty string\\.","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/workflows/src/model-validation.ts","lineNumber":101,"sourceCode":"function assertNotReserved(name: string): void {\n  if (isTierName(name)) {\n    throw new Error(\n      `Alias name '${name}' is reserved (small/medium/large are tier keywords). Use a different name.`\n    );\n  }\n}\n\nfunction assertCustomAliasPrefix(name: string): void {\n  if (!name.startsWith('@')) {\n    throw new Error(\n      `Alias name '${name}' must start with '@' (e.g. '@${name}'). Reserved tier names (small/medium/large) do not need '@'.`\n    );\n  }\n}\n\nfunction assertValidEntry(name: string, entry: RawAliasEntry): void {\n  if (typeof entry.provider !== 'string' || entry.provider.length === 0) {\n    throw new Error(`Alias '${name}' has invalid provider — must be a non-empty string.`);\n  }\n  if (typeof entry.model !== 'string' || entry.model.length === 0) {\n    throw new Error(`Alias '${name}' has invalid model — must be a non-empty string.`);\n  }\n}\n\nfunction assertValidPersistedPreset(name: string, entry: ModelAliasPreset): void {\n  if (entry.effort !== undefined && !isEffortValidForProvider(entry.provider, entry.effort)) {\n    throw new Error(`Model binding '${name}' has an invalid effort.`);\n  }\n}\n\nexport type RunModelPresetValidationIssue =\n  | { kind: 'unknown-provider'; provider: string; field: 'provider' }\n  | { kind: 'invalid-model'; provider: string; model: string; reason: string; field: 'model' }\n  | { kind: 'unsupported-effort'; provider: string; effort: string; field: 'effort' }\n  | {\n      kind: 'invalid-effort';","sourceCodeStart":83,"sourceCodeEnd":119,"githubUrl":"https://github.com/coleam00/Archon/blob/0773b9745896ef0612e709c80845a0f7db315b19/packages/workflows/src/model-validation.ts#L83-L119","documentation":"`assertValidEntry` enforces that each alias entry's `provider` field is a non-empty string. The library throws this during profile construction because an alias without a usable provider cannot be resolved to any SDK model binding.","triggerScenarios":"Defining an alias in the aliases config where `provider` is missing, an empty string, or not a string (e.g. a number or nested object) — evaluated via `buildAiProfile`.","commonSituations":"YAML indentation mistakes that nest the provider value under the wrong key, leaving `provider:` empty, typos like `provder:`, or programmatically built config passing undefined.","solutions":["Set `provider` to a non-empty registered provider name (e.g. anthropic, openai)","Check YAML indentation so `provider:` is a direct child of the alias entry","Look for a misspelled key that left the real provider under a different field"],"exampleFix":"# before\naliases:\n  '@fast':\n    provider:\n    model: gpt-4o-mini\n# after\naliases:\n  '@fast':\n    provider: openai\n    model: gpt-4o-mini","handlingStrategy":"validation","validationCode":"// Shape-check alias entries before profile build.\nfunction hasValidProvider(entry: unknown): entry is { provider: string; model: string } {\n  return typeof entry === 'object' && entry !== null &&\n    typeof (entry as any).provider === 'string' && (entry as any).provider.length > 0;\n}","typeGuard":"function hasNonEmptyString<K extends string>(obj: unknown, key: K): obj is Record<K, string> {\n  return typeof obj === 'object' && obj !== null &&\n    typeof (obj as Record<string, unknown>)[key] === 'string' &&\n    ((obj as Record<string, unknown>)[key] as string).length > 0;\n}","tryCatchPattern":"try {\n  const profile = buildAiProfile(rawConfig);\n} catch (err) {\n  if (err instanceof Error && err.message.includes('invalid provider')) {\n    const alias = err.message.match(/Alias '([^']+)'/)?.[1];\n    throw new Error(`Alias ${alias} in config needs a non-empty provider: value`, { cause: err });\n  }\n  throw err;\n}","preventionTips":["Verify YAML indentation puts provider: directly under each alias key","Use an editor YAML schema for the aliases config to catch empty/missing fields","Never leave provider: with an empty value; delete the alias instead if unused","Run config loading as part of CI or startup smoke checks"],"tags":["config","model-alias","validation","yaml"],"backgroundTag":"invalid-config-value","analyzedSha":"0773b9745896ef0612e709c80845a0f7db315b19","analyzedAt":"2026-09-01T02:28:07.064Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T05:18:18.240Z"}