Coordinate multi-step detached tasks as one durable TaskFlow job with owner context, state, waits, and child tasks.
复制安装指令,让 AI 自动完成配置 · 推荐新手
请帮我安装 askskill 上的 "taskflow" 技能: 1. 下载 https://raw.githubusercontent.com/openclaw/openclaw/main/skills/taskflow/SKILL.md 2. 保存为 ~/.claude/skills/taskflow/SKILL.md 3. 装好后重载技能,告诉我可以用了
Use TaskFlow when a job needs to outlive one prompt or one detached run, but you still want one owner session, one return context, and one place to inspect or resume the work.
currentStep, stateJson, and waitJsonIt does not own branching or business logic. Put that in Lobster, acpx, or the calling code.
Canonical plugin/runtime entrypoint:
api.runtime.tasks.flowapi.runtime.taskFlow still exists as an alias, but api.runtime.tasks.flow is the canonical shapeBinding:
api.runtime.tasks.flow.fromToolContext(ctx) when you already have trusted tool context with sessionKeyapi.runtime.tasks.flow.bindSession({ sessionKey, requesterOrigin }) when your binding layer already resolved the session and delivery contextManaged-flow lifecycle:
createManaged(...)runTask(...)setWaiting(...) when waiting on a person or an external systemresume(...) when work can continuefinish(...) or fail(...)requestCancel(...) or cancel(...) when the whole job should stopstateJson as the persisted state bag. There is no separate setFlowOutput or appendFlowOutput API.flow.revision after each successful mutation.runTask(...) links the child task to the flow. Use it instead of manually creating detached tasks when you want parent orchestration.const taskFlow = api.runtime.tasks.flow.fromToolContext(ctx);
const created = taskFlow.createManaged({
controllerId: "my-plugin/inbox-triage",
goal: "triage inbox",
currentStep: "classify",
stateJson: {
businessThreads: [],
personalItems: [],
eodSummary: [],
},
});
const classify = taskFlow.runTask({
flowId: created.flowId,
runtime: "acp",
childSessionKey: "agent:main:subagent:classifier",
runId: "inbox-classify-1",
task: "Classify inbox messages",
status: "running",
startedAt: Date.now(),
lastEventAt: Date.now(),
});
if (!classify.created) {
throw new Error(classify.reason);
}
const waiting = taskFlow.setWaiting({
flowId: created.flowId,
expectedRevision: created.revision,
currentStep: "await_business_reply",
stateJson: {
businessThreads: ["slack:thread-1"],
personalItems: [],
eodSummary: [],
},
waitJson: {
kind: "reply",
channel: "slack",
threadKey: "slack:thread-1",
},
});
if (!waiting.applied) {
throw new Error(waiting.code);
}
const resumed = taskFlow.resume({
flowId: waiting.flow.flowId,
expectedRevision: waiting.flow.revision,
status: "running",
currentStep: "finalize",
stateJson: waiting.flow.stateJson,
});
if (!resumed.applied) {
throw new Error(resumed.code);
}
taskFlow.finish({
flowId: resumed.flow.flowId,
expectedRevision: resumed.flow.revision,
stateJson: resumed.flow.stateJson,
});
Use the flow runtime for state and task linkage. Keep decisions in the authoring layer:
business -> post to Slack and waitpersonal -> notify the owner nowlater -> append to an end-of-day summary bucket…
通过 OpenAI 音频转写接口,将语音录音快速转成文本或说话人分段结果。
帮助你自动控制网页流程,处理多步骤操作、登录检查与标签页管理。
快速生成概念、架构、流程与白板图,支持 SVG、HTML 或 Excalidraw 格式
帮助维护者分诊、清理并解决 GitHub 中的 OpenClaw 密钥泄露告警。
帮助定位 OpenClaw 测试中的内存增长、堆泄漏与 OOM 根因
帮助开发与运维团队运行、排查并总结 OpenClaw 发布 CI 与发布前检查流程