68 lines
2.4 KiB
Python
68 lines
2.4 KiB
Python
import os
|
|
|
|
import aiofiles
|
|
|
|
from app.config import WORKSPACE_ROOT
|
|
from app.tool.base import BaseTool
|
|
|
|
|
|
class FileSaver(BaseTool):
|
|
name: str = "file_saver"
|
|
description: str = """Save content to a local file at a specified path.
|
|
Use this tool when you need to save text, code, or generated content to a file on the local filesystem.
|
|
The tool accepts content and a file path, and saves the content to that location.
|
|
"""
|
|
parameters: dict = {
|
|
"type": "object",
|
|
"properties": {
|
|
"content": {
|
|
"type": "string",
|
|
"description": "(required) The content to save to the file.",
|
|
},
|
|
"file_path": {
|
|
"type": "string",
|
|
"description": "(required) The path where the file should be saved, including filename and extension.",
|
|
},
|
|
"mode": {
|
|
"type": "string",
|
|
"description": "(optional) The file opening mode. Default is 'w' for write. Use 'a' for append.",
|
|
"enum": ["w", "a"],
|
|
"default": "w",
|
|
},
|
|
},
|
|
"required": ["content", "file_path"],
|
|
}
|
|
|
|
async def execute(self, content: str, file_path: str, mode: str = "w") -> str:
|
|
"""
|
|
Save content to a file at the specified path.
|
|
|
|
Args:
|
|
content (str): The content to save to the file.
|
|
file_path (str): The path where the file should be saved.
|
|
mode (str, optional): The file opening mode. Default is 'w' for write. Use 'a' for append.
|
|
|
|
Returns:
|
|
str: A message indicating the result of the operation.
|
|
"""
|
|
try:
|
|
# Place the generated file in the workspace directory
|
|
if os.path.isabs(file_path):
|
|
file_name = os.path.basename(file_path)
|
|
full_path = os.path.join(WORKSPACE_ROOT, file_name)
|
|
else:
|
|
full_path = os.path.join(WORKSPACE_ROOT, file_path)
|
|
|
|
# Ensure the directory exists
|
|
directory = os.path.dirname(full_path)
|
|
if directory and not os.path.exists(directory):
|
|
os.makedirs(directory)
|
|
|
|
# Write directly to the file
|
|
async with aiofiles.open(full_path, mode, encoding="utf-8") as file:
|
|
await file.write(content)
|
|
|
|
return f"Content successfully saved to {full_path}"
|
|
except Exception as e:
|
|
return f"Error saving file: {str(e)}"
|