Download src/tools/loader.py from Snapkitty/sovereign-engine-v2: direct link, hf CLI and curl.
- Browser
- Download file 37.7 kB
-
https://huggingface.co/Snapkitty/sovereign-engine-v2/resolve/main/src/tools/loader.py
- Command line
-
hf download hf://Snapkitty/sovereign-engine-v2/src/tools/loader.py
-
curl -L -o loader.py https://huggingface.co/Snapkitty/sovereign-engine-v2/resolve/main/src/tools/loader.py
37.7 kB
| """ | |
| Tool Loader | |
| Part of SOVEREIGN PYTHON LLM ENGINE | |
| Auto-registers all available tools into the registry. | |
| """ | |
| from pathlib import Path | |
| from .registry import ToolRegistry, ToolDefinition, RiskClass, ApprovalPolicy | |
| # ========================================== | |
| # FILESYSTEM TOOLS | |
| # ========================================== | |
| def register_filesystem_tools(registry: ToolRegistry) -> None: | |
| async def read_file(params: dict) -> dict: | |
| path = Path(params["path"]) | |
| if not path.exists(): | |
| return {"error": f"File not found: {path}"} | |
| try: | |
| content = path.read_text(encoding='utf-8') | |
| return {"content": content, "path": str(path), "size": len(content)} | |
| except Exception as e: | |
| return {"error": str(e)} | |
| registry.register(ToolDefinition( | |
| tool_id="filesystem.read", | |
| version="1.0.0", | |
| title="Read File", | |
| description="Read contents of a file", | |
| input_schema={ | |
| "type": "object", | |
| "properties": {"path": {"type": "string"}}, | |
| "required": ["path"] | |
| }, | |
| output_schema=None, | |
| risk_class=RiskClass.READ_ONLY_LOCAL, | |
| approval_policy=ApprovalPolicy.AUTOMATIC, | |
| sandbox_required=False, | |
| timeout_ms=5000, | |
| handler=read_file, | |
| tags=["filesystem", "read"] | |
| )) | |
| async def write_file(params: dict) -> dict: | |
| path = Path(params["path"]) | |
| content = params["content"] | |
| try: | |
| path.parent.mkdir(parents=True, exist_ok=True) | |
| path.write_text(content, encoding='utf-8') | |
| return {"success": True, "path": str(path), "bytes_written": len(content)} | |
| except Exception as e: | |
| return {"error": str(e)} | |
| registry.register(ToolDefinition( | |
| tool_id="filesystem.write", | |
| version="1.0.0", | |
| title="Write File", | |
| description="Write content to a file", | |
| input_schema={ | |
| "type": "object", | |
| "properties": { | |
| "path": {"type": "string"}, | |
| "content": {"type": "string"} | |
| }, | |
| "required": ["path", "content"] | |
| }, | |
| output_schema=None, | |
| risk_class=RiskClass.REVERSIBLE_LOCAL_WRITE, | |
| approval_policy=ApprovalPolicy.USER_CONFIRMATION, | |
| sandbox_required=False, | |
| timeout_ms=10000, | |
| handler=write_file, | |
| tags=["filesystem", "write"] | |
| )) | |
| async def list_directory(params: dict) -> dict: | |
| path = Path(params["path"]) | |
| if not path.exists(): | |
| return {"error": f"Path not found: {path}"} | |
| if not path.is_dir(): | |
| return {"error": f"Not a directory: {path}"} | |
| try: | |
| files = [] | |
| for item in path.iterdir(): | |
| files.append({ | |
| "name": item.name, | |
| "path": str(item), | |
| "is_dir": item.is_dir(), | |
| "is_file": item.is_file(), | |
| "size": item.stat().st_size if item.is_file() else 0 | |
| }) | |
| return {"files": files, "count": len(files), "path": str(path)} | |
| except Exception as e: | |
| return {"error": str(e)} | |
| registry.register(ToolDefinition( | |
| tool_id="filesystem.list", | |
| version="1.0.0", | |
| title="List Directory", | |
| description="List files in a directory", | |
| input_schema={ | |
| "type": "object", | |
| "properties": {"path": {"type": "string"}}, | |
| "required": ["path"] | |
| }, | |
| output_schema=None, | |
| risk_class=RiskClass.READ_ONLY_LOCAL, | |
| approval_policy=ApprovalPolicy.AUTOMATIC, | |
| sandbox_required=False, | |
| timeout_ms=5000, | |
| handler=list_directory, | |
| tags=["filesystem", "read"] | |
| )) | |
| async def delete_file(params: dict) -> dict: | |
| path = Path(params["path"]) | |
| if not path.exists(): | |
| return {"error": f"File not found: {path}"} | |
| try: | |
| path.unlink() | |
| return {"success": True, "path": str(path)} | |
| except Exception as e: | |
| return {"error": str(e)} | |
| registry.register(ToolDefinition( | |
| tool_id="filesystem.delete", | |
| version="1.0.0", | |
| title="Delete File", | |
| description="Delete a file (irreversible)", | |
| input_schema={ | |
| "type": "object", | |
| "properties": {"path": {"type": "string"}}, | |
| "required": ["path"] | |
| }, | |
| output_schema=None, | |
| risk_class=RiskClass.DESTRUCTIVE_LOCAL, | |
| approval_policy=ApprovalPolicy.USER_CONFIRMATION, | |
| sandbox_required=False, | |
| timeout_ms=5000, | |
| handler=delete_file, | |
| tags=["filesystem", "delete"] | |
| )) | |
| async def move_file(params: dict) -> dict: | |
| import shutil | |
| src = Path(params["source"]) | |
| dst = Path(params["destination"]) | |
| if not src.exists(): | |
| return {"error": f"Source not found: {src}"} | |
| try: | |
| dst.parent.mkdir(parents=True, exist_ok=True) | |
| shutil.move(str(src), str(dst)) | |
| return {"success": True, "source": str(src), "destination": str(dst)} | |
| except Exception as e: | |
| return {"error": str(e)} | |
| registry.register(ToolDefinition( | |
| tool_id="filesystem.move", | |
| version="1.0.0", | |
| title="Move File", | |
| description="Move or rename a file", | |
| input_schema={ | |
| "type": "object", | |
| "properties": { | |
| "source": {"type": "string"}, | |
| "destination": {"type": "string"} | |
| }, | |
| "required": ["source", "destination"] | |
| }, | |
| output_schema=None, | |
| risk_class=RiskClass.REVERSIBLE_LOCAL_WRITE, | |
| approval_policy=ApprovalPolicy.USER_CONFIRMATION, | |
| sandbox_required=False, | |
| timeout_ms=5000, | |
| handler=move_file, | |
| tags=["filesystem", "write"] | |
| )) | |
| async def search_files(params: dict) -> dict: | |
| import fnmatch | |
| root = Path(params["path"]) | |
| pattern = params["pattern"] | |
| recursive = params.get("recursive", True) | |
| if not root.exists(): | |
| return {"error": f"Path not found: {root}"} | |
| try: | |
| matches = [] | |
| glob_pattern = f"**/{pattern}" if recursive else pattern | |
| for match in root.glob(glob_pattern): | |
| matches.append({ | |
| "path": str(match), | |
| "name": match.name, | |
| "size": match.stat().st_size if match.is_file() else 0 | |
| }) | |
| return {"matches": matches, "count": len(matches)} | |
| except Exception as e: | |
| return {"error": str(e)} | |
| registry.register(ToolDefinition( | |
| tool_id="filesystem.search", | |
| version="1.0.0", | |
| title="Search Files", | |
| description="Search for files by pattern (e.g. '*.py', '*.json')", | |
| input_schema={ | |
| "type": "object", | |
| "properties": { | |
| "path": {"type": "string"}, | |
| "pattern": {"type": "string"}, | |
| "recursive": {"type": "boolean", "default": True} | |
| }, | |
| "required": ["path", "pattern"] | |
| }, | |
| output_schema=None, | |
| risk_class=RiskClass.READ_ONLY_LOCAL, | |
| approval_policy=ApprovalPolicy.AUTOMATIC, | |
| sandbox_required=False, | |
| timeout_ms=10000, | |
| handler=search_files, | |
| tags=["filesystem", "search"] | |
| )) | |
| # ========================================== | |
| # CODE TOOLS | |
| # ========================================== | |
| def register_code_tools(registry: ToolRegistry) -> None: | |
| async def execute_python(params: dict) -> dict: | |
| code = params["code"] | |
| try: | |
| import subprocess | |
| result = subprocess.run( | |
| ["python", "-c", code], | |
| capture_output=True, | |
| text=True, | |
| timeout=30 | |
| ) | |
| return { | |
| "stdout": result.stdout, | |
| "stderr": result.stderr, | |
| "returncode": result.returncode, | |
| "success": result.returncode == 0 | |
| } | |
| except Exception as e: | |
| return {"error": str(e)} | |
| registry.register(ToolDefinition( | |
| tool_id="code.execute_python", | |
| version="1.0.0", | |
| title="Execute Python", | |
| description="Execute Python code in subprocess", | |
| input_schema={ | |
| "type": "object", | |
| "properties": {"code": {"type": "string"}}, | |
| "required": ["code"] | |
| }, | |
| output_schema=None, | |
| risk_class=RiskClass.DESTRUCTIVE_LOCAL, | |
| approval_policy=ApprovalPolicy.USER_CONFIRMATION, | |
| sandbox_required=True, | |
| timeout_ms=30000, | |
| handler=execute_python, | |
| tags=["code", "execution"] | |
| )) | |
| async def run_shell(params: dict) -> dict: | |
| import subprocess | |
| command = params["command"] | |
| cwd = params.get("cwd", None) | |
| try: | |
| result = subprocess.run( | |
| command, | |
| shell=True, | |
| capture_output=True, | |
| text=True, | |
| timeout=60, | |
| cwd=cwd | |
| ) | |
| return { | |
| "stdout": result.stdout, | |
| "stderr": result.stderr, | |
| "returncode": result.returncode, | |
| "success": result.returncode == 0 | |
| } | |
| except Exception as e: | |
| return {"error": str(e)} | |
| registry.register(ToolDefinition( | |
| tool_id="code.shell", | |
| version="1.0.0", | |
| title="Run Shell Command", | |
| description="Run a shell command", | |
| input_schema={ | |
| "type": "object", | |
| "properties": { | |
| "command": {"type": "string"}, | |
| "cwd": {"type": "string"} | |
| }, | |
| "required": ["command"] | |
| }, | |
| output_schema=None, | |
| risk_class=RiskClass.DESTRUCTIVE_LOCAL, | |
| approval_policy=ApprovalPolicy.USER_CONFIRMATION, | |
| sandbox_required=True, | |
| timeout_ms=60000, | |
| handler=run_shell, | |
| tags=["code", "shell", "execution"] | |
| )) | |
| # ========================================== | |
| # GIT TOOLS | |
| # ========================================== | |
| def register_git_tools(registry: ToolRegistry) -> None: | |
| from .git.operations import ( | |
| git_status_tool, git_commit_tool, | |
| git_push_tool, git_log_tool | |
| ) | |
| from .git.operations import GitOperations | |
| async def git_status(params: dict) -> dict: | |
| try: | |
| return await git_status_tool(params["repo_path"]) | |
| except Exception as e: | |
| return {"error": str(e)} | |
| registry.register(ToolDefinition( | |
| tool_id="git.status", | |
| version="1.0.0", | |
| title="Git Status", | |
| description="Get git repository status (branch, modified, untracked files)", | |
| input_schema={ | |
| "type": "object", | |
| "properties": {"repo_path": {"type": "string"}}, | |
| "required": ["repo_path"] | |
| }, | |
| output_schema=None, | |
| risk_class=RiskClass.READ_ONLY_LOCAL, | |
| approval_policy=ApprovalPolicy.AUTOMATIC, | |
| sandbox_required=False, | |
| timeout_ms=10000, | |
| handler=git_status, | |
| tags=["git", "read"] | |
| )) | |
| async def git_diff(params: dict) -> dict: | |
| try: | |
| git = GitOperations(Path(params["repo_path"])) | |
| diff = await git.diff(params.get("file_path")) | |
| return {"diff": diff} | |
| except Exception as e: | |
| return {"error": str(e)} | |
| registry.register(ToolDefinition( | |
| tool_id="git.diff", | |
| version="1.0.0", | |
| title="Git Diff", | |
| description="Show changes in working directory", | |
| input_schema={ | |
| "type": "object", | |
| "properties": { | |
| "repo_path": {"type": "string"}, | |
| "file_path": {"type": "string"} | |
| }, | |
| "required": ["repo_path"] | |
| }, | |
| output_schema=None, | |
| risk_class=RiskClass.READ_ONLY_LOCAL, | |
| approval_policy=ApprovalPolicy.AUTOMATIC, | |
| sandbox_required=False, | |
| timeout_ms=10000, | |
| handler=git_diff, | |
| tags=["git", "read"] | |
| )) | |
| async def git_log(params: dict) -> dict: | |
| try: | |
| return await git_log_tool(params["repo_path"], params.get("max_count", 10)) | |
| except Exception as e: | |
| return {"error": str(e)} | |
| registry.register(ToolDefinition( | |
| tool_id="git.log", | |
| version="1.0.0", | |
| title="Git Log", | |
| description="Get commit history", | |
| input_schema={ | |
| "type": "object", | |
| "properties": { | |
| "repo_path": {"type": "string"}, | |
| "max_count": {"type": "integer", "default": 10} | |
| }, | |
| "required": ["repo_path"] | |
| }, | |
| output_schema=None, | |
| risk_class=RiskClass.READ_ONLY_LOCAL, | |
| approval_policy=ApprovalPolicy.AUTOMATIC, | |
| sandbox_required=False, | |
| timeout_ms=10000, | |
| handler=git_log, | |
| tags=["git", "read"] | |
| )) | |
| async def git_commit(params: dict) -> dict: | |
| try: | |
| return await git_commit_tool( | |
| params["repo_path"], | |
| params["message"], | |
| params.get("files") | |
| ) | |
| except Exception as e: | |
| return {"error": str(e)} | |
| registry.register(ToolDefinition( | |
| tool_id="git.commit", | |
| version="1.0.0", | |
| title="Git Commit", | |
| description="Stage files and create a commit", | |
| input_schema={ | |
| "type": "object", | |
| "properties": { | |
| "repo_path": {"type": "string"}, | |
| "message": {"type": "string"}, | |
| "files": {"type": "array", "items": {"type": "string"}} | |
| }, | |
| "required": ["repo_path", "message"] | |
| }, | |
| output_schema=None, | |
| risk_class=RiskClass.REVERSIBLE_LOCAL_WRITE, | |
| approval_policy=ApprovalPolicy.USER_CONFIRMATION, | |
| sandbox_required=False, | |
| timeout_ms=15000, | |
| handler=git_commit, | |
| tags=["git", "write"] | |
| )) | |
| async def git_push(params: dict) -> dict: | |
| try: | |
| return await git_push_tool(params["repo_path"], params.get("remote", "origin")) | |
| except Exception as e: | |
| return {"error": str(e)} | |
| registry.register(ToolDefinition( | |
| tool_id="git.push", | |
| version="1.0.0", | |
| title="Git Push", | |
| description="Push commits to remote repository", | |
| input_schema={ | |
| "type": "object", | |
| "properties": { | |
| "repo_path": {"type": "string"}, | |
| "remote": {"type": "string", "default": "origin"} | |
| }, | |
| "required": ["repo_path"] | |
| }, | |
| output_schema=None, | |
| risk_class=RiskClass.REVERSIBLE_REMOTE_WRITE, | |
| approval_policy=ApprovalPolicy.USER_CONFIRMATION, | |
| sandbox_required=False, | |
| timeout_ms=30000, | |
| handler=git_push, | |
| tags=["git", "write", "remote"] | |
| )) | |
| async def git_pull(params: dict) -> dict: | |
| try: | |
| git = GitOperations(Path(params["repo_path"])) | |
| await git.pull(params.get("remote", "origin"), params.get("branch")) | |
| return {"success": True} | |
| except Exception as e: | |
| return {"error": str(e)} | |
| registry.register(ToolDefinition( | |
| tool_id="git.pull", | |
| version="1.0.0", | |
| title="Git Pull", | |
| description="Pull commits from remote repository", | |
| input_schema={ | |
| "type": "object", | |
| "properties": { | |
| "repo_path": {"type": "string"}, | |
| "remote": {"type": "string", "default": "origin"}, | |
| "branch": {"type": "string"} | |
| }, | |
| "required": ["repo_path"] | |
| }, | |
| output_schema=None, | |
| risk_class=RiskClass.REVERSIBLE_LOCAL_WRITE, | |
| approval_policy=ApprovalPolicy.USER_CONFIRMATION, | |
| sandbox_required=False, | |
| timeout_ms=30000, | |
| handler=git_pull, | |
| tags=["git", "write", "remote"] | |
| )) | |
| async def git_branch_list(params: dict) -> dict: | |
| try: | |
| git = GitOperations(Path(params["repo_path"])) | |
| branches = await git.branch_list() | |
| return {"branches": branches} | |
| except Exception as e: | |
| return {"error": str(e)} | |
| registry.register(ToolDefinition( | |
| tool_id="git.branch_list", | |
| version="1.0.0", | |
| title="List Git Branches", | |
| description="List all branches in repository", | |
| input_schema={ | |
| "type": "object", | |
| "properties": {"repo_path": {"type": "string"}}, | |
| "required": ["repo_path"] | |
| }, | |
| output_schema=None, | |
| risk_class=RiskClass.READ_ONLY_LOCAL, | |
| approval_policy=ApprovalPolicy.AUTOMATIC, | |
| sandbox_required=False, | |
| timeout_ms=10000, | |
| handler=git_branch_list, | |
| tags=["git", "read"] | |
| )) | |
| async def git_branch_create(params: dict) -> dict: | |
| try: | |
| git = GitOperations(Path(params["repo_path"])) | |
| await git.branch_create(params["name"], params.get("checkout", False)) | |
| return {"success": True, "branch": params["name"]} | |
| except Exception as e: | |
| return {"error": str(e)} | |
| registry.register(ToolDefinition( | |
| tool_id="git.branch_create", | |
| version="1.0.0", | |
| title="Create Git Branch", | |
| description="Create a new branch", | |
| input_schema={ | |
| "type": "object", | |
| "properties": { | |
| "repo_path": {"type": "string"}, | |
| "name": {"type": "string"}, | |
| "checkout": {"type": "boolean", "default": False} | |
| }, | |
| "required": ["repo_path", "name"] | |
| }, | |
| output_schema=None, | |
| risk_class=RiskClass.REVERSIBLE_LOCAL_WRITE, | |
| approval_policy=ApprovalPolicy.AUTOMATIC, | |
| sandbox_required=False, | |
| timeout_ms=10000, | |
| handler=git_branch_create, | |
| tags=["git", "write"] | |
| )) | |
| async def git_checkout(params: dict) -> dict: | |
| try: | |
| git = GitOperations(Path(params["repo_path"])) | |
| await git.checkout(params["branch"]) | |
| return {"success": True, "branch": params["branch"]} | |
| except Exception as e: | |
| return {"error": str(e)} | |
| registry.register(ToolDefinition( | |
| tool_id="git.checkout", | |
| version="1.0.0", | |
| title="Git Checkout", | |
| description="Checkout a branch", | |
| input_schema={ | |
| "type": "object", | |
| "properties": { | |
| "repo_path": {"type": "string"}, | |
| "branch": {"type": "string"} | |
| }, | |
| "required": ["repo_path", "branch"] | |
| }, | |
| output_schema=None, | |
| risk_class=RiskClass.REVERSIBLE_LOCAL_WRITE, | |
| approval_policy=ApprovalPolicy.USER_CONFIRMATION, | |
| sandbox_required=False, | |
| timeout_ms=10000, | |
| handler=git_checkout, | |
| tags=["git", "write"] | |
| )) | |
| async def git_clone(params: dict) -> dict: | |
| try: | |
| from git import Repo | |
| import asyncio | |
| target = Path(params["target_path"]) | |
| target.mkdir(parents=True, exist_ok=True) | |
| def _clone(): | |
| Repo.clone_from(params["url"], target) | |
| await asyncio.to_thread(_clone) | |
| return {"success": True, "path": str(target)} | |
| except Exception as e: | |
| return {"error": str(e)} | |
| registry.register(ToolDefinition( | |
| tool_id="git.clone", | |
| version="1.0.0", | |
| title="Git Clone", | |
| description="Clone a remote repository", | |
| input_schema={ | |
| "type": "object", | |
| "properties": { | |
| "url": {"type": "string"}, | |
| "target_path": {"type": "string"} | |
| }, | |
| "required": ["url", "target_path"] | |
| }, | |
| output_schema=None, | |
| risk_class=RiskClass.REVERSIBLE_LOCAL_WRITE, | |
| approval_policy=ApprovalPolicy.USER_CONFIRMATION, | |
| sandbox_required=False, | |
| timeout_ms=60000, | |
| handler=git_clone, | |
| tags=["git", "write", "remote"] | |
| )) | |
| # ========================================== | |
| # DATABASE TOOLS | |
| # ========================================== | |
| def register_database_tools(registry: ToolRegistry) -> None: | |
| from .database.sqlite import sqlite_query_tool, sqlite_execute_tool | |
| async def sqlite_query(params: dict) -> dict: | |
| try: | |
| return await sqlite_query_tool( | |
| params["db_path"], | |
| params["sql"], | |
| params.get("params") | |
| ) | |
| except Exception as e: | |
| return {"error": str(e)} | |
| registry.register(ToolDefinition( | |
| tool_id="database.sqlite_query", | |
| version="1.0.0", | |
| title="SQLite Query", | |
| description="Execute a SELECT query on a SQLite database", | |
| input_schema={ | |
| "type": "object", | |
| "properties": { | |
| "db_path": {"type": "string"}, | |
| "sql": {"type": "string"}, | |
| "params": {"type": "array"} | |
| }, | |
| "required": ["db_path", "sql"] | |
| }, | |
| output_schema=None, | |
| risk_class=RiskClass.READ_ONLY_LOCAL, | |
| approval_policy=ApprovalPolicy.AUTOMATIC, | |
| sandbox_required=False, | |
| timeout_ms=15000, | |
| handler=sqlite_query, | |
| tags=["database", "sqlite", "read"] | |
| )) | |
| async def sqlite_execute(params: dict) -> dict: | |
| try: | |
| return await sqlite_execute_tool( | |
| params["db_path"], | |
| params["sql"], | |
| params.get("params") | |
| ) | |
| except Exception as e: | |
| return {"error": str(e)} | |
| registry.register(ToolDefinition( | |
| tool_id="database.sqlite_execute", | |
| version="1.0.0", | |
| title="SQLite Execute", | |
| description="Execute an INSERT/UPDATE/DELETE on a SQLite database", | |
| input_schema={ | |
| "type": "object", | |
| "properties": { | |
| "db_path": {"type": "string"}, | |
| "sql": {"type": "string"}, | |
| "params": {"type": "array"} | |
| }, | |
| "required": ["db_path", "sql"] | |
| }, | |
| output_schema=None, | |
| risk_class=RiskClass.REVERSIBLE_LOCAL_WRITE, | |
| approval_policy=ApprovalPolicy.USER_CONFIRMATION, | |
| sandbox_required=False, | |
| timeout_ms=15000, | |
| handler=sqlite_execute, | |
| tags=["database", "sqlite", "write"] | |
| )) | |
| async def sqlite_list_tables(params: dict) -> dict: | |
| try: | |
| from .database.sqlite import SQLiteOperations | |
| ops = SQLiteOperations(Path(params["db_path"])) | |
| tables = await ops.list_tables() | |
| return {"tables": tables} | |
| except Exception as e: | |
| return {"error": str(e)} | |
| registry.register(ToolDefinition( | |
| tool_id="database.sqlite_list_tables", | |
| version="1.0.0", | |
| title="SQLite List Tables", | |
| description="List all tables in a SQLite database", | |
| input_schema={ | |
| "type": "object", | |
| "properties": {"db_path": {"type": "string"}}, | |
| "required": ["db_path"] | |
| }, | |
| output_schema=None, | |
| risk_class=RiskClass.READ_ONLY_LOCAL, | |
| approval_policy=ApprovalPolicy.AUTOMATIC, | |
| sandbox_required=False, | |
| timeout_ms=5000, | |
| handler=sqlite_list_tables, | |
| tags=["database", "sqlite", "read"] | |
| )) | |
| # ========================================== | |
| # DOCUMENT TOOLS | |
| # ========================================== | |
| def register_document_tools(registry: ToolRegistry) -> None: | |
| async def parse_pdf(params: dict) -> dict: | |
| try: | |
| from .documents.pdf import PDFParser | |
| parser = PDFParser() | |
| doc = await parser.parse(Path(params["path"])) | |
| return { | |
| "text": doc.text, | |
| "pages": doc.pages, | |
| "metadata": doc.metadata | |
| } | |
| except ImportError: | |
| return {"error": "pypdf not installed. Run: pip install pypdf"} | |
| except Exception as e: | |
| return {"error": str(e)} | |
| registry.register(ToolDefinition( | |
| tool_id="documents.parse_pdf", | |
| version="1.0.0", | |
| title="Parse PDF", | |
| description="Extract text and metadata from a PDF file", | |
| input_schema={ | |
| "type": "object", | |
| "properties": {"path": {"type": "string"}}, | |
| "required": ["path"] | |
| }, | |
| output_schema=None, | |
| risk_class=RiskClass.READ_ONLY_LOCAL, | |
| approval_policy=ApprovalPolicy.AUTOMATIC, | |
| sandbox_required=False, | |
| timeout_ms=30000, | |
| handler=parse_pdf, | |
| tags=["documents", "pdf", "read"] | |
| )) | |
| async def parse_docx(params: dict) -> dict: | |
| try: | |
| from .documents.docx import DOCXParser | |
| parser = DOCXParser() | |
| doc = await parser.parse(Path(params["path"])) | |
| return { | |
| "text": doc.text, | |
| "paragraphs": doc.paragraphs, | |
| "metadata": doc.metadata | |
| } | |
| except ImportError: | |
| return {"error": "python-docx not installed. Run: pip install python-docx"} | |
| except Exception as e: | |
| return {"error": str(e)} | |
| registry.register(ToolDefinition( | |
| tool_id="documents.parse_docx", | |
| version="1.0.0", | |
| title="Parse DOCX", | |
| description="Extract text from a Microsoft Word document", | |
| input_schema={ | |
| "type": "object", | |
| "properties": {"path": {"type": "string"}}, | |
| "required": ["path"] | |
| }, | |
| output_schema=None, | |
| risk_class=RiskClass.READ_ONLY_LOCAL, | |
| approval_policy=ApprovalPolicy.AUTOMATIC, | |
| sandbox_required=False, | |
| timeout_ms=15000, | |
| handler=parse_docx, | |
| tags=["documents", "docx", "read"] | |
| )) | |
| async def parse_markdown(params: dict) -> dict: | |
| try: | |
| from .documents.markdown import MarkdownParser | |
| parser = MarkdownParser() | |
| doc = await parser.parse(Path(params["path"])) | |
| return { | |
| "text": doc.text, | |
| "sections": doc.sections, | |
| "links": doc.links, | |
| "code_blocks": doc.code_blocks, | |
| "metadata": doc.metadata | |
| } | |
| except Exception as e: | |
| return {"error": str(e)} | |
| registry.register(ToolDefinition( | |
| tool_id="documents.parse_markdown", | |
| version="1.0.0", | |
| title="Parse Markdown", | |
| description="Parse a Markdown file and extract sections, links, code blocks", | |
| input_schema={ | |
| "type": "object", | |
| "properties": {"path": {"type": "string"}}, | |
| "required": ["path"] | |
| }, | |
| output_schema=None, | |
| risk_class=RiskClass.READ_ONLY_LOCAL, | |
| approval_policy=ApprovalPolicy.AUTOMATIC, | |
| sandbox_required=False, | |
| timeout_ms=10000, | |
| handler=parse_markdown, | |
| tags=["documents", "markdown", "read"] | |
| )) | |
| async def parse_html(params: dict) -> dict: | |
| try: | |
| from .documents.html import HTMLParser | |
| parser = HTMLParser() | |
| doc = await parser.parse(Path(params["path"])) | |
| return { | |
| "text": doc.text, | |
| "title": doc.title, | |
| "links": doc.links, | |
| "metadata": doc.metadata | |
| } | |
| except Exception as e: | |
| return {"error": str(e)} | |
| registry.register(ToolDefinition( | |
| tool_id="documents.parse_html", | |
| version="1.0.0", | |
| title="Parse HTML", | |
| description="Extract text and links from an HTML file", | |
| input_schema={ | |
| "type": "object", | |
| "properties": {"path": {"type": "string"}}, | |
| "required": ["path"] | |
| }, | |
| output_schema=None, | |
| risk_class=RiskClass.READ_ONLY_LOCAL, | |
| approval_policy=ApprovalPolicy.AUTOMATIC, | |
| sandbox_required=False, | |
| timeout_ms=10000, | |
| handler=parse_html, | |
| tags=["documents", "html", "read"] | |
| )) | |
| # ========================================== | |
| # WEB TOOLS (decorator-based, auto-register on import) | |
| # ========================================== | |
| def register_web_tools(registry: ToolRegistry) -> None: | |
| # web.search, web.fetch, web.extract use @tool decorator | |
| # importing the module auto-registers them into the global registry | |
| # we then copy them into the provided registry | |
| try: | |
| import src.tools.web.search as _ # noqa: F401 | |
| from .registry import get_global_registry | |
| global_reg = get_global_registry() | |
| for tool_id in ["web.search", "web.fetch", "web.extract"]: | |
| if global_reg.has(tool_id) and not registry.has(tool_id): | |
| registry.register(global_reg.get(tool_id)) | |
| except ImportError as e: | |
| print(f"Note: web tools require httpx + beautifulsoup4: {e}") | |
| except Exception as e: | |
| print(f"Note: web tools skipped: {e}") | |
| # ========================================== | |
| # EMBEDDINGS TOOLS (decorator-based) | |
| # ========================================== | |
| def register_embeddings_tools(registry: ToolRegistry) -> None: | |
| try: | |
| import src.tools.embeddings.encode as _ # noqa: F401 | |
| from .registry import get_global_registry | |
| global_reg = get_global_registry() | |
| for tool_id in ["embeddings.encode_text", "embeddings.similarity"]: | |
| if global_reg.has(tool_id) and not registry.has(tool_id): | |
| registry.register(global_reg.get(tool_id)) | |
| except Exception as e: | |
| print(f"Note: embeddings tools skipped: {e}") | |
| # ========================================== | |
| # AUDIO TOOLS | |
| # ========================================== | |
| def register_audio_tools(registry: ToolRegistry) -> None: | |
| async def transcribe_audio(params: dict) -> dict: | |
| try: | |
| from .audio.transcribe import AudioTranscriber | |
| transcriber = AudioTranscriber( | |
| provider=params.get("provider", "openai"), | |
| model=params.get("model", "whisper-1") | |
| ) | |
| result = await transcriber.transcribe( | |
| Path(params["audio_path"]), | |
| language=params.get("language") | |
| ) | |
| return { | |
| "text": result.text, | |
| "language": result.language, | |
| "duration": result.duration | |
| } | |
| except ImportError: | |
| return {"error": "openai not installed. Run: pip install openai"} | |
| except Exception as e: | |
| return {"error": str(e)} | |
| registry.register(ToolDefinition( | |
| tool_id="audio.transcribe", | |
| version="1.0.0", | |
| title="Transcribe Audio", | |
| description="Transcribe audio file to text using Whisper", | |
| input_schema={ | |
| "type": "object", | |
| "properties": { | |
| "audio_path": {"type": "string"}, | |
| "language": {"type": "string"}, | |
| "provider": {"type": "string", "default": "openai"}, | |
| "model": {"type": "string", "default": "whisper-1"} | |
| }, | |
| "required": ["audio_path"] | |
| }, | |
| output_schema=None, | |
| risk_class=RiskClass.READ_ONLY_REMOTE, | |
| approval_policy=ApprovalPolicy.AUTOMATIC, | |
| sandbox_required=False, | |
| timeout_ms=120000, | |
| handler=transcribe_audio, | |
| tags=["audio", "transcribe", "whisper"] | |
| )) | |
| async def synthesize_speech(params: dict) -> dict: | |
| try: | |
| from .audio.synthesize import AudioSynthesizer | |
| synth = AudioSynthesizer(provider=params.get("provider", "openai")) | |
| result = await synth.synthesize( | |
| text=params["text"], | |
| voice=params.get("voice", "alloy"), | |
| speed=params.get("speed", 1.0) | |
| ) | |
| output_path = params.get("output_path", "output.mp3") | |
| Path(output_path).write_bytes(result.audio_bytes) | |
| return {"success": True, "output_path": output_path, "format": result.format} | |
| except ImportError: | |
| return {"error": "openai not installed. Run: pip install openai"} | |
| except Exception as e: | |
| return {"error": str(e)} | |
| registry.register(ToolDefinition( | |
| tool_id="audio.synthesize", | |
| version="1.0.0", | |
| title="Synthesize Speech", | |
| description="Convert text to speech (TTS)", | |
| input_schema={ | |
| "type": "object", | |
| "properties": { | |
| "text": {"type": "string"}, | |
| "voice": {"type": "string", "default": "alloy"}, | |
| "speed": {"type": "number", "default": 1.0}, | |
| "output_path": {"type": "string"}, | |
| "provider": {"type": "string", "default": "openai"} | |
| }, | |
| "required": ["text"] | |
| }, | |
| output_schema=None, | |
| risk_class=RiskClass.REVERSIBLE_REMOTE_WRITE, | |
| approval_policy=ApprovalPolicy.AUTOMATIC, | |
| sandbox_required=False, | |
| timeout_ms=60000, | |
| handler=synthesize_speech, | |
| tags=["audio", "tts", "speech"] | |
| )) | |
| # ========================================== | |
| # PYTORCH TOOLS | |
| # ========================================== | |
| def register_pytorch_tools(registry: ToolRegistry) -> None: | |
| from .ml.pytorch import tensor_operation, check_cuda | |
| async def pytorch_tensor_op(params: dict) -> dict: | |
| return await tensor_operation(params) | |
| registry.register(ToolDefinition( | |
| tool_id="pytorch.tensor_operation", | |
| version="1.0.0", | |
| title="PyTorch Tensor Operation", | |
| description="Execute PyTorch tensor operations (add, matmul, softmax, relu, etc)", | |
| input_schema={ | |
| "type": "object", | |
| "properties": { | |
| "operation": {"type": "string"}, | |
| "tensor_a": {"type": "array"}, | |
| "tensor_b": {"type": "array"}, | |
| "dim": {"type": "integer"} | |
| }, | |
| "required": ["operation", "tensor_a"] | |
| }, | |
| output_schema=None, | |
| risk_class=RiskClass.PURE_COMPUTATION, | |
| approval_policy=ApprovalPolicy.AUTOMATIC, | |
| sandbox_required=False, | |
| timeout_ms=10000, | |
| handler=pytorch_tensor_op, | |
| tags=["pytorch", "ml", "tensor"] | |
| )) | |
| async def pytorch_cuda_check(params: dict) -> dict: | |
| return await check_cuda(params) | |
| registry.register(ToolDefinition( | |
| tool_id="pytorch.check_cuda", | |
| version="1.0.0", | |
| title="Check CUDA Availability", | |
| description="Check if CUDA is available and list GPU devices", | |
| input_schema={"type": "object", "properties": {}}, | |
| output_schema=None, | |
| risk_class=RiskClass.READ_ONLY_LOCAL, | |
| approval_policy=ApprovalPolicy.AUTOMATIC, | |
| sandbox_required=False, | |
| timeout_ms=5000, | |
| handler=pytorch_cuda_check, | |
| tags=["pytorch", "ml", "cuda"] | |
| )) | |
| # ========================================== | |
| # MASTER LOADER | |
| # ========================================== | |
| def load_all_tools(registry: ToolRegistry) -> int: | |
| """ | |
| Load all available tools into registry. | |
| Returns: | |
| Number of tools loaded | |
| """ | |
| count_before = len(registry.tools) | |
| # Core tools — always available | |
| register_filesystem_tools(registry) | |
| register_code_tools(registry) | |
| # Git tools (requires gitpython) | |
| try: | |
| register_git_tools(registry) | |
| except ImportError: | |
| print("Note: gitpython not installed, skipping git.* tools. Run: pip install gitpython") | |
| # Database tools (stdlib sqlite3, always available) | |
| register_database_tools(registry) | |
| # Document tools (optional deps) | |
| register_document_tools(registry) | |
| # Web tools (requires httpx + beautifulsoup4) | |
| register_web_tools(registry) | |
| # Embeddings tools (optional) | |
| register_embeddings_tools(registry) | |
| # Audio tools (requires openai) | |
| register_audio_tools(registry) | |
| # PyTorch tools (optional) | |
| try: | |
| register_pytorch_tools(registry) | |
| except ImportError: | |
| print("Note: torch not installed, skipping pytorch.* tools. Run: pip install torch") | |
| count_after = len(registry.tools) | |
| loaded = count_after - count_before | |
| print(f"OK: Loaded {loaded} tools into registry") | |
| return loaded | |