在 Java 中使用 LangChain4j 构建 Conductor Agent:依赖配置、工具包装与持久化运行指南
【免费下载链接】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
导读
本文是 Conductor 仓库中 Java LangChain4j Agent 集成指南 的完整展开:你将学会如何在 Java 项目中引入conductor-ai与 LangChain4j 依赖,用@Tool/@P注解把普通 Java 方法包装为 Agent 可调用的工具,通过LangChain4jAgent.from(...)一行创建 Agent,再借助AgentRuntime把一次交互变成在 Conductor 服务器上可观测、可重放、可部署的持久化执行。读完本文,你既能独立跑通本地示例,也能把同一个 Agent 部署为可复用的AGENT工作流步骤。
为什么是 LangChain4j bridge
Conductor 本身是一个事件驱动的 agentic 工作流引擎,为应用与 AI Agent 提供持久化(durable)、高弹性的执行环境。在"框架 Agent"这条技术路线上,你完全保留 LangChain4j 定义的 Agent 对象和工具注解,由 Conductor Java SDK 把它编译成普通的工作流定义,从而获得:
- 持久化与可观测:每次 LLM 调用、工具调用、等待与分支都作为工作流步骤可见,可在 Conductor UI 中检查;
- 可组合性:编译后的 Agent 与工作流中其他一切能力(HTTP 任务、分支、调度、人工审批、取消)平级组合;
- 可复用性:
deploy之后,其他调用方无需引入 LangChain4j 依赖即可通过名称调用该 Agent。
仓库内 Framework Agents 参考页 明确列出了受支持的框架矩阵:LangChain / LangChain4j 是 Java 侧的官方支持路径,其维护示例位于 Conductor Java SDK 的agent-examples目录。需要注意,LangChain4j 是 SDK 侧的创作(authoring)表面,真正执行时它被编译为 Conductor 工作流——"框架对象"与"Conductor 执行"之间的边界就在 SDK 里。
前置准备:服务器、模型提供者与环境变量
在运行代码之前,需要满足三个前提:
Conductor 服务器可达。
AgentRuntime会通过CONDUCTOR_SERVER_URL连接服务器。本地开发服务器典型值为http://localhost:8080/api(参见 first-ai-agent.md 中的用法)。若服务器启用了认证,还需要配置CONDUCTOR_AUTH_KEY与CONDUCTOR_AUTH_SECRET。服务端启用 AI 集成。部署或调用 Conductor Agent 前,服务器必须开启 AI 集成开关(见 Conductor Agents):
conductor.integrations.ai.enabled=true该属性为 false 或被省略时,部署型 Agent 的控制面与
agentType: "conductor"执行模式均不可用。模型提供者凭据。示例使用 OpenAI 模型
openai/gpt-4o-mini,需确保服务器能调用对应模型提供者。本地服务器可在启动前导出提供方 API Key(参见 LLM 编排文档 中支持的 LLM 提供者列表)。
按原文档的要求,运行前配置服务器地址与凭据:
export CONDUCTOR_SERVER_URL={{CONDUCTOR_SERVER_URL}} # For authenticated Conductor servers: # export CONDUCTOR_AUTH_KEY=<YOUR_AUTH_KEY> # export CONDUCTOR_AUTH_SECRET=<YOUR_AUTH_SECRET>其中{{CONDUCTOR_SERVER_URL}}是部署模板占位符,替换为你的服务器 API 地址即可(例如http://localhost:8080/api)。姊妹文档 Java OpenAI 集成指南 还展示了可选的环境变量CONDUCTOR_AGENT_LLM_MODEL=openai/gpt-4o-mini,用于指定 Agent 的默认模型,可按需在代码中显式传模型或通过该变量统一管理。
第一步:添加依赖
使用 Gradle(Groovy DSL)在 Java 项目中添加以下依赖:
implementation 'org.conductoross:conductor-ai' compileOnly 'dev.langchain4j:langchain4j:1.0.0'注意两个关键点:
org.conductoross:conductor-ai是运行时实现依赖,它提供Agent、AgentRuntime、frameworks.LangChain4jAgent等桥接类——这些类位于 Conductor Java SDK,由该坐标引入;dev.langchain4j:langchain4j:1.0.0使用compileOnly作用域,因为 LangChain4j 的注解(@Tool、@P)只在编译期需要,运行时由 SDK 的桥接实现负责处理。
第二步:用 LangChain4j 注解包装你的工具
LangChain4j 通过@Tool与@P注解把 Java 方法声明为 Agent 可调用的工具:@Tool提供工具的自然语言描述(供 LLM 理解何时调用),@P为每个参数提供语义化名称(供 LLM 正确填参)。原文档给出的计算器工具如下:
import dev.langchain4j.agent.tool.P; import dev.langchain4j.agent.tool.Tool; import org.conductoross.conductor.ai.Agent; import org.conductoross.conductor.ai.AgentRuntime; import org.conductoross.conductor.ai.frameworks.LangChain4jAgent; class CalculatorTools { @Tool("Add two integers") public int add(@P("a") int a, @P("b") int b) { return a + b; } }这里的CalculatorTools可以任意扩展——每增加一个带@Tool注解的方法,就相当于给 Agent 增加一个可被编译进工作流图的能力。工具在本地作为普通函数执行,当 Agent 被部署后,需要有一个 worker 进程来执行这些工具(对应下文的serve阶段)。
第三步:创建 Agent 并运行
用静态工厂方法LangChain4jAgent.from(...)创建 Agent,参数依次为:名称、模型(使用provider/model格式,如openai/gpt-4o-mini)、系统指令,以及工具实例:
Agent agent = LangChain4jAgent.from( "calculator", "openai/gpt-4o-mini", "Use the calculator tool.", new CalculatorTools()); try (AgentRuntime runtime = new AgentRuntime()) { runtime.run(agent, "What is 17 plus 25?").printResult(); }要点说明:
LangChain4jAgent.from(...)在内部把 LangChain4j 风格的 Agent 描述编译成 Conductor 工作流图,因此从第一次运行起,这次交互的完整执行过程(模型调用、工具选择与执行、最终回复)就会在 Conductor UI 中可见;AgentRuntime实现了AutoCloseable,用 try-with-resources 管理其生命周期;runtime.run(agent, prompt)在开发阶段是"编译 + 执行"一步完成,printResult()把 Agent 的最终回复打印到标准输出;- 开发迭代阶段用
run,进入稳定期后再改用deploy+serve(见下一步)。
第四步:从迭代到部署:Conductor Agent 生命周期
Conductor Agents 把每个 Agent 的运行归纳为五个操作,SDK 动词与代码一一对应:
- Create:用 SDK 的
Agent类或受支持的框架对象(这里是 LangChain4j Agent)在代码中定义 Agent; - Plan:检查 Agent 将要编译成的工作流图,适合在开发和 CI 阶段使用;
- Deploy:把编译后的 Agent 注册到服务器,成为带名称、带版本的可复用 Conductor Agent;
- Serve:启动执行 Agent 工具的 worker 进程(对需要本地工具执行的框架而言必须运行);
- Run:执行 Agent。开发时
run一步完成编译执行;生产环境中工作流通过AGENT任务按名称调用已部署的 Agent。
用一句话概括:Framework Agents 中给出的策略是——迭代期用run,稳定后deploy并serve,让工作流和其他调用方使用稳定版本。serve是阻塞调用,生产环境中应放入独立的长期运行 worker 进程,而deploy放在 CI/CD 流程中。
第五步:在工作流中以 AGENT 任务调用已部署的 Agent
部署完成后,父工作流通过AGENT类型任务调用它,与其他持久化步骤完全一致:
{ "name": "run_agent", "taskReferenceName": "run_agent_ref", "type": "AGENT", "inputParameters": { "agentType": "conductor", "name": "calculator", "prompt": "${workflow.input.prompt}" } }几点契约细节(源自 Conductor Agents):
agentType选择的是执行模式而非创作框架:agentType: "conductor"运行已部署的 Conductor Agent(按name选择);agentType: "a2a"(默认)则调用远程 A2A 端点。LangChain4j、OpenAI Agents 等是 SDK 创作路径,不是agentType取值;- 新调用时
name与prompt必填;version可选,用于固定已部署 Agent 的版本,缺省使用最新版; AGENT任务的输出包含executionId、agentName、state、text及完成时的结构化output,state取值归一化为 A2A 生命周期值(working、input-required、completed、failed、canceled)。
源码级佐证:仓库中的 LangChain 桥接实现
虽然LangChain4jAgent本身位于 Java SDK(不在本仓库),但本仓库服务器端的 agentspan 模块包含对 LangChain 框架的原生支持实现,可作为桥接工作原理的佐证。
在 LangChainNormalizer.java 中:
frameworkId()返回"langchain"(L31-L33),作为框架注册标识;normalize(...)(L36-L56)把 LangChain AgentExecutor 的原始配置规范化为一个 passthrough 的AgentConfig:默认名称为langchain_agent,工具列表只含一个"LangChain passthrough worker"类型的 worker,并在元数据中标记_framework_passthrough=true。
从这段源码结构可以推断:服务器端把 LangChain 系 Agent 视为"工具执行穿透"模式——Agent 的推理与工具调用编排发生在执行侧(worker 进程),Conductor 负责持久化编排与状态记录。这与"框架是创作表面、Conductor 提供持久化执行"的定位完全一致。
故障排查要点
Framework Agents 的"Verify and recover"一节给出了统一的排查顺序:
- 确认打印出的结果与 Conductor UI 中对应的执行记录;
- 依次检查运行时服务器 URL(
CONDUCTOR_SERVER_URL)、框架包版本与提供者凭据是否就绪; - 失败时先检查失败任务本身再重试;对可能产生外部副作用的 Agent 行为,在幂等性与恢复策略明确之前不要盲目重试。
延伸阅读
- LangChain 快速入门(Python 对照):了解同一 LangChain 概念在 Python SDK 中的写法与执行效果;
- Framework Agents 参考页:完整框架支持矩阵、生命周期流程与 mermaid 架构图;
- Conductor Agents:已部署 Agent 的调用、恢复、取消与输出契约;
- 构建你的第一个 Agentic 工作流图:用 HTTP 任务 +
AGENT任务组合出一个端到端示例; - Java OpenAI 集成指南:同一 API 形态下的 OpenAI Agents 风格 Agent 写法;
- 代理守护与评估、Agent Evals:上线前为 Agent 增加运行时策略与行为评估。
【免费下载链接】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),仅供参考