sipeed/picoclaw · error
error creating new provider: %w
Error message
error creating new provider: %w
What it means
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.
Source
Thrown at pkg/gateway/gateway.go:613
debug bool,
) error {
logger.Info("🔄 Config file changed, reloading...")
newModel := newCfg.Agents.Defaults.ModelName
logger.Infof(" New model is '%s', recreating provider...", newModel)
logger.Info(" Stopping all services...")
stopAndCleanupServices(runningServices, serviceShutdownTimeout, true)
newProvider, newModelID, err := createStartupProvider(newCfg, allowEmptyStartup)
if err != nil {
logger.Errorf(" ⚠ Error creating new provider: %v", err)
logger.Warn(" Attempting to restart services with old provider and config...")
if restartErr := restartServices(al, runningServices, msgBus); restartErr != nil {
logger.Errorf(" ⚠ Failed to restart services: %v", restartErr)
}
return fmt.Errorf("error creating new provider: %w", err)
}
if newModelID != "" {
newCfg.Agents.Defaults.ModelName = newModelID
}
reloadCtx, reloadCancel := context.WithTimeout(context.Background(), providerReloadTimeout)
defer reloadCancel()
if err := al.ReloadProviderAndConfig(reloadCtx, newProvider, newCfg); err != nil {
logger.Errorf(" ⚠ Error reloading agent loop: %v", err)
if cp, ok := newProvider.(providers.StatefulProvider); ok {
cp.Close()
}
logger.Warn(" Attempting to restart services with old provider and config...")
if restartErr := restartServices(al, runningServices, msgBus); restartErr != nil {
logger.Errorf(" ⚠ Failed to restart services: %v", restartErr)
}View on GitHub (pinned to 49183d7e8d)
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
Defensive patterns
Strategy: fallback
Validate before calling
if _, ok := providerCatalog[newCfg.Agents.Defaults.ModelName]; !ok {
return fmt.Errorf("refusing reload: unknown model %q", newCfg.Agents.Defaults.ModelName)
} Try / catch
if err != nil {
// old provider already restored via restartServices; surface and let user fix config
return fmt.Errorf("error creating new provider: %w", err)
} Prevention
- 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
When it happens
Trigger: 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.
Common situations: 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.
Related errors
- error creating channel manager: %w
- Failed to validate gateway start conditions: %v
- feishu channel is not supported on 32-bit architectures (arm
- must be in range 1-65535
- create request: %w
AI-assisted analysis of sipeed/picoclaw@49183d7e8d (2026-08-15).
Data as JSON: /api/errors/107c94c25350b932.
Report an issue: GitHub.