在这里插入图片描述

Agent重构50个文件,跑了3小时突然崩溃——所有进度丢失。 即使有上下文压缩的transcripts,Agent也无法精确恢复:哪些文件已修改?哪些待修改?下一步该做什么?本文用Task System实现任务持久化,让Agent从"临时工具"升级为"可恢复的生产系统"。

重启即失忆:跨天任务的噩梦

你让Agent处理一个跨天任务:

Day 1, 17:00: Agent正在重构第15个文件,进度30%
Day 1, 18:00: 你关机下班

Day 2, 09:00: 重新启动Agent
Agent: "你好!我是你的编程助手。今天有什么可以帮你的?"
你: "继续昨天的重构任务"
Agent: "什么是重构任务?"

你: 😱

即使有上下文压缩的transcripts,Agent也无法精确恢复:

  • 哪些文件已修改?
  • 哪些待修改?
  • 中间生成的临时文件在哪?
  • 下一步该做什么?

小李 frustrated: “这就像一个程序员每天下班前把所有代码删掉,第二天从头开始!”

核心洞察:从"会话"到"系统"

聊天软件 vs 项目管理系统

会话(Session)模式像微信聊天:

  • 实时对话,历史记录
  • 但关机后所有上下文丢失
  • 无法分配任务、追踪进度

系统(System)模式像Jira/禅道:

  • 任务持久化到数据库
  • 状态追踪(待办/进行中/已完成)
  • 依赖管理(任务B依赖任务A)
  • 崩溃后可恢复

系统模式

磁盘存储

DAG管理

任务持久化

崩溃可恢复

任务依赖图

执行有序

会话模式

进程结束

内存中的对话

全部丢失

代码实现:Task System核心逻辑(70行)

class TaskSystem:
    """文件持久化的任务管理系统"""
    
    def __init__(self, tasks_dir: Path):
        self.dir = tasks_dir
        self.dir.mkdir(exist_ok=True)
    
    def create_task(self, title: str, description: str, 
                    dependencies: list = None) -> str:
        """创建新任务"""
        task_id = str(uuid.uuid4())[:8]
        task = {
            "id": task_id,
            "title": title,
            "description": description,
            "status": "pending",
            "dependencies": dependencies or [],
            "created_at": datetime.now().isoformat(),
            "updated_at": datetime.now().isoformat(),
            "result": None
        }
        
        # 持久化到JSON文件
        with open(self._task_file(task_id), 'w') as f:
            json.dump(task, f, indent=2)
        
        return task_id
    
    def update_task(self, task_id: str, status: str = None, 
                    result: str = None) -> bool:
        """更新任务状态"""
        task = self.get_task(task_id)
        if not task:
            return False
        
        if status:
            task["status"] = status
        if result:
            task["result"] = result
        
        task["updated_at"] = datetime.now().isoformat()
        
        with open(self._task_file(task_id), 'w') as f:
            json.dump(task, f, indent=2)
        
        return True
    
    def get_next_tasks(self) -> list:
        """获取可执行的任务(依赖已满足)"""
        all_tasks = {t["id"]: t for t in self.list_tasks()}
        ready = []
        
        for task_id, task in all_tasks.items():
            if task["status"] != "pending":
                continue
            
            # 检查依赖是否都已完成
            deps_satisfied = all(
                all_tasks.get(dep, {}).get("status") == "completed"
                for dep in task["dependencies"]
            )
            
            if deps_satisfied:
                ready.append(task)
        
        return ready
    
    def get_task_graph(self) -> str:
        """获取任务依赖图的可视化文本"""
        tasks = self.list_tasks()
        lines = ["Task Dependency Graph:", "=" * 40]
        
        for task in tasks:
            deps = ", ".join(task["dependencies"]) if task["dependencies"] else "None"
            status_emoji = {
                "pending": "⏳",
                "in_progress": "🔄",
                "completed": "✅",
                "failed": "❌"
            }.get(task["status"], "❓")
            
            lines.append(f"{status_emoji} {task['id']}: {task['title']}")
            lines.append(f"   Status: {task['status']}")
            lines.append(f"   Depends on: {deps}")
            if task["result"]:
                lines.append(f"   Result: {task['result'][:50]}...")
            lines.append("")
        
        return "\n".join(lines)

# 全局任务系统实例
task_system = TaskSystem(Path(".tasks"))

关键设计:

  1. 文件持久化:每个任务一个JSON文件,崩溃后可恢复
  2. 状态机:pending → in_progress → completed/failed
  3. DAG依赖检查:确保任务按依赖顺序执行
  4. 可视化:任务依赖图一目了然

运行效果:代码重构项目对比

无Task System(纯内存):

Day 1: Agent工作3小时,重构了15个文件
Day 1 18:00: 关机下班
Day 2 09:00: 重启Agent
Agent: "你好!今天有什么可以帮你的?"
你: "继续重构任务"
Agent: "什么重构任务?"
结果:全部丢失,从头开始

有Task System(持久化):

Day 1: 
- 创建任务:"重构utils.py", "重构models.py", ...
- 完成15个任务,标记为completed
- 35个任务仍在pending
- 关机

Day 2:
- 重启Agent
- 读取.tasks/目录
- 发现35个pending任务
- 从第16个任务继续
结果:断点续传,无损失

给你的团队:生产级Task System

阶段1:单Agent + Task System

  • 实现任务持久化
  • 支持断点续传
  • 单Agent处理复杂项目

阶段2:任务粒度控制

# 错误:一个任务包含太多工作
task = create_task("Refactor entire codebase", "...")
# 结果:运行2小时,进度不明确,崩溃后全部重做

# 正确:细粒度任务,可并行
task1 = create_task("Refactor utils.py", "...")
task2 = create_task("Refactor models.py", "...")
# 可并行、可恢复、进度明确

阶段3:依赖管理

# 任务B依赖任务A
task_a = create_task("Task A", "...")
task_b = create_task("Task B", "...", dependencies=[task_a])

# 自动检测循环依赖
def validate_dag(tasks):
    """验证无循环依赖"""
    # 拓扑排序检查
    # 如有循环,抛出异常

避坑指南

❌ 陷阱1:任务粒度过大

# 错误:一个任务包含太多工作
task = create_task("Refactor entire codebase", "...")
# 结果:运行2小时,进度不明确,崩溃后全部重做

✅ 解决方案:

# 正确:细粒度任务,可并行
task1 = create_task("Refactor utils.py", "...")
task2 = create_task("Refactor models.py", "...")

❌ 陷阱2:循环依赖

# 错误:A依赖B,B依赖A
task_a = create_task("Task A", "...", dependencies=["B"])
task_b = create_task("Task B", "...", dependencies=["A"])
# 死锁!两个任务都永远无法执行

❌ 陷阱3:不及时更新状态

# 错误:任务完成了但不更新状态
# 结果:重复执行,浪费时间

✅ 解决方案:

# 每个任务完成后立即更新
task_system.update_task(task_id, status="completed", result="重构完成")

总结:从玩具到生产系统

Task System解决了Agent开发的终极挑战:

  • 可靠性:崩溃后可恢复,不再"重启即失忆"
  • 可追踪性:任务状态一目了然,审计追踪完整
  • 可规划性:支持复杂项目的任务分解和依赖管理

这就像从"个人脚本"升级为"企业级工作流引擎"——不再是临时工具,而是可依赖的生产系统。


🔥 互动投票:

你的Agent最长跑过多少小时的任务?

  • A. < 1小时(简单任务)
  • B. 1-3小时(中型任务)
  • C. 3-8小时(大型任务)
  • D. > 8小时(跨天任务,需要Task System)
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐