Skip to content

feat: 新增项目自动推进功能(定时调度 + 章节生成流水线)#157

Open
zhangsiqiang519 wants to merge 1 commit into
xiamuceer-j:mainfrom
zhangsiqiang519:feature/project-auto-advancement
Open

feat: 新增项目自动推进功能(定时调度 + 章节生成流水线)#157
zhangsiqiang519 wants to merge 1 commit into
xiamuceer-j:mainfrom
zhangsiqiang519:feature/project-auto-advancement

Conversation

@zhangsiqiang519

Copy link
Copy Markdown

Summary

新增项目自动推进功能,支持按 cron 表达式定时触发章节自动生成,覆盖 one-to-one 和 one-to-many 两种大纲模式的完整流水线。

核心能力

  • 定时调度:30 秒轮询,PostgreSQL 使用 SELECT FOR UPDATE SKIP LOCKED 分布式锁防重复触发,SQLite 自动降级
  • 多阶段编排:自动收集项目状态 → 补齐大纲/章节结构 → 选取候选章节 → 前置检查 → 创建批量任务 → 异步执行正文生成
  • 防御性 Prompt 格式化format_prompt 改用 format_map(defaultdict(str)),用户自定义模板中新增占位符不再导致崩溃
  • 健壮的错误处理:统一 calculate_next_run_at 到 Service 层(ValueError 替代 HTTPException),错误路径 fallback 延迟 1 小时重试,避免调度卡死
  • 前端配置 UI:独立 AutoAdvancementSettings 组件,支持 Cron 可视化/高级编辑、生成策略配置、模型选择、实时状态面板

新增文件

文件 说明
backend/app/models/project_generation_schedule.py 数据模型
backend/app/schemas/project_generation_schedule.py Pydantic schema(expansion_strategyLiteral 联合类型)
backend/app/api/project_generation_schedule.py REST API:GET/PUT/DELETE/POST trigger
backend/app/services/project_generation_automation_service.py 编排服务(900+ 行)
backend/app/services/project_generation_scheduler.py 调度器(轮询 + 行锁)
backend/alembic/versions/*_新增项目自动推进计划.py PostgreSQL + SQLite 迁移
frontend/src/components/AutoAdvancementSettings.tsx 自动推进配置 UI 组件
frontend/src/utils/cronUtils.ts Cron 解析/生成工具函数

修改文件

文件 改动
backend/app/main.py 注册路由 + lifespan 启停调度器
backend/app/database.py 导入 ProjectGenerationSchedule 模型
backend/app/models/__init__.py 导出 ProjectGenerationSchedule
backend/app/services/prompt_service.py format_prompt 改用 format_map 防缺失参数崩溃
frontend/src/pages/SystemSettings.tsx 新增「自动推进」Tab
frontend/src/services/api.ts 添加 projectAutomationApi(含 AbortSignal
frontend/src/App.tsx 移除未使用的 PromptWorkshop 导入

Test plan

  • 通过 PUT /api/project-automation/{project_id} 创建自动推进计划,验证 cron 表达式解析和 next_run_at 计算
  • 通过 POST /api/project-automation/{project_id}/trigger 手动触发,验证大纲生成/续写 + 章节补齐 + 批量任务创建
  • 验证 DELETE /api/project-automation/{project_id} 正确删除计划
  • 验证 expansion_strategy 非法值被 Pydantic 拒绝
  • 验证调度器在 next_run_at 到期时自动触发
  • 验证已存在活跃批量任务时触发返回 skipped_conflict
  • 验证 PostgreSQL 环境下 FOR UPDATE SKIP LOCKED 正常工作
  • 验证 prompt 模板中缺少参数时不会崩溃
  • 验证前端「自动推进」Tab 的 Cron 可视化编辑、保存、删除、触发功能
  • 验证前端时间显示正确转换为用户本地时区

Notes

  • prompt_service.format_prompt 改动影响全局:所有使用该方法的地方都会受益于缺失参数的容错处理
  • 无单元测试:项目本身未配置测试套件,建议后续补充

实现按 cron 表达式定时触发章节自动生成的完整流水线,支持 one-to-one
和 one-to-many 两种大纲模式,包含大纲自动生成/续写、章节结构补齐、
正文批量生成等多阶段编排。

后端新增:
- ProjectGenerationSchedule 数据模型 + Pydantic schema(expansion_strategy
  收紧为 Literal 联合类型)
- REST API:GET/PUT/DELETE/POST trigger(/project-automation/{project_id})
- 调度器:30 秒轮询,PostgreSQL 使用 SELECT FOR UPDATE SKIP LOCKED
  分布式锁防重复触发,SQLite 降级为普通查询
- 编排服务:collect_project_generation_state → _ensure_ready_chapters →
  _select_chapters_for_generation → check_prerequisites →
  _create_scheduled_batch_task → asyncio.create_task 异步执行
- 错误处理:calculate_next_run_at 统一到 Service 层(ValueError 替代
  HTTPException),错误路径 fallback 延迟 1 小时重试
- Alembic 迁移(PostgreSQL + SQLite)

后端修改:
- prompt_service.format_prompt 改用 format_map(defaultdict(str)),
  缺失模板参数自动以空字符串替代,防止用户自定义模板崩溃
- main.py 注册路由 + lifespan 启停调度器
- database.py / models/__init__.py 注册新模型

前端新增:
- AutoAdvancementSettings 组件:完整的自动推进配置 UI(项目选择、
  Cron 可视化/高级编辑、生成策略、模型选择、状态面板、操作按钮)
- cronUtils.ts:Cron 解析/生成工具函数(从 SystemSettings 抽离)
- api.ts:projectAutomationApi(含 AbortSignal 支持)

前端修改:
- SystemSettings.tsx:新增「自动推进」Tab,引入 AutoAdvancementSettings
- App.tsx:移除未使用的 PromptWorkshop 导入

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant