文章目录引入依赖定义状态类定义controller检查点 todo版本jdk17springboot # 3.3.5langchain4j 0.34.0langgraph4j # 1.8.17引入依赖langchain4j的依赖也是需要的在此不赘述。属性标签langgraph4j.version1.8.17/langgraph4j.versiondependencygroupIdorg.bsc.langgraph4j/groupIdartifactIdlanggraph4j-core/artifactIdversion${langgraph4j.version}/version/dependency定义状态类importorg.bsc.langgraph4j.state.AgentState;importjava.util.Map;publicclassMyCustomStateextendsAgentState{publicMyCustomState(MapString,ObjectinitData){super(initData);}// 封装获取用户输入的方法避免类型转换publicStringgetUserInput(){returnthis.Stringvalue(userInput).orElse();}// 封装获取AI回复的方法publicStringgetAiResponse(){returnthis.Stringvalue(aiResponse).orElse();}}定义controllerrun方法里面定义了一个langGraph共两个节点运行时会按照这个步骤走。importcom.example.demo.entity.MyCustomState;importdev.langchain4j.model.chat.ChatLanguageModel;importorg.bsc.langgraph4j.CompiledGraph;importorg.bsc.langgraph4j.StateGraph;// 1. 导入异步节点动作接口importorg.bsc.langgraph4j.action.AsyncNodeAction;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;importjava.util.Map;importjava.util.Optional;importstaticorg.bsc.langgraph4j.GraphDefinition.START;importstaticorg.bsc.langgraph4j.GraphDefinition.END;// 2. 导入 node_async 静态方法用于包装同步逻辑importstaticorg.bsc.langgraph4j.action.AsyncNodeAction.node_async;RestControllerRequestMapping(/api)publicclassLangGraph4jController{privatefinalChatLanguageModelchatLanguageModel;publicLangGraph4jController(ChatLanguageModelchatLanguageModel){this.chatLanguageModelchatLanguageModel;}GetMapping(/langgraph4j/run)publicStringrunGraph(RequestParamStringmessage)throwsException{// 3. 使用 AsyncNodeAction 并配合 node_async 包装器AsyncNodeActionMyCustomStateaiNodenode_async(state-{StringuserInputstate.value(userInput).map(Object::toString).orElse();StringresponsechatLanguageModel.generate(请简短回答userInput);returnMap.of(aiResponse,response);});AsyncNodeActionMyCustomStateformatNodenode_async(state-{StringaiResponsestate.value(aiResponse).map(Object::toString).orElse();StringfinalResultString.format([格式化结果]: AI的最终回复是 - %s,aiResponse);returnMap.of(aiResponse,finalResult);});// 4. 构建图StateGraphMyCustomStateworkflownewStateGraph(MyCustomState::new).addNode(ai_processor,aiNode).addNode(formatter,formatNode).addEdge(START,ai_processor).addEdge(ai_processor,formatter).addEdge(formatter,END);// 5. 编译并执行CompiledGraphMyCustomStategraphworkflow.compile();MapString,ObjectinitialStateMap.of(userInput,message);OptionalMyCustomStatefinalStateOptgraph.invoke(initialState);MyCustomStatefinalStatefinalStateOpt.orElseThrow();returnfinalState.getAiResponse();}}检查点 todo