Bird
Raised Fist0
LangChainframework~5 mins

Conditional routing in graphs in LangChain

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction

Conditional routing in graphs helps decide which path to take based on certain rules or conditions. It makes the flow smart and flexible.

When you want to choose different actions based on user input in a chatbot.
When processing data flows that depend on specific values or states.
When building workflows that need to branch depending on conditions.
When you want to handle errors or special cases differently in a process.
Syntax
LangChain
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.

Examples
This edge is taken only if the context's 'choice' is 'a'.
LangChain
graph.add_edge('start', 'option_a', condition=lambda context: context['choice'] == 'a')
This edge is taken only if the context's 'choice' is 'b'.
LangChain
graph.add_edge('start', 'option_b', condition=lambda context: context['choice'] == 'b')
This edge is always taken if no other conditions match, acting as a fallback.
LangChain
graph.add_edge('start', 'default_option', condition=lambda context: True)
If no condition is given, the edge is always available.
LangChain
# Edge with no condition means always true
graph.add_edge('start', 'always_option')
Sample Program

This program creates a graph with conditional edges. It runs the graph with different inputs to show how the path changes based on conditions.

LangChain
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'})
OutputSuccess
Important Notes

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.

Summary

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

(1/5)
1. What is the main purpose of conditional routing in Langchain graphs?
easy
A. To randomly select a node without any rules
B. To execute all nodes in parallel regardless of conditions
C. To stop the graph execution immediately
D. To choose the next node based on specific conditions

Solution

  1. Step 1: Understand conditional routing concept

    Conditional routing means selecting the next step based on rules or conditions.
  2. 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.
  3. Final Answer:

    To choose the next node based on specific conditions -> Option D
  4. Quick Check:

    Conditional routing = choose next node by condition [OK]
Hint: Think: routing means choosing path by rules [OK]
Common Mistakes:
  • Confusing routing with parallel execution
  • Assuming routing stops the graph
  • Thinking routing is random
2. Which of the following is the correct way to define a condition function for routing in Langchain?
easy
A. def condition(context): return context['value'] > 10
B. condition = context => context.value > 10
C. def condition(): return context['value'] > 10
D. condition(context): return context.value > 10

Solution

  1. Step 1: Check function syntax in Python

    Python functions require 'def' keyword, a parameter list, and a return statement.
  2. 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.
  3. Final Answer:

    def condition(context): return context['value'] > 10 -> Option A
  4. Quick Check:

    Python function with parameter and return = def condition(context): return context['value'] > 10 [OK]
Hint: Remember Python function syntax: def name(params): return value [OK]
Common Mistakes:
  • Using JavaScript arrow function syntax in Python
  • Omitting function parameters
  • Missing 'def' keyword
3. Given this routing setup in Langchain graph:
conditions = [
  lambda ctx: ctx['score'] > 80,
  lambda ctx: ctx['score'] > 50
]
routes = ['high', 'medium', 'low']
context = {'score': 65}

Which route will be chosen?
medium
A. "high"
B. "medium"
C. "low"
D. Error due to missing condition

Solution

  1. Step 1: Evaluate conditions in order with context

    First condition: score > 80? 65 > 80 is False. Second condition: score > 50? 65 > 50 is True.
  2. Step 2: Match true condition to route

    Second condition matches, so route at index 1 is chosen, which is "medium".
  3. Final Answer:

    "medium" -> Option B
  4. Quick Check:

    First true condition index = route chosen [OK]
Hint: Check conditions top to bottom, pick first true route [OK]
Common Mistakes:
  • Choosing 'high' because 65 > 50 but ignoring order
  • Picking 'low' when conditions match
  • Assuming error if not all conditions true
4. Identify the error in this Langchain routing code snippet:
def route_condition(context):
  if context['value'] > 10:
    return True
  elif context['value'] < 5:
    return False

routes = ['path1', 'path2']
# Routing uses route_condition
medium
A. Routes list should have three paths
B. The function uses wrong comparison operators
C. The function does not return a value for all cases
D. The function should return strings, not booleans

Solution

  1. 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.
  2. 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.
  3. Final Answer:

    The function does not return a value for all cases -> Option C
  4. Quick Check:

    All code paths must return a boolean [OK]
Hint: Ensure all if/else paths return a value [OK]
Common Mistakes:
  • Ignoring missing return in some cases
  • Thinking routes count must match conditions exactly
  • Returning wrong data types
5. You want to route a Langchain graph node based on user input where:
- 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?
hard
A. conditions = [lambda ctx: 'urgent' in ctx['input'], lambda ctx: len(ctx['input']) > 100] routes = ['priority', 'long', 'normal']
B. conditions = [lambda ctx: len(ctx['input']) > 100, lambda ctx: 'urgent' in ctx['input']] routes = ['long', 'priority', 'normal']
C. conditions = [lambda ctx: 'urgent' in ctx['input'] and len(ctx['input']) > 100] routes = ['priority', 'long', 'normal']
D. conditions = [lambda ctx: 'urgent' not in ctx['input'], lambda ctx: len(ctx['input']) <= 100] routes = ['normal', 'long', 'priority']

Solution

  1. 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.
  2. Step 2: Confirm routes order matches conditions plus default

    Routes list has 'priority', 'long', then 'normal' as default if no condition matches.
  3. Final Answer:

    conditions = [lambda ctx: 'urgent' in ctx['input'], lambda ctx: len(ctx['input']) > 100] routes = ['priority', 'long', 'normal'] -> Option A
  4. Quick Check:

    Order and logic match requirements [OK]
Hint: Order conditions by priority, add default route last [OK]
Common Mistakes:
  • Swapping condition order and routes
  • Combining conditions incorrectly
  • Using negated conditions that break logic