FileManagerToolSet#
The FileManagerToolSet provides agents with file system operations including reading, writing, editing files, and visual inspection of images and PDFs.
Overview#
Key capabilities:
File Operations: Read, write, update text files
Path Management: Create directories, delete, move files
Search: Glob patterns and grep content search
Visual Inspection: Analyze images and PDFs with LLM
Patch Application: Apply unified diff or V4A format patches
Basic Usage#
from pantheon.agent import Agent
from pantheon.toolsets import FileManagerToolSet
# Create toolset with workspace path
file_tools = FileManagerToolSet(
name="files",
path="/path/to/workspace"
)
# Create agent and add toolset at runtime
agent = Agent(
name="developer",
instructions="Help manage files in the workspace."
)
await agent.toolset(file_tools)
await agent.chat()
Constructor Parameters#
Parameter |
Type |
Description |
|---|---|---|
|
str |
Name of the toolset |
|
str | Path | None |
Working directory path. Defaults to current directory. |
|
list[str] | None |
List of filenames to ignore |
Tools Reference#
read_file#
Read contents of a text file with optional line range.
result = await file_tools.read_file(
file_path="src/main.py",
start_line=10, # Optional: 1-indexed, inclusive
end_line=50, # Optional: 1-indexed, inclusive
max_chars=5000 # Optional: character limit
)
Returns:
{
"success": True,
"content": "file contents...",
"total_lines": 100,
"format": ".py",
"truncated": False
}
write_file#
Create a new file or overwrite existing file.
result = await file_tools.write_file(
file_path="output/report.md",
content="# Report\n...",
overwrite=True # Default: True
)
Note: For editing existing files, use update_file instead.
update_file#
Edit an existing file using string replacement.
result = await file_tools.update_file(
file_path="config.py",
old_string="DEBUG = True",
new_string="DEBUG = False",
replace_all=False, # Default: replace first occurrence
start_line=None, # Optional: limit search range
end_line=None
)
Returns:
{"success": True, "replacements": 1}
manage_path#
Unified tool for directory and file path operations.
# Create directory
await file_tools.manage_path("create_dir", "src/components")
# Delete file or directory
await file_tools.manage_path("delete", "old_file.py")
await file_tools.manage_path("delete", "old_folder", recursive=True)
# Move/rename
await file_tools.manage_path("move", "old.py", new_path="new.py")
Operations:
create_dir: Create directory (parents created automatically)delete: Delete file or directory (userecursive=Truefor non-empty dirs)move: Move or rename file/directory
glob#
Find files matching glob patterns using fd (falls back to pathlib).
result = await file_tools.glob(
pattern="**/*.py", # Glob pattern
path="src", # Optional: subdirectory
respect_git_ignore=True # Default: True
)
Pattern examples:
*.py- Python files in current directory**/*.py- Python files recursivelytest_*.py- Test filessrc/**/*.ts- TypeScript files in src/
grep#
Search file contents using ripgrep (falls back to Python re).
result = await file_tools.grep(
pattern="TODO", # Regex pattern
path="src", # Optional: directory to search
file_pattern="*.py", # Optional: filter by file pattern
context_lines=2, # Lines before/after match
case_sensitive=False, # Default: case insensitive
respect_git_ignore=True
)
Returns:
{
"success": True,
"matches": [
{
"file": "src/main.py",
"line_number": 42,
"line_content": "# TODO: fix this",
"context_before": [...],
"context_after": [...]
}
],
"total_matches": 5,
"files_matched": 3
}
apply_patch#
Apply patches to files with fuzzy matching support.
Unified Diff format:
await file_tools.apply_patch('''
--- a/config.py
+++ b/config.py
@@ -1,2 +1,2 @@
DEBUG = True
-PORT = 8000
+PORT = 3000
''')
V4A/Codex format:
await file_tools.apply_patch('''
*** Begin Patch
*** Update File: api.py
- old_code()
+ new_code()
*** Create File: utils.py
+ def helper():
+ pass
*** End Patch
''', fuzzy_threshold=0.8)
Parameters:
patch: Patch content (format auto-detected)file_path: Optional explicit file pathfuzzy_threshold: 0.0-1.0, default 0.5 (0.8 recommended for AI patches)
Visual Inspection Tools#
observe_images#
Analyze images using LLM vision capabilities.
result = await file_tools.observe_images(
question="What objects are in this image?",
image_paths=["photo1.jpg", "photo2.png"]
)
observe_pdf_screenshots#
Render PDF pages as images and analyze with LLM.
result = await file_tools.observe_pdf_screenshots(
question="Summarize the charts on these pages",
pdf_path="report.pdf",
page_numbers=[1, 2, 3], # Optional: defaults to all pages
dpi=300 # Optional: default 300
)
read_pdf#
Extract text content from PDF files.
result = await file_tools.read_pdf("document.pdf")
# Returns: {"success": True, "content": "Page 1...", "metadata": {...}}
generate_image#
Generate images from text descriptions.
result = await file_tools.generate_image(
prompt="A sunset over mountains",
reference_images=["style.png"] # Optional: for style transfer
)
Examples#
File Editing Workflow#
from pantheon.agent import Agent
from pantheon.toolsets import FileManagerToolSet
file_tools = FileManagerToolSet(name="files", path="./project")
agent = Agent(
name="editor",
instructions="""You are a code editor. When editing files:
1. Use read_file to see current content
2. Use update_file for small changes
3. Use apply_patch for multiple changes"""
)
await agent.toolset(file_tools)
# The agent will use appropriate tools:
# - read_file to view code
# - update_file for single replacements
# - apply_patch for multi-line changes
Search and Replace#
# Find all TODOs
todos = await file_tools.grep("TODO", file_pattern="**/*.py")
# Find specific files
configs = await file_tools.glob("**/config*.yaml")
# Update found files
for match in todos["matches"]:
await file_tools.update_file(
match["file"],
old_string="TODO:",
new_string="DONE:",
replace_all=True
)
Best Practices#
Use update_file for edits: Don’t rewrite entire files with
write_fileUse apply_patch for multi-file changes: More efficient and safer
Use glob/grep for search: More efficient than reading all files
Set fuzzy_threshold for AI patches: Use 0.8 for tolerant matching
Respect line limits: Large files are automatically truncated