菜单

文件选择和项目结构

相关源文件

本文档介绍了 gpt-engineer 项目中的文件组织方式以及文件选择功能的使用。文件选择是一项关键功能,它允许用户在改进现有代码库时指定应考虑哪些文件。有关整体命令行界面的信息,请参阅 CLI 和 Agent 系统

项目结构概览

gpt-engineer 以特定的目录结构组织项目,其中包含用户创建的文件和存储在隐藏目录中的元数据。理解此结构对于有效使用该系统至关重要。

图示:项目目录结构

来源:gpt_engineer/core/default/paths.py43-52 gpt_engineer/applications/cli/file_selector.py54

项目目录包含:

  • 用户文件:您的源代码、文档和其他项目文件
  • .gpteng:一个元数据目录(隐藏),其中存储:
    • memory/:运行时信息和模型交互记录
    • file_selection.toml:选定文件的配置文件
    • 日志文件:各种日志,包括生成输出、调试信息
    • run.sh:生成的运行项目入口脚本

文件选择系统

文件选择系统允许用户指定 AI 在改进现有代码时应考虑哪些文件。这很重要,因为:

  1. 通过排除无关文件,防止 token 限制溢出
  2. 通过集中注意力于相关文件,提高 AI 性能
  3. 允许精细控制代码库的哪些部分会被修改

图示:文件选择过程

来源:gpt_engineer/applications/cli/file_selector.py79-121 gpt_engineer/applications/cli/file_selector.py123-211

使用文件选择功能

当您在改进模式下运行 gpt-engineer 时(gpte <project_dir> -i),文件选择过程会自动激活。工作流程如下:

  1. .gpteng 元数据目录中创建一个 file_selection.toml 文件,或者使用现有的文件。
  2. 此文件将在您的默认文本编辑器中打开。
  3. 文件最初是被注释掉的(以 # 开头)。
  4. 您需要取消注释(移除 #)您想要包含的文件。
  5. 您也可以在该文件中配置 linting(代码规范)选项。
  6. 保存并关闭后,gpt-engineer 会显示所选文件的树形视图。
  7. 只有选定的文件才会被加载到内存并发送给 AI 模型。

TOML 文件结构如下所示:

# Remove '#' to select a file or turn off linting.

# Linting with BLACK (Python) enhances code suggestions from LLMs. 
# To disable linting, uncomment the relevant option in the linting settings.

# gpt-engineer can only read selected files. 
# Including irrelevant files will degrade performance, 
# cost additional tokens and potentially overflow token limit.

[linting]
# "linting" = "off"

[files]
# "main.py" = "selected"
# "utils.py" = "selected"
# "README.md" = "selected"

来源:gpt_engineer/applications/cli/file_selector.py54-64 gpt_engineer/applications/cli/file_selector.py271-307

文件过滤和项目组织

FileSelector 使用几种机制来过滤文件:

忽略的文件夹和文件

默认情况下,以下目录会被忽略:

  • site-packages
  • node_modules
  • venv
  • __pycache__
  • 隐藏目录(以 . 开头)
  • 名为“prompt”的文件

Git 集成

如果项目是 Git 仓库,则文件选择器会遵守 .gitignore 规则,过滤掉不应被跟踪的文件。这是通过以下方式实现的:

  1. 检查目录是否为 Git 仓库
  2. 如果是,则应用 .gitignore 规则来过滤文件列表。
  3. 这确保了临时文件、构建产物和其他非必要文件不会被包含在内。

图示:文件过滤过程

来源:gpt_engineer/applications/cli/file_selector.py53 gpt_engineer/applications/cli/file_selector.py379-416 gpt_engineer/core/git.py58-68

DisplayablePath 和树形可视化

在文件选择之后,gpt-engineer 使用 DisplayablePath 类显示所选文件的树形表示。这提供了关于哪些文件将包含在改进过程中的可视化确认。

示例输出

You have selected the following files:
/path/to/project
├── main.py
├── utils/
│   ├── helpers.py
│   └── config.py
└── README.md

DisplayablePath 类通过以下方式创建此树状结构:

  1. 构建文件系统层次结构的表示
  2. 添加适当的前缀和缩进以显示结构
  3. 生成清晰显示目录和文件的可视化树。

来源:gpt_engineer/applications/cli/file_selector.py419-540

系统集成

文件选择系统与 gpt-engineer 的其他几个组件集成。

图示:文件选择在系统中的上下文

来源:gpt_engineer/applications/cli/file_selector.py35-121 gpt_engineer/core/git.py10-85 gpt_engineer/core/linting.py1-64

与代码 Linting 集成

文件选择过程还允许用户切换代码 Linting。默认情况下,Python 文件会使用 Black 格式化程序进行 Linting,以确保样式一致性,这通常有助于 AI 提供更好的建议。用户可以在 TOML 配置文件中禁用 Linting。

文件选择中的 Linting 状态会影响 AI 生成后文件的处理方式。

  1. 启用 Linting 时(默认),Python 文件会自动使用 Black 进行格式化。
  2. 禁用时,将使用 AI 的原始输出,不进行额外格式化。

来源:gpt_engineer/core/linting.py6-64 gpt_engineer/applications/cli/file_selector.py64 gpt_engineer/applications/cli/file_selector.py177-180

文件选择最佳实践

在使用 gpt-engineer 改进现有代码时,为获得最佳结果:

  1. 要有选择性:仅包含与您要进行的更改直接相关的文件。
  2. 包含上下文:确保包含提供上下文的文件(例如,接口、基类)。
  3. 排除生成代码:跳过生成文件(如构建产物、编译输出或自动生成代码)。
  4. 注意 token 限制:注意选定文件的总大小,以避免 token 限制问题。
  5. 使用 Git 跟踪:将您的项目初始化为 Git 仓库,以利用基于 .gitignore 的过滤。
  6. 组织您的项目:将代码组织在逻辑的目录结构中,以便于选择。

文件选择在改进工作流程中的作用

当使用 gpt-engineer 改进现有代码时,文件选择过程在更大的工作流程中按如下方式进行:

  1. 用户运行 gpte <project_dir> -i 以启动改进模式。
  2. FileSelector 通过 TOML 配置提示用户选择文件。
  3. 选定的文件加载到 FilesDict 对象中。
  4. AI 模型接收选定的文件作为上下文。
  5. AI 生成代码改进(如果合适,则生成 diff)。
  6. 输出被写回到选定的文件中。
  7. 可选的 Linting 被应用以格式化代码。

此过程确保 AI 获得进行有针对性改进所需的精确上下文,而不会因无关代码而感到不知所措。

来源:gpt_engineer/applications/cli/file_selector.py79-121

结论

gpt-engineer 中的文件选择和项目结构系统为用户提供了对 AI 处理文件的精细控制。通过了解这些系统的运作方式,用户可以有效地组织他们的项目并选择正确的文件,以在生成或改进代码时取得最佳结果。