pulumi/pulumi · error

illegal semver returned by language host: %s@%s: %w

Error message

illegal semver returned by language host: %s@%s: %w

What it means

After a language host lists the packages/plugins it needs, each package version string is parsed with tolerant semver. If `semver.ParseTolerant` fails, langruntime_plugin.go:267 wraps the error with the plugin name and raw version for diagnosis.

Source

Thrown at sdk/go/common/resource/plugin/langruntime_plugin.go:267

			for i, plugin := range plugins {
				packages[i] = workspace.PackageDescriptor{
					PluginDescriptor: plugin,
				}
			}
			return packages, nil, nil
		}

		return nil, nil, rpcError
	}

	packageDescriptors := slice.Prealloc[workspace.PackageDescriptor](len(resp.Packages))
	packageSpecs := slice.Prealloc[workspace.PackageSpec](len(resp.Specs))
	for _, info := range resp.Packages {
		var version *semver.Version
		if v := info.GetVersion(); v != "" {
			sv, err := semver.ParseTolerant(v)
			if err != nil {
				return nil, nil, fmt.Errorf("illegal semver returned by language host: %s@%s: %w", info.GetName(), v, err)
			}
			version = &sv
		}
		if !apitype.IsPluginKind(info.Kind) {
			return nil, nil, fmt.Errorf("unrecognized plugin kind: %s", info.Kind)
		}
		unmarshal := func(p *pulumirpc.PackageParameterization) (*workspace.Parameterization, error) {
			if p == nil {
				return nil, nil
			}
			sv, err := semver.ParseTolerant(p.Version)
			if err != nil {
				return nil, fmt.Errorf(
					"illegal semver returned by language host: %s@%s: %w",
					info.GetName(), p.Version, err)
			}
			return &workspace.Parameterization{
				Name:    p.Name,

View on GitHub (pinned to 793f7b2e16)

Solutions

  1. Fix the language plugin/SDK to report a valid semver (e.g. 1.2.3) in its package listing.
  2. Upgrade or reinstall the language plugin to a released version with sane versions.
  3. Clear the plugin cache (`pulumi plugin rm --all`) and re-run so plugins re-report correct versions.
Defensive patterns

Strategy: try-catch

Validate before calling

if _, err := semver.ParseTolerant(pkg.Version); err != nil {
	log.Printf("language host reported non-semver version %q for %s", pkg.Version, pkg.Name)
}

Try / catch

pkgs, params, err := getLanguagePackages(ctx, host)
if err != nil {
	if strings.Contains(err.Error(), "illegal semver") {
		return fmt.Errorf("language plugin returned a bad version; reinstall the plugin: %w", err)
	}
	return err
}

Prevention

When it happens

Trigger: A language plugin's dynamic-provider/package response contains a version like `latest`, `5.x`, an empty-but-set odd string, or a git SHA in the `version` field of `resp.Packages`.

Common situations: Custom or third-party language plugins returning non-semver versions; plugin version resolution bugs after lockfile or plugin cache changes; using a development build of a language SDK that emits `0.0.0-dev`-style strings not parseable.

Related errors


AI-assisted analysis of pulumi/pulumi@793f7b2e16 (2026-08-31). Data as JSON: /api/errors/36cadf6cc70eb7df. Report an issue: GitHub.