Task Router Skill

Polar Sponsor
爱发电 赞助
.NET 9.0

OpenClaw多智能体系统分布式任务队列,按能力路由任务、跟踪生命周期、协调异步交接、负载均衡...

任务路由器

功能概述

任务路由器是一项面向实际任务的技能,主要用于OpenClaw 多代理系统的任务分配队列;. 中央协调、 自动交接、 基于能力的路由;

核心要点

  • // 快速启动;
  • What This Does.;
  • Core 函数 : 排队: 创建 tas。

使用与执行

它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。

结果检查与注意事项

实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。

任务路由(Task Router)

面向 OpenClaw 多智能体系统的分布式任务队列。提供中心化协调、异步任务交接与基于能力的路由调度。

快速上手

# 安装技能
clawhub install task-router

# 注册智能体
task agent register watson --capabilities "research analysis" --max-concurrent 3

# 创建任务
task create --type research --title "竞品分析" --priority high

# 路由器通过心跳自动运行
# 查看任务状态
task list --status pending
task show task-abc123

功能说明

核心功能:

  • 入队(Enqueue):从任意会话(主会话或子智能体)创建任务
  • 路由(Route):根据智能体能力匹配并分发任务
  • 追踪(Track):监控任务全生命周期(pending → active → complete/failed)
  • 异步协调(Async Coordination):移交工作后异步检查结果
  • 死信处理(Dead Letter):自动处理超时与失败任务
  • 再均衡(Rebalance):迁移卡住的任务,启用备选策略重试

典型用例:

  • 心跳触发创建研究类任务 → 自动路由至 research 智能体
  • 主智能体派生任务 → 异步执行,稍后检查结果
  • 多步骤工作流:任务 A 输出 → 作为任务 B 输入
  • 智能体故障 → 任务自动重新分配至备用智能体
  • 在具备相同能力的多个智能体间实现负载均衡

配置

目录结构

~/.openclaw/task-router/
├── config.yaml           # 路由器设置、超时参数
├── agents.yaml           # 智能体注册表 + 能力声明
├── queue/                # 任务状态存储
│   ├── pending/          # 等待分配
│   ├── active/           # 已分配给智能体
│   ├── completed/        # 成功完成
│   └── failed/           # 失败且重试次数已耗尽
└── logs/
    └── router.log        # 路由决策日志

config.yaml

router:
  check_interval: 30           # 路由器两次运行间隔(秒)
  default_ttl: 3600            # 任务默认超时时间(秒)
  max_retries: 2
  
  strategies:
    default: least-loaded      # 可选值:round-robin | least-loaded | priority
    by_type:
      research: least-loaded
      image_gen: round-robin
      urgent: priority

  health:
    agent_timeout: 300           # 智能体无响应超时(秒),超时后标记为不健康
    task_timeout:
      warning: 1800              # 30 分钟时发出告警
      critical: 3600             # 1 小时后标记为失败

  notifications:
    on_complete: true
    on_fail: true
    channels: [main_session]   # 可扩展支持 Discord 等渠道

agents.yaml(自动维护)

agents:
  watson:
    id: watson
    emoji: 🔬
    capabilities: [research, analysis, web_search]
    max_concurrent: 3
    current_tasks: [task-abc123, task-def456]
    stats:
      completed: 47
      failed: 2
      avg_duration: 180
    health:
      last_ping: 2026-02-13T09:15:00Z
      status: healthy
    
  picasso:
    id: picasso
    emoji: 🎨
    capabilities: [image_gen, image_edit]
    max_concurrent: 2
    current_tasks: []

任务 Schema

id: task-abc123
type: research               # 与智能体 capability 匹配
title: Research Gameye competitors
description: Deep competitive analysis

payload:
  query: Gameye vs competitors
  sources: [web, apollo]
  output_format: markdown
  
created_by: main             # 创建该任务的会话标签
assigned_to: watson          # 路由前为 null
assigned_by: router          # router | manual | agent

created_at: 2026-02-13T09:00:00Z
assigned_at: 2026-02-13T09:05:00Z
started_at: 2026-02-13T09:06:00Z
completed_at: null
expires_at: 2026-02-13T10:00:00Z  # created_at + ttl

priority: high               # low | normal | high | urgent
ttl: 3600                    # 秒
retries: 0
max_retries: 2

dependencies: []             # 阻塞直至所列任务全部完成
blocked_by: []               # 由路由器填充

status: assigned             # pending | assigned | running | complete | failed
result: null                 # 结果文件路径
error: null                  # 失败时的错误信息

metadata:
  source: heartbeat
  tags: [gameye, competitors]

CLI 命令

任务管理

# 创建任务
task create --type research 
  --title "Research Gameye competitors" 
  --data '{"query": "Gameye pricing"}' 
  --priority high 
  --ttl 3600

# 创建带依赖关系的任务
task create --type analysis 
  --title "Analyze research results" 
  --depends-on task-abc123

# 列出任务
task list                    # 所有未完成任务
task list --status pending
task list --assigned-to watson
task list --type research --limit 10
task list --created-after 2026-02-13

# 查看任务详情
task show task-abc123        # 完整详情 + 结果预览

# 任务操作
task cancel task-abc123      # 取消 pending 或 active 状态任务
task retry task-abc123       # 将 failed 任务移回 pending 状态
task reprioritize task-abc123 --priority urgent

# 结果操作
task result task-abc123      # 查看结果文件内容
task export --status completed --since 2026-02-13 > ~/reports/tasks.ndjson

智能体管理

# 注册智能体(路由前必需)
task agent register watson 
  --capabilities "research analysis web_search" 
  --max-concurrent 3 
  --emoji 🔬

# 更新智能体
task agent update watson --add-capability "competitive-analysis"
task agent update watson --max-concurrent 5

# 检查智能体健康状态
task agent status watson     # 当前任务、健康状态、统计信息
task agent ping watson       # 健康检查 ping

# 列出智能体
task agent list              # 所有已注册智能体
task agent list --capable-of research

# 注销智能体
task agent unregister watson --reassign-tasks

路由器控制

# 状态查询
task router status           # 队列深度、智能体健康状态

# 控制流程
task router pause            # 暂停新任务分配
task router resume           # 恢复路由
task router rebalance        # 重新分配卡住的任务

# 维护操作  
task router cleanup          # 归档旧的已完成任务
task router drain            # 完成所有 active 任务,不再接受新 pending 任务

程序化 API

import * as Task from "~/.openclaw/task-router/sdk";

// === 创建任务 ===

// 简单创建
const task = await Task.create({
  type: "research",
  title: "Competitor analysis",
  payload: { query: "Gameye vs competitors" }
});

// 带选项创建
const task = await Task.create({
  type: "image_gen",
  title: "Generate hero image",
  payload: { prompt: "Futuristic game server...", size: "1024x1024" },
  priority: "high",
  ttl: 1800,
  max_retries: 1,
  dependencies: [previousTaskId],  // 先等待这些任务完成
  created_by: "main"
});

// === 查询任务 ===

// 获取状态
const status = await Task.status(task.id);
// { id, status, assigned_to, created_at, expires_at }

// 等待完成(阻塞式)
const result = await Task.wait(task.id, { timeout: 300, pollInterval: 5 });

// 按条件查询列表
const pending = await Task.query({
  status: "pending",
  type: "research",
  priority: "high",
  limit: 10
});

const myTasks = await Task.query({
  created_by: "main",
  status: ["assigned", "running"]
});

// === 智能体集成 ===

// 智能体主动领取任务(禁用自动分配时使用)
await Task.claim({
  agentId: "watson",
  capableOf: "research",
  limit: 1
});

// 标记任务完成
await Task.complete(task.id, {
  result_path: "~/agents/watson/memory/results/competitors.md",
  summary: "Found 5 competitors: GameLift, Multiplay, Hathora, Edgegap, Agones",
  metadata: { competitors_count: 5 }
});

// 标记任务失败
await Task.fail(task.id, {
  reason: "API quota exceeded",
  retryable: true  // 将自动重试
});

// === 多步骤工作流 ===

// 串行任务链
const analysisTask = await Task.chain(researchTask.id, {
  type: "analysis",
  title: "Analyze research findings",
  payload: { input_task: researchTask.id }
});

// 并行任务
const tasks = await Task.parallel([
  { type: "research", title: "Research A", payload: {} },
  { type: "research", title: "Research B", payload: {} },
  { type: "research", title: "Research C", payload: {} }
]);
await Task.waitAll(tasks.map(t => t.id));

// === 智能体会话集成 ===

// 通过任务路由器派生(推荐用于异步工作)
const spawnResult = await Task.spawn({
  taskId: task.id,
  agentId: "watson",      // 可选:若省略则自动路由
  useSession: true      // 使用 sessions_spawn 而非 sessions_send
});

// 路由器将调用:
// sessions_spawn({ agentId, task, label: task.id })

HEARTBEAT 集成

创建 ~/.openclaw/workspace/HEARTBEAT.md:

# Task Router Heartbeat

## 路由器周期(每 30 秒运行一次)
```typescript
import * as Task from "~/.openclaw/task-router/sdk";

// 1. 自动路由 pending 任务
const routed = await Task.router.cycle();
if (routed.length > 0) {
  Task.log(`Routed ${routed.length} tasks:`, routed.map(t => `${t.id} → ${t.assigned_to}`));
}

// 2. 检查超时任务
const timeouts = await Task.router.checkTimeouts();
for (const task of timeouts) {
  if (task.retries < task.max_retries) {
    Task.log(`Retrying ${task.id} after timeout`);
    await Task.retry(task.id);
  } else {
    Task.log(`Dead lettering ${task.id}`);
    await Task.router.moveToDeadLetter(task);
  }
}

// 3. 检查智能体健康状态
const unhealthy = await Task.agents.checkHealth();
for (const agent of unhealthy) {
  // 重新分配其任务
  await Task.router.reassignFrom(agent.id);
}

// 4. 完成任务通知
const recent = await Task.query({
  status: "completed",
  completed_after: Date.now() - 60000  // 过去一分钟内
});
for (const task of recent) {
  if (task.created_by === "main") {
    sessions_send({
      message: `✅ Task complete: ${task.title}\nResult: ${task.result}`
    });
  }
}

路由策略

策略 适用场景 说明
round-robin 均衡负载 轮询遍历智能体
least-loaded 防过载 选择当前活跃任务数最少的智能体
fastest 对延迟敏感 选择历史平均完成时间最短的智能体
priority 紧急任务 优先按 priority 排序
sticky 顺序型工作 关联任务始终分配给同一智能体
# config.yaml
strategies:
  default: least-loaded
  
  # 按任务类型指定策略
  by_type:
    research: least-loaded      # 避免单个研究员过载
    image_gen: round-robin      # 均衡 GPU 利用率
    urgent: priority             # 总是选择最优智能体
    
  # 自定义规则
  rules:
    - if: priority == urgent
      then: fastest
    - if: tags includes "sticky"
      then: sticky

任务生命周期详解

PENDING ──assign──→ ASSIGNED ──ack──→ RUNNING ──complete──→ COMPLETE
   │           │          │              │                      │
   │           │          │              └──fail────┐            │
   │           │          │                        ↓            │
   │           │          │                     FAILED ──retry──┘
 timeout      │       timeout        (if retries < max)        │
   │           │          │                (else dead letter)    │
   │           │          │                                     │
   └───────────┴──────────┘─────────────────────────────────────┘

状态定义:

  • pending:已创建,等待路由器分配
  • assigned:已路由至智能体,等待其确认接收
  • running:智能体已确认,正在执行中
  • complete:成功完成,结果可用
  • failed:最终失败(重试次数已耗尽)
  • dead_letter:永久失败,需人工介入审查

死信队列(Dead Letter Queue)

当任务重试次数耗尽时:

~/.openclaw/task-router/dead-letter/
├── task-failed-001.yaml       # 含最终错误状态的任务定义
├── task-failed-002.yaml
└── index.yaml                 # 供管理员审查的汇总信息
# 查看失败任务
task dead-letter list
task dead-letter show task-failed-001

# 可执行操作
task dead-letter retry task-failed-001      # 强制重试
task dead-letter reassign task-failed-001 --to watson
task dead-letter archive task-failed-001   # 确认并归档

最佳实践

任务设计:

  • 保持 payload 可 JSON 序列化(避免循环引用)
  • 在 payload 中包含输出格式提示
  • 使用 dependencies 实现真正严格的任务顺序
  • 设置合理的 TTL(避免无限期阻塞)

智能体设计:

  • 初始注册能力时应尽量精确窄泛
  • 设置保守的 max_concurrent 值
  • HEARTBEAT 应定期检查已分配任务
  • 务必完成「确认 → 完成 / 失败」完整闭环

协同模式:

  • 使用 Task.spawn() 实现 fire-and-forget 场景
  • 使用 Task.wait() 在用户需要即时结果时阻塞等待
  • 将复杂逻辑拆分为链式依赖任务,而非单一巨型任务
  • 由路由器统一处理重试逻辑,智能体无需自行实现

多智能体示例

// 用户提问:“调研竞品并生成一份演示文稿”

// 主智能体(即你)负责编排:

// 1. 创建研究任务
const research = await Task.create({
  type: "research",
  title: "Research Gameye competitors",
  payload: { query: "Gameye vs competitors" }
});

// 2. 创建分析任务(依赖 research)
const analysis = await Task.create({
  type: "analysis",
  title: "Analyze competitive landscape",
  dependencies: [research.id],
  payload: { input_task: research.id }
});

// 3. 创建图像任务(独立、异步)
const images = await Task.parallel([
  { type: "image_gen", title: "Competitor comparison chart", payload: {} },
  { type: "image_gen", title: "Market positioning diagram", payload: {} }
]);

// 4. 创建演示文稿任务(依赖上述全部任务)
const deck = await Task.create({
  type: "presentation",
  title: "Gameye competitive analysis deck",
  dependencies: [analysis.id, ...images.map(i => i.id)],
  payload: { 
    research: analysis.id,
    images: images.map(i => i.result)
  }
});

// 5. 等待最终结果
const result = await Task.wait(deck.id, { timeout: 600 });

// 最终效果:协调 4 个智能体、执行 5 个任务、自动处理依赖关系

故障排查

# 无任务被路由?
task router status           # 是否处于 paused 状态?
task agent list             # 是否存在健康智能体?
task list --status pending  # 是否有任务在等待?

# 任务卡住?
task show task-abc123        # 检查 assigned_to、started_at 字段
task agent status watson     # 智能体是否健康?

# 智能体未领取任务?
# - 检查该智能体的 HEARTBEAT 是否包含任务轮询逻辑
# - 验证 sessions_send 向该智能体发送消息是否正常

# 失败过多?
task dead-letter list       # 审查失败模式
task router logs            # 查看路由决策日志

# 清空全部(慎用)
task router drain           # 等待所有 active 任务完成
task list --status pending | xargs task cancel
task dead-letter clear

运行要求

  • OpenClaw 环境,需支持 sessions_send / sessions_spawn / sessions_list
  • 各智能体需在 HEARTBEAT.md 中正确实现任务轮询逻辑
  • 可选:若 HEARTBEAT 不可靠,可通过 cron 定时运行路由器

未来扩展方向

  • 指标(Metrics):兼容 Prometheus 的统计指标
  • Web UI:本地 Web 控制台(localhost:3333)
  • 插件(Plugins):Slack/Discord 通知支持
  • 优先级队列(Priority Queues)

相关专题

更多
Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

2026.11.06

0

12

Postman请求头Headers怎么设置
Postman请求头Headers怎么设置

围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。

2026.11.06

0

13

Postman接口请求发送教程
Postman接口请求发送教程

详细介绍Postman接口请求的创建与发送方法,涵盖GET和POST请求、URL配置、请求参数、Headers请求头、Body请求体设置以及响应结果查看,帮助用户掌握Postman接口请求的完整操作流程。

2026.11.06

0

10

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

2026.11.05

0

12

DBeaver安全防护教程大全
DBeaver安全防护教程大全

DBeaver安全防护专题,围绕数据库连接安全、账号密码保护和访问权限管理展开,整理SSL/TLS加密连接、SSH隧道、数据库凭据保存及证书验证等配置方法,同时介绍敏感信息保护、远程连接风险和高权限账号使用等注意事项,帮助用户提高数据库日常管理的安全性。

2026.11.05

0

12

DBeaver连接创建与配置教程
DBeaver连接创建与配置教程

本专题聚焦DBeaver数据库连接配置与管理,覆盖从新建连接、选择数据库类型到填写连接参数和验证连接的完整流程。针对MySQL、PostgreSQL、SQL Server等常见数据库,整理相应的连接设置方法,并提供驱动缺失、认证失败和连接异常等问题的排查方向。

2026.11.04

0

16

XORM框架结构体映射与表结构同步
XORM框架结构体映射与表结构同步

本专题围绕XORM框架的结构体映射展开,说明表名与字段的命名策略、xorm标签常用属性、主键自增与时间字段自动填充,并演示Sync2自动建表、增量字段升级、索引声明与反向生成结构体的完整流程。

2026.11.04

0

15

XORM框架安装配置与数据库连接
XORM框架安装配置与数据库连接

本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。

2026.11.04

0

15

XORM框架安装配置与数据库连接
XORM框架安装配置与数据库连接

本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。

2026.11.04

0

16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习