{"record":{"id":"107c94c25350b932","repo":"sipeed/picoclaw","slug":"error-creating-new-provider-w","errorCode":null,"errorMessage":"error creating new provider: %w","messagePattern":"error creating new provider: %w","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/gateway/gateway.go","lineNumber":613,"sourceCode":"\tdebug bool,\n) error {\n\tlogger.Info(\"🔄 Config file changed, reloading...\")\n\n\tnewModel := newCfg.Agents.Defaults.ModelName\n\n\tlogger.Infof(\" New model is '%s', recreating provider...\", newModel)\n\n\tlogger.Info(\"  Stopping all services...\")\n\tstopAndCleanupServices(runningServices, serviceShutdownTimeout, true)\n\n\tnewProvider, newModelID, err := createStartupProvider(newCfg, allowEmptyStartup)\n\tif err != nil {\n\t\tlogger.Errorf(\"  ⚠ Error creating new provider: %v\", err)\n\t\tlogger.Warn(\"  Attempting to restart services with old provider and config...\")\n\t\tif restartErr := restartServices(al, runningServices, msgBus); restartErr != nil {\n\t\t\tlogger.Errorf(\"  ⚠ Failed to restart services: %v\", restartErr)\n\t\t}\n\t\treturn fmt.Errorf(\"error creating new provider: %w\", err)\n\t}\n\n\tif newModelID != \"\" {\n\t\tnewCfg.Agents.Defaults.ModelName = newModelID\n\t}\n\n\treloadCtx, reloadCancel := context.WithTimeout(context.Background(), providerReloadTimeout)\n\tdefer reloadCancel()\n\n\tif err := al.ReloadProviderAndConfig(reloadCtx, newProvider, newCfg); err != nil {\n\t\tlogger.Errorf(\"  ⚠ Error reloading agent loop: %v\", err)\n\t\tif cp, ok := newProvider.(providers.StatefulProvider); ok {\n\t\t\tcp.Close()\n\t\t}\n\t\tlogger.Warn(\"  Attempting to restart services with old provider and config...\")\n\t\tif restartErr := restartServices(al, runningServices, msgBus); restartErr != nil {\n\t\t\tlogger.Errorf(\"  ⚠ Failed to restart services: %v\", restartErr)\n\t\t}","sourceCodeStart":595,"sourceCodeEnd":631,"githubUrl":"https://github.com/sipeed/picoclaw/blob/49183d7e8daed0dba89ddbb6fcb60089401d9680/pkg/gateway/gateway.go#L595-L631","documentation":"During a runtime model change, createStartupProvider(newCfg, allowEmptyStartup) failed to build a provider for the requested model, so the reload path logs a warning, attempts to restart services with the old provider/config, and returns 'error creating new provider'. The gateway stays on the previous model if the restart succeeds.","triggerScenarios":"Config reload changes Agents.Defaults.ModelName to a provider/model that cannot be constructed: unknown provider name, missing API key env var, invalid base URL, or empty model when allowEmptyStartup is false.","commonSituations":"Editing model name with a typo (e.g. 'gpt-4o-mini ' with whitespace); provider API key removed from environment; switching provider type without migrating its config keys.","solutions":["Check the wrapped createStartupProvider error for the exact cause","Verify the model name matches the provider's catalog exactly","Confirm the provider's API key env var is present in the gateway process","After fixing config, trigger the model reload again — services continue on old provider meanwhile"],"exampleFix":null,"handlingStrategy":"fallback","validationCode":"if _, ok := providerCatalog[newCfg.Agents.Defaults.ModelName]; !ok {\n    return fmt.Errorf(\"refusing reload: unknown model %q\", newCfg.Agents.Defaults.ModelName)\n}","typeGuard":null,"tryCatchPattern":"if err != nil {\n    // old provider already restored via restartServices; surface and let user fix config\n    return fmt.Errorf(\"error creating new provider: %w\", err)\n}","preventionTips":["Keep a known-good model name in config to roll back to","Validate model names and API keys before requesting a swap","Never mix model edits with channel edits in one reload"],"tags":["gateway","provider","model-reload","config","go"],"backgroundTag":null,"analyzedSha":"49183d7e8daed0dba89ddbb6fcb60089401d9680","analyzedAt":"2026-08-15T21:55:41.315Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}