mirror of https://github.com/kortix-ai/suna.git
wip
This commit is contained in:
parent
4601702c06
commit
baae370bea
|
@ -1,6 +1,6 @@
|
||||||
# AgentPress: Building Blocks for AI Agents
|
# AgentPress: Building Blocks for AI Agents
|
||||||
|
|
||||||
AgentPress is not a agent framework - it's a collection of _simple, but powerful_ utilities that serve as building blocks for creating AI agents. *Plug, play, and customize.*
|
AgentPress is a collection of _simple, but powerful_ utilities that serve as building blocks for creating AI agents. *Plug, play, and customize.*
|
||||||
|
|
||||||
- **Threads**: Simple message thread handling utilities
|
- **Threads**: Simple message thread handling utilities
|
||||||
- **Tools**: Flexible tool definition and automatic execution
|
- **Tools**: Flexible tool definition and automatic execution
|
||||||
|
|
|
@ -12,14 +12,6 @@ async def run_agent(thread_id: str, max_iterations: int = 5):
|
||||||
|
|
||||||
thread_manager.add_tool(FilesTool)
|
thread_manager.add_tool(FilesTool)
|
||||||
thread_manager.add_tool(TerminalTool)
|
thread_manager.add_tool(TerminalTool)
|
||||||
|
|
||||||
await thread_manager.add_message(
|
|
||||||
thread_id,
|
|
||||||
{
|
|
||||||
"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."
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
async def init():
|
async def init():
|
||||||
pass
|
pass
|
||||||
|
@ -32,12 +24,15 @@ async def run_agent(thread_id: str, max_iterations: int = 5):
|
||||||
async def after_iteration():
|
async def after_iteration():
|
||||||
# Ask the user for a custom message or use the default
|
# Ask the user for a custom message or use the default
|
||||||
custom_message = input("Enter a message to send (or press Enter to use 'Continue!!!' as message): ")
|
custom_message = input("Enter a message to send (or press Enter to use 'Continue!!!' as message): ")
|
||||||
message_content = custom_message if custom_message else "Continue!!!"
|
|
||||||
|
message_content = custom_message if custom_message else """
|
||||||
|
Continue!!!
|
||||||
|
"""
|
||||||
await thread_manager.add_message(thread_id, {
|
await thread_manager.add_message(thread_id, {
|
||||||
"role": "user",
|
"role": "user",
|
||||||
"content": message_content
|
"content": message_content
|
||||||
})
|
})
|
||||||
|
|
||||||
async def finalizer():
|
async def finalizer():
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -49,30 +44,54 @@ async def run_agent(thread_id: str, max_iterations: int = 5):
|
||||||
iteration += 1
|
iteration += 1
|
||||||
await pre_iteration()
|
await pre_iteration()
|
||||||
|
|
||||||
# Get entire state store
|
|
||||||
state = await state_manager.export_store()
|
|
||||||
state_info = f"Current workspace state:\n{json.dumps(state, indent=2)}"
|
|
||||||
|
|
||||||
system_message = {
|
system_message = {
|
||||||
"role": "system",
|
"role": "system",
|
||||||
"content": f"""You are a web developer who can create, read, update, and delete files,
|
"content": """
|
||||||
and execute terminal commands. You write clean, well-structured code and explain your changes.
|
You are a world-class web developer who can create, update, delete files, and execute terminal commands. You write clean, well-structured code. Keep iterating on existing files, continue working on this existing codebase - do not omit previous progress; instead, keep iterating.
|
||||||
|
|
||||||
Current workspace state:
|
<available_tools>
|
||||||
{state_info}
|
[update_file(file_path, file_contents)]
|
||||||
|
[create_file(file_path, file_contents)]
|
||||||
Explain what you're doing before making changes."""
|
[delete_file(file_path)]
|
||||||
|
[execute_command(command)]
|
||||||
|
</available_tools>
|
||||||
|
|
||||||
|
ALWAYS RESPOND WITH MULTIPLE SIMULTANEOUS ACTIONS:
|
||||||
|
<thoughts>
|
||||||
|
[Provide a concise overview of your planned changes and implementations]
|
||||||
|
</thoughts>
|
||||||
|
|
||||||
|
<actions>
|
||||||
|
[Include multiple tool calls]
|
||||||
|
</actions>
|
||||||
|
|
||||||
|
Think deeply and step by step.
|
||||||
|
"""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
state = await state_manager.export_store()
|
||||||
|
|
||||||
|
state_message = {
|
||||||
|
"role": "user",
|
||||||
|
"content": f"""
|
||||||
|
Current development environment workspace state:
|
||||||
|
<current_workspace_state>
|
||||||
|
{json.dumps(state, indent=2)}
|
||||||
|
</current_workspace_state>
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
|
||||||
model_name = "anthropic/claude-3-5-sonnet-latest"
|
model_name = "anthropic/claude-3-5-sonnet-latest"
|
||||||
|
|
||||||
response = await thread_manager.run_thread(
|
response = await thread_manager.run_thread(
|
||||||
thread_id=thread_id,
|
thread_id=thread_id,
|
||||||
system_message=system_message,
|
system_message=system_message,
|
||||||
model_name=model_name,
|
model_name=model_name,
|
||||||
temperature=0.7,
|
temperature=0.1,
|
||||||
max_tokens=4096,
|
max_tokens=4096,
|
||||||
tool_choice="auto",
|
tool_choice="auto",
|
||||||
execute_tools_async=False,
|
additional_message=state_message,
|
||||||
|
execute_tools_async=True,
|
||||||
use_tools=True,
|
use_tools=True,
|
||||||
execute_model_tool_calls=True
|
execute_model_tool_calls=True
|
||||||
)
|
)
|
||||||
|
@ -89,6 +108,15 @@ if __name__ == "__main__":
|
||||||
async def main():
|
async def main():
|
||||||
thread_manager = ThreadManager()
|
thread_manager = ThreadManager()
|
||||||
thread_id = await thread_manager.create_thread()
|
thread_id = await thread_manager.create_thread()
|
||||||
|
|
||||||
|
await thread_manager.add_message(
|
||||||
|
thread_id,
|
||||||
|
{
|
||||||
|
"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."
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
await run_agent(thread_id)
|
await run_agent(thread_id)
|
||||||
|
|
||||||
asyncio.run(main())
|
asyncio.run(main())
|
|
@ -12,28 +12,17 @@ class FilesTool(Tool):
|
||||||
"package-lock.json",
|
"package-lock.json",
|
||||||
"postcss.config.js",
|
"postcss.config.js",
|
||||||
"postcss.config.mjs",
|
"postcss.config.mjs",
|
||||||
"playwright.config.js",
|
|
||||||
"jsconfig.json",
|
"jsconfig.json",
|
||||||
"components.json",
|
"components.json",
|
||||||
"tsconfig.tsbuildinfo",
|
"tsconfig.tsbuildinfo",
|
||||||
"next-env.d.ts",
|
|
||||||
"tsconfig.json",
|
"tsconfig.json",
|
||||||
"firebase-service-account.json",
|
|
||||||
"Dockerfile"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EXCLUDED_DIRS = {
|
EXCLUDED_DIRS = {
|
||||||
"src/components/ui",
|
|
||||||
"cypress",
|
|
||||||
"node_modules",
|
"node_modules",
|
||||||
"migrations",
|
|
||||||
".next",
|
".next",
|
||||||
"playwright-report",
|
|
||||||
"test-results",
|
|
||||||
"dist",
|
"dist",
|
||||||
"build",
|
"build",
|
||||||
"coverage",
|
|
||||||
"terminal_logs",
|
|
||||||
".git"
|
".git"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -108,11 +97,11 @@ class FilesTool(Tool):
|
||||||
|
|
||||||
@tool_schema({
|
@tool_schema({
|
||||||
"name": "create_file",
|
"name": "create_file",
|
||||||
"description": "Create a new file in the workspace",
|
"description": "Create a new file with the provided contents at a given path in the workspace",
|
||||||
"parameters": {
|
"parameters": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"file_path": {"type": "string", "description": "The relative path of the file to create"},
|
"file_path": {"type": "string", "description": "Path to the file to be created."},
|
||||||
"content": {"type": "string", "description": "The content to write to the file"}
|
"content": {"type": "string", "description": "The content to write to the file"}
|
||||||
},
|
},
|
||||||
"required": ["file_path", "content"]
|
"required": ["file_path", "content"]
|
||||||
|
@ -133,37 +122,14 @@ class FilesTool(Tool):
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return self.fail_response(f"Error creating file: {str(e)}")
|
return self.fail_response(f"Error creating file: {str(e)}")
|
||||||
|
|
||||||
@tool_schema({
|
|
||||||
"name": "read_file",
|
|
||||||
"description": "Read the contents of a file in the workspace",
|
|
||||||
"parameters": {
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"file_path": {"type": "string", "description": "The relative path of the file to read"}
|
|
||||||
},
|
|
||||||
"required": ["file_path"]
|
|
||||||
}
|
|
||||||
})
|
|
||||||
async def read_file(self, file_path: str) -> ToolResult:
|
|
||||||
try:
|
|
||||||
workspace_state = await self.state_manager.get("workspace")
|
|
||||||
if file_path in workspace_state["files"]:
|
|
||||||
return self.success_response({
|
|
||||||
"file_path": file_path,
|
|
||||||
"content": workspace_state["files"][file_path]["content"]
|
|
||||||
})
|
|
||||||
return self.fail_response(f"File '{file_path}' not found in workspace state.")
|
|
||||||
except Exception as e:
|
|
||||||
return self.fail_response(f"Error reading file: {str(e)}")
|
|
||||||
|
|
||||||
@tool_schema({
|
@tool_schema({
|
||||||
"name": "update_file",
|
"name": "update_file",
|
||||||
"description": "Update the contents of a file in the workspace",
|
"description": "Update an existing file at the given path in the workspace with the provided contents.",
|
||||||
"parameters": {
|
"parameters": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"file_path": {"type": "string", "description": "The relative path of the file to update"},
|
"file_path": {"type": "string", "description": "Path to the file to be updated"},
|
||||||
"content": {"type": "string", "description": "The new content to write to the file"}
|
"content": {"type": "string", "description": "New content to be written to the file. ONLY CODE. The whole file contents, the complete code – The contents of the new file with all instructions implemented perfectly. NEVER write comments. Keep the complete File Contents within this key."}
|
||||||
},
|
},
|
||||||
"required": ["file_path", "content"]
|
"required": ["file_path", "content"]
|
||||||
}
|
}
|
||||||
|
@ -181,11 +147,11 @@ class FilesTool(Tool):
|
||||||
|
|
||||||
@tool_schema({
|
@tool_schema({
|
||||||
"name": "delete_file",
|
"name": "delete_file",
|
||||||
"description": "Delete a file from the workspace",
|
"description": "Delete a file at the given path in the workspace.",
|
||||||
"parameters": {
|
"parameters": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"file_path": {"type": "string", "description": "The relative path of the file to delete"}
|
"file_path": {"type": "string", "description": "Path to the file to be deleted."}
|
||||||
},
|
},
|
||||||
"required": ["file_path"]
|
"required": ["file_path"]
|
||||||
}
|
}
|
||||||
|
@ -214,18 +180,10 @@ if __name__ == "__main__":
|
||||||
create_result = await files_tool.create_file(test_file_path, test_content)
|
create_result = await files_tool.create_file(test_file_path, test_content)
|
||||||
print("Create file result:", create_result)
|
print("Create file result:", create_result)
|
||||||
|
|
||||||
# Test read_file
|
|
||||||
read_result = await files_tool.read_file(test_file_path)
|
|
||||||
print("Read file result:", read_result)
|
|
||||||
|
|
||||||
# Test update_file
|
# Test update_file
|
||||||
update_result = await files_tool.update_file(test_file_path, updated_content)
|
update_result = await files_tool.update_file(test_file_path, updated_content)
|
||||||
print("Update file result:", update_result)
|
print("Update file result:", update_result)
|
||||||
|
|
||||||
# Test read_file after update
|
|
||||||
read_updated_result = await files_tool.read_file(test_file_path)
|
|
||||||
print("Read updated file result:", read_updated_result)
|
|
||||||
|
|
||||||
# Test delete_file
|
# Test delete_file
|
||||||
delete_result = await files_tool.delete_file(test_file_path)
|
delete_result = await files_tool.delete_file(test_file_path)
|
||||||
print("Delete file result:", delete_result)
|
print("Delete file result:", delete_result)
|
||||||
|
|
Loading…
Reference in New Issue