Files
crewAI/docs/examples/jinja_templating.md
Devin AI 15dd15fcab [FEATURE] Improve agent/task templating with Jinja2
Fixes #2650

- Add support for container types (List, Dict, Set)
- Add support for standard objects (datetime)
- Add support for custom objects
- Add support for conditional and loop statements
- Add support for filtering options
- Maintain backward compatibility with existing templates
- Add comprehensive tests
- Add documentation with examples

Co-Authored-By: Joe Moura <joao@crewai.com>
2025-04-20 14:36:46 +00:00

2.8 KiB

Enhanced Templating with Jinja2

CrewAI now supports enhanced templating using Jinja2, while maintaining compatibility with the existing templating system.

Basic Usage

The basic templating syntax remains the same:

from crewai import Agent, Task, Crew

# Define inputs
inputs = {
    "topic": "Artificial Intelligence",
    "year": 2024,
    "count": 5
}

# Create an agent with template variables
researcher = Agent(
    role="{topic} Researcher",
    goal="Research the latest developments in {topic} for {year}",
    backstory="You're an expert in {topic} with years of experience"
)

# Create a task with template variables
research_task = Task(
    description="Research {topic} and provide {count} key insights",
    expected_output="A list of {count} key insights about {topic} in {year}",
    agent=researcher
)

# Create a crew and pass inputs
crew = Crew(
    agents=[researcher],
    tasks=[research_task],
    inputs=inputs
)

# Run the crew
result = crew.kickoff()

Advanced Features

The new templating system adds support for container types, object attributes, conditional statements, loops, and filters:

Container Types

inputs = {
    "topics": ["AI", "Machine Learning", "Data Science"],
    "details": {"main_theme": "Technology Trends", "subtopics": ["Ethics", "Applications"]}
}

# Access list items
task = Task(
    description="Research {{topics[0]}} and {{topics[1]}}",
    expected_output="Analysis of the topics"
)

# Access dictionary items
task = Task(
    description="Research {{details.main_theme}} with focus on {{details.subtopics[0]}}",
    expected_output="Detailed analysis"
)

Conditional Statements

inputs = {
    "topic": "AI",
    "priority": "high",
    "deadline": "2024-12-31"
}

task = Task(
    description="{% if priority == 'high' %}URGENT: {% endif %}Research {topic}{% if deadline %} by {{deadline}}{% endif %}",
    expected_output="A report on {topic}"
)

Loop Statements

inputs = {
    "topics": ["AI", "Machine Learning", "Data Science"]
}

task = Task(
    description="Research the following topics: {% for topic in topics %}{{topic}}{% if not loop.last %}, {% endif %}{% endfor %}",
    expected_output="A report covering multiple topics"
)

Filters

from datetime import datetime

inputs = {
    "topic": "AI",
    "date": datetime.now()
}

task = Task(
    description="Research {topic} as of {{date|date('%Y-%m-%d')}}",
    expected_output="A report on {topic}"
)

Custom Objects

from pydantic import BaseModel

class Person(BaseModel):
    name: str
    age: int
    
    def __str__(self):
        return f"{self.name} ({self.age})"

inputs = {
    "author": Person(name="John Doe", age=35)
}

task = Task(
    description="Write a report authored by {author}",
    expected_output="A report by {{author.name}}"
)