Files
crewAI/docs/how-to/Create-Custom-Tools.md

5.3 KiB

title, description
title description
Creating and Utilizing Tools in crewAI A comprehensive guide on crafting, using, and managing custom tools within the crewAI framework, including advanced functionalities and best practices.

Creating and Utilizing Tools in crewAI

This guide provides detailed instructions on creating custom tools for the crewAI framework, efficiently managing and utilizing these tools, and incorporating advanced functionalities. By mastering tool creation and management, you can significantly enhance the capabilities of your AI agents and improve overall system performance.

Table of Contents

  1. Prerequisites
  2. Creating Custom Tools
  3. Advanced Tool Features
  4. Best Practices
  5. Conclusion

Prerequisites

Before creating your own tools, ensure you have the crewAI extra tools package installed:

pip install 'crewai[tools]'

Creating Custom Tools

Subclassing BaseTool

To create a personalized tool, inherit from BaseTool and define the necessary attributes and the _run method:

from crewai_tools import BaseTool

class MyCustomTool(BaseTool):
    name: str = "My Custom Tool"
    description: str = "This tool performs a specific task. Provide a clear description for effective utilization."

    def _run(self, argument: str) -> str:
        # Implement your tool's logic here
        result = f"Processed: {argument}"
        return result

Using the tool Decorator

For simpler tools, use the @tool decorator to define the tool's attributes and functionality directly within a function:

from crewai_tools import tool

@tool("Simple Calculator")
def simple_calculator(operation: str, a: float, b: float) -> float:
    """Performs basic arithmetic operations (add, subtract, multiply, divide)."""
    if operation == "add":
        return a + b
    elif operation == "subtract":
        return a - b
    elif operation == "multiply":
        return a * b
    elif operation == "divide":
        return a / b if b != 0 else "Error: Division by zero"
    else:
        return "Error: Invalid operation"

Advanced Tool Features

Implementing Caching

Optimize tool performance with custom caching strategies:

from crewai_tools import tool

@tool("Cacheable Tool")
def cacheable_tool(input_data: str) -> str:
    """Tool that benefits from caching results."""
    # Simulate complex processing
    import time
    time.sleep(2)
    return f"Processed: {input_data}"

def cache_strategy(arguments: dict, result: str) -> bool:
    # Implement your caching logic here
    return len(arguments['input_data']) > 10  # Cache results for longer inputs

cacheable_tool.cache_function = cache_strategy

Error Handling

Implement robust error handling in your tools:

from crewai_tools import BaseTool

class RobustTool(BaseTool):
    name: str = "Robust Processing Tool"
    description: str = "Processes data with error handling."

    def _run(self, data: str) -> str:
        try:
            # Your processing logic here
            result = self._process_data(data)
            return result
        except ValueError as e:
            return f"Error: Invalid input - {str(e)}"
        except Exception as e:
            return f"Unexpected error occurred: {str(e)}"

    def _process_data(self, data: str) -> str:
        # Implement your actual data processing logic here
        if not data:
            raise ValueError("Empty input")
        return f"Successfully processed: {data}"

Dynamic Tool Calling

Implement dynamic tool selection based on input:

from crewai_tools import tool

@tool("Dynamic Tool Selector")
def dynamic_tool_selector(task_description: str) -> str:
    """Selects and calls the appropriate tool based on the task description."""
    if "calculate" in task_description.lower():
        return simple_calculator("add", 5, 3)  # Example usage
    elif "process" in task_description.lower():
        return cacheable_tool("Sample input")
    else:
        return "No suitable tool found for the given task."

Best Practices

  1. Clear Documentation: Provide detailed descriptions for each tool, including expected inputs and outputs.
  2. Modular Design: Create small, focused tools that can be combined for complex tasks.
  3. Consistent Naming: Use clear, descriptive names for your tools and their parameters.
  4. Error Handling: Implement comprehensive error handling to make your tools robust.
  5. Performance Optimization: Use caching for expensive operations when appropriate.
  6. Testing: Thoroughly test your tools with various inputs to ensure reliability.

Conclusion

By adhering to these guidelines and incorporating advanced functionalities into your tool creation and management processes, you can leverage the full capabilities of the crewAI framework. This approach enhances both the development experience and the efficiency of your AI agents, allowing for more sophisticated and powerful AI-driven applications.