microsoft/semantic-kernel · error · FileNotFoundError

File not found in repository.

Error message

File {path} not found in repository.

What it means

Raised by RepoFilePlugin.read_file_by_path when open(path) raises FileNotFoundError. The path is resolved relative to the repository root (four levels up from the plugin file). The original FileNotFoundError is caught and re-raised with a descriptive message.

Solutions

  1. Verify the relative path against the actual repository root layout.
  2. Confirm the plugin file's location so the four '..' hops resolve to the intended base; adjust if the file was relocated.
  3. Use read_file_by_name if you only know the filename and want a tree search.
  4. Normalize/validate the path and check existence with os.path.exists before open().

Example fix

// before
plugin.read_file_by_path('src/main.py')

// after
base = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', '..', '..'))
target = os.path.normpath(os.path.join(base, 'src/main.py'))
if not os.path.isfile(target):
    raise FileNotFoundError(f'File not at {target}')
plugin.read_file_by_path('python/samples/.../src/main.py')
Defensive patterns

Strategy: validation

Validate before calling

import os
base = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', '..', '..'))
target = os.path.normpath(os.path.join(base, rel_path))
if not os.path.isfile(target):
    raise FileNotFoundError(f'File not at {target}')
with open(target) as f:
    return f.read()

Type guard

import os
def is_valid_repo_path(rel_path: str) -> bool:
    base = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', '..', '..'))
    target = os.path.normpath(os.path.join(base, rel_path))
    return os.path.isfile(target) and target.startswith(base)

Try / catch

try:
    return plugin.read_file_by_path(rel_path)
except FileNotFoundError as ex:
    # fall back to name-based search or inform the model
    raise

Prevention

When it happens

Trigger: Calling the kernel function with a relative path that does not exist under the repo root; path traversal that escapes the expected tree; the file lives outside the resolved base directory.

Common situations: An LLM hallucinates a file path; the plugin's relative base assumption (.. x4) is wrong after the file is moved; case-sensitivity mismatches on case-insensitive dev machines vs Linux.

Related errors


AI-assisted analysis of microsoft/semantic-kernel@c028a0c7dc (2026-08-13). Data as JSON: /api/errors/e9ceca9c72f78b0f. Report an issue: GitHub.

Appendix: source

Thrown at python/samples/demos/document_generator/plugins/repo_file_plugin.py:25


class RepoFilePlugin:
    """A plugin that reads files from this repository.

    This plugin assumes that the code is run within the Semantic Kernel repository.
    """

    @kernel_function(description="Read a file given a relative path to the root of the repository.")
    def read_file_by_path(
        self, path: Annotated[str, "The relative path to the file."]
    ) -> Annotated[str, "Returns the file content."]:
        path = os.path.join(os.path.dirname(__file__), "..", "..", "..", "..", path)

        try:
            with open(path) as file:
                return file.read()
        except FileNotFoundError:
            raise FileNotFoundError(f"File {path} not found in repository.")

    @kernel_function(
        description="Read a file given the name of the file. Function will search for the file in the repository."
    )
    def read_file_by_name(
        self, file_name: Annotated[str, "The name of the file."]
    ) -> Annotated[str, "Returns the file content."]:
        path = os.path.join(os.path.dirname(__file__), "..", "..", "..", "..")
        for root, dirs, files in os.walk(path):
            if file_name in files:
                print(f"Found file {file_name} in {root}.")
                with open(os.path.join(root, file_name)) as file:
                    return file.read()
        raise FileNotFoundError(f"File {file_name} not found in repository.")

    @kernel_function(description="List all files or subdirectories in a directory.")
    def list_directory(
        self, path: Annotated[str, "Path of a directory relative to the root of the repository."]

View on GitHub (pinned to c028a0c7dc)