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
- Fix the language plugin/SDK to report a valid semver (e.g. 1.2.3) in its package listing.
- Upgrade or reinstall the language plugin to a released version with sane versions.
- 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
- Use released plugin versions, not dev builds, for package listing.
- Keep pulumi CLI and language plugins updated together.
- Run `pulumi plugin rm --all && pulumi install` to rebuild plugin state.
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
- unrecognized plugin kind: %s
- invalid plugin version %s: %w
- invalid version %s
- must have a 'version' field of type string
- parsing plugin options for '%s': %w
AI-assisted analysis of pulumi/pulumi@793f7b2e16 (2026-08-31).
Data as JSON: /api/errors/36cadf6cc70eb7df.
Report an issue: GitHub.