关于 agently-dynamic-task
这项技能指导开发者使用 Agently 构建和执行动态任务图,涵盖 DAG 规划或提交、验证、处理器解析与运行。
主要功能
- 01通过 Facade 规划并运行任务 DAG
- 02从 YAML 或 JSON 加载 DAG
- 03验证依赖关系与任务架构
- 04解析自定义处理器
- 05用占位符连接运行时输入
适用场景
- 01根据用户目标规划任务图
- 02运行审核过的 YAML 或 JSON 图
- 03将依赖结果传入后续任务
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ agentera/ agently-skills --skill agently-dynamic-task安装后在 Claude Code 中输入/agently-dynamic-task确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
examples/minimal.pyoutputs/expected.mdreferences/overview.mdscripts/check.py详细介绍
Agently 动态任务
当问题属于动态任务图时使用此技能:模型或应用提交必须经过规划、验证、剪枝、解析到处理器并执行的 DAG 数据。
TaskDAG 是 Agently 的 DAG 基础能力。动态任务是当前基于 TaskDAG 规划与执行的兼容性与便捷外观,不是 TriggerFlow 的子 API,也不是战略性 Agent 任务生命周期。TriggerFlow 是 TaskDAGExecutor 之下的执行基底,而 Agently.create_dynamic_task(...) 是当前面向应用的外观入口;agent.create_dynamic_task(...) 仍是面向旧版提示词快照调用方的兼容外观,不是默认指导。
当更底层的证据或运行时可视化很重要时,请使用 TaskDAGExecutor.compile_blocks(...) 或 async_run_blocks(...):TaskDAG 仍然掌管图验证、依赖语义和语义输出;Blocks 仅将已验证的 DAG 片段降级为基于 TriggerFlow 的 ExecutionBlockGraph,并映射 EvidenceEnvelope/ResultAdapter 输出。默认的 TaskDAGExecutor.async_run(...) 路径不经过 Blocks;它直接将已验证的 DAG 编译到 TriggerFlow。
原生优先规则
- 当普通应用代码需要紧凑门面时,使用
Agently.create_dynamic_task(...) - 当 DAG 是更广泛业务任务中的一个阶段时,独立运行该 DAG, 并将其快照作为证据传给 AgentExecution;不要 将 DynamicTask 暴露为 AgentExecution 路由候选,也不要将 Dynamic Task 门面变成长期运行的 AgentTask 生命周期所有者
- 仅当需要分阶段控制时,才拆分为
AgentlyTaskDAGPlanner、TaskDAGValidator、TaskDAGResolver和TaskDAGExecutor - 当调用方需要 Blocks 生命周期证据路径时,使用
TaskDAGExecutor.compile_blocks(...)或async_run_blocks(...);不要绕过TaskDAGValidator,也不要将 Blocks 视为 DAG 所有者 - 当调用方已拥有 DAG 且应跳过模型规划时,使用
plan=<TaskDAG> - 当提交的 DAG 是经过审查的配置产物时,使用
TaskDAG.from_yaml(...)或TaskDAG.from_json(...) - 使用提交的 DAG
inputs占位符进行小型运行时接线:${INIT}/${INIT.foo}用于初始图输入,${DEPS.task_id.path}用于依赖结果,${STATE...}用于 执行本地状态,${TRIGGER...}用于原始 TriggerFlow 触发 载荷。槽位名称不区分大小写,但示例应使用大写。 整字符串占位符保留原始值类型;嵌入式 占位符会字符串化到周围文本中。缺失的运行时路径在执行期间 失败关闭 - 当提交的 DAG 通过
create_dynamic_task(...)或TaskDAGExecutor运行时,保持${INIT...}连接到该门面/执行器拥有的提交图输入。 不要在新示例中使用旧的 AgentExecution 本地 DynamicTask 钩子;AgentExecution 通过 TaskGraph 和 ExecutionGraph 规划普通工作。 - 当模型必须生成 DAG 时,使用
planner=<agent-or-provider-settings> - 使用
model=<agent-or-provider-settings>作为模型任务执行资源 - 对于本地/自定义任务,使用
handlers={"risk_check_handler": handler};处理程序名称应显式,通常以_handler结尾 - 仅当规划器应被允许使用这些任务类型时,才传递
actions=...或skills=...;不要默认暴露它们 - 对于模型拥有的语义输出,使用 Agently 输出模式,而不是用示例本地 JSON/代码块解析器解析模型文本
- 在示例中保持后端业务系统调用可模拟,但保持模型拥有的规划、分类、起草、评估、修订和最终响应生成由模型驱动
- 要求每个重要的模型任务都有清晰的输出模式,可以通过门面级
output_schema或节点级inputs.output_schema实现 - 当生成或提交计划时,按结果类型设置模型任务
inputs.output_format: 省略它以让请求读取prompt.default_output_format(全局默认json);对于紧凑的机器控制数据、操作 参数、路由标志、独立布尔值/数字、严格提取、 模型评判以及密集的全类型数组/对象,使用json;对于扁平字符串长 文本/代码/HTML/SVG/Markdown/SQL/模板,使用xml_field;当可接受重试延迟时,对于与类型化列表/对象/布尔值/数字字段混合的长 散文/代码字段,显式使用hybrid;仅为了旧版 节标题兼容性,显式使用flat_markdown;仅当有意需要 YAML 目标文档时,显式使用yaml_literal;仅当 目标模型通过代表性稳定性检查后,可接受结构模式驱动选择和重试延迟时,使用auto。qwen2.5:7b 检查 发现 hybrid 可能省略节标题或将旧脚手架注释回显到文本 字段中 - 让
TaskDAGValidator在执行前拒绝重复 ID、缺失依赖、循环、不支持的必要任务类型、模式版本不匹配、不安全副作用策略以及未知的必要处理程序 - 仅当未知可选处理程序不影响必要的语义输出、必要的下游节点、审批或副作用策略时,才允许修剪它们
- 将生成的计划数据保留在执行输入或执行状态中;不要使用共享 TriggerFlow 流数据作为每次运行的 DAG 状态
- 对于小型声明式输入
接线,使用
${INIT...}/${DEPS...}占位符;对于较大的转换,将逻辑保留在处理程序或模型任务中 - 不要教规划器将内部解析器条目(如
validate或emit)用作普通任务类型 - 不要仅仅因为普通只读模型任务调用 LLM 提供商就将其标记为网络副作用
- 除非用户明确要求审批,否则不要为分析、综合、起草或最终响应模型任务添加审批门
API 形态
提交的 DAG:
from agently import Agently
async def risk_check_handler(context):
return {
"task_id": context.task.id,
"deps": dict(context.dependency_results),
}
task = Agently.create_dynamic_task(
target="review policy",
plan={
"graph_id": "review",
"task_schema_version": "task_dag/v1",
"tasks": [
{"id": "extract", "kind": "local", "binding": "risk_check_handler"},
{
"id": "final",
"kind": "local",
"binding": "risk_check_handler",
"depends_on": ["extract"],
"inputs": {
"source": "${INIT}",
"extract_result": "${DEPS.extract}",
},
},
],
"semantic_outputs": {"final": "final"},
},
handlers={"risk_check_handler": risk_check_handler},
)
snapshot = await task.async_start(timeout=10)
result = snapshot["semantic_outputs"]["final"]
由配置支持的提交 DAG:
from agently import Agently
from agently.core import TaskDAG
graph = TaskDAG.from_yaml("plans/review.yaml")
task = Agently.create_dynamic_task(
target="review policy",
plan=graph,
handlers={"risk_check_handler": risk_check_handler},
)
snapshot = await task.async_run(graph_input={"doc": "policy"}, timeout=10)
对 JSON/JSON5 文件或原始内容使用 TaskDAG.from_json(...)。两个加载器都支持
task_dag_key_path="plans.review",用于从更大的配置中选择一个 DAG。使用
graph.get_yaml(path) 或 graph.get_json(path) 导出规范化后的图。
自动规划的 DAG:
from agently import Agently
task = Agently.create_dynamic_task(
target=user_goal,
planner=planner_agent,
model=worker_agent,
output_schema={
"answer": (str, "final user-facing answer", True),
},
)
graph = await task.async_plan(max_retries=3)
task.validate(graph, strict_schema_version=True)
snapshot = await task.async_run(graph_input={"goal": user_goal}, timeout=30)
更底层的集成:
from agently.builtins.plugins import AgentlyTaskDAGPlanner
from agently.core import TaskDAGExecutor, TaskDAGResolver, TaskDAGValidator
resolver = TaskDAGResolver({"risk_check_handler": risk_check_handler})
validator = TaskDAGValidator(resolver)
planner = AgentlyTaskDAGPlanner(validator=validator)
graph = await planner.async_plan(planner_agent, {"target": "review policy"})
validation = validator.validate(graph, strict_schema_version=True)
snapshot = await TaskDAGExecutor(resolver, validator=validator).async_run(graph)
规划器约束
规划器插件和规划器提示词必须声明:
- 任务 schema 版本,通常为
task_dag/v1 - 允许的任务类型和可用的绑定名称
- 必需的语义输出叶子节点
- 当场景存在实际限制时的最大任务数量
- 会成为可重试的模型输出失败的校验检查
- 禁止行为:不稳定的任务 id、将依赖结果嵌入静态任务输入、隐式副作用、隐藏的 action/skill 使用,以及内部 resolver 任务类型
facade 规划器应接入 .output(planner.output_schema(), format="json")、必需的
planner.ensure_keys() 以及 .validate(planner.validate_output),以便结构性问题在执行前成为模型输出校验失败。编译/运行仍会重新校验图。
层级归属:
TaskDAG/TaskDAGNode数据契约和 YAML/JSON 图配置属于agently.types.dataTaskDAGExecutor、TaskDAGValidator和TaskDAGResolver属于核心层AgentlyTaskDAGPlanner作为插件关注点,负责规划器输出 schema、ensure keys 和规划器指令Agently.create_dynamic_task(...)是面向应用的 facade 入口;agent.create_dynamic_task(...)仅为兼容性指引
反模式
- 不要把 Dynamic Task 指南放在 TriggerFlow 下,就好像它是 TriggerFlow 语法一样
- 不要为提交的 DAG 数据手写调度器
- 当 Agently 输出 schema 可以负责形状时,不要用
json.loads(...)、正则标记分割或代码块提取来解析模型文本 - 默认不要向规划器暴露
actions或skills - 在推荐示例中,不要把模型负责的分类、起草、质量检查或最终响应生成隐藏在确定性的本地替代方案背后
- 当
Agently.create_dynamic_task(...)已足够时,不要在普通应用代码中调用底层的TaskDAGExecutor - 不要把 Blocks 描述为 TaskDAG 执行的必需项;普通的
async_run(...)路径是直接的,而 Blocks 需要显式的compile_blocks(...)/async_run_blocks(...) - 不要使用诸如
risk_check这样含糊的 handler 名称;请使用risk_check_handler或其他能描述可调用角色名称的名字 - 不要在此处重复 TriggerFlow 文档;只需说明 Dynamic Task 在内部编译为 TriggerFlow
接下来阅读
references/overview.mdexamples/minimal.py