{"record":{"id":"b5c1b439d1d7c656","repo":"charmbracelet/crush","slug":"provider-s-has-no-models-configured","errorCode":null,"errorMessage":"provider %s has no models configured","messagePattern":"provider (.+?) has no models configured","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/config/load.go","lineNumber":773,"sourceCode":"\t\t\tMaxTokens:       defaultSmallModel.DefaultMaxTokens,\n\t\t\tReasoningEffort: defaultSmallModel.DefaultReasoningEffort,\n\t\t}\n\t\treturn largeModel, smallModel, err\n\t}\n\n\tenabledProviders := c.EnabledProviders()\n\tslices.SortFunc(enabledProviders, func(a, b ProviderConfig) int {\n\t\treturn strings.Compare(a.ID, b.ID)\n\t})\n\n\tif len(enabledProviders) == 0 {\n\t\terr = fmt.Errorf(\"no providers configured, please configure at least one provider\")\n\t\treturn largeModel, smallModel, err\n\t}\n\n\tproviderConfig := enabledProviders[0]\n\tif len(providerConfig.Models) == 0 {\n\t\terr = fmt.Errorf(\"provider %s has no models configured\", providerConfig.ID)\n\t\treturn largeModel, smallModel, err\n\t}\n\tdefaultLargeModel := c.GetModel(providerConfig.ID, providerConfig.Models[0].ID)\n\tlargeModel = SelectedModel{\n\t\tProvider:  providerConfig.ID,\n\t\tModel:     defaultLargeModel.ID,\n\t\tMaxTokens: defaultLargeModel.DefaultMaxTokens,\n\t}\n\tdefaultSmallModel := c.GetModel(providerConfig.ID, providerConfig.Models[0].ID)\n\tsmallModel = SelectedModel{\n\t\tProvider:  providerConfig.ID,\n\t\tModel:     defaultSmallModel.ID,\n\t\tMaxTokens: defaultSmallModel.DefaultMaxTokens,\n\t}\n\treturn largeModel, smallModel, err\n}\n\n// resolvedModels holds the result of resolving user-configured model","sourceCodeStart":755,"sourceCodeEnd":791,"githubUrl":"https://github.com/charmbracelet/crush/blob/7944b8e52225d8805e31eacbf7ef24856b0dfb7a/internal/config/load.go#L755-L791","documentation":"After picking the first alphabetically-sorted enabled provider, defaultModelSelection checks that the provider actually has models configured. An enabled provider with an empty Models list cannot supply a default large model, so this error is returned and wrapped by resolveSelectedModels.","triggerScenarios":"Load runs, EnabledProviders() is non-empty, but enabledProviders[0] (lowest provider ID) has zero entries in its Models slice — e.g. a provider declared with credentials but no models block and no catalog models.","commonSituations":"Custom/self-hosted provider defined in crushrc with an API key but no models listed; provider catalog lookup failed silently for a custom provider; models list emptied by a bad config merge.","solutions":["Add at least one model to the provider's models list in your config","If the provider should use catalog models, verify the provider ID matches the catwalk catalog so its models load","Remove or disable the empty provider if unused, so a healthy provider is selected first","Re-run Load after fixing; note the failing provider is the first by sorted ID"],"exampleFix":"// before\n\"openai-custom\": { \"api_key\": \"...\" }\n// after\n\"openai-custom\": { \"api_key\": \"...\", \"models\": [{ \"id\": \"gpt-4o\" }] }","handlingStrategy":"validation","validationCode":"for _, p := range cfg.EnabledProviders() {\n  if len(p.Models) == 0 {\n    fmt.Printf(\"provider %s is enabled but has no models\\n\", p.ID)\n  }\n}","typeGuard":null,"tryCatchPattern":"if _, _, err := config.Load(ctx, ...); err != nil {\n  var wrapped interface{ Unwrap() error }\n  if errors.As(err, new(error)) && strings.Contains(err.Error(), \"has no models configured\") {\n    // disable the empty provider or add models, then retry\n  }\n}","preventionTips":["Every provider block must declare at least one model","Use catalog provider IDs so models load automatically","Disable providers you only keep for reference"],"tags":["config","providers","model-resolution"],"backgroundTag":"provider-has-no-models","analyzedSha":"7944b8e52225d8805e31eacbf7ef24856b0dfb7a","analyzedAt":"2026-08-29T12:48:59.079Z","schemaVersion":2},"datasetVersion":"2026-08-29T17:17:51.833Z"}