Current breaking changes
Hydra 1.4 and OmegaConf 2.4 are still under development. This page is a working inventory of changes currently known to require application updates. It is derived from their news fragments, may change, and may not yet be complete. The final release notes will be the authoritative list.
Hydra 1.4
- Python 3.7, 3.8, and 3.9 are no longer supported. Hydra requires Python 3.10 or newer.
- The unsupported Torchrun launcher and the
contribplugin area have been removed. - The experimental
on_compose_configcallback has been removed. It was never included in a stable Hydra release, but was available in Hydra 1.4 development versions from February 2025 through July 2026. - Parent traversal in Defaults List config paths is no longer accepted.
- Backslashes in Defaults List config paths are no longer accepted.
/is the only supported config group separator. Paths that used\previously composed on Windows only, where the operating system resolved the backslash as a filesystem separator.
Hydra 1.1 compatibility behavior
version_base="1.1" is no longer accepted, and the following legacy behavior
has been removed:
- Omitting
config_pathno longer adds the calling directory to the config search path. hydra.job.chdirdefaults toFalse.- Config files using the
.ymlextension are rejected; use.yaml. - The old
{group: option, optional: true}Defaults List syntax is rejected; useoptional group: option. - Defaults List entries that replace Hydra config groups require the
overridekeyword. - Indexed Defaults List interpolations such as
${defaults.0.dataset}are no longer accepted. _group_and_name_are no longer expanded as symbolic package values.- The
strictargument tohydra.compose()has been removed. - ConfigStore schemas are no longer matched automatically by config name. Use explicit schema extension in the Defaults List.
Hydra 1.2 migration behavior
version_base="1.2" is no longer accepted, and the following migration paths
have been removed:
hydra.types.TargetConfhas been removed. Use a Structured Config with a_target_field.- The
hydra.experimentalcompose and initialization APIs have been removed. Import them fromhydra. hydra.job.chdir=nullis no longer accepted. Set it toTrueorFalse.- Direct callers of the internal
run_job()API must passhydra_context. - Third-party Sweepers must use the
HydraContextsupplied tosetup()to access the config loader. - Optuna Sweeper's deprecated
hydra.sweeper.search_spaceconfiguration has been removed. Usehydra.sweeper.params.
Instantiation
- A
dictorDictConfigcall-site argument tohydra.utils.instantiate()replaces a plain mapping configured for that target parameter instead of merging into it. As an exception, a dictionary overriding a Structured Config node is merged and schema-validated. Configured target values also retain merge behavior, regardless of whether recursive instantiation is enabled. See Instantiate resolution and call-site overrides. hydra.utils.instantiate()passes dataclass and attrs instances supplied as call-site arguments through unchanged instead of interpreting them as Structured Configs.hydra.utils.instantiate()rejects???and interpolation syntax in plain Python call-site overrides. Supply concrete runtime values or explicit OmegaConf containers instead.hydra.utils.instantiate()resolves interpolations during recursive traversal instead of resolving the entire configuration before instantiation. With_recursive_=False,_convert_="none", and no call-site overrides, Config containers are passed through without a final copy. See Instantiate resolution and call-site overrides.- Launcher and sweeper plugin configurations are instantiated non-recursively.
- Some security-sensitive modules can no longer be instantiated by default. This restriction is not a security boundary; do not rely on it to make untrusted configurations safe.
OmegaConf 2.4
- Python 3.6, 3.7, 3.8, and 3.9 are no longer supported. OmegaConf requires Python 3.10 or newer.
- Native tuples create immutable
TupleConfigvalues instead of mutableListConfigvalues, and conversion returns tuples instead of lists. See the OmegaConf tuple migration guide. OmegaConf.create(None)returnsNoneinstead of aDictConfigwrappingNone.OmegaConf.get_type()returnsNoneTypefor nodes containingNone, andNoneandNoneTypeannotations are validated.OmegaConf.resolve()raisesInterpolationToMissingValueErrorwhen an interpolation dereferences a missing (???) value instead of replacing the node with???.OmegaConf.to_container(..., resolve=True)resolves a custom resolver at most once per resolved node during a conversion pass. Code relying on repeated side effects from the same resolver may behave differently.- A backslash immediately before a key-path delimiter now escapes that delimiter. This changes the interpretation of key paths involving keys whose names end in a backslash.