This commit is contained in:
marko-kraemer 2024-11-02 19:09:39 +01:00
parent b370a34ee4
commit fa7e932f08
2 changed files with 11 additions and 76 deletions

View File

@ -51,15 +51,8 @@ You are a world-class web developer who can create, edit, and delete files, and
RULES: RULES:
- All current file contents are available to you in the <current_workspace_state> section - All current file contents are available to you in the <current_workspace_state> section
- Each file in the workspace state includes: - Each file in the workspace state includes its full content
* content: The full file contents
* line_count: Total number of lines in the file
* lines: Array of line objects containing:
- number: Line number (1-based)
- content: The line's content
- length: Length of the line
- Use str_replace for precise replacements in files - Use str_replace for precise replacements in files
- Use insert_lines to add new content at specific line numbers (use the line numbers from the workspace state)
- NEVER include comments in any code you write - the code should be self-documenting - NEVER include comments in any code you write - the code should be self-documenting
- Always maintain the full context of files when making changes - Always maintain the full context of files when making changes
- When creating new files, write clean code without any comments or documentation - When creating new files, write clean code without any comments or documentation
@ -68,7 +61,6 @@ RULES:
[create_file(file_path, file_contents)] - Create new files [create_file(file_path, file_contents)] - Create new files
[delete_file(file_path)] - Delete existing files [delete_file(file_path)] - Delete existing files
[str_replace(file_path, old_str, new_str)] - Replace specific text in files [str_replace(file_path, old_str, new_str)] - Replace specific text in files
[insert_lines(file_path, insert_line, new_content)] - Insert content at specific line number
[execute_command(command)] - Execute terminal commands [execute_command(command)] - Execute terminal commands
</available_tools> </available_tools>
@ -82,21 +74,15 @@ ALWAYS RESPOND WITH MULTIPLE SIMULTANEOUS ACTIONS:
</actions> </actions>
EDITING GUIDELINES: EDITING GUIDELINES:
1. Review the current file contents and line information in the workspace state 1. Review the current file contents in the workspace state
2. Use line numbers from the workspace state for precise insertions 2. Make targeted changes with str_replace
3. Make targeted changes with str_replace or insert_lines 3. Write clean, self-documenting code without comments
4. Write clean, self-documenting code without comments 4. Use create_file for new files and str_replace for modifications
Example workspace state for a file: Example workspace state for a file:
{ {
"index.html": { "index.html": {
"content": "<!DOCTYPE html>\\n<html>\\n<head>...", "content": "<!DOCTYPE html>\\n<html>\\n<head>..."
"line_count": 15,
"lines": [
{"number": 1, "content": "<!DOCTYPE html>", "length": 15},
{"number": 2, "content": "<html>", "length": 6},
...
]
} }
} }
@ -148,7 +134,7 @@ if __name__ == "__main__":
thread_id, thread_id,
{ {
"role": "user", "role": "user",
"content": "Let's create a marketing website for my AI Agent 'Jarvis' using HTML, CSS, Javascript. Use images from pixabay, pexels, and co. Style it cyberpunk style. Make it like Ironmen Jarvis." "content": "Let's create a identical 1to1 Airbnb Clone using HTML, CSS, Javascript. Use images from pixabay, pexels, and co."
} }
) )

View File

@ -1,6 +1,9 @@
import os import os
import asyncio import asyncio
from datetime import datetime
from pathlib import Path from pathlib import Path
from collections import defaultdict
from typing import Optional, List
from agentpress.tool import Tool, ToolResult, tool_schema from agentpress.tool import Tool, ToolResult, tool_schema
from agentpress.state_manager import StateManager from agentpress.state_manager import StateManager
@ -84,20 +87,8 @@ class FilesTool(Tool):
try: try:
with open(full_path, 'r') as f: with open(full_path, 'r') as f:
content = f.read() content = f.read()
lines = content.split('\n')
# Create file state object with content and line information
files_state[rel_path] = { files_state[rel_path] = {
"content": content, "content": content
"line_count": len(lines),
"lines": [
{
"number": i + 1,
"content": line,
"length": len(line)
}
for i, line in enumerate(lines)
]
} }
except Exception as e: except Exception as e:
print(f"Error reading file {rel_path}: {e}") print(f"Error reading file {rel_path}: {e}")
@ -203,48 +194,6 @@ class FilesTool(Tool):
except Exception as e: except Exception as e:
return self.fail_response(f"Error replacing string: {str(e)}") return self.fail_response(f"Error replacing string: {str(e)}")
@tool_schema({
"name": "insert_lines",
"description": "Insert lines at a specific line number in a file",
"parameters": {
"type": "object",
"properties": {
"file_path": {"type": "string", "description": "Path to the file"},
"insert_line": {"type": "integer", "description": "Line number to insert at"},
"new_content": {"type": "string", "description": "Content to insert"}
},
"required": ["file_path", "insert_line", "new_content"]
}
})
async def insert_lines(self, file_path: str, insert_line: int, new_content: str) -> ToolResult:
try:
full_path = Path(os.path.join(self.workspace, file_path))
if not full_path.exists():
return self.fail_response(f"File '{file_path}' does not exist")
content = full_path.read_text().expandtabs()
lines = content.split('\n')
if insert_line < 0 or insert_line > len(lines):
return self.fail_response(f"Invalid line number {insert_line}")
# Insert new content
new_lines = new_content.expandtabs().split('\n')
updated_lines = lines[:insert_line] + new_lines + lines[insert_line:]
new_content = '\n'.join(updated_lines)
full_path.write_text(new_content)
# Show snippet around the edit
start_line = max(0, insert_line - self.SNIPPET_LINES)
end_line = insert_line + len(new_lines) + self.SNIPPET_LINES
snippet = '\n'.join(updated_lines[start_line:end_line])
return self.success_response(f"Lines inserted successfully. Snippet of changes:\n{snippet}")
except Exception as e:
return self.fail_response(f"Error inserting lines: {str(e)}")
if __name__ == "__main__": if __name__ == "__main__":
async def test_files_tool(): async def test_files_tool():