python-poetry/poetry · error · RuntimeError

{dependency}: unknown direct dependency type {dependency.sou

Error message

{dependency}: unknown direct dependency type {dependency.source_type}

What it means

Raised by Provider.search_for_direct_origin_dependency() when a dependency claims direct-origin status (is_vcs/is_file/is_directory/is_url all false) but source_type is set to an unrecognised value. The else branch fires because none of the known direct-origin handlers matched.

Source

Thrown at src/poetry/puzzle/provider.py:304

        elif dependency.is_vcs():
            dependency = cast("VCSDependency", dependency)
            package = self._search_for_vcs(dependency)

        elif dependency.is_file():
            dependency = cast("FileDependency", dependency)
            package = self._search_for_file(dependency)

        elif dependency.is_directory():
            dependency = cast("DirectoryDependency", dependency)
            package = self._search_for_directory(dependency)

        elif dependency.is_url():
            dependency = cast("URLDependency", dependency)
            package = self._search_for_url(dependency)

        else:
            raise RuntimeError(
                f"{dependency}: unknown direct dependency type {dependency.source_type}"
            )

        if dependency.is_vcs():
            dependency._source_reference = package.source_reference
            dependency._source_resolved_reference = package.source_resolved_reference
            dependency._source_subdirectory = package.source_subdirectory

        dependency._constraint = package.version
        dependency._pretty_constraint = package.version.text

        self._deferred_cache[dependency] = package

        return package

    def search_for(self, dependency: Dependency) -> list[DependencyPackage]:
        """
        Search for the specifications that match the given dependency.

View on GitHub (pinned to 92b74dcfe3)

Solutions

  1. Inspect the dependency's source_type value to identify the unknown type.
  2. If you introduced a new source type, extend search_for_direct_origin_dependency with a matching branch.
  3. Recreate the dependency from a clean pyproject.toml declaration rather than constructing it ad hoc.
  4. Check for a corrupted/edited poetry.lock that produced an odd source_type on load.

Example fix

// before: Dependency with unknown source_type
dep = Dependency(name='x', constraint='*', source_type='ftp')
provider.search_for_direct_origin_dependency(dep)
RuntimeError: unknown direct dependency type ftp

// after: use a supported source_type
dep = Dependency(name='x', constraint='*', source_type='url', url='https://...')
Defensive patterns

Strategy: type-guard

Validate before calling

SUPPORTED = {"vcs", "file", "directory", "url", None}

def source_type_supported(dep) -> bool:
    return getattr(dep, "source_type", None) in SUPPORTED

Type guard

SUPPORTED_DIRECT = {"vcs", "file", "directory", "url"}

def is_known_direct_origin(dep) -> bool:
    return getattr(dep, "source_type", None) in SUPPORTED_DIRECT

Try / catch

from poetry.puzzle.provider import Provider

try:
    provider.search_for_direct_origin_dependency(dep)
except RuntimeError as e:
    if "unknown direct dependency type" in str(e):
        # rebuild dep with a supported source_type
        ...

Prevention

When it happens

Trigger: A Dependency object has source_type set to something other than 'vcs'/'file'/'directory'/'url' (or null) and is passed to search_for_direct_origin_dependency. This is almost always a programmatic/serialisation bug rather than user config.

Common situations: A custom Dependency subclass introducing a new source_type without extending the provider; a dependency deserialised from a malformed lockfile with a garbage source_type; internal code constructing a Dependency with an unrecognised source_type.

Related errors


AI-assisted analysis of python-poetry/poetry@92b74dcfe3 (2026-08-04). Data as JSON: /data/errors/2d2bed38bf207c17.json. Report an issue: GitHub.