File size: 2,128 Bytes
62da328
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
59
60
61
62
63
64
65
import sys
sys.path.append("../")

import json
import re
from typing import Dict, Optional, List
from loguru import logger

from camel.toolkits import *


def extract_pattern(content: str, pattern: str) -> Optional[str]:
    try:
        _pattern = fr"<{pattern}>(.*?)</{pattern}>"
        match = re.search(_pattern, content, re.DOTALL)
        if match:
            text = match.group(1)
            return text.strip()
        else:
            return None
    except Exception as e:
        logger.warning(f"Error extracting answer: {e}, current content: {content}")
        return None
        
        
def extract_dict_from_str(text: str) -> Optional[Dict]:
    r"""Extract dict from LLM's outputs including "```json ```" tag."""
    text = text.replace("\\", "")
    pattern = r'```json\s*(.*?)```'
    match = re.search(pattern, text, re.DOTALL)
    
    if match:
        json_str = match.group(1).strip()
        try:
            # Parse the JSON string into a dictionary
            return json.loads(json_str)
        except json.JSONDecodeError:
            return None
    return None 


def process_tools(tools: List[str] | str) -> List[FunctionTool]:
    r"""Process the tools from the configuration."""
    tool_list = []
    if isinstance(tools, str):
        tools = [tools]
    for tool_name in tools:
        if tool_name in globals():
            toolkit_class: BaseToolkit = globals()[tool_name]
            if tool_name == "CodeExecutionToolkit":
                tool_list.extend(toolkit_class(sandbox="subprocess", verbose=True).get_tools())
            elif tool_name == 'ImageAnalysisToolkit':
                tool_list.extend(toolkit_class(model="gpt-4o").get_tools())
            elif tool_name == 'AudioAnalysisToolkit':
                tool_list.extend(toolkit_class(reasoning=True).get_tools())
            elif tool_name == "WebToolkit":
                tool_list.extend(toolkit_class(headless=True).get_tools())
            else:
                tool_list.extend(toolkit_class().get_tools())

        else:
            raise ValueError(f"Toolkit {tool_name} not found.")

    return tool_list