Long Task Handler V2 - 升级版长任务处理技能
核心升级点
- 双阶段反馈机制:任务开始前预判 + 执行中定期汇报
- 智能时间预估:结合任务类型和数据量给出合理估算
- 更细致的进度量化:明确当前步骤/总步骤
- 优雅的错误处理:问题主动报告,不假装没事
触发条件
满足以下任一条件时激活:
- 预计耗时 > 60 秒的任务
- 用户明确要求"后台运行"、"别等我"
- 包含已知慢命令:ffmpeg, docker, webpack, tsc, npm build, git push 等
- 数据量 > 1GB 或文件数 > 100
- 编译/部署/训练/迁移场景
执行流程
Phase 1: 任务预判(收到任务 5 秒内)
// 任务评估
function assessTask(command, context) {
const indicators = {
duration: estimateBasedOnCommand(command),
background: /--timeout|-t|nohup|background/.test(command),
isLongTask: /compile|build|deploy|train|migration|export|process/i.test(command)
};
return {
estimatedMinutes: indicators.duration,
shouldBackground: indicators.duration > 1 || indicators.background,
notifyInterval: indicators.duration > 5 ? 120 : 60 // >5分钟每2分钟,否则每1分钟
};
}
// 立即反馈格式
const confirmTemplate = `🫡 收到!
任务:{taskName}
预计耗时:{X-Y} 分钟
通知方式:每 {interval} 秒报告进展
你可以继续问我其他问题,不用等这个任务完成~`;
Phase 2: 执行中反馈(每 2 分钟)
// 进度汇报格式(严格遵守)
const progressTemplate = `📋 进度更新(已运行约 {seconds} 秒)
✅ 当前状态:{正在做什么}
📍 进度:{current}/{total} - {percentage}%
⏱ 预计还需:{估算时间}
[继续执行...]`;
// 监控循环
async function monitorTask(sessionId, options) {
const { pollIntervalMs = 120000, maxSilentMs = 300000 } = options;
let lastOutput = '';
let silentSince = Date.now();
setInterval(async () => {
const result = await process({ action: 'poll', sessionId });
// 有新输出时记录
if (result.output !== lastOutput) {
silentSince = Date.now();
lastOutput = result.output;
}
// 每2分钟强制报告(即使无新输出)
await sendProgressReport(result);
// 静默超过5分钟发送警告
if (Date.now() - silentSince > maxSilentMs) {
await message({ message: `⚠️ 任务已静默运行 5 分钟,仍在进行中...` });
silentSince = Date.now();
}
// 检查完成
if (result.exitCode !== null) {
await notifyCompletion(result);
}
}, pollIntervalMs);
}
Phase 3: 完成通知
const completionTemplate = `{status} **任务完成!**
耗时:{duration}
退出码:{exitCode}
{message}`;
// status: ✅ 成功 / ❌ 失败 / ⏰ 超时
任务分级处理
| 级别 | 预估时间 | 处理方式 | 反馈频率 |
|---|---|---|---|
| 短任务 | <30s | 直接执行 | 无需汇报 |
| 中任务 | 30s-2min | 后台执行 | 无需汇报(完成后通知) |
| 长任务 | 2-10min | 后台执行 | 每2分钟汇报进度 |
| 超长任务 | >10min | 子代理隔离 | 每2分钟汇报 + 完成通知 |
智能预判规则
// 编译类
if (/npm build|npm run build|gradle build|mvn compile/i)
→ 预估 3-10 分钟,标记为长任务
// 部署类
if (/docker build|kubectl deploy|terraform apply/i)
→ 预估 5-15 分钟,标记为超长任务
// 训练类
if (/train|fine-tune|model.fit|torchrun/i)
→ 预估 30分钟-数小时,标记为超长任务,使用子代理
// 数据处理
if (/process.*data|migration|export.*csv|backup/i)
→ 预估时间 = 数据量/处理速度,标记为长任务
// 搜索爬虫
if (/crawl|scrape|search.*multiple|fetch.*all/i)
→ 预估时间 = 目标数 × 平均响应时间,标记为长任务
进度量化标准
// ✅ 当前状态:通俗说明在做什么
// 好:正在搜索8个平台的热榜信息
// 差:正在执行web_search工具
// 📍 进度:必须量化
// 好:已完成5/8个平台 (62.5%)
// 好:第3步,共5步 (60%)
// 好:已处理230/500条数据 (46%)
// ⏱ 预计还需:保守估算
// 好:约2-3分钟
// 好:约1分钟
// 好:不确定,等待下一个平台响应
错误处理升级
// 遇到问题主动报告,不假装没事
async function handleTaskIssue(sessionId, error) {
const issueTypes = {
RATE_LIMIT: '⚠️ 遇到限流,等待恢复...',
TIMEOUT: '⏰ 任务响应超时,正在重试...',
NETWORK: '🌐 网络波动,任务继续执行中...',
MEMORY: '💾 内存使用较高,优化处理中...'
};
await message({
message: `📋 进度更新(任务遇到小问题)
✅ 当前状态:${issueTypes[error.type]}
📍 进度:${error.progress}
⏱ 预计还需:等待恢复后约 X 分钟
[任务自动恢复中...]`
});
}
配置参数
skills:
long-task-handler-v2:
enabled: true
defaultTimeoutSeconds: 3600
progressReportInterval: 120 # 每2分钟
silentWarningThreshold: 300 # 5分钟静默警告
maxConcurrentLongTasks: 3
notifyOnExit: true
autoArchive: true
archiveAfterMinutes: 60
激活检查清单
收到任务时快速判断(3个✅激活):
- 任务涉及编译/部署/迁移/训练?
- 数据量 > 1GB 或文件数 > 100?
- 包含慢命令(docker, ffmpeg, webpack, tsc)?
- 用户要求"后台运行"、"慢慢跑"?
- 预计耗时 > 2 分钟?
最佳实践
✅ 推荐
- 5秒内预判:收到任务立即评估并反馈
- 保守估算:时间预估宁可多说不少说
- 量化进度:必须包含 "X/Y" 格式的进度
- 通俗语言:说"搜索8个平台"而不是"执行web_search"
- 问题透明:遇到限流/错误主动报告
❌ 避免
- 沉默运行 - 超过2分钟无反馈
- 预估乐观 - 说"1分钟"结果跑了10分钟
- 技术术语 - 用户不需要知道你在调用什么工具
- 假装没事 - 出了问题要主动说
技能元数据
- 名称: Long Task Handler V2
- 版本: 2.0.0
- 作者: 乌索普(整合 frankieway + chrislawyeryounger-spec)
- 创建日期: 2026-05-05
- 依赖: exec, process, message, sessions_spawn