backend/core/utils/TOOL_SYSTEM_REFACTOR.md
The tool system has been refactored to be auto-generated and self-documenting, eliminating the need for manual maintenance of tool metadata across multiple files.
Metadata Decorators (backend/core/agentpress/tool.py)
@tool_metadata() - Add display name, description, icon, and color to tool classes@method_metadata() - Add display name and description to tool methodsAuto-Discovery System (backend/core/utils/tool_discovery.py)
backend/core/tools/ directoryTools API (backend/core/tools_api.py)
GET /tools - Returns all tools with metadataGET /tools/{tool_name} - Returns specific tool metadataReact Hook (frontend/src/hooks/react-query/tools/use-tools-metadata.ts)
useToolsMetadata() - Fetch all tools from APIuseToolMetadata(toolName) - Fetch specific toolbackend/core/utils/tool_groups.py - Replaced by auto-discovery
frontend/src/components/agents/tools/tool-groups-comprehensive.ts - Can fetch from API instead
# Had to manually update tool_groups.py every time a tool changed
TOOL_GROUPS = {
"sb_files_tool": ToolGroup(
name="sb_files_tool",
display_name="File Operations",
description="Create, read, edit...",
# ... 50+ lines per tool
),
# ... repeated for every tool
}
# Tool defines its own metadata
@tool_metadata(
display_name="File Operations",
description="Create, read, edit, and manage files",
icon="FolderOpen",
color="bg-blue-100 dark:bg-blue-800/50"
)
class SandboxFilesTool(Tool):
@method_metadata(
display_name="Create File",
description="Create new files with content"
)
@openapi_schema({...})
def create_file(self, ...):
...
Simply create a tool class that inherits from Tool. It will be automatically discovered!
from core.agentpress.tool import Tool, tool_metadata, method_metadata, openapi_schema
@tool_metadata(
display_name="My Awesome Tool",
description="Does awesome things",
icon="Sparkles",
color="bg-purple-100 dark:bg-purple-800/50"
)
class MyAwesomeTool(Tool):
@method_metadata(
display_name="Do Something",
description="Does something awesome"
)
@openapi_schema({
"type": "function",
"function": {
"name": "do_something",
"description": "Does something awesome",
"parameters": {...}
}
})
def do_something(self, param: str):
return self.success_response("Done!")
That's it! The tool will:
# Backend - Get all tools
from core.utils.tool_discovery import get_tools_metadata
tools = get_tools_metadata()
# Returns: {"sb_files_tool": {...}, "sb_shell_tool": {...}, ...}
// Frontend - Use React hook
import { useToolsMetadata } from '@/hooks/react-query/tools/use-tools-metadata';
function MyComponent() {
const { data, isLoading } = useToolsMetadata();
if (data?.success) {
const tools = data.tools;
// All tool metadata available here
}
}
tool_groups.py is now deprecatedimport { TOOL_GROUPS } from './tool-groups-comprehensive'const { data } = useToolsMetadata()TOOL_GROUPS still works for nowbackend/core/agentpress/tool.py - Enhanced with metadata decoratorsbackend/core/utils/tool_discovery.py - Auto-discovery systembackend/core/tools_api.py - API endpointsfrontend/src/hooks/react-query/tools/use-tools-metadata.ts - React hookbackend/core/utils/tool_groups.py - 971 lines DELETED (replaced by auto-discovery)frontend/src/components/agents/tools/tool-groups-comprehensive.ts - 1069 lines DELETED (fetch from API)Important: The naming remains agentpress_tools throughout the codebase for consistency:
config.tools.agentpressagentpress_toolsagentpress_toolsThis was kept to maintain backward compatibility and avoid breaking changes.