ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Conductor 工作流如何调用远程 A2A Agent(AGENT 任务)?

Conductor 工作流如何调用远程 A2A Agent(AGENT 任务)? Conductor 工作流如何调用远程 A2A AgentAGENT 任务【免费下载链接】conductorConductor is an event driven agentic workflow engine providing durable and highly resilient execution engine for applications and AI Agents项目地址: https://gitcode.com/GitHub_Trending/co/conductor如果你的工作流需要调用一个部署在别处的 A2AAgent2Agent远程 Agent——比如官方的a2a-sdk参考 Agent 或其他框架实现的 A2A 服务——Conductor 提供了AGENT这类持久化系统任务来完成这件事工作流向远程 Agent 发送message/send由引擎负责轮询、超时、重试和重启恢复远程 Agent 的返回结果状态、文本、artifacts会作为该任务的 output 供下游任务引用。本文的完整操作路径是启用 AI 集成 → 准备一个可被调用的 A2A Agent → 编写并注册包含AGENT任务的工作流 → 运行 → 核对任务输出。主要依据是 A2A 集成文档 与 A2A 端到端测试说明。前置条件启用 AI 集成并放行 Agent 地址AGENT、GET_AGENT_CARD、CANCEL_AGENT这几个任务要求 Conductor 开启 AI 集成默认关闭conductor.integrations.ai.enabledtrue同时注意文档中的 SSRF 防护agentUrl解析到 loopback、RFC-1918 私有网段、link-local 或 IPv6 unique-localfc00::/7地址时会被拒绝云元数据地址则始终被阻断。开发环境里调用本机 Agent如http://localhost:9999需要额外打开conductor.a2a.client.allow-private-networktrue打开该开关后云元数据地址依然被拒。文档建议生产环境优先用网络层出口防火墙控制访问。如果任务报错信息包含… SSRF blocked就是这一层拦截按上面处理即可。准备一个可被调用的远程 A2A Agent测试目标要真正跑通链路你需要一个真实的 A2A 服务端点。仓库自带一个基于官方 Pythona2a-sdk的最小 echo Agentecho_agent.py。副作用说明下面的命令会创建一个 Python 虚拟环境并联网安装a2a-sdk与uvicorn需要uv工具。它不修改 Conductor 仓库本身只在本机准备一个独立的 Agent 进程。uv venv --python 3.12 uv pip install a2a-sdk0.2,0.3 uvicorn AGENT_MODEtask python ai/src/test/resources/a2a/echo_agent.py # serves http://localhost:9999AGENT_MODEtask表示该 Agent 返回一个 A2A Task可轮询AGENT_MODEmessage则直接返回一条 message。该 Agent 起在http://localhost:9999其 Agent Card 位于/.well-known/agent-card.json。如果你有自己部署的 A2A 服务直接把它的基础 URL 当agentUrl用即可——工作流只需要这一个信息。编写工作流AGENT 任务的定义与关键输入agentType决定AGENT任务调用哪一类运行时agentType: a2a默认——调用远程 Agent2Agent 端点agentUrl即本文场景agentType: conductor——按name运行已部署的 Conductor Agent见 Conductor Agents。它不是用来选框架OpenAI Agents、Google ADK、LangGraph 等的无法识别的值会直接让任务失败。完整输入字段参照A2ACallRequest本文用到的字段如下字段说明agentTypea2a默认调远程端点conductor运行已部署 Conductor Agent其他值被拒绝agentUrl远程 Agent 基础 URL必填text/prompt单文本 part 的简写parts/message完整 A2A 消息多 part / data part替代textcontextId、taskId续接已有会话 / 恢复远程 Agent 任务多轮headers每次调用的 HTTP 头如鉴权凭据建议走工作流 input/secrets 而不是硬编码pollIntervalSecondspoll 模式的轮询间隔默认 5streamingtrue→ 消费message/streamSSE并聚合到完成pushNotificationtrue→ 任务完成时由 Agent 回调 Conductor 的 webhookmaxDurationSeconds绝对截止时间默认 86400maxPollFailures容忍的连续瞬时轮询失败次数默认 30示例工作流仓库内ai/examples/10-a2a-call-agent.json展示了最小形态{ name: a2a_agent, version: 1, schemaVersion: 2, tasks: [ { name: call_currency_agent, taskReferenceName: agent, type: AGENT, inputParameters: { agentType: a2a, agentUrl: http://localhost:9999, text: convert 100 USD to EUR, pollIntervalSeconds: 5, headers: { Authorization: Bearer ${workflow.input.agentToken} } } } }上面的${workflow.input.agentToken}是模板表达式启动工作流时通过 input 传入如果你的 Agent 不需要鉴权删掉整个headers块即可。文档还给出一个更完整的参考工作流a2a_interop_echo先用GET_AGENT_CARD发现 Agent 的 card再调用它agentUrl和 prompt 作为工作流输入同一份定义可以对接任意 A2A Agent{ name: a2a_interop_echo, version: 1, schemaVersion: 2, description: Discover a remote A2A agent, then call it., ownerEmail: a2aexample.com, tasks: [ { name: discover_agent, taskReferenceName: discover, type: GET_AGENT_CARD, inputParameters: { agentUrl: ${workflow.input.agentUrl} } }, { name: call_agent, taskReferenceName: call, type: AGENT, inputParameters: { agentUrl: ${workflow.input.agentUrl}, text: ${workflow.input.prompt}, pollIntervalSeconds: 2 } } ] }GET_AGENT_CARD从/.well-known/agent-card.json解析找不到时回退到旧路径/.well-known/agent.json返回解析后的 skills/capabilities可喂给 LLM 在运行时选 skill。注册并运行工作流把上面的定义保存为a2a_interop_echo.json然后注册、启动# register curl -X POST localhost:8080/api/metadata/workflow \ -H Content-Type: application/json -d a2a_interop_echo.json # run against a reachable A2A agent curl -X POST localhost:8080/api/workflow/a2a_interop_echo \ -H Content-Type: application/json \ -d {agentUrl:http://localhost:9999,prompt:convert 100 USD to EUR}这里agentUrl指向前面启动的 echo Agentlocalhost:9999替换成你自己的 A2A 服务地址即可。验证调用结果仓库的 interop 演示脚本 用下面的方式查询工作流状态与任务输出轮询到终态curl -sS localhost:8080/api/workflow/workflowId判定成功的依据来自 A2A 测试说明 的 Full-server verification工作流状态为COMPLETEDAGENT任务的 output 携带 Agent 返回的state、text、artifacts、taskId、contextId。AGENT任务的 output下称agent.output字段为stateA2A 任务状态、taskId与contextId用于恢复、artifacts、text提取出的文本、agentMessage以及完整task对象。完成调用时文档给出的示例输出文档示例非固定预期{ state: completed, taskId: task-7f3a, contextId: ctx-7f3a, text: 100 USD 92.40 EUR, artifacts: [ { artifactId: result, parts: [ { kind: text, text: 100 USD 92.40 EUR } ] } ] }下游任务用${agent.output.text}、${agent.output.taskId}等表达式引用这些值。仓库还提供了一个端到端演示脚本 run-interop-demo.sh要求 Java 21、curl、uv或已装a2a-sdk的A2A_VENV不需要 Docker、Redis 或 API key。副作用说明它会删除/tmp下的conductor-a2a-interop*状态文件、在/tmp创建 Python venv 并安装依赖、启动本地 Conductor端口 7002与 echo Agent端口 9998进程退出时自动终止这两个进程。运行它可以直接看到文档给出的预期输出示例workflow status : COMPLETED discovered agent: Echo Agent agent state : completed agent reply : echo-task: convert 100 USD to EUR ✓ Conductor discovered and called a real third-party A2A agent. That is A2A interop.长任务三种执行模式怎么选AGENT任务是非阻塞的快速回复立即完成长任务进入IN_PROGRESS后被轮询期间不占 worker 线程重启也能恢复。三种模式Poll默认——任务为IN_PROGRESS按pollIntervalSeconds通过tasks/get轮询轮询之间不占线程调用在重启后存活。Streamingstreaming: true——消费 Agent 的 SSE 流并聚合事件要求 Agent Card 声明capabilities.streamingtrue否则行为退化为 poll。流期间占线程文档建议交互式/短流场景用 streaming长任务优先 poll 或 push。PushpushNotification: true——任务完成时 Agent 回调 Conductor 的 webhook期间不轮询要求配置对外可达的conductor.a2a.callback.url且仍有pushBackstopPollSeconds默认 300兜底轮询防止 webhook 丢失挂死任务。conductor.integrations.ai.enabledtrue conductor.a2a.callback.urlhttps://conductor.example.com失败语义与排查AGENT把远程结果映射到 Conductor 任务状态引擎的正常重试/超时机制随之生效。重试会复用确定性的messageId由workflowInstanceId referenceTaskName iteration派生对按messageId去重的 Agent 相当于 effectively-once 投递。失败原因记录在task.reasonForIncompletion。条件任务状态会重试HTTP 408/429/5xx、连接/读超时、流中断/空流FAILED是JSON-RPC 瞬时错误如-32603internalFAILED是远程 Agent 任务结束为failed/rejectedFAILED是HTTP 4xx408/429 除外FAILED_WITH_TERMINAL_ERROR否JSON-RPC 终态码-32700/-32600/-32601/-32602/-3200{1..5,7}FAILED_WITH_TERMINAL_ERROR否缺agentUrl/ 空消息 /SSRF 拦截FAILED_WITH_TERMINAL_ERROR否超过maxDurationSeconds或连续maxPollFailures次轮询失败FAILED_WITH_TERMINAL_ERROR否文档给出的常见现象对照现象原因 / 处理… SSRF blockedagentUrl解析到私有/loopback/元数据地址。用公网 URL或为可信/开发环境设conductor.a2a.client.allow-private-networktrue云元数据始终拦截streaming: true却表现为 pollAgent Card 是capabilities.streamingfalse客户端只在 Agent 声明支持时才走流N 次轮询失败后失败Agent 不可达——调大maxPollFailures或检查连通性挂起后在截止时间失败Agent 在maxDurationSeconds内未到达终态多轮交互input-required与取消远程任务到达input-required或auth-required时AGENT任务会完成并在 output 中带出 Agent 的问题与taskId/contextId。工作流按状态分支SWITCH再用相同的taskId和contextId发一个新AGENT任务带回答案——这是恢复同一个远程任务而不是开新会话。完整示例见 29-a2a-client-multi-turn.json。取消运行中的远程 Agent 任务用CANCEL_AGENT引用前一步拿到的 taskId{ name: cancel_agent_task, taskReferenceName: cancel, type: CANCEL_AGENT, inputParameters: { agentUrl: https://currency-agent.example.com, taskId: ${agent.output.taskId} } }下一步AGENT是普通持久化任务可用常规 Conductor 算子编排多个 AgentFORK_JOIN并行调用多个 Agent、JOIN汇合结果每条分支各自 crash-safe。仓库内的相关示例10-a2a-call-agent.json — poll 模式调用远程 Agent11-a2a-get-agent-card.json — 发现 Agent 的 skills27-a2a-multi-agent.json —FORK_JOIN → JOIN并行多 Agent28-a2a-llm-pick-skill.json — 发现 → LLM 选 prompt → 调用反向场景把 Conductor 工作流暴露为 A2A Agent 供外部客户端调用与流式服务端行为见 A2A 集成文档 的 server 部分【免费下载链接】conductorConductor is an event driven agentic workflow engine providing durable and highly resilient execution engine for applications and AI Agents项目地址: https://gitcode.com/GitHub_Trending/co/conductor创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表