xtekky/gpt4free · error · FileNotFoundError

PA provider file not found

Error message

PA provider file not found: {file_path}

What it means

Raised by load_pa_provider when the given path does not exist (Path.exists() is false). This is the entry point that loads a sandboxed PA provider file, so it is the first sanity check before extension and execution checks. The message embeds the exact path for quick diagnosis.

Solutions

  1. Verify the path exists before calling: Path(p).is_file()
  2. Use absolute paths built from the workspace directory rather than cwd-relative paths
  3. Re-register/re-point the provider after moving or renaming the file

Example fix

# before
load_pa_provider('myprov.pa.py')  # relative, wrong cwd

# after
load_pa_provider(get_workspace_dir() / 'myprov.pa.py')
Defensive patterns

Strategy: validation

Validate before calling

from pathlib import Path
p = Path(file_path)
assert p.is_file(), f"missing PA provider file: {p}"

Try / catch

try:
    provider_cls = load_pa_provider(path)
except FileNotFoundError:
    provider_cls = None  # log and skip / re-register with correct path

Prevention

When it happens

Trigger: Calling load_pa_provider with a typo'd path, a relative path resolved against the wrong working directory, or a file that was moved/deleted after registration.

Common situations: MCP tool invocations referencing a stale workspace path; scripts run from a different cwd so a relative path no longer resolves; provider files renamed from .py to .pa.py leaving old references.

Related errors


AI-assisted analysis of xtekky/gpt4free@973504e177 (2026-08-14). Data as JSON: /api/errors/1fc4dcfcd06ab037. Report an issue: GitHub.

Appendix: source

Thrown at g4f/mcp/pa_provider.py:746

    The file is executed inside the safe sandbox.  The module is expected to
    define a class named ``Provider``; if that name is absent the first class
    with a ``create_completion`` or ``create_async_generator`` attribute is
    returned instead.

    Args:
        file_path: Path to the ``.pa.py`` file.

    Returns:
        The provider class, or ``None`` if none could be found.

    Raises:
        FileNotFoundError: If *file_path* does not exist.
        ValueError: If *file_path* does not end with ``.pa.py``.
        RuntimeError: If the file fails to execute.
    """
    file_path = Path(file_path)
    if not file_path.exists():
        raise FileNotFoundError(f"PA provider file not found: {file_path}")
    if not file_path.name.endswith(".pa.py"):
        raise ValueError(f"File must have .pa.py extension: {file_path}")

    code = file_path.read_text(encoding="utf-8")
    result = execute_safe_code(code, file_path=file_path, timeout=0.1, max_depth=100)

    if not result.success:
        raise RuntimeError(
            f"Failed to load PA provider from {file_path}:\n{result.error}"
        )

    # Prefer an explicit 'Provider' name
    provider_class = result.locals.get("Provider")
    if provider_class is not None:
        return provider_class

    # Fall back to any class that looks like a provider
    for obj in result.locals.values():

View on GitHub (pinned to 973504e177)