人工智能AI AgentAgent 框架工具调用Agent 工作流RAGMCP Clients强化学习【免费下载链接】agent-core-javaopenJiuwen agent core Java是 openJiuwen Core的 Java版本提供AI Agent开发、运行、调优与演进相关的全套SDK能力。项目地址https://gitcode.com/openJiuwen/agent-core-java点击查看免费下载导读com.openjiuwen.core.runner.resourcemanager.AgentMgr是 openJiuwen agent-core-java 中负责Agent 资源 provider提供者注册、获取与移除的核心管理类是 Runner 在执行 Agent 时按agentId解析具体 Agent 实例的入口。本文将围绕该类从 API 签名、底层 provider 注册表、分布式模式适配、与ResourceMgr门面及Runner运行时的协作、以及测试用例验证等维度完整剖析 Agent 资源从登记到取出执行再到注销的完整生命周期帮助读者掌握如何在自己的应用中注册、按 ID 懒加载获取和清理 Agent 资源。一、AgentMgr 在 Runner 资源管理体系中的定位AgentMgr 属于core/src/main/java/com/openjiuwen/core/runner/resourcemanager资源管理包与ModelMgr、ToolMgr、PromptMgr、WorkflowMgr、SysOperationMgr、AgentGroupMgr等并列共同构成 Runner 的资源管理基础设施。按照 AgentMgr.md 的类说明其原始设计形态为public class AgentMgrT extends AbstractManagerT即一个泛型管理器继承自通用的资源管理器基类AbstractManagerT专门负责Agent资源 provider 的注册、获取与移除。需要说明的是当前仓库源码中AgentMgr的实现AgentMgr.java是一个面向 0.1.12 版本兼容的别名类public class AgentMgrT extends AgentManager { public String kind() { return agent; } }它直接继承AgentManager本地 provider 分布式 Agent 的真正实现类泛型参数T保留用于源码级兼容kind()返回agent供资源类型标识使用源码注释表明其与 Python 版openjiuwen/core/runner/resources_manager/agent_manager.py中的AgentMgr保持行为对齐。在整体架构中AgentMgrObject agentMgr由 ResourceRegistry.java 作为中央注册表持有可通过agent()、agentManager()访问并被 ResourceMgr.java 这一统一资源门面封装最终由 Runner 消费。二、核心方法 API 一览AgentMgr.md 给出的方法签名为签名说明public void addAgent(String agentId, Supplier? extends T agent)注册一个 Agent 提供者public T getAgent(String agentId)按 ID 获取 Agentpublic Supplier? extends T removeAgent(String agentId)移除 Agent返回被移除的提供者当前仓库的实际实现由父类AgentManagerAgentManager.java提供签名与语义如下addAgent(String agentId, Supplier? agentProvider)L27-29注册一个以Supplier形式提供的本地 Agent 工厂实际调用addAgent(agentId, agentProvider, null, null)。addAgent(String agentId, Supplier? agentProvider, AgentCard card, String interfaceUrl)L31-43完整版注册方法。若当前处于分布式模式还会同步创建并启动一个AgentAdapter将本地 Agent 暴露为 A2A 服务。addAgent(String agentId, RemoteAgent agent)L45-47与addAgent(String agentId, RemoteAgent agent, AgentCard card, String interfaceUrl)L49-54注册一个远端 AgentRemoteAgent到远端 Agent 表中。getAgent(String agentId)L65-71返回CompletionStageObject异步结果解析顺序为远端 Agent 优先本地 provider 兜底。removeAgent(String agentId)L73-82返回被移除的Supplier?在分布式模式下还会先停止对应的AgentAdapter。此外还提供两个辅助查询方法containsRemoteAgent(String agentId)L84-86判断该 ID 是否注册为远端 AgentcontainsDistributedAdapter(String agentId)L88-90判断该 ID 是否挂载了分布式适配器。下面分别展开三类核心操作的内部机制。三、本地 Provider 注册机制AbstractManager 与 ThreadSafeDict3.1 底层存储结构AgentManager继承的 AbstractManager.java 是所有资源管理器的通用基类其内部用一张线程安全的字典保存 providerprivate final ThreadSafeDictString, Supplier? providers new ThreadSafeDict();ThreadSafeDictThreadSafeDict.java是一个以ReentrantLock保护内部LinkedHashMap的线程安全字典L29-30因此所有读写操作互斥保证并发注册/移除/查询的一致性基于LinkedHashMap保持插入顺序keys()、providerIds()返回的快照即为注册顺序。3.2 注册与重复校验registerResourceProviderL25-30对重复 ID 有严格的唯一性保护protected void registerResourceProvider(String resourceId, Supplier? resource) { if (providers.get(resourceId) ! null) { throw new IllegalArgumentException(add resource failed, resourceId is already exist); } providers.put(resourceId, resource); }这意味着对同一agentId重复调用addAgent会直接抛出IllegalArgumentException而不是静默覆盖——这是防止运行期 Agent 资源被意外替换的关键约束。若确实需要无唯一性校验地替换则使用replaceResourceProviderL38-40。3.3 懒加载与异步规约getResourceL43-53是getAgent的底层支撑语义上有两点值得注意懒加载注册时只保存Supplier工厂真正调用provider.get()的时机是获取时。这允许 Agent 实例按需创建测试用例localProviderIsResolvedLazilyByAgentId专门验证了这一行为支持异步 provider若 provider 返回的是CompletionStage则自动通过thenApply展开为CompletionStageT若返回普通对象则包装为CompletableFuture.completedFuture。因此调用方统一以CompletionStageObject消费结果未注册的 IDprovider 不存在时返回completedFuture(null)不会抛异常。unregisterResourceProviderL56-58通过providers.pop(resourceId, null)弹出并返回被移除的 providerproviderIds()L65-67返回注册 ID 快照。基类还对外暴露了put、contains、size等便捷方法L69-79。四、分布式模式AgentAdapter、RemoteAgent 与 interfaceUrlAgentManager区别于普通注册表的关键能力在于对分布式 Agent的支持AgentManager.javaprivate static final String AGENT_ADAPTER_PREFIX agent_adapter_; private final ThreadSafeDictString, Object remoteAgents new ThreadSafeDict();4.1 分布式模式下自动挂载 AgentAdapter当RunnerConfig.getRunnerConfig().isDistributedMode()为真时addAgent(agentId, supplier, card, interfaceUrl)会额外执行AgentCard effectiveCard cardWithInterfaceUrl(card, interfaceUrl); AgentAdapter adapter new AgentAdapter(agentId, , effectiveCard); adapter.start(); remoteAgents.put(AGENT_ADAPTER_PREFIX agentId, adapter);即以agent_adapter_agentId为键保存并启动一个AgentAdapter把本地 Agent 暴露为可供远端调用的 A2A 服务。随后仍会在providers中注册本地 provider保证本进程内也能正常解析。4.2 interfaceUrl 的解析与覆盖规则cardWithInterfaceUrlL92-101负责将interfaceUrl合并进AgentCard基于AgentCard深拷贝一份副本并setInterfaceUrl。其规则为显式传入的interfaceUrl参数优先于AgentCard自带的interfaceUrlAgentCard已设置的interfaceUrl在参数为null时生效两者皆缺省时适配器卡片不携带interfaceUrl。这一规则在测试 AgentManagerTest.java 中有三组用例分别验证L117-147addAgentUsesAgentCardInterfaceUrlWhenKwargOmitted、addAgentInterfaceUrlKwargOverridesAgentCard、addAgentForwardsInterfaceUrlToAgentAdapter。4.3 RemoteAgent 的直接注册addAgent(agentId, RemoteAgent)系列L45-54将远端 Agent 直接存入remoteAgents键为裸agentId不带前缀。若该 ID 已被注册为远端 Agent则抛出IllegalArgumentException(already same id remote agent, id...)。4.4 getAgent 的解析顺序public CompletionStageObject getAgent(String agentId) { Object agent remoteAgents.get(agentId, null); if (agent ! null) { return CompletableFuture.completedFuture(agent); } return getResource(agentId).thenApply(localAgent - localAgent); }解析策略清晰先查裸键agentId对应的 RemoteAgent命中直接返回未命中再回落到本地 provider 注册表。因此RemoteAgent具有最高优先级本地 provider 作为兜底。4.5 removeAgent 的分布式清理public Supplier? removeAgent(String agentId) { if (RunnerConfig.getRunnerConfig().isDistributedMode()) { Object adapter remoteAgents.pop(AGENT_ADAPTER_PREFIX agentId); if (adapter instanceof AgentAdapter agentAdapter) { agentAdapter.stop().toCompletableFuture().join(); } } remoteAgents.pop(agentId, null); return unregisterResourceProvider(agentId); }移除时按顺序完成三步清理停止并弹出分布式适配器分布式模式→ 移除远端 Agent → 弹出本地 provider 并返回。测试removeAgentUnregistersLocalProviderWhenNotDistributedL68-82验证了非分布式场景下移除后本地 provider 与远端记录同时失效。五、与 ResourceMgr 门面、Runner 运行时的协作5.1 ResourceMgr 统一门面实际业务代码通常不直接操作AgentMgr而是通过 ResourceMgr.java 门面。ResourceMgr构造时通过resetManagers()L2366-2378从ResourceRegistry取出agentManager等子管理器。Agent 相关的门面方法包括addAgent(AgentCard card, Supplier? agent)L148-163注册前依次执行validateResourceCard(card, agent, AgentCard.class)、validateResourceId、validateProvider、validateOptionalTags四重校验再进入统一的innerAddResource还会同步维护 tag 索引与idToCard卡片表批量注册addAgents(ListAgentEntry agents, tag)L181-190AgentEntry是(AgentCard, Supplier)的记录对L2419用于一次性登记多个 AgentremoveAgent(String agentId)L192-195按 ID 移除getAgent(String agentId)L216-222先通过tagManager.hasResource(agentId)判断资源是否存在不存在直接返回completedFuture(null)存在则进入dispatchGet按标签查询getAgentsByTag(tag, strategy, session)L232-235结合TagMatchStrategy匹配策略筛选。dispatchGetL1820-1830是统一分发点其中case AGENT - agentManager.getAgent(resourceId)最终将请求路由到AgentMgr/AgentManager。5.2 ResourceRegistry 中央注册表ResourceRegistry.java 持有各子管理器实例其中 Agent 相关访问入口包括agent()L74-76返回AgentMgrObjectagentManager()L106-108以AgentManager类型返回二者是同一实例removeById(String)L36-56按 ID 依次尝试从 tool、workflow、agent、agentGroup、prompt、model、sys_operation 各子表中移除Agent 分支即调用agentMgr.removeAgent(resourceId)clearAll()L26-34一键重置全部子管理器包括重建agentMgr。5.3 Runner 运行时的类型分发Runner 在 Runner.java 的runAgent中消费从资源管理器解析出的 Agent 对象L698-752。prepareAgent取出对象后按实例类型做多分支分发L714-745RemoteAgent→ 调用remoteAgent.invoke(...)走远端调用新/旧BaseAgent→ 调用baseAgent.invoke(inputs, agentSession)DeepAgent→ 调用deepAgent.invoke(...)其他 duck-typed Agent → 反射式调用invokeDuckTypedAgent(...)均不匹配 → 抛出unsupportedAgent。这正是AgentMgr.getAgent返回动态联合类型远端 Agent、适配器或本地 Agent 三选一的原因——Runner 侧通过类型判断来决定执行路径与 Python 版本保持行为对齐。六、行为契约与测试验证仓库为AgentManager提供了完整的行为测试 AgentManagerTest.java其断言可作为使用时的行为契约参考测试用例验证的行为契约localProviderIsResolvedLazilyByAgentIdL45-55本地 provider 按agentId懒加载解析未注册 ID 返回nullduplicateLocalProviderIsRejectedByAbstractManagerL57-66同 ID 重复注册抛IllegalArgumentExceptionremoveAgentUnregistersLocalProviderWhenNotDistributedL68-82非分布式模式下移除返回原 provider且之后查询为nulladdAgentForwardsInterfaceUrlToAgentAdapterL84-101分布式模式下interfaceUrl正确写入AgentAdapter的AgentCardaddAgentPassesNullInterfaceUrlWhenOmittedL103-115缺省interfaceUrl时卡片该项为nulladdAgentUsesAgentCardInterfaceUrlWhenKwargOmittedL117-129仅设置AgentCard.interfaceUrl时该值生效addAgentInterfaceUrlKwargOverridesAgentCardL131-147显式参数覆盖AgentCard自带值测试通过反射注入 Noop MQ 适配器工厂模拟分布式基础设施L149-222避免测试依赖真实消息队列也侧面说明分布式适配器依赖 Runner 的消息队列通道。七、一个可运行的集成示例综合以上机制一个典型的使用流程如下API 均来自源码验证// 本地模式注册、懒加载获取、移除 AgentManager manager new AgentManager(); manager.addAgent(agent-1, () - buildLocalAgent()); // 注册本地 provider Object agent manager.getAgent(agent-1) // 按 ID 懒加载解析 .toCompletableFuture().join(); Supplier? removed manager.removeAgent(agent-1); // 移除并返回原 provider // 分布式模式注册本地 Agent 并暴露为 A2A 服务 RunnerConfig config RunnerConfig.DEFAULT_RUNNER_CONFIG.copy(); config.setDistributedMode(true); RunnerConfig.setRunnerConfig(config); AgentCard card new AgentCard(agent-x, agent-x, ); manager.addAgent( agent-x, () - buildLocalAgent(), card, http://127.0.0.1:9000/a2a/jsonrpc // interfaceUrl 写入适配器卡片 ); // 通过 ResourceMgr 门面推荐含参数校验与标签管理 ResourceMgr resourceMgr new ResourceMgr(); resourceMgr.addAgent(card, () - buildLocalAgent()); Object agentFromFacade resourceMgr.getAgent(agent-x).toCompletableFuture().join(); resourceMgr.removeAgent(agent-x);使用要点同一agentId不可重复注册唯一性校验会抛异常getAgent是异步接口CompletionStage需要同步结果时调用.toCompletableFuture().join()分布式模式下建议同时提供AgentCard与interfaceUrl便于远端按 A2A 协议访问生产代码优先使用ResourceMgr门面以获得参数校验、标签索引与idToCard卡片管理等增强能力。八、小结与延伸阅读AgentMgr虽然对外只暴露addAgent/getAgent/removeAgent三个核心操作但底层依托AbstractManager的 provider 注册表、ThreadSafeDict的锁保护、以及AgentManager对分布式适配器与远端 Agent 的联合管理构成了 Runner 执行 Agent 前资源解析的关键一环。理解其本地懒加载、远端优先解析、重复注册保护和分布式清理语义有助于正确设计多 Agent 应用的注册与回收策略。建议结合以下资料继续深入同包 API 文档AbstractManager.md、ResourceMgr.md、ResourceRegistry.md核心实现AgentManager.java、AbstractManager.java、ThreadSafeDict.java门面与运行消费ResourceMgr.java、Runner.java行为契约测试AgentManagerTest.java赞分享人工智能AI AgentAgent 框架工具调用Agent 工作流RAGMCP Clients强化学习【免费下载链接】agent-core-javaopenJiuwen agent core Java是 openJiuwen Core的 Java版本提供AI Agent开发、运行、调优与演进相关的全套SDK能力。项目地址https://gitcode.com/openJiuwen/agent-core-java点击查看免费下载相关推荐openJiuwen AgentGroupMgr 详解Agent 团队资源 provider 的注册、获取与移除openJiuwen AgentGroupMgr 详解Agent 团队资源 provider 的注册、获取与移除 AgentGroupMgr 是 openJi人工智能AI AgentAgent 框架工具调用Agent 工作流RAGMCP Clients强化学习GetQzonehistoryQQ空间数据导出工具历史说说、图片与评论全部归档到本地 ExcelGetQzonehistoryQQ空间数据导出工具历史说说、图片与评论全部归档到本地 Excel 老QQ空间一条条翻回去,像徒手淘井:时间线越往上加载越慢,人工智能AI AgentAgent 框架工具调用Agent 工作流RAGMCP Clients强化学习openJiuwen agent-core-java 存储事件日志详解StoreEvent 的字段、序列化与注册机制openJiuwen agent core java 存储事件日志详解StoreEvent 的字段、序列化与注册机制 StoreEvent 是 openJiu人工智能AI AgentAgent 框架工具调用Agent 工作流RAGMCP Clients强化学习上一篇mistral.rs Topology 逐层量化控制实战用 Rust API 与 YAML 配置为每一层指定 ISQ 类型下一篇GPTs 医疗诊断助手提示词深度解析症状自查、急救指导与用药安全的实战设计创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考