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

  1. Check the wrapped createStartupProvider error for the exact cause
  2. Verify the model name matches the provider's catalog exactly
  3. Confirm the provider's API key env var is present in the gateway process
  4. 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

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


AI-assisted analysis of sipeed/picoclaw@49183d7e8d (2026-08-15). Data as JSON: /api/errors/107c94c25350b932. Report an issue: GitHub.