Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
mysql/data/
mysql/log/
redis/data/
elasticsearch/data/
kibana/data/
rocketmq/store/
Empty file.
Empty file.
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The AppController is identical to ApplicationController in the same package, therefore it has been removed.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ public class Node implements RunnableModel {

private String id;

// todo: 使用NodeTypeEnum
private String type;

private String title;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,9 @@ public IterationNodeData parse(Map<String, Object> data) throws JsonProcessingEx
Pattern typePattern = Pattern.compile("array\\[(.*?)]");
String inputType = "object";
String outputType = "object";
Matcher inputTypeMatcher = typePattern.matcher((String) data.get("iterator_input_type"));
Matcher outputTypeMatcher = typePattern.matcher((String) data.get("output_type"));
Matcher inputTypeMatcher = typePattern
.matcher((String) data.getOrDefault("iterator_input_type", "object"));
Matcher outputTypeMatcher = typePattern.matcher((String) data.getOrDefault("output_type", "object"));
if (inputTypeMatcher.find()) {
inputType = inputTypeMatcher.group(1);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,6 @@ private String renderEdgeSections(List<Edge> edges, List<Node> nodes, Map<String
String tgtVar = varNames.get(targetId);
Map<String, Object> data = edge.getData();
String sourceType = data != null ? (String) data.get("sourceType") : null;
String targetType = data != null ? (String) data.get("targetType") : null;

// Skip if already rendered as conditional
if (edge.getSourceHandle() != null && !"source".equals(edge.getSourceHandle())) {
Expand All @@ -197,10 +196,6 @@ private String renderEdgeSections(List<Edge> edges, List<Node> nodes, Map<String
if ("start".equals(sourceType)) {
sb.append(String.format("stateGraph.addEdge(START, \"%s\");%n", tgtVar));
}
else if ("end".equals(targetType)) {
sb.append(String.format("stateGraph.addEdge(\"%s\", \"%s\");%n", srcVar, tgtVar));
sb.append(String.format("stateGraph.addEdge(\"%s\", END);%n", tgtVar));
}
else {
sb.append(String.format("stateGraph.addEdge(\"%s\", \"%s\");%n", srcVar, tgtVar));
}
Expand All @@ -219,6 +214,15 @@ else if ("end".equals(targetType)) {
}
}

// 统一生成end节点到StateGraph.END的边(避免边重复)
sb.append("stateGraph");
nodes.stream()
.filter(node -> NodeType.END.value().equals(node.getType()))
.map(Node::getId)
.map(varNames::get)
.forEach(endName -> sb.append(String.format("%n.addEdge(\"%s\", END)", endName)));
sb.append(String.format(";%n"));

return sb.toString();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@

import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.Stream;

Expand Down Expand Up @@ -114,20 +113,6 @@ public String renderConditionalEdges(BranchNodeData branchNodeData, Map<String,
.append(edgeCaseMapStr)
.append(");\n");

// 补充结束节点与END的联系(如果有)
List<String> endNodeNames = edgeCaseMap.values()
.stream()
.map(nodeMap::get)
.filter(Objects::nonNull)
.filter(node -> "end".equalsIgnoreCase(node.getType()))
.map(Node::getId)
.map(varNames::get)
.toList();
if (!endNodeNames.isEmpty()) {
sb.append("stateGraph");
endNodeNames.forEach(varName -> sb.append(String.format("\n.addEdge(\"%s\", END)", varName)));
sb.append(";\n");
}
return sb.toString();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,22 +109,15 @@ public String renderConditionalEdges(QuestionClassifierNodeData nodeData, Map<St
String srcVar = varNames.get(sourceId);
StringBuilder sb = new StringBuilder();

List<String> endNodes = new ArrayList<>();

// 如果输出的都不是预定分类,则使用最后一个分类
String lastConditionKey = "unknown";

for (Edge e : condEdges) {
Map<String, Object> data = e.getData();
String targetType = data != null ? (String) data.get("targetType") : null;
String conditionKey = resolveConditionKey(nodeData, e.getSourceHandle());
String tgtVar2 = varNames.get(e.getTarget());
lastConditionKey = conditionKey;
conditions.add(String.format("if (value.contains(\"%s\")) return \"%s\";", conditionKey, conditionKey));
mappings.add(String.format("\"%s\", \"%s\"", conditionKey, tgtVar2));
if ("end".equalsIgnoreCase(targetType)) {
endNodes.add(tgtVar2);
}
}

String lambdaContent = String.join("\n", conditions);
Expand All @@ -136,13 +129,6 @@ public String renderConditionalEdges(QuestionClassifierNodeData nodeData, Map<St
+ "return \"%s\";%n" + " }),%n" + " Map.of(%s)%n" + ");%n",
srcVar, srcVar, lambdaContent, lastConditionKey, mapContent));

// 补充end节点与END的边,如果有
if (!endNodes.isEmpty()) {
sb.append("stateGraph");
endNodes.forEach(end -> sb.append(String.format("%n.addEdge(\"%s\", END)", end)));
sb.append(String.format(";%n"));
}

return sb.toString();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,26 +15,12 @@ import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;
import java.util.List;

import static com.alibaba.cloud.ai.graph.StateGraph.END;
import static com.alibaba.cloud.ai.graph.StateGraph.START;
{{importSection}}

{{#hasRetriever}}
import org.springframework.ai.embedding.EmbeddingModel;
import org.springframework.ai.reader.TextReader;
import org.springframework.ai.transformer.splitter.TokenTextSplitter;
import org.springframework.ai.vectorstore.SimpleVectorStore;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
{{/hasRetriever}}

{{#hasCode}}
import com.alibaba.cloud.ai.graph.node.code.entity.CodeExecutionConfig;
import com.alibaba.cloud.ai.graph.node.code.CodeExecutor;
{{/hasCode}}

@Component
public class GraphBuilder {
{{#hasRetriever}}
Expand All @@ -48,10 +34,11 @@ public class GraphBuilder {
ChatModel chatModel
{{#hasRetriever}}, VectorStore vectorStore{{/hasRetriever}}
{{#hasCode}}, CodeExecutionConfig codeExecutionConfig, CodeExecutor codeExecutor{{/hasCode}}
) throws GraphStateException {
) throws Exception {
ChatClient chatClient = ChatClient.builder(chatModel).defaultAdvisors(new SimpleLoggerAdvisor()).build();

// new stateGraph
// todo: Add some non-node variable names, such as sys and conversation variables. Format as sys_xxx.
StateGraph stateGraph = new StateGraph({{stateSection}});
// add nodes
{{nodeSection}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import java.util.HashMap;
@RestController("/run")
public class GraphRunController {

private CompiledGraph graph;
private final CompiledGraph graph;

public GraphRunController(@Qualifier("buildGraph") CompiledGraph graph){
this.graph = graph;
Expand All @@ -37,7 +37,7 @@ public class GraphRunController {

@PostMapping(value = "/start")
public Map<String, Object> startInvoke(@RequestBody Map<String, Object> inputs) throws Exception {
{{startInputsSection}}
return graph.invoke(inputs).get().data();
}


Expand Down
Loading