Conditional routing in graphs helps decide which path to take based on certain rules or conditions. It makes the flow smart and flexible.
Conditional routing in graphs in LangChain
Start learning this pattern below
Jump into concepts and practice - no test required
from langchain.graphs import Graph # Create a graph graph = Graph() # Add nodes with names graph.add_node('start') graph.add_node('option_a') graph.add_node('option_b') # Add edges with conditions # condition is a function that returns True or False graph.add_edge('start', 'option_a', condition=lambda context: context['choice'] == 'a') graph.add_edge('start', 'option_b', condition=lambda context: context['choice'] == 'b') # Run the graph with a context result = graph.run(start_node='start', context={'choice': 'a'})
The condition is a function that checks the context to decide if the edge should be followed.
The context is a dictionary holding data used to evaluate conditions.
graph.add_edge('start', 'option_a', condition=lambda context: context['choice'] == 'a')
graph.add_edge('start', 'option_b', condition=lambda context: context['choice'] == 'b')
graph.add_edge('start', 'default_option', condition=lambda context: True)
# Edge with no condition means always true graph.add_edge('start', 'always_option')
This program creates a graph with conditional edges. It runs the graph with different inputs to show how the path changes based on conditions.
from langchain.graphs import Graph # Create a graph workflow_graph = Graph() # Add nodes workflow_graph.add_node('start') workflow_graph.add_node('process_a') workflow_graph.add_node('process_b') workflow_graph.add_node('end') # Add edges with conditions workflow_graph.add_edge('start', 'process_a', condition=lambda context: context.get('input') == 'A') workflow_graph.add_edge('start', 'process_b', condition=lambda context: context.get('input') == 'B') workflow_graph.add_edge('process_a', 'end') workflow_graph.add_edge('process_b', 'end') # Function to run and print path def run_and_print_path(graph, start, context): path = graph.run(start_node=start, context=context) print(f"Context: {context}") print(f"Path taken: {path}") # Run with input 'A' run_and_print_path(workflow_graph, 'start', {'input': 'A'}) # Run with input 'B' run_and_print_path(workflow_graph, 'start', {'input': 'B'}) # Run with input 'C' (no matching condition) run_and_print_path(workflow_graph, 'start', {'input': 'C'})
Time complexity depends on the number of edges checked at each node.
Space complexity depends on the size of the graph and context data.
Common mistake: forgetting to handle cases where no condition matches, which can stop the flow unexpectedly.
Use conditional routing to make flows dynamic and responsive to input or state.
Conditional routing lets you choose paths based on rules.
Use conditions as simple functions checking context data.
Always consider what happens if no conditions match.
Practice
Solution
Step 1: Understand conditional routing concept
Conditional routing means selecting the next step based on rules or conditions.Step 2: Match purpose with options
Only To choose the next node based on specific conditions describes choosing the next node based on conditions, which fits the concept.Final Answer:
To choose the next node based on specific conditions -> Option DQuick Check:
Conditional routing = choose next node by condition [OK]
- Confusing routing with parallel execution
- Assuming routing stops the graph
- Thinking routing is random
Solution
Step 1: Check function syntax in Python
Python functions require 'def' keyword, a parameter list, and a return statement.Step 2: Validate each option
def condition(context): return context['value'] > 10 correctly defines a function with one parameter and returns a boolean. condition = context => context.value > 10 uses JavaScript syntax. def condition(): return context['value'] > 10 misses the parameter. condition(context): return context.value > 10 misses 'def' keyword.Final Answer:
def condition(context): return context['value'] > 10 -> Option AQuick Check:
Python function with parameter and return = def condition(context): return context['value'] > 10 [OK]
- Using JavaScript arrow function syntax in Python
- Omitting function parameters
- Missing 'def' keyword
conditions = [
lambda ctx: ctx['score'] > 80,
lambda ctx: ctx['score'] > 50
]
routes = ['high', 'medium', 'low']
context = {'score': 65}
Which route will be chosen?Solution
Step 1: Evaluate conditions in order with context
First condition: score > 80? 65 > 80 is False. Second condition: score > 50? 65 > 50 is True.Step 2: Match true condition to route
Second condition matches, so route at index 1 is chosen, which is "medium".Final Answer:
"medium" -> Option BQuick Check:
First true condition index = route chosen [OK]
- Choosing 'high' because 65 > 50 but ignoring order
- Picking 'low' when conditions match
- Assuming error if not all conditions true
def route_condition(context):
if context['value'] > 10:
return True
elif context['value'] < 5:
return False
routes = ['path1', 'path2']
# Routing uses route_condition
Solution
Step 1: Check function return paths
The function returns True if value > 10, False if value < 5, but returns nothing if value is between 5 and 10.Step 2: Understand routing condition requirements
Routing conditions must return a boolean for every input to decide path. Missing return causes errors or unexpected behavior.Final Answer:
The function does not return a value for all cases -> Option CQuick Check:
All code paths must return a boolean [OK]
- Ignoring missing return in some cases
- Thinking routes count must match conditions exactly
- Returning wrong data types
- If input contains "urgent", go to 'priority' node
- If input length > 100, go to 'long' node
- Otherwise, go to 'normal' node
Which conditional routing setup correctly implements this logic?
Solution
Step 1: Match conditions to requirements in order
First condition checks if 'urgent' is in input, matching priority route. Second checks input length > 100 for long route.Step 2: Confirm routes order matches conditions plus default
Routes list has 'priority', 'long', then 'normal' as default if no condition matches.Final Answer:
conditions = [lambda ctx: 'urgent' in ctx['input'], lambda ctx: len(ctx['input']) > 100] routes = ['priority', 'long', 'normal'] -> Option AQuick Check:
Order and logic match requirements [OK]
- Swapping condition order and routes
- Combining conditions incorrectly
- Using negated conditions that break logic
