Skip to content

Commit

Permalink
Support adding a prefix when extending graph
Browse files Browse the repository at this point in the history
  • Loading branch information
nfcampos committed Apr 24, 2024
1 parent 3bcfbcc commit dd7b852
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 11 deletions.
11 changes: 3 additions & 8 deletions libs/core/langchain_core/runnables/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -2409,8 +2409,7 @@ def get_graph(self, config: Optional[RunnableConfig] = None) -> Graph:
step_graph.trim_first_node()
if step is not self.last:
step_graph.trim_last_node()
graph.extend(step_graph)
step_first_node = step_graph.first_node()
step_first_node, _ = graph.extend(step_graph)
if not step_first_node:
raise ValueError(f"Runnable {step} has no first node")
if current_last_node:
Expand Down Expand Up @@ -3082,11 +3081,9 @@ def get_graph(self, config: Optional[RunnableConfig] = None) -> Graph:
if not step_graph:
graph.add_edge(input_node, output_node)
else:
graph.extend(step_graph)
step_first_node = step_graph.first_node()
step_first_node, step_last_node = graph.extend(step_graph)
if not step_first_node:
raise ValueError(f"Runnable {step} has no first node")
step_last_node = step_graph.last_node()
if not step_last_node:
raise ValueError(f"Runnable {step} has no last node")
graph.add_edge(input_node, step_first_node)
Expand Down Expand Up @@ -3779,11 +3776,9 @@ def get_graph(self, config: RunnableConfig | None = None) -> Graph:
if not dep_graph:
graph.add_edge(input_node, output_node)
else:
graph.extend(dep_graph)
dep_first_node = dep_graph.first_node()
dep_first_node, dep_last_node = graph.extend(dep_graph)
if not dep_first_node:
raise ValueError(f"Runnable {dep} has no first node")
dep_last_node = dep_graph.last_node()
if not dep_last_node:
raise ValueError(f"Runnable {dep} has no last node")
graph.add_edge(input_node, dep_first_node)
Expand Down
35 changes: 32 additions & 3 deletions libs/core/langchain_core/runnables/graph.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
List,
NamedTuple,
Optional,
Tuple,
Type,
TypedDict,
Union,
Expand Down Expand Up @@ -236,11 +237,39 @@ def add_edge(
self.edges.append(edge)
return edge

def extend(self, graph: Graph) -> None:
def extend(
self, graph: Graph, *, prefix: str = ""
) -> Tuple[Optional[Node], Optional[Node]]:
"""Add all nodes and edges from another graph.
Note this doesn't check for duplicates, nor does it connect the graphs."""
self.nodes.update(graph.nodes)
self.edges.extend(graph.edges)
if all(is_uuid(node.id) for node in graph.nodes.values()):
prefix = ""

def prefixed(id: str) -> str:
return f"{prefix}:{id}" if prefix else id

# prefix each node
self.nodes.update(
{prefixed(k): Node(prefixed(k), v.data) for k, v in graph.nodes.items()}
)
# prefix each edge's source and target
self.edges.extend(
[
Edge(
prefixed(edge.source),
prefixed(edge.target),
edge.data,
edge.conditional,
)
for edge in graph.edges
]
)
# return (prefixed) first and last nodes of the subgraph
first, last = graph.first_node(), graph.last_node()
return (
Node(prefixed(first.id), first.data) if first else None,
Node(prefixed(last.id), last.data) if last else None,
)

def first_node(self) -> Optional[Node]:
"""Find the single node that is not a target of any edge.
Expand Down

0 comments on commit dd7b852

Please sign in to comment.