{"record":{"id":"a9d5c46d8ce23384","repo":"charmbracelet/crush","slug":"default-large-model-s-not-found-for-provider-s","errorCode":null,"errorMessage":"default large model %s not found for provider %s","messagePattern":"default large model (.+?) not found for provider (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/config/load.go","lineNumber":733,"sourceCode":"\nfunc (c *Config) defaultModelSelection(knownProviders []catwalk.Provider) (largeModel SelectedModel, smallModel SelectedModel, err error) {\n\tif len(knownProviders) == 0 && c.Providers.Len() == 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\t// Use the first provider enabled based on the known providers order\n\t// if no provider found that is known use the first provider configured\n\tfor _, p := range knownProviders {\n\t\tproviderConfig, ok := c.Providers.Get(string(p.ID))\n\t\tif !ok || providerConfig.Disable {\n\t\t\tcontinue\n\t\t}\n\t\tdefaultLargeModel := c.GetModel(string(p.ID), p.DefaultLargeModelID)\n\t\tif defaultLargeModel == nil {\n\t\t\tslog.Warn(\"Default large model %s not found for provider %s\", p.DefaultLargeModelID, p.ID)\n\t\t\tif len(providerConfig.Models) == 0 {\n\t\t\t\treturn largeModel, smallModel, fmt.Errorf(\"default large model %s not found for provider %s\", p.DefaultLargeModelID, p.ID)\n\t\t\t}\n\t\t\tdefaultLargeModel = &providerConfig.Models[0]\n\t\t}\n\t\tlargeModel = SelectedModel{\n\t\t\tProvider:        string(p.ID),\n\t\t\tModel:           defaultLargeModel.ID,\n\t\t\tMaxTokens:       defaultLargeModel.DefaultMaxTokens,\n\t\t\tReasoningEffort: defaultLargeModel.DefaultReasoningEffort,\n\t\t}\n\n\t\tdefaultSmallModel := c.GetModel(string(p.ID), p.DefaultSmallModelID)\n\t\tif defaultSmallModel == nil {\n\t\t\tslog.Warn(\"Default small model %s not found for provider %s\", p.DefaultSmallModelID, p.ID)\n\t\t\tif len(providerConfig.Models) == 0 {\n\t\t\t\treturn largeModel, smallModel, fmt.Errorf(\"default small model %s not found for provider %s\", p.DefaultSmallModelID, p.ID)\n\t\t\t}\n\t\t\tdefaultSmallModel = &providerConfig.Models[0]\n\t\t}","sourceCodeStart":715,"sourceCodeEnd":751,"githubUrl":"https://github.com/charmbracelet/crush/blob/7944b8e52225d8805e31eacbf7ef24856b0dfb7a/internal/config/load.go#L715-L751","documentation":"defaultModelSelection resolves fallback large models when no explicit large model is selected. For each enabled provider it looks up the provider's DefaultLargeModelID via Config.GetModel; if the ID is not present in the provider's model catalog (or in known catwalk providers), it warns and throws. If the provider has no models at all to fall back to, the error becomes fatal and bubbles up wrapped by resolveSelectedModels.","triggerScenarios":"Calling config.Load (or reloadFromDiskLocked) when a provider entry sets default_model_large (or p.DefaultLargeModelID) to an ID that GetModel cannot resolve: the model is missing from providerConfig.Models and is not in the catwalk provider catalog.","commonSituations":"Typo in the default large model ID in crush.json/crushrc; provider renamed/removed a model so the pinned default no longer exists; catwalk provider catalog out of date; hand-edited config referencing a model from a different provider.","solutions":["Fix the provider's DefaultLargeModelID in your crush config to an ID that exists in that provider's model list","Run the models command (crush models) to list valid model IDs for the provider","Ensure at least one model is defined under the provider's models so the fallback to Models[0] can kick in","Update the provider catalog so the referenced default model resolves"],"exampleFix":"// before\n\"provider\": { \"id\": \"anthropic\", \"default_model_large\": \"claude-4-opus\" }\n// after\n\"provider\": { \"id\": \"anthropic\", \"default_model_large\": \"claude-sonnet-4-20250514\" }","handlingStrategy":"validation","validationCode":"for id, p := range cfg.Providers {\n  if cfg.GetModel(string(p.ID), p.DefaultLargeModelID) == nil {\n    fmt.Printf(\"provider %s: unknown default large model %q\\n\", p.ID, p.DefaultLargeModelID)\n  }\n}","typeGuard":null,"tryCatchPattern":"if _, _, err := config.Load(ctx, ...); err != nil {\n  if strings.Contains(err.Error(), \"default large model\") {\n    // prompt user to fix default_model_large, then retry\n  }\n}","preventionTips":["Always pick default_model_large from the IDs listed by crush models","Keep default model IDs in sync when upgrading a provider's catalog","Never hand-copy model IDs across providers"],"tags":["config","model-resolution","startup"],"backgroundTag":"model-not-found","analyzedSha":"7944b8e52225d8805e31eacbf7ef24856b0dfb7a","analyzedAt":"2026-08-29T12:48:59.079Z","schemaVersion":2},"datasetVersion":"2026-08-29T17:17:51.833Z"}