openJiuwen agent-core-java 的 Result 类型:Runner 资源管理 API 中的类型安全错误处理 人工智能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.base.Result是 openJiuwen agent-core-java 在 Runner 执行器资源管理 API 中引入的一套结果类型Result Pattern用于把资源注册、查询、移除等操作的成功 / 失败两种结局以类型安全的方式显式建模替代裸抛异常或返回null的隐式错误传播。本文从接口契约、Ok/Error实现、resourcemanager包中的 sealed 变体到ResourceMgr的真实调用与ResourceMgrTest测试验证逐层剖析这套类型的设计意图与正确用法。读完本文你将掌握如何在项目中使用Result判断操作结果、取出成功值或异常并理解 sealed 层次结构对穷尽匹配的支撑。Result 模式在 Runner 资源管理中的定位openJiuwen agent-core-java 的 Runner 模块负责执行器的资源管理对应源码位于 core/src/main/java/com/openjiuwen/core/runner其中resourcemanager包聚合了 Agent、AgentTeam、Workflow、Tool、Model、Prompt、SysOperation 等各类资源的注册与管理门面ResourceMgr。资源操作如addAgent、addTool、removeAgentTeam、addMcpServer面临两类典型结局操作成功需要把注册成功的 Card / 资源 ID交还给调用方操作失败需要把底层异常如参数非法、重复注册明确暴露给调用方。如果仅用返回对象 抛异常的传统写法调用方要么被异常打断控制流要么必须在null语义上做隐式约定。Result类型把这两种结局统一收敛为一个可判别的返回值调用方通过isOk()/isErr()显式分支这正是其注释中所说的Result type for type-safe error handling。从源码注释看这一设计是对 Python 版openjiuwen/core/runner/resources_manager/base.py中Result别名的 Java 镜像Mirrors Pythons Result alias保证两套实现的行为语义一致。base 包中的 Result 契约文档给出的接口定义如下public sealed interface ResultT permits Ok, Error需要说明的是实际仓库中sealed 变体位于resourcemanager包见下文第四节而 base/Result.java 中的ResultT是普通接口非 sealed它被设计为 runner 资源 API 的向后兼容单泛型结果契约Backward-compatible single-generic result contractpublic interface ResultT { boolean isOk(); boolean isErr(); Object msg(); default T getValue() { return isOk() ? (T) msg() : null; } default boolean isError() { return isErr(); } default Object getError() { return isErr() ? msg() : null; } }该接口定义了四个语义明确的成员其余方法均为基于它们的默认实现方法语义默认实现说明isOk()是否为成功结果由Ok/Error各自覆写为true/falseisErr()是否为失败结果与isOk()互斥msg()取出载荷成功时为值失败时为异常对象返回Object保证两种场景共用同一存取通道getValue()若成功则返回值否则返回null默认实现基于isOk()与msg()isError()等价于isErr()提供别名兼容不同调用习惯getError()若失败则返回异常对象否则返回null默认实现基于isErr()与msg()这里msg()返回Object是刻意保留的宽松通道Ok的载荷是任意泛型值Error的载荷是异常两者经由同一个方法读取由调用方结合isOk()/isErr()判别后再做类型收窄。Ok 与 Error两种结局的具体实现接口的实现类位于同一base包成功包装 Okbase/Ok.java 表示成功操作结果内部持有一个T valuepublic final class OkT implements ResultT { private final T value; public Ok(T value) { this.value value; } Override public boolean isOk() { return true; } Override public boolean isErr() { return false; } Override public Object msg() { return value; } Override public T getValue() { return value; } Override public Exception getError() { throw new UnsupportedOperationException(Ok does not contain an error); } }注意Ok覆写了getError()对成功结果取错误这一非法访问直接抛出UnsupportedOperationException从行为上杜绝误用toString()输出形如Ok(value)便于日志排查。失败包装 Errorbase/Error.java 表示失败操作结果内部持有一个Exception errorpublic final class ErrorT implements ResultT { private final Exception error; public Error(Exception error) { this.error error; } Override public boolean isOk() { return false; } Override public boolean isErr() { return true; } Override public Object msg() { return error; } Override public boolean isError() { return true; } Override public T getValue() { throw new UnsupportedOperationException(Error does not contain a value); } Override public Exception getError() { return error; } }与Ok对称Error覆写了getValue()对失败结果取值同样抛出UnsupportedOperationException。两个类均为final不允许第三方扩展保证成功/失败两种语义不会出现第三种实现toString()输出Error(exception)。resourcemanager 包中的 sealed ResultT, E 与 Ok / ErrorResult面向资源管理内部resourcemanager包提供了带独立错误类型参数的 sealed 变体。resourcemanager/Result.javapublic sealed interface ResultT, E extends com.openjiuwen.core.runner.base.ResultT permits Ok, ErrorResult { boolean isOk(); boolean isErr(); Object msg(); }这是文档中sealed interface ResultT permits Ok, Error对应的实际形态双泛型ResultT, ET为成功值类型、E为错误值类型同时继承base.ResultT保证与旧接口向上兼容sealed关键字把允许的实现严格限定为同包内的Ok与ErrorResult配合switch穷尽匹配即可获得编译期安全。两个允许实现public final class OkT implements ResultT, Void { private final T value; // isOk() true, isErr() false, msg() value, value() 返回成功值 } public final class ErrorResultE implements ResultVoid, E { private final E error; // 提供无参构造error 为 null与带参构造isOk() false, isErr() true // msg() error, error() 返回错误载荷 }实现细节见 resourcemanager/Ok.java 与 resourcemanager/ErrorResult.java。OkT以ResultT, Void实例化ErrorResultE以ResultVoid, E实例化从类型层面把成功携带值、失败携带错误做了强约束ErrorResult还额外提供无参构造表示不含具体错误对象的失败。ResourceMgr 中的真实运用ResourceMgrresourcemanager/ResourceMgr.java是这套类型最主要的消费方。它对外暴露的 API 大量以Result为返回类型例如addAgent、addWorkflow、addTool返回com.openjiuwen.core.runner.base.ResultAgentCard等单泛型结果addAgentTeam、addMcpServer等异步入口返回CompletionStageResult?, ?批量操作如addAgents、addTools返回ListResult?, ?让每个条目的成败独立呈现。内部构造结果的方式清晰体现了成功与失败分流// 成功路径 return new Ok(modelId); // updateModel载荷为模型 ID results.add(new Ok(mcpServerId)); // addMcpServer 逐条成功 return new Ok(registration.resourceCard() ! null ? registration.resourceCard() : resourceId); // 失败路径 results.add(new ErrorResult(exception)); // 批量操作中某条失败 return Optional.of(new ErrorResult(error)); // 移除资源时校验失败从源码看ResourceMgr先做参数校验validateResourceCard、validateResourceId、validateProvider等校验不过直接抛BaseError而运行期可能失败的分支重复注册、移除不存在的资源、MCP 服务器操作等则统一收敛为ErrorResult返回例如Result?, ? duplicate manager.addTool(second, List.of(new), false); // 重复注册 assertTrue(duplicate.isErr()); // 通过 isErr() 判别失败此外ResourceMgr还通过baseResult/baseResultList两个私有方法把双泛型ResultT, E向上转型为单泛型base.ResultT实现新旧契约的平滑互转ResourceMgr.java 第 1944 行起。ResourceManagerBaseresourcemanager/ResourceManagerBase.java作为配套的常量与函数式接口集合定义了ALL *、GLOBAL __global__、ACTIVE __active__、INACTIVE __inactive__等标签常量以及AgentProvider、AgentTeamProvider、WorkflowProvider、ModelProvider四个 Provider 别名——它们配合Result一起构成了资源管理 API 的完整边界。测试验证ResourceMgrTest文档在相关测试一节指出的ResourceMgrTest位于 core/src/test/java/com/openjiuwen/core/runner/resourcemanager/ResourceMgrTest.java它对Result语义做了系统性验证成功分支assertTrue(result.isOk())随后用assertSame(card, result.msg())确认成功载荷就是注册的 CardaddAgentStoresProviderAndCardTag、addToolKeepsCardAndTagLedgersInSync等用例均遵循该模式失败分支Result?, ? duplicate manager.addTool(...); assertTrue(duplicate.isErr());验证重复注册返回失败结果且旧资源不被覆盖removeTag批量结果中逐条results.get(0).isOk()批量结果assertTrue(results.stream().allMatch(Result::isOk))校验批量注册全部成功异步场景manager.addMcpServer(config).toCompletableFuture().join()后断言added.isOk()覆盖CompletionStageResult?, ?的消费路径。这些断言直接印证了Result的判别方法isOk()/isErr()、载荷读取方法msg()以及成功携带 Card、失败携带异常的契约在真实资源操作中的行为。使用建议与最佳实践综合接口定义与ResourceMgr的用法在 openJiuwen agent-core-java 中消费Result时建议遵循以下模式先判别、再取值始终先调用isOk()或isErr()分支再通过msg()/getValue()/getError()取载荷避免对结果直接强转因为Ok与Error的getValue()/getError()在错误方向调用时会抛UnsupportedOperationException。区分单发与批量单资源操作返回单个Result批量操作返回ListResult?, ?批量场景应逐条判别以便定位具体哪条失败。利用 sealed 穷尽性在switch中匹配Ok与ErrorResult时编译器可穷尽检查避免遗漏分支如需对外暴露窄契约可用baseResult转换为单泛型base.ResultT。适配异步入口addAgentTeam、addMcpServer等返回CompletionStageResult?, ?需join()或组合后消费结果中的异常载荷可作为业务错误直接透传。参考源码索引runner/base/Result.java单泛型结果契约接口runner/base/Ok.java、runner/base/Error.java两种结局实现runner/resourcemanager/Result.javasealed 双泛型变体runner/resourcemanager/Ok.java、runner/resourcemanager/ErrorResult.javasealed 允许实现runner/resourcemanager/ResourceMgr.java主要消费方与构造方runner/resourcemanager/ResourceManagerBase.java标签常量与 Provider 别名runner/resourcemanager/ResourceMgrTest.javaResult 语义测试赞分享人工智能AI AgentAgent 框架工具调用Agent 工作流RAGMCP Clients强化学习【免费下载链接】agent-core-javaopenJiuwen agent core Java是 openJiuwen Core的 Java版本提供AI Agent开发、运行、调优与演进相关的全套SDK能力。项目地址https://gitcode.com/openJiuwen/agent-core-java点击查看免费下载相关推荐如何永久保存微信聊天记录WeChatMsg本地免费工具终极指南如何永久保存微信聊天记录WeChatMsg本地免费工具终极指南 你是否曾担心珍贵的微信聊天记录会随着手机更换而消失那些与家人朋友的温馨对话、重要的工作沟通、SmartBugs 批量安全审计实战4.7 万合约的并行分析与资源调优怎么配SmartBugs 批量安全审计实战4.7 万合约的并行分析与资源调优怎么配 凌晨三点4.7 万份合约的批量安全审计跑到一半容器集体 OOM、队列卡死。S音视频语言运行时openJiuwen agent-core 资源管理器基础类型全解析Provider 工厂、Tag 策略与 Ok/Error Result 模式openJiuwen agent core 资源管理器基础类型全解析Provider 工厂、Tag 策略与 Ok/Error Result 模式 导读 ope人工智能AI AgentAgent 框架大模型工具调用RAG提示工程强化学习创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考