llmcodegen/issues/concurrent-generation.issue

36 lines
3.7 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 需求工单:并发代码生成
name: 并发代码生成
description: |
当前工具在初始化项目时,按照 design.json 中列出的文件顺序逐个生成代码,即只有前一个文件生成完成后才开始下一个文件的生成。
这种串行方式在文件数量较多或网络延迟较高时效率低下。我们希望改为基于依赖关系的并发生成:在解析 design.json 获得文件列表和依赖关系后构建一个有向无环图DAG当某个文件的所有依赖文件都已生成完毕即前置条件满足立即启动该文件的生成任务调用 LLM多个文件可以并行生成。
特别要求:`utils.py` 文件应被视为所有其他 Python 文件的隐式依赖项。这意味着在依赖图中,每个非 `utils.py` 的文件都自动依赖于 `utils.py`,因此 `utils.py` 必须先生成,然后其他文件才能开始并发生成。这样可确保公共工具函数在依赖它的模块生成时已可用。
需要实现以下功能:
- 解析 design.json 中的 files 数组,提取每个文件的 path 和 dependencies依赖的文件路径列表
- 构建依赖图时,自动为所有非 `utils.py` 的文件添加对 `utils.py` 的依赖(如果 `utils.py` 存在于文件列表中且不是自身)。
- 计算每个文件的入度(依赖数),并考虑上述隐式依赖。
- 使用一个任务队列(如 asyncio 或 concurrent.futures并发执行生成任务初始时入度为0的文件即无依赖的文件其中 `utils.py` 通常入度为0可以立即开始生成。
- 每当一个文件生成完成成功或失败更新依赖它的其他文件的入度当入度变为0时将其加入待执行队列。
- 生成任务应使用独立的 LLM 客户端实例(或复用连接池)进行并发请求,需注意 API 并发限制(可配置)。
- 支持限制最大并发数(例如通过 --max-concurrency 参数或配置文件中的 max_concurrent_requests
- 生成过程中仍需保存断点续写状态(.llm_generator_state.json记录每个文件的生成状态pending、generating、success、failed
- 错误处理:某个文件生成失败不应影响其他文件的生成(除非是依赖失败导致下游无法生成),最终汇总失败信息。
- 命令行输出需展示并发进度(如 rich 进度条),显示已完成/总数。
acceptance_criteria:
- 当 design.json 中包含多个无相互依赖的文件时,它们应同时开始生成。
- **必须确保 `utils.py` 在所有其他 Python 文件之前生成,确保`utils.py` 是其他所有文件的上下文**。
- 当存在其他依赖链时,依赖项必须先生成完成,然后才能开始生成依赖它们的文件。
- 并发数可通过配置或命令行参数控制,默认值为 5。
- 生成过程中中断后重新运行,能根据状态文件恢复未完成的任务,并继续并发执行。
- 所有生成的代码内容与串行方式生成的代码一致(即并发不影响生成逻辑)。
- 日志中记录每个文件的生成开始时间、结束时间及所用 LLM 调用时长。
- 如果某个文件生成失败(例如 LLM 返回错误),在最终汇总中显示,并允许用户选择是否重试或跳过。
affected_files:
- src/llm_codegen/core.py # CodeGenerator 类和生成核心逻辑
- src/llm_codegen/cli.py # init 命令的主流程
- src/llm_codegen/models.py # 可能需要定义任务状态枚举
- src/llm_codegen/utils.py # 可能添加图构建、并发控制辅助函数
- pyproject.toml # 可能新增配置项 max_concurrent_requests