Here’s a step-by-step guide to creating a new custom handler in SuperAgentX
, inheriting from BaseHandler
(superagentx.handler.base.BaseHandler
), to enhance and extend the system’s functionality.
Step 1: Creating a New Handler
Now, we will create a new class FileHandler
that inherits from BaseHandler
. This class will handle reading a text file
and filtering the contents based on a search query.
Here’s the FileHandler implementation:
import asyncio
import aiofiles
from superagentx.handler.base import BaseHandler
from superagentx.handler.decorators import tool
class FileHandler(BaseHandler):
def __init__(self, file_path: str):
"""
Initializes the FileHandler with the given file path.
Args:
file_path (str): The path to the text file to be read.
"""
super().__init__() # Call the parent class's constructor
self.file_path = file_path # Store the file path for later use
Step 2: Define Handler Method(s).
Now, let’s define a method inside the handler to perform an action, like processing data from the given method.
This tool
(superagentx.handler.decorators.tool
) decorator is used to preserve llm tool function
when you wrap it in a new function, often used in custom decorators.
Write a docstring for the method based on the parameters provided. The docstring should be clear, detailed,
and understandable by an LLM (Large Language Model). The description should be 3 to 4 lines long with a brief
explanation, and parameter can be in a single line.
@tool
async def read_file(self):
"""
Reads the contents of the file specified by the file path.
Returns:
list: A list of lines from the file.
"""
try:
async with aiofiles.open(self.file_path, 'r') as file:
lines = await file.readlines()
return lines
except FileNotFoundError:
print(f"Error: The file at {self.file_path} was not found.")
return []
@tool
async def search(
self,
query: str
):
"""
Searches for lines in the file that contain the provided query.
Args:
query (str): The string to search for in the file.
Returns:
list: A list of lines containing the query.
"""
lines = await self.read_file() # Get lines from the file
filtered_lines = [line for line in lines if query.lower() in line.lower()] # Filter lines by query
return filtered_lines
Step 3: Testing the Handler
To test the FileHandler class, create a sample text file and use the handler to search for specific terms.
create the sample.txt file
Create a file named sample.txt
in the same directory as your script with the following content:
Hello, welcome to the file handler example.
This file contains several lines of text.
You can search through it using queries.
The FileHandler will help you find matching lines.
Use the FileHandler
class to search for the term "file"
:
# Create an instance of FileHandler with the path to your text file
file_handler = FileHandler(file_path='sample.txt')
# Search for the term 'file' in the file
search_result = file_handler.search('file')
# Print the search results
print("Search Results:")
for line in search_result:
print(line.strip()) # Strip removes the newline character
Full Code
import asyncio
import aiofiles
from superagentx.handler.base import BaseHandler
from superagentx.handler.decorators import tool
class FileHandler(BaseHandler):
def __init__(self, file_path: str):
"""
Initializes the FileHandler with the given file path.
Args:
file_path (str): The path to the text file to be read.
"""
super().__init__() # Call the parent class's constructor
self.file_path = file_path # Store the file path for later use
@tool
async def read_file(self):
"""
Reads the contents of the file specified by the file path.
Returns:
list: A list of lines from the file.
"""
try:
async with aiofiles.open(self.file_path, 'r') as file:
lines = await file.readlines()
return lines
except FileNotFoundError:
print(f"Error: The file at {self.file_path} was not found.")
return []
@tool
async def search(
self,
query: str
):
"""
Searches for lines in the file that contain the provided query.
Args:
query (str): The string to search for in the file.
Returns:
list: A list of lines containing the query.
"""
lines = await self.read_file() # Get lines from the file
filtered_lines = [line for line in lines if query.lower() in line.lower()] # Filter lines by query
return filtered_lines
# Create an instance of FileHandler with the path to your text file
file_handler = FileHandler(file_path='sample.txt')
if __name__ == "__main__":
# Search for the term 'file' in the file
search_result = asyncio.run(file_handler.search('file'))
# Print the search results
print("Search Results:")
for line in search_result:
print(line.strip()) # Strip removes the newline character
Expected Output:
When you run this code, it will output:
Search Results:
This file contains several lines of text.
You can search through it using queries.
The FileHandler will help you find matching lines.