File size: 2,215 Bytes
8b54db1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
"""
Package Manager for CodeAct Agent.
Handles Python package management and imports.
"""

from typing import Dict
from core.constants import LIBRARY_CONTENT_DICT


class PackageManager:
    """Manages Python packages available to the agent."""

    def __init__(self, default_packages: Dict[str, str] = None):
        self.default_packages = default_packages or LIBRARY_CONTENT_DICT.copy()
        self.custom_packages = {}

    def add_packages(self, packages: Dict[str, str]) -> bool:
        """Add new packages to the available packages."""
        try:
            if not isinstance(packages, dict):
                raise ValueError("Packages must be a dictionary with package name as key and description as value")

            for package_name, description in packages.items():
                if not isinstance(package_name, str) or not isinstance(description, str):
                    print("Warning: Skipping invalid package entry - package_name and description must be strings")
                    continue

                self.custom_packages[package_name] = description
                print(f"Added package '{package_name}': {description}")

            print(f"Successfully added {len(packages)} package(s) to the library")
            return True

        except Exception as e:
            print(f"Error adding packages: {e}")
            return False

    def get_all_packages(self) -> Dict[str, str]:
        """Get all available packages (default + custom)."""
        all_packages = self.default_packages.copy()
        all_packages.update(self.custom_packages)
        return all_packages

    def import_packages(self, python_executor) -> tuple:
        """Import all packages into the executor environment."""
        all_packages = self.get_all_packages()
        imported_packages = []
        failed_packages = []

        for package_name in all_packages.keys():
            try:
                import_code = f"import {package_name}"
                python_executor(import_code)
                imported_packages.append(package_name)
            except Exception as e:
                failed_packages.append((package_name, str(e)))

        return imported_packages, failed_packages