With the recent release of our first open-source tool Agentic Radar, we’re committed to making transparency in agentic workflows more accessible to developers and security engineers across the AI community. As we continuously expand support for the most popular frameworks used to build and orchestrate agentic systems, we see Agentic Radar becoming an essential tool for securing Agentic AI.
In this technical article, we'll dive into integrating Agentic Radar with CrewAI, one of the leading frameworks for developing agentic workflows. This integration streamlines the analysis and visualization of your CrewAI workflows, while automatically identifying potential vulnerabilities mapped to recognized AI security standards like the OWASP LLM Top 10 and Agentic AI Threats.
With the recent release of our first open-source tool Agentic Radar, we’re committed to making transparency in agentic workflows more accessible to developers and security engineers across the AI community. As we continuously expand support for the most popular frameworks used to build and orchestrate agentic systems, we see Agentic Radar becoming an essential tool for securing Agentic AI.
In this technical article, we'll dive into integrating Agentic Radar with CrewAI, one of the leading frameworks for developing agentic workflows. This integration streamlines the analysis and visualization of your CrewAI workflows, while automatically identifying potential vulnerabilities mapped to recognized AI security standards like the OWASP LLM Top 10 and Agentic AI Threats.
With the recent release of our first open-source tool Agentic Radar, we’re committed to making transparency in agentic workflows more accessible to developers and security engineers across the AI community. As we continuously expand support for the most popular frameworks used to build and orchestrate agentic systems, we see Agentic Radar becoming an essential tool for securing Agentic AI.
In this technical article, we'll dive into integrating Agentic Radar with CrewAI, one of the leading frameworks for developing agentic workflows. This integration streamlines the analysis and visualization of your CrewAI workflows, while automatically identifying potential vulnerabilities mapped to recognized AI security standards like the OWASP LLM Top 10 and Agentic AI Threats.
Exploring a CrewAI Workflow: A Detailed Code Example
CrewAI is an open-source framework designed to simplify the orchestration of autonomous AI agents, enabling seamless collaboration through intuitive assignments of roles, tools, and objectives. With its clean, declarative syntax, developers can effortlessly develop complex and high-performing agentic workflows.
Let’s dive deeper into a practical example to see CrewAI in action. We'll examine an agentic workflow that leverages multiple agents to automate the creation of surprise travel itineraries. Below is a Python code snippet showcasing how agents and tools are defined and organized within a single Crew (you can explore the complete example here).
class Activity(BaseModel):
name: str = Field(..., description="Name of the activity")
location: str = Field(..., description="Location of the activity")
description: str = Field(..., description="Description of the activity")
date: str = Field(..., description="Date of the activity")
cousine: str = Field(..., description="Cousine of the restaurant")
why_its_suitable: str = Field(..., description="Why it's suitable for the traveler")
reviews: Optional[List[str]] = Field(..., description="List of reviews")
rating: Optional[float] = Field(..., description="Rating of the activity")
class DayPlan(BaseModel):
date: str = Field(..., description="Date of the day")
activities: List[Activity] = Field(..., description="List of activities")
restaurants: List[str] = Field(..., description="List of restaurants")
flight: Optional[str] = Field(None, description="Flight information")
class Itinerary(BaseModel):
name: str = Field(..., description="Name of the itinerary, something funny")
day_plans: List[DayPlan] = Field(..., description="List of day plans")
hotel: str = Field(..., description="Hotel information")
@CrewBase
class SurpriseTravelCrew():
"""SurpriseTravel crew"""
agents_config = 'config/agents.yaml'
tasks_config = 'config/tasks.yaml'
@agent
def personalized_activity_planner(self) -> Agent:
return Agent(
config=self.agents_config['personalized_activity_planner'],
tools=[SerperDevTool(), ScrapeWebsiteTool()],
verbose=True,
allow_delegation=False,
)
@agent
def restaurant_scout(self) -> Agent:
return Agent(
config=self.agents_config['restaurant_scout'],
tools=[SerperDevTool(), ScrapeWebsiteTool()],
verbose=True,
allow_delegation=False,
)
@agent
def itinerary_compiler(self) -> Agent:
return Agent(
config=self.agents_config['itinerary_compiler'],
tools=[SerperDevTool()],
verbose=True,
allow_delegation=False,
)
@task
def personalized_activity_planning_task(self) -> Task:
return Task(
config=self.tasks_config['personalized_activity_planning_task'],
agent=self.personalized_activity_planner()
)
@task
def restaurant_scenic_location_scout_task(self) -> Task:
return Task(
config=self.tasks_config['restaurant_scenic_location_scout_task'],
agent=self.restaurant_scout()
)
@task
def itinerary_compilation_task(self) -> Task:
return Task(
config=self.tasks_config['itinerary_compilation_task'],
agent=self.itinerary_compiler(),
output_json=Itinerary
)
@crew
def crew(self) -> Crew:
"""Creates the SurpriseTravel crew"""
return Crew(
agents=self.agents
tasks=self.tasks,
process=Process.sequential,
verbose=2
As you can see above, setting up a workflow in CrewAI is pretty straightforward – even if you're completely new to the framework. However, clearly visualizing all the connections between different agents and tools can quickly become challenging, especially as the workflow grows in size and complexity. To illustrate this, let's first attempt to map these dependencies manually using our example workflow.
Finding Agents Manually
We can identify agents by the @agent
function decorators. We can visualize them as graph nodes below.

Connecting Agents to Tools
To understand how each agent interacts with specific tools, we can inspect the tools
keyword argument in their definitions. Our example utilizes two built-in CrewAI tools: ScrapeWebsiteTool and SerperDevTool. While these tools significantly enhance our agents' capabilities, they also introduce potential security risks, especially when interacting with external resources. For example, ScrapeWebsiteTool enables agents to extract data from web pages, potentially causing unintended data exposure or unauthorized scraping if not properly managed. Similarly, SerperDevTool grants search engine access, which could expose the system to risks such as uncontrolled queries or accidental leakage of sensitive information.
Let’s now incorporate these tools into our visualization and connect each of them to the corresponding agents.

Agent-to-Agent Interactions
Agentic systems reach their full potential when agents can dynamically communicate and collaborate, seamlessly exchanging information. To complete our visualization, it's essential to map the connections between agents themselves. This will give us a clear view of how data is flowing through the entire system.
To infer these agent-to-agent connections from our code, we first need to understand CrewAI’s core concept of Tasks. In CrewAI, tasks represent distinct units of work executed by agents. For example, the restaurant_scenic_location_scout_task
encapsulates all necessary information, including input data, logic for processing, and expected outputs, enabling the assigned agent to find restaurants with scenic views. Each task explicitly assigns responsibility to a specific agent, defined via the agent
keyword argument in the Task(...)
constructor. Let’s manually extract these task-to-agent mappings next:
Task | Agent |
---|---|
personalized_activity_planning_task | personalized_activity_planner |
restaurant_scenic_location_scout_task | restaurant_scout |
itinerary_compilation_task | itinerary_compiler |
Another important concept to understand is CrewAI’s use of Processes, which orchestrate task execution across agents. In our example, we can identify the specific process by examining the process
keyword argument within the Crew(...)
constructor. Here, the process is set to Process.sequential
, indicating that tasks will run sequentially, following the order they're defined in the Crew
class. The output from each task is automatically passed as additional context to the next one, which helps the agent produce more meaningful and relevant results.
Given that agents are tied directly to tasks – and tasks execute sequentially – the agents' workflow naturally follows this same order. Now we have all the details needed to finalize our visualization. To make things even clearer, we’ll include explicit Start and End nodes to define the boundaries of our workflow.

CrewAI is an open-source framework designed to simplify the orchestration of autonomous AI agents, enabling seamless collaboration through intuitive assignments of roles, tools, and objectives. With its clean, declarative syntax, developers can effortlessly develop complex and high-performing agentic workflows.
Let’s dive deeper into a practical example to see CrewAI in action. We'll examine an agentic workflow that leverages multiple agents to automate the creation of surprise travel itineraries. Below is a Python code snippet showcasing how agents and tools are defined and organized within a single Crew (you can explore the complete example here).
class Activity(BaseModel):
name: str = Field(..., description="Name of the activity")
location: str = Field(..., description="Location of the activity")
description: str = Field(..., description="Description of the activity")
date: str = Field(..., description="Date of the activity")
cousine: str = Field(..., description="Cousine of the restaurant")
why_its_suitable: str = Field(..., description="Why it's suitable for the traveler")
reviews: Optional[List[str]] = Field(..., description="List of reviews")
rating: Optional[float] = Field(..., description="Rating of the activity")
class DayPlan(BaseModel):
date: str = Field(..., description="Date of the day")
activities: List[Activity] = Field(..., description="List of activities")
restaurants: List[str] = Field(..., description="List of restaurants")
flight: Optional[str] = Field(None, description="Flight information")
class Itinerary(BaseModel):
name: str = Field(..., description="Name of the itinerary, something funny")
day_plans: List[DayPlan] = Field(..., description="List of day plans")
hotel: str = Field(..., description="Hotel information")
@CrewBase
class SurpriseTravelCrew():
"""SurpriseTravel crew"""
agents_config = 'config/agents.yaml'
tasks_config = 'config/tasks.yaml'
@agent
def personalized_activity_planner(self) -> Agent:
return Agent(
config=self.agents_config['personalized_activity_planner'],
tools=[SerperDevTool(), ScrapeWebsiteTool()],
verbose=True,
allow_delegation=False,
)
@agent
def restaurant_scout(self) -> Agent:
return Agent(
config=self.agents_config['restaurant_scout'],
tools=[SerperDevTool(), ScrapeWebsiteTool()],
verbose=True,
allow_delegation=False,
)
@agent
def itinerary_compiler(self) -> Agent:
return Agent(
config=self.agents_config['itinerary_compiler'],
tools=[SerperDevTool()],
verbose=True,
allow_delegation=False,
)
@task
def personalized_activity_planning_task(self) -> Task:
return Task(
config=self.tasks_config['personalized_activity_planning_task'],
agent=self.personalized_activity_planner()
)
@task
def restaurant_scenic_location_scout_task(self) -> Task:
return Task(
config=self.tasks_config['restaurant_scenic_location_scout_task'],
agent=self.restaurant_scout()
)
@task
def itinerary_compilation_task(self) -> Task:
return Task(
config=self.tasks_config['itinerary_compilation_task'],
agent=self.itinerary_compiler(),
output_json=Itinerary
)
@crew
def crew(self) -> Crew:
"""Creates the SurpriseTravel crew"""
return Crew(
agents=self.agents
tasks=self.tasks,
process=Process.sequential,
verbose=2
As you can see above, setting up a workflow in CrewAI is pretty straightforward – even if you're completely new to the framework. However, clearly visualizing all the connections between different agents and tools can quickly become challenging, especially as the workflow grows in size and complexity. To illustrate this, let's first attempt to map these dependencies manually using our example workflow.
Finding Agents Manually
We can identify agents by the @agent
function decorators. We can visualize them as graph nodes below.

Connecting Agents to Tools
To understand how each agent interacts with specific tools, we can inspect the tools
keyword argument in their definitions. Our example utilizes two built-in CrewAI tools: ScrapeWebsiteTool and SerperDevTool. While these tools significantly enhance our agents' capabilities, they also introduce potential security risks, especially when interacting with external resources. For example, ScrapeWebsiteTool enables agents to extract data from web pages, potentially causing unintended data exposure or unauthorized scraping if not properly managed. Similarly, SerperDevTool grants search engine access, which could expose the system to risks such as uncontrolled queries or accidental leakage of sensitive information.
Let’s now incorporate these tools into our visualization and connect each of them to the corresponding agents.

Agent-to-Agent Interactions
Agentic systems reach their full potential when agents can dynamically communicate and collaborate, seamlessly exchanging information. To complete our visualization, it's essential to map the connections between agents themselves. This will give us a clear view of how data is flowing through the entire system.
To infer these agent-to-agent connections from our code, we first need to understand CrewAI’s core concept of Tasks. In CrewAI, tasks represent distinct units of work executed by agents. For example, the restaurant_scenic_location_scout_task
encapsulates all necessary information, including input data, logic for processing, and expected outputs, enabling the assigned agent to find restaurants with scenic views. Each task explicitly assigns responsibility to a specific agent, defined via the agent
keyword argument in the Task(...)
constructor. Let’s manually extract these task-to-agent mappings next:
Task | Agent |
---|---|
personalized_activity_planning_task | personalized_activity_planner |
restaurant_scenic_location_scout_task | restaurant_scout |
itinerary_compilation_task | itinerary_compiler |
Another important concept to understand is CrewAI’s use of Processes, which orchestrate task execution across agents. In our example, we can identify the specific process by examining the process
keyword argument within the Crew(...)
constructor. Here, the process is set to Process.sequential
, indicating that tasks will run sequentially, following the order they're defined in the Crew
class. The output from each task is automatically passed as additional context to the next one, which helps the agent produce more meaningful and relevant results.
Given that agents are tied directly to tasks – and tasks execute sequentially – the agents' workflow naturally follows this same order. Now we have all the details needed to finalize our visualization. To make things even clearer, we’ll include explicit Start and End nodes to define the boundaries of our workflow.

CrewAI is an open-source framework designed to simplify the orchestration of autonomous AI agents, enabling seamless collaboration through intuitive assignments of roles, tools, and objectives. With its clean, declarative syntax, developers can effortlessly develop complex and high-performing agentic workflows.
Let’s dive deeper into a practical example to see CrewAI in action. We'll examine an agentic workflow that leverages multiple agents to automate the creation of surprise travel itineraries. Below is a Python code snippet showcasing how agents and tools are defined and organized within a single Crew (you can explore the complete example here).
class Activity(BaseModel):
name: str = Field(..., description="Name of the activity")
location: str = Field(..., description="Location of the activity")
description: str = Field(..., description="Description of the activity")
date: str = Field(..., description="Date of the activity")
cousine: str = Field(..., description="Cousine of the restaurant")
why_its_suitable: str = Field(..., description="Why it's suitable for the traveler")
reviews: Optional[List[str]] = Field(..., description="List of reviews")
rating: Optional[float] = Field(..., description="Rating of the activity")
class DayPlan(BaseModel):
date: str = Field(..., description="Date of the day")
activities: List[Activity] = Field(..., description="List of activities")
restaurants: List[str] = Field(..., description="List of restaurants")
flight: Optional[str] = Field(None, description="Flight information")
class Itinerary(BaseModel):
name: str = Field(..., description="Name of the itinerary, something funny")
day_plans: List[DayPlan] = Field(..., description="List of day plans")
hotel: str = Field(..., description="Hotel information")
@CrewBase
class SurpriseTravelCrew():
"""SurpriseTravel crew"""
agents_config = 'config/agents.yaml'
tasks_config = 'config/tasks.yaml'
@agent
def personalized_activity_planner(self) -> Agent:
return Agent(
config=self.agents_config['personalized_activity_planner'],
tools=[SerperDevTool(), ScrapeWebsiteTool()],
verbose=True,
allow_delegation=False,
)
@agent
def restaurant_scout(self) -> Agent:
return Agent(
config=self.agents_config['restaurant_scout'],
tools=[SerperDevTool(), ScrapeWebsiteTool()],
verbose=True,
allow_delegation=False,
)
@agent
def itinerary_compiler(self) -> Agent:
return Agent(
config=self.agents_config['itinerary_compiler'],
tools=[SerperDevTool()],
verbose=True,
allow_delegation=False,
)
@task
def personalized_activity_planning_task(self) -> Task:
return Task(
config=self.tasks_config['personalized_activity_planning_task'],
agent=self.personalized_activity_planner()
)
@task
def restaurant_scenic_location_scout_task(self) -> Task:
return Task(
config=self.tasks_config['restaurant_scenic_location_scout_task'],
agent=self.restaurant_scout()
)
@task
def itinerary_compilation_task(self) -> Task:
return Task(
config=self.tasks_config['itinerary_compilation_task'],
agent=self.itinerary_compiler(),
output_json=Itinerary
)
@crew
def crew(self) -> Crew:
"""Creates the SurpriseTravel crew"""
return Crew(
agents=self.agents
tasks=self.tasks,
process=Process.sequential,
verbose=2
As you can see above, setting up a workflow in CrewAI is pretty straightforward – even if you're completely new to the framework. However, clearly visualizing all the connections between different agents and tools can quickly become challenging, especially as the workflow grows in size and complexity. To illustrate this, let's first attempt to map these dependencies manually using our example workflow.
Finding Agents Manually
We can identify agents by the @agent
function decorators. We can visualize them as graph nodes below.

Connecting Agents to Tools
To understand how each agent interacts with specific tools, we can inspect the tools
keyword argument in their definitions. Our example utilizes two built-in CrewAI tools: ScrapeWebsiteTool and SerperDevTool. While these tools significantly enhance our agents' capabilities, they also introduce potential security risks, especially when interacting with external resources. For example, ScrapeWebsiteTool enables agents to extract data from web pages, potentially causing unintended data exposure or unauthorized scraping if not properly managed. Similarly, SerperDevTool grants search engine access, which could expose the system to risks such as uncontrolled queries or accidental leakage of sensitive information.
Let’s now incorporate these tools into our visualization and connect each of them to the corresponding agents.

Agent-to-Agent Interactions
Agentic systems reach their full potential when agents can dynamically communicate and collaborate, seamlessly exchanging information. To complete our visualization, it's essential to map the connections between agents themselves. This will give us a clear view of how data is flowing through the entire system.
To infer these agent-to-agent connections from our code, we first need to understand CrewAI’s core concept of Tasks. In CrewAI, tasks represent distinct units of work executed by agents. For example, the restaurant_scenic_location_scout_task
encapsulates all necessary information, including input data, logic for processing, and expected outputs, enabling the assigned agent to find restaurants with scenic views. Each task explicitly assigns responsibility to a specific agent, defined via the agent
keyword argument in the Task(...)
constructor. Let’s manually extract these task-to-agent mappings next:
Task | Agent |
---|---|
personalized_activity_planning_task | personalized_activity_planner |
restaurant_scenic_location_scout_task | restaurant_scout |
itinerary_compilation_task | itinerary_compiler |
Another important concept to understand is CrewAI’s use of Processes, which orchestrate task execution across agents. In our example, we can identify the specific process by examining the process
keyword argument within the Crew(...)
constructor. Here, the process is set to Process.sequential
, indicating that tasks will run sequentially, following the order they're defined in the Crew
class. The output from each task is automatically passed as additional context to the next one, which helps the agent produce more meaningful and relevant results.
Given that agents are tied directly to tasks – and tasks execute sequentially – the agents' workflow naturally follows this same order. Now we have all the details needed to finalize our visualization. To make things even clearer, we’ll include explicit Start and End nodes to define the boundaries of our workflow.

Automating it with Agentic Radar
Visualizing agentic workflows manually can quickly become tedious, especially when dealing with complex workflows spread across multiple files in a large codebase. This is exactly where Agentic Radar comes into play – it automates the extraction, analysis, and visualization of agentic workflows. Instead of manually tracing through agents, tasks, and tools, Agentic Radar scans your codebase, identifies critical components, and produces a structured, interactive graph illustrating the complete execution flow.
Let’s see how to leverage Agentic Radar on our CrewAI example workflow.
First, ensure you've completed the Getting Started instructions outlined in the repository's README file. Then, clone or download the CrewAI example repository:
git clone https://github.com/crewAIInc/crewAI-examples/tree/main
After that, run Agentic Radar on the surprise_trip
example by executing the following command:
agentic-radar -i ./crewAI-examples/surprise_trip -o report.html crewai
Agentic Radar will generate a clean, informative report that clearly shows how agents interact, identifies the tools they utilize, and highlights potential security risks. Additionally, the report provides practical steps for remediation, enabling security engineers to proactively resolve issues before they become critical.
You can open the generated report.html
in your preferred browser to explore the visualization. You should see something like this:

Below the graph you can find the report of potential tool vulnerabilities:


Visualizing agentic workflows manually can quickly become tedious, especially when dealing with complex workflows spread across multiple files in a large codebase. This is exactly where Agentic Radar comes into play – it automates the extraction, analysis, and visualization of agentic workflows. Instead of manually tracing through agents, tasks, and tools, Agentic Radar scans your codebase, identifies critical components, and produces a structured, interactive graph illustrating the complete execution flow.
Let’s see how to leverage Agentic Radar on our CrewAI example workflow.
First, ensure you've completed the Getting Started instructions outlined in the repository's README file. Then, clone or download the CrewAI example repository:
git clone https://github.com/crewAIInc/crewAI-examples/tree/main
After that, run Agentic Radar on the surprise_trip
example by executing the following command:
agentic-radar -i ./crewAI-examples/surprise_trip -o report.html crewai
Agentic Radar will generate a clean, informative report that clearly shows how agents interact, identifies the tools they utilize, and highlights potential security risks. Additionally, the report provides practical steps for remediation, enabling security engineers to proactively resolve issues before they become critical.
You can open the generated report.html
in your preferred browser to explore the visualization. You should see something like this:

Below the graph you can find the report of potential tool vulnerabilities:


Visualizing agentic workflows manually can quickly become tedious, especially when dealing with complex workflows spread across multiple files in a large codebase. This is exactly where Agentic Radar comes into play – it automates the extraction, analysis, and visualization of agentic workflows. Instead of manually tracing through agents, tasks, and tools, Agentic Radar scans your codebase, identifies critical components, and produces a structured, interactive graph illustrating the complete execution flow.
Let’s see how to leverage Agentic Radar on our CrewAI example workflow.
First, ensure you've completed the Getting Started instructions outlined in the repository's README file. Then, clone or download the CrewAI example repository:
git clone https://github.com/crewAIInc/crewAI-examples/tree/main
After that, run Agentic Radar on the surprise_trip
example by executing the following command:
agentic-radar -i ./crewAI-examples/surprise_trip -o report.html crewai
Agentic Radar will generate a clean, informative report that clearly shows how agents interact, identifies the tools they utilize, and highlights potential security risks. Additionally, the report provides practical steps for remediation, enabling security engineers to proactively resolve issues before they become critical.
You can open the generated report.html
in your preferred browser to explore the visualization. You should see something like this:

Below the graph you can find the report of potential tool vulnerabilities:


The Road Ahead
Agentic Radar has already taken important steps toward enhancing transparency and improving security analysis for agentic AI workflows – but this is just the start. As agentic systems continue to evolve, so must the tools we use to understand and protect them.
Looking forward, our team is actively working to enhance the static analysis capabilities and precision specifically for CrewAI workflows. We're also committed to rapidly expanding Agentic Radar's coverage by integrating other leading frameworks, such as LlamaIndex, Swarm, PydanticAI, AutoGen, Dify and more. By continuously refining vulnerability mappings and supporting more frameworks, we're making Agentic Radar an indispensable solution for developers and security engineers dedicated to securing advanced, AI-driven systems.
Stay tuned – there's much more on the way!
Agentic Radar has already taken important steps toward enhancing transparency and improving security analysis for agentic AI workflows – but this is just the start. As agentic systems continue to evolve, so must the tools we use to understand and protect them.
Looking forward, our team is actively working to enhance the static analysis capabilities and precision specifically for CrewAI workflows. We're also committed to rapidly expanding Agentic Radar's coverage by integrating other leading frameworks, such as LlamaIndex, Swarm, PydanticAI, AutoGen, Dify and more. By continuously refining vulnerability mappings and supporting more frameworks, we're making Agentic Radar an indispensable solution for developers and security engineers dedicated to securing advanced, AI-driven systems.
Stay tuned – there's much more on the way!
Agentic Radar has already taken important steps toward enhancing transparency and improving security analysis for agentic AI workflows – but this is just the start. As agentic systems continue to evolve, so must the tools we use to understand and protect them.
Looking forward, our team is actively working to enhance the static analysis capabilities and precision specifically for CrewAI workflows. We're also committed to rapidly expanding Agentic Radar's coverage by integrating other leading frameworks, such as LlamaIndex, Swarm, PydanticAI, AutoGen, Dify and more. By continuously refining vulnerability mappings and supporting more frameworks, we're making Agentic Radar an indispensable solution for developers and security engineers dedicated to securing advanced, AI-driven systems.
Stay tuned – there's much more on the way!
Ready to adopt Generative AI with confidence?
Ready to adopt Generative AI with confidence?
Ready to adopt Generative AI with confidence?