人工智能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 agent-core-javaopenJiuwen Core 的 Java 版 SDK控制器模块中的com.openjiuwen.core.controller.modules.IntentRecognizer展开。IntentRecognizer 是控制器Controller中理解用户要做什么的第一道关口它把用户输入事件InputEvent转换为结构化的任务意图列表ListIntent为后续任务创建、暂停、补充、修改等动作提供指令依据。读完本文你将掌握该类的依赖构成、recognize(...)主流程、意图工具链IntentToolkits、置信度机制、配置参数与异常约束并能结合源码与测试理解其完整行为。一、类定位控制器中的意图翻译器在 openJiuwen 控制器的架构中用户请求并不是直接驱动任务执行的。控制器先要把用户说了什么翻译成用户想对任务做什么这个翻译动作就由IntentRecognizer完成。源码位于 core/src/main/java/com/openjiuwen/core/controller/modules/IntentRecognizer.java类定义如下public class IntentRecognizer { private final ControllerConfig config; private final TaskManager taskManager; private final ContextEngine contextEngine; private final Object abilityManager; private final SystemMessage systemMessage; private final ModelProvider modelProvider; }它依赖会话上下文ContextEngine管理、当前任务清单TaskManager管理和模型工具调用结果为控制器提供后续的任务创建、暂停、补充和修改指令。从源码注释看该类镜像了 Python 版 openJiuwen Core 中的IntentRecognizeropenjiuwen/core/controller/modules/intent_recognizer.py属于跨语言同构实现。二、构造依赖详解IntentRecognizer通过构造函数注入 5 个依赖公开构造签名如下对应 IntentRecognizer.javapublic IntentRecognizer( ControllerConfig config, TaskManager taskManager, Object abilityManager, ContextEngine contextEngine, ModelProvider modelProvider )各依赖职责如下表成员类型说明configControllerConfig提供intentLlmId意图识别专用模型 ID、intentConfidenceThreshold置信度阈值与允许的意图类型列表intentTypeListtaskManagerTaskManager用于读取当前任务列表并拼接到用户提示中contextEngineContextEngine负责获取/创建当前会话对应的ModelContextabilityManagerObject构造时注入的能力管理器当前公开方法不直接使用它modelProviderModelProvider按模型 ID 和会话延迟获取Model实例值得注意的一点构造时还会同步创建一条固定的系统提示消息new SystemMessage(SYSTEM_PROMPT)这条系统提示在每次模型调用包括后续补轮调用中都会被重新注入消息序列头部见下文提示词设计。2.1ModelProvider函数式接口解耦运行器ModelProvider是一个函数式接口源码见 IntentRecognizer.javaFunctionalInterface public interface ModelProvider { Model getModel(String modelId, AgentSessionApi session); }它只暴露一个getModel(String modelId, AgentSessionApi session)方法用来为意图识别阶段提供模型实例避免IntentRecognizer直接依赖更上层的运行器Runner实现。在 Python 版中对应Runner.resource_mgr.get_model(...)的用法Java 版通过这一函数式接口把取模型这个动作延迟到装配层完成。这样的设计使得IntentRecognizer可以在测试中用 Mock 模型替换真实模型测试示例见下文测试验证一节。三、recognize(...)主流程从事件到意图列表IntentRecognizer对外只有一个核心方法public ListIntent recognize(Event event, AgentSessionApi session)文档与源码共同确认了它的五步行为对应 IntentRecognizer.java上下文准备从ContextEngine中按ContextEngine.DEFAULT_CONTEXT_ID与session.getSessionId()获取ModelContext若不存在则先创建。事件类型校验只接受InputEvent传入其他Event实现会直接抛出IllegalArgumentException异常消息为Event must be an InputEvent for intent recognition。输入数据校验遍历inputEvent.getInputData()只允许恰好一条DataFrame.TextDataFrame出现文件输入FileDataFrame、JSON 输入JsonDataFrame或多段文本输入时抛出AGENT_CONTROLLER_RUNTIME_ERROR。提示词组装把taskManager.getTask(null)获取的当前任务清单整理成## Task id: ... / ### Task description: ... / Status: ...形式的文本无任务时为无再与用户文本一起按模板USER_PROMPT_TEMPLATE封装为UserMessage写入ModelContext。模型工具调用循环首轮模型调用使用IntentToolkits.getOpenaiToolSchemas(config.getIntentTypeList())限定可用工具随后进入 while 循环——若返回的ToolCall非空则将每个工具调用的参数解析为MapString, Object交给IntentToolkits.dispatch(...)生成Intent与工具消息工具消息回写到ModelContext然后放开为全部工具定义再次调用模型直到模型返回纯文本无工具调用为止。所有模型交互的消息都会持久化到ModelContext。3.1 上下文消息数量上限读取上下文时固定最多取最近50条消息对应源码中的常量private static final int MAX_MESSAGE_LEN 50;即每次构造模型调用消息序列时执行context.getMessages(MAX_MESSAGE_LEN, true)只把最近的 50 条上下文消息随系统提示一起发给模型。3.2 输入数据校验细节DataFrame的三种子类型定义位于 core/src/main/java/com/openjiuwen/core/controller/schema/DataFrame.javarecord TextDataFrame(String text) implements DataFrame { ... } record FileDataFrame(String name, String mimeType, byte[] bytes, String uri) implements DataFrame { ... } record JsonDataFrame(MapString, Object data) implements DataFrame { ... }recognize的校验逻辑为只要输入中含有FileDataFrame或JsonDataFrame立即抛错Inputs with files or jsons are not supported for intent recognition.若TextDataFrame超过一条抛错Multiple inputs are not supported for intent recognition.校验通过后取texts.get(0).text()作为用户 query。这意味着意图识别阶段只处理单段纯文本输入文件、JSON 结构化数据与多段文本应当走其他事件通道。四、提示词设计任务化一切的系统约束源码中固化了两段提示词它们是意图识别质量的软约束也是理解该模块设计理念的关键。4.1 系统提示词SYSTEM_PROMPTprivate static final String SYSTEM_PROMPT # 角色 你是一个任务管理助手专门使用工具创建和管理任务。你的核心理念是**任何用户请求都可以转化为一个任务**并由任务管理器处理。 # 核心原则 1. **任务化一切**对于任何用户请求包括信息查询、事务处理、提醒等你的第一反应不是直接执行或拒绝而是思考如何将它创建为一个任务。 2. **透明管理**如果任务需要外部能力如天气API你仍然创建它并明确告知用户任务的状态。 # 工作流程 1. **解析请求**理解用户想做什么。 2. **任务操作**使用工具创建一个对应的任务或修改已有任务。 3. **永远不拒绝**不声称超出能力范围而是告知用户任务会由其他执行器处理。 # 任务目标 - 根据用户输入**总是优先创建对应的任务**。 - 使用工具进行任务操作创建、更新、列表、删除。 - 只有纯粹闲聊或问候时不调用工具。 ;核心要点任何用户请求都可以转化为一个任务模型被要求永远优先走任务化路径只有纯粹闲聊/问候才不调用工具。4.2 用户提示词模板USER_PROMPT_TEMPLATEprivate static final String USER_PROMPT_TEMPLATE 你当前拥有的任务有 %s 当前用户的输入为 %s 请根据你当前的任务和用户输入进行合适的任务操作。 ;%s第一个参数由prepareUserMessage(String query)生成遍历taskManager.getTask(null)返回的所有任务逐条拼出## Task id: taskId、### Task description: description、Status: status无任务时填入无。第二个参数即用户本次的 query 文本。因此模型每次识别意图时都能看到当前会话已有的全部任务及其状态从而正确区分创建新任务与修改/暂停/取消已有任务。五、意图工具链 IntentToolkits八种任务操作工具IntentRecognizer并不直接构造Intent而是把工具调用的翻译委托给IntentToolkits源码见 core/src/main/java/com/openjiuwen/core/controller/modules/IntentToolkits.java。它负责两件事提供 OpenAI 兼容的 function tool schema 列表getOpenaiToolSchemas(...)根据工具名与解析后的参数分发生成意图dispatch(...)。5.1 八种工具定义buildToolSchemaChoices()在构造时预构建全部 8 个工具定义LinkedHashMap保持顺序每个工具都含name、description、parameterstype: object、properties、required、additionalProperties: false工具名用途必填参数create_task用户想开始新任务/活动时创建任务confidence、task_description另有可选dependent_task_idpause_task用户想临时中断/挂起某任务confidence、task_idcancel_task用户想彻底终止/放弃某任务confidence、task_idresume_task用户想继续之前暂停/中断的任务confidence、task_idunknown_task无法确定用户意图时生成澄清问题confidence、question_for_usercreate_dependent_task创建依赖一个或多个已有任务的新任务confidence、task_description、dependent_task_idsmodify_task修改已有任务生成新版本描述confidence、task_id、new_task_descriptionsupplement_task为进行中的任务补充额外信息/上下文confidence、task_id、supplement_info每个工具都带有confidence0-1.0 的置信度打分参数其描述文案统一为Your confidence score for this operation (0-1.0), typically used when confidence is low。5.2 dispatch 分发参数 → Intentdispatch(String toolName, MapString, Object arguments)使用 Java 21 的 switch 表达式按工具名分发到对应意图构造方法例如case create_task - createTask(confidence, (String) arguments.get(task_description)); case modify_task - modifyTask(confidence, (String) arguments.get(task_id), (String) arguments.get(new_task_description)); case supplement_task - supplementTask(confidence, (String) arguments.get(task_id), (String) arguments.get(supplement_info));confidence统一从参数中取出并转成double。若传入未知工具名则回退到lowConfidenceIntent(0.0)即自动降级为unknown_task。每个意图构造方法返回IntentResult记录record IntentResult(Intent intent, String message)message是人类可读的状态描述例如创建任务返回Task ID: uuid, Task Description: desc, Current Status: Created and submitted for execution暂停任务返回Task ID: id, Current Status: Paused。message会被包装成ToolMessage回写到ModelContext从而在后续补轮调用中让模型看到上一步工具的执行结果。5.3 首轮限定与后续放开IntentToolkits.getOpenaiToolSchemas(ListString choices)当前实现直接返回全部 8 个工具定义choices参数来自config.getIntentTypeList()暂未用于过滤。但在IntentRecognizer的调用上存在明显区分对应文档行为说明第 4 点首轮model.invoke(messages, ModelInvokeOptions.builder().tools(toolkits.getOpenaiToolSchemas(config.getIntentTypeList())).build())——携带配置中限定的意图类型列表补轮tools(toolkits.getOpenaiToolSchemas(null))——放开为全部工具定义。这种先限定、后放开的设计让模型在首轮聚焦于配置允许的意图而在需要继续澄清或补充操作时具备全部工具能力。六、置信度阈值机制低置信度自动降级intentConfidenceThreshold是意图识别质量的关键闸门。在IntentToolkits的每个意图构造方法中都遵循同一模式public IntentResult createTask(double confidence, String taskDescription) { if (confidence confidenceThreshold) { return lowConfidenceIntent(confidence); } ... }当模型给出的confidence低于阈值时不会直接创建意图而是调用lowConfidenceIntent(confidence)降级为UNKNOWN_TASKprivate IntentResult lowConfidenceIntent(double confidence) { return new IntentResult( new Intent(IntentType.UNKNOWN_TASK, event, , null, List.of(), null, null, confidence, Sorry, I couldnt understand your meaning. Please clarify whether you want to create a new task or modify an existing one.), Automatically converted to unknown_task due to low confidence ); }其澄清提示文案固定为抱歉我无法理解您的意思请澄清您是想要创建新任务还是修改现有任务。 该澄清提示会作为Intent.clarificationPrompt字段最终由下游通过session.writeStream写回给用户见下文下游消费。七、意图数据模型Intent 与 IntentType7.1 IntentType 枚举九种意图IntentType定义于 core/src/main/java/com/openjiuwen/core/controller/schema/IntentType.java涵盖控制器支持的全部任务操作语义枚举值字符串值语义CREATE_TASKcreate_task执行新任务 / 中断执行中的任务并执行新任务PAUSE_TASKpause_task暂停执行中的任务RESUME_TASKresume_task恢复先前暂停的任务CONTINUE_TASKcontinue_task基于已完成任务继续执行SUPPLEMENT_TASKsupplement_task为任务补充必要信息CANCEL_TASKcancel_task取消当前执行的任务MODIFY_TASKmodify_task修改执行中的任务SWITCH_TASKswitch_task切换任务中断当前任务并执行另一任务UNKNOWN_TASKunknown_task未知意图需要用户澄清注意create_dependent_task工具最终映射到的是CONTINUE_TASK意图类型IntentToolkits.createDependentTask(...)构造Intent(IntentType.CONTINUE_TASK, ...)即基于已完成任务继续执行。7.2 Intent 数据模型与校验Intent定义于 core/src/main/java/com/openjiuwen/core/controller/schema/Intent.javaJSON 字段包括intent_type、event、target_task_id、target_task_description、depend_task_id、supplementary_info、modification_details、confidence、metadata、clarification_prompt。构造时validate()会按意图类型做强校验例如CREATE_TASK必须携带target_task_descriptionCONTINUE_TASK必须携带非空depend_task_id列表SUPPLEMENT_TASK必须携带target_task_id与supplementary_infoMODIFY_TASK必须携带target_task_id与modification_detailsPAUSE_TASK/RESUME_TASK/CANCEL_TASK必须携带target_task_idUNKNOWN_TASK必须携带clarification_promptconfidence必须在0.0到1.0之间。任一不满足即抛出AGENT_CONTROLLER_RUNTIME_ERROR。这保证了识别结果在下游被消费时总是结构完整、语义自洽的。八、配置参数ControllerConfig 中的意图识别开关意图识别的全部行为参数由ControllerConfig控制定义于 core/src/main/java/com/openjiuwen/core/controller/ControllerConfig.javaJSON 属性名与默认值如下配置项JSON keyJava 字段默认值说明enable_intent_recognitionenableIntentRecognitionfalse是否启用意图识别全局开关intent_llm_idintentLlmId意图识别专用模型 ID经modelProvider.getModel(...)获取模型intent_confidence_thresholdintentConfidenceThreshold0.7置信度阈值模型给出的 confidence 低于此值则降级为 unknown_task取值范围 0.01.0intent_type_listintentTypeList[create_task,pause_task,resume_task,cancel_task,unknown_task]允许的意图类型列表首轮工具限定依据其中intentConfidenceThreshold的 setter 做了边界校验小于 0.0 或大于 1.0 会抛出IllegalArgumentException(intentConfidenceThreshold must be between 0.0 and 1.0)。intentLlmIdsetter 会把 null 归一化为空串。若intentLlmId为空则modelProvider.getModel(, session)会按空模型 ID 取模型实际业务使用时应显式配置一个可用的 LLM 模型 ID例如测试中使用的ds_model。九、下游消费EventHandlerWithIntentRecognition 的意图路由识别出的ListIntent并不会在IntentRecognizer内部直接处理而是交给控制器的事件处理器消费。EventHandlerWithIntentRecognition源码见 core/src/main/java/com/openjiuwen/core/controller/modules/EventHandlerWithIntentRecognition.java继承自EventHandler在依赖注入完成后通过initRecognizer()构造IntentRecognizerpublic void initRecognizer() { this.recognizer new IntentRecognizer( config, taskManager, abilityManager, contextEngine, modelProvider ); }其handleInput(...)在recognizer为 null 时自动调用initRecognizer()懒加载然后调用recognizer.recognize(inputs.getEvent(), inputs.getSession())得到意图列表为每个Intent启动一个名为intent-handler-intentType的独立线程按意图类型 switch 分发到对应的处理器方法并join等待完成case CREATE_TASK - processCreateTaskIntent(intent, inputs.getSession()); case PAUSE_TASK - processPauseTaskIntent(intent, inputs.getSession()); case RESUME_TASK - processResumeTaskIntent(intent, inputs.getSession()); case CONTINUE_TASK - processContinueTaskIntent(intent, inputs.getSession()); case SUPPLEMENT_TASK - processSupplementTaskIntent(intent, inputs.getSession()); case CANCEL_TASK - processCancelTaskIntent(intent, inputs.getSession()); case MODIFY_TASK - processModifyTaskIntent(intent, inputs.getSession()); default - processUnknownTaskIntent(intent, inputs.getSession());各处理器的典型行为同样位于该文件创建任务构造TasktaskType固定为default_task_type、priority为 1、contextId为sessionId _ targetTaskId、status为SUBMITTED把原始InputEvent挂到task.inputs然后taskManager.addTask(task)提交暂停/取消直接调用taskScheduler.pauseTask(...)/taskScheduler.cancelTask(...)恢复按 taskId 查任务若状态为PAUSED则置回SUBMITTED并更新继续依赖任务收集依赖任务的历史输入事件与上下文消息JsonDataFrame连同本次输入一起构造成新任务提交补充信息先暂停目标任务把supplementaryInfo追加到任务描述后重新提交修改任务取消目标任务更新描述并把本次事件追加到任务输入后重新提交未知意图通过session.writeStream(Map.of(clarification_prompt, intent.getClarificationPrompt()))把澄清问题写回会话流与用户交互。由此可见IntentRecognizer输出的不仅是意图类型还携带了完整的目标任务信息targetTaskId、targetTaskDescription、依赖关系、补充信息、澄清提示等保证下游无需再解析原始用户文本即可执行任务操作。十、约束、异常与错误码综合文档与源码IntentRecognizer的约束与异常行为可归纳为事件类型只接受InputEvent否则抛出IllegalArgumentException输入格式只允许单条TextDataFrame文件、JSON 或多段文本输入抛出AGENT_CONTROLLER_RUNTIME_ERROR上下文固定最多取最近 50 条消息若ContextEngine中不存在当前会话的ModelContext方法不会直接失败而是自动创建源码行为context contextEngine.createContext(ContextEngine.DEFAULT_CONTEXT_ID, session)文档要求调用方先创建上下文的场景指的是默认上下文缺失时的兜底行为异常包装模型调用失败LLM invocation failed: ...、工具参数解析失败Failed to parse tool call: ...和输入格式违规都会被包装成StatusCode.AGENT_CONTROLLER_RUNTIME_ERROR并行消费多个意图由下游处理器以独立线程并行执行EventHandlerWithIntentRecognition.handleInput互不阻塞。十一、测试验证单元测试如何刻画行为仓库提供了针对IntentRecognizer的专注测试 core/src/test/java/com/openjiuwen/core/controller/modules/IntentRecognizerTest.java与 Python 版TestIntentRecognizer保持 parity可用于验证本文所述行为识别工具调用并自动创建上下文配置enableIntentRecognitiontrue、intentLlmIdds_model用队列化的假模型响应create_task工具调用{confidence:0.9,task_description:搜索北京今天天气}与后续纯文本断言recognize(...)返回 1 个CREATE_TASK意图、targetTaskDescription与输入一致、targetTaskId非空同时断言ModelContext中消息角色序列为user → assistant → tool → assistant工具消息确实回写到了上下文。第二轮输入不搜了改成昨天天气时假模型一次性返回cancel_taskcreate_task两个工具调用断言返回 2 个意图——验证了多工具调用的补轮处理能力拒绝不支持的输入传入FileDataFrame或两条TextDataFrame时断言抛出包含Inputs with files or jsons are not supported.../Multiple inputs are not supported...的运行时错误真实 API 用例标注Disabled(LLM API required; skipped in Python source test_real_case)说明真实模型场景需外部 LLM API测试中默认跳过。同目录下还有 EventHandlerWithIntentRecognitionTest.java 与 EventHandlerWithIntentRecognitionPythonParityTest.java覆盖从识别到意图路由处理的下游链路。十二、小结一条完整的输入 → 意图 → 任务操作链路综上openJiuwen agent-core-java 的意图识别能力可以浓缩为一条清晰链路InputEvent单段文本 │ ▼ IntentRecognizer.recognize(...) │ ① ContextEngine 获取/创建 ModelContext │ ② 校验事件类型与输入格式仅 TextDataFrame 单条 │ ③ taskManager 当前任务清单 用户输入 → UserMessage │ ④ 首轮限定工具集调用模型 → 解析 ToolCall 参数 │ ⑤ IntentToolkits.dispatch → Intent ToolMessage 回写上下文 │ ⑥ 放开全部工具补轮调用直至模型返回纯文本 ▼ ListIntentCREATE / PAUSE / RESUME / CONTINUE / SUPPLEMENT / CANCEL / MODIFY / UNKNOWN │ ▼ EventHandlerWithIntentRecognition按意图类型分发到独立线程 │ ▼ TaskManager.addTask / TaskScheduler.pause、cancel、resume / session.writeStream(澄清提示)配合ControllerConfig的enable_intent_recognition、intent_llm_id、intent_confidence_threshold、intent_type_list四个配置项开发者可以在不修改业务代码的前提下调整意图识别模型的选用、置信度门限与允许的意图范围让控制器具备任务化一切的入口能力。赞分享人工智能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 agent-core-java 控制器意图分类枚举 IntentType 全解9 类任务意图、LLM 识别与事件路由机制openJiuwen agent core java 控制器意图分类枚举 IntentType 全解9 类任务意图、LLM 识别与事件路由机制 导读 Inte人工智能AI AgentAgent 框架工具调用Agent 工作流RAGMCP Clients强化学习openJiuwen agent-core-java 控制器Controller机制详解从事件分发、任务调度到意图识别openJiuwen agent core java 控制器Controller机制详解从事件分发、任务调度到意图识别 com.openjiuwen.co人工智能AI AgentAgent 框架工具调用Agent 工作流RAGMCP Clients强化学习Node.js 6.2.2Current版本发布全解析HTTP 修复、npm 3.9.5 与发布博客的工程化Node.js 6.2.2Current版本发布全解析HTTP 修复、npm 3.9.5 与发布博客的工程化 2016 年 6 月 17 日Node.j人工智能AI AgentAgent 框架工具调用Agent 工作流RAGMCP Clients强化学习上一篇AGT 提示注入基准锁文件刷新实战AES 0.9.2 升级、agentmesh 5.0.0 迁移与 Rust 依赖图审计下一篇NixOS 上配置 IBus 智能补全输入法 ibus-engines.typing-booster 完全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考