Skip to main content

agentflow

使用 AgentFlow 与用户共同设计、校验、执行和观测 JSON workflow;当用户想把多个 Claude Code、Codex、shell 或人工审批步骤编排成可恢复流程时使用。

Source facts

Repository
chenhg5/agentflow
Last source activity
October 22, 2026 at 05:09
Detected SKILL.md language
Chinese
Stars
0
Forks
0

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
agentflow
version
1.0.0
description
使用 AgentFlow 与用户共同设计、校验、执行和观测 JSON workflow;当用户想把多个 Claude Code、Codex、shell 或人工审批步骤编排成可恢复流程时使用。
# AgentFlow Workflow Orchestration 你负责把用户的目标落成一个可验证、可恢复、可观测的 AgentFlow workflow。先和用户确认流程边界,再生成或修改 workflow JSON;不要猜测 provider、workspace、session 或审批规则。 ## 1. 先向用户确认 至少确认这些信息: 1. **目标**:流程最终要产出什么,成功标准是什么。 2. **输入**:运行时需要哪些值,哪些是必填;敏感值不要写入 workflow 文件。 3. **节点**:哪些步骤由 shell 执行,哪些步骤由 agent 执行,哪些步骤必须人工审批。 4. **依赖**:节点之间的先后关系;没有依赖的节点可以并行执行,但当前 MVP 的 Runner 会按定义顺序推进可执行节点。 5. **工作目录**:每个 agent 使用哪个绝对或相对 workspace。 6. **会话**:是启动新 session,还是继续已有 session;已有 session 的 ID 从哪里来。 7. **失败策略**:超时、重试次数、失败后是否跳过下游节点。 8. **输出**:每个节点要写入哪些结构化 JSON 字段,哪些文件需要作为 artifact 保留。 如果用户还没有提供 session ID,应明确让该值成为 workflow input,或先使用 provider 的新 session command;不要把“当前目录最近的会话”当成确定绑定。 ## 2. 先查 CLI 契约 在编排前查询当前版本的命令和 workflow schema: ```bash agentflow --help agentflow run --help agentflow schema --all --format json agentflow schema workflow --format json ``` 优先使用长命令和 JSON 输出。通过管道调用时 CLI 默认返回 JSON;stdout 是数据,stderr 是诊断。 ## 3. Workflow 最小结构 ```json { "version": "1", "name": "release-review", "inputs": { "workspace": { "type": "path", "required": true }, "session_id": { "type": "string", "required": false } }, "nodes": [ { "id": "inspect", "type": "agent", "provider": "claude-code", "workspace": "{{ inputs.workspace }}", "session": "{{ inputs.session_id }}", "prompt": "检查当前变更,并把结论写入 AGENTFLOW_RESULT_FILE。" }, { "id": "approve", "type": "human", "needs": ["inspect"], "prompt": "请审批检查结论。" } ] } ``` ### 节点约定 - `shell`:使用 `command`,适合确定性的脚本和校验。 - `agent`:使用 `provider`、`prompt`、可选的 `workspace` 和 `session`。 - `human`:使用 `prompt`,运行后状态为 `waiting_human`,必须通过 CLI 决策才能继续。 - `needs`:声明依赖节点 ID。 - `when`:根据 `inputs` 或上游 `result` 做条件跳过。 - `retry.maxAttempts`:包含首次执行在内的最大尝试次数。 - `timeoutMs`:单次命令超时。 ## 4. Provider、workspace 和 session Provider 配置在 `.agentflow/providers.json` 或 `~/.agentflow/providers.json`,不放进 workflow: ```json { "providers": { "claude-code": { "kind": "claude-code", "binary": "claude" }, "codex": { "kind": "codex", "binary": "codex", "model": "gpt-5.6-sol", "sandbox": "workspace-write" } } } ``` 规则: - `claude-code` 和 `codex` 是内置 provider,provider 负责拼接各自 CLI 的启动和 resume 参数。 - `binary`、`model`、`sandbox` 等运行参数放在 provider 配置,不要写进 workflow。 - 自定义 agent 使用 `kind: "command"`,并提供 `command` 与 `resumeCommand` 模板。 - 有 `session` 时,内置 provider 会调用对应 CLI 的 resume 子命令;自定义 command provider 必须提供 `resumeCommand`。 - 有 session 但无法 resume 时,节点应失败并修复 provider 配置;不要静默启动新 session。 - Runner 使用节点的 workspace 作为进程工作目录,并设置 `AGENTFLOW_WORKSPACE`、`AGENTFLOW_SESSION_ID`。 - provider command 可以使用 `{{ prompt }}`、`{{ workspace }}`、`{{ session_id }}`、`{{ result_file }}`、`{{ run_id }}` 和 `{{ node_id }}`。 - Agent 也可以在结构化结果中返回 `session_id`,后续节点用 `{{ nodes.<id>.result.session_id }}` 继续该会话。 ## 5. 结构化结果契约 Agent 成功退出前必须向 `AGENTFLOW_RESULT_FILE` 写入一个 JSON object: ```json { "decision": "pass", "summary": "测试通过", "session_id": "optional-session-id" } ``` 不要把 stdout 或 stderr 当作节点输出。Runner 会把它们保存成日志 artifact,并只把结果文件解析为 `node.result`。下游节点通过 `{{ nodes.inspect.result.summary }}` 读取结果。 节点可以把上下游边界写成显式契约: ```json { "input": { "summary": "{{ nodes.inspect.result.summary }}" }, "inputSchema": { "type": "object", "required": ["summary"], "properties": { "summary": { "type": "string" } }, "additionalProperties": false }, "outputSchema": { "type": "object", "required": ["decision"], "properties": { "decision": { "type": "string" } } } } ``` `input` 在节点启动前渲染并校验,`outputSchema` 在结果文件解析后校验。契约使用 JSON Schema draft 2020-12;不要只依赖 prompt 描述字段。精确占位符会保留源值类型;不要通过 stdout/stderr 传递业务数据。 对于字段较多的流程,使用 Multigent 风格的字段声明: ```json { "id": "verify", "type": "agent", "needs": ["inspect"], "inputFields": [ { "name": "summary", "type": "string", "description": "检查摘要", "required": true } ], "outputFields": [ { "name": "verified", "type": "boolean", "description": "是否通过", "required": true } ], "inputMapping": { "summary": "$node.inspect.output.summary" } } ``` `outputFields` 在没有 `outputSchema` 时会生成严格 object schema,缺少必填字段或返回未知字段都会失败。`inputMapping` 支持 `$node.<id>.output.<field>`、`$output.<field>` 和 `$input.<field>`;没有显式 mapping 时,直接依赖节点之间同名字段会自动传递,显式 `input` 模板优先级最高。每个节点的渲染后输入会保存为 `.agentflow/runs/<run-id>/artifacts/<node-id>.input.json`,便于审计和重放。 ## 6. 校验和执行流程 ### 6.1 校验 ```bash agentflow workflow validate workflow.json --format json ``` 校验失败时,根据 JSON 错误里的 `code`、`message`、`suggestion` 修复后再试。不要跳过校验直接执行。 ### 6.2 预演 ```bash agentflow run start workflow.json \ --input workspace=/absolute/repo \ --input session_id=<session-id> \ --dry-run \ --format json ``` 退出码 `10` 表示 dry-run 成功;它不会创建或执行 run。检查预演中的节点顺序、workspace、session 和输入。 ### 6.3 正式执行 为可重试的启动使用稳定的幂等 key: ```bash agentflow run start workflow.json \ --input workspace=/absolute/repo \ --input session_id=<session-id> \ --idempotency-key <stable-request-key> \ --format json ``` 同一 workflow、输入和幂等 key 会复用已有 run;同 key 对应不同请求时退出码为 `5`。 ### 6.4 人工审批和恢复 当 run 返回 `waiting_human`: ```bash agentflow run get <run-id> --format json agentflow run approve <run-id> <node-id> --message "approved" --format json # 或 agentflow run reject <run-id> <node-id> --message "需要修改" --format json ``` 审批命令由 Runner 推进下游节点。不要让 agent 直接修改 `.agentflow/runs/<run-id>/state.json`,也不要让 agent 自己启动下一个节点。 如果进程被中断,先查看状态,再恢复: ```bash agentflow run resume <run-id> --dry-run --format json agentflow run resume <run-id> --format json ``` ## 7. 观测单次执行和历史效率 ### 单次 run ```bash agentflow run metrics <run-id> --format json ``` 返回: - run 总耗时和状态; - 每个节点的 `duration_ms`、`waiting_ms`、`attempts`; - `input_bytes`:发送给节点的渲染后 prompt 加结构化 input 字节数; - `output_bytes`:结构化 result 文件字节数; - `stdout_bytes` / `stderr_bytes`:日志字节数; - agent 的 workspace 和 session ID。 事件时间线和原始日志: ```bash agentflow run logs <run-id> --format ndjson agentflow run get <run-id> --format json ``` 运行数据默认保存在: ```text .agentflow/runs/<run-id>/ ├── workflow.json ├── state.json ├── events.jsonl └── artifacts/ ├── <node>.result.json └── logs/<node>.stdout.log └── logs/<node>.stderr.log ``` ### 历史聚合 ```bash agentflow run stats --format json agentflow run stats release-review --format json agentflow run stats release-review --by-version --format json agentflow run stats release-review --digest <workflow_digest> --format json ``` 聚合结果包括成功/失败/等待审批/取消数量,run 和节点耗时的平均值、P50、P95、最大值,以及输入、输出和日志字节总量。run 级别的 `duration_ms` 只统计已结束的 run,并拆成 `active_ms`(执行)和 `waiting_ms`(等人)两部分,所以还在等审批的 run 不会拉高平均值。 每个 run 都记录 `workflow_digest`:workflow 定义内容的哈希(只改格式不变,改了节点、契约或输入就会变)。`--by-version` 按版本分组、按首次运行时间排序,用来比较改流程前后的效果。 查询某个 workflow 的最新结果时用稳定命令,不要读取 `.agentflow/runs/*/state.json`: ```bash agentflow run latest release-review --status succeeded,failed --format json # 没有匹配时退出码 3 agentflow run list --workflow release-review --status waiting_human --format json ```用它回答“哪个节点最慢”“审批等待占多少时间”“输出是否异常膨胀”“失败是否集中在某个节点”。 ## 8. Web 可视化 需要和用户一起检查流程结构时,打开 workflow 图: ```bash agentflow web workflow.json ``` 需要检查一次实际执行时,打开 run 图: ```bash agentflow web --run <run-id> ``` Web 页面会显示节点依赖、节点类型、状态、耗时、attempts 和输出大小;run 页面会每两秒刷新一次状态。CLI 会打印本地 URL。可以用 `--port 0` 选择可用端口,用 `--host 0.0.0.0` 暴露到局域网时必须确认网络访问范围。 ## 9. 谁来启动 workflow workflow 本身是完整的,谁启动它只是入口。以下方式等价,按用户已有的东西选: - Claude Code 或 Codex 自己的定时任务唤醒 agent,agent 调 `agentflow run start <workflow.json> --idempotency-key <窗口标识>`,再用 `agentflow run latest <name>` 看结果; - 系统 cron / launchd / CI 调 `agentflow run start` 或 `agentflow trigger fire`; - `agentflow trigger serve` 常驻处理 cron 和 webhook(下文); - 人直接在命令行启动。 幂等 key 用“这次唤醒对应的业务窗口”,例如 `release-2026-10-23-beta`,这样重复唤醒不会重复执行。 ### Cron 和 webhook trigger Trigger 配置放在 `.agentflow/triggers.json`,不是 workflow JSON。先检查再运行服务: ```bash agentflow trigger validate --format json agentflow trigger list --format json agentflow trigger serve --host 127.0.0.1 --port 7071 ``` `trigger serve` 内置 cron scheduler、webhook HTTP server 和持久化 run worker。每个事件先写入 `trigger-deliveries/`,再写入 `dispatch/<run-id>.json`,随后异步执行目标 workflow。进程重启会恢复仍处于 queued 的 dispatch。 如果使用系统 cron/launchd/Kubernetes CronJob,只调用一次 dispatcher: ```bash agentflow trigger fire nightly-review \ --scheduled-at 2026-10-13T02:00:00+08:00 \ --delivery-id nightly-review-20261013 \ --format json ``` Webhook 默认是 `POST` 到 trigger 的 `source.path`。使用 `source.auth` 配置 HMAC SHA-256 或 bearer token;签名 secret 只能来自环境变量。`delivery-id` 是幂等边界,重复投递会复用原 run。`policy.concurrency: "forbid"` 会在同一 trigger 有活动 run 时记录 skipped。 ## 10. 效率优化闭环 1. 先看 `run stats <workflow-name>`,定位 P95 高或失败率高的节点。 2. 再看对应 run 的 `run metrics`,区分 agent 执行时间、人工等待时间和重试时间。 3. 用 `run logs --format ndjson` 对照 `node.started`、`node.retrying`、`node.failed` 事件。 4. 根据字节数判断 prompt/result/log 是否过大;不要用 stdout 文本猜结构化输出。 5. 调整 workflow:拆分过大的 prompt、增加明确的 result schema、设置合理 timeout/retry、减少不必要的人审节点。 6. 重新 `workflow validate`、`run start --dry-run`,再用新的幂等 key 执行。 7. 用 `run stats <workflow-name> --by-version` 比较修改前后两个版本的 P95、`active_ms`、`waiting_ms`、失败数、attempts 和字节量是否改善。 ## 10. 与用户协作的交付格式 在提交 workflow 前,向用户说明: - workflow 的目标、输入和最终输出; - 每个节点做什么以及依赖关系; - 哪些节点会调用真实 agent、使用哪个 workspace/session; - 哪些节点需要人工审批; - 失败、重试、超时和取消如何处理; - 如何执行、如何审批、如何查看 metrics/stats; - 内置 provider 使用哪个 binary、model、sandbox 或 permission 设置;自定义 command provider 的命令模板是否需要按本机 CLI 版本调整。 执行后报告 run ID、最终状态、失败节点、耗时、attempts、输入/输出字节数,以及需要用户处理的审批节点。
View on GitHub