File size: 4,572 Bytes
5d9f8de
 
 
38255bb
5d9f8de
38255bb
 
 
 
 
 
 
 
5d9f8de
 
 
 
 
 
38255bb
5d9f8de
38255bb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5d9f8de
38255bb
 
 
5d9f8de
 
38255bb
 
 
 
5d9f8de
 
38255bb
 
 
 
 
5d9f8de
38255bb
 
5d9f8de
38255bb
 
5d9f8de
 
38255bb
5d9f8de
38255bb
5d9f8de
 
 
 
 
 
38255bb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5d9f8de
 
38255bb
 
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
from dotenv import load_dotenv
load_dotenv()

import os
from camel.models import ModelFactory
from camel.toolkits import (
    CodeExecutionToolkit,
    DocumentProcessingToolkit,
    ExcelToolkit,
    ImageAnalysisToolkit,
    SearchToolkit,
    WebToolkit,
)
from camel.types import ModelPlatformType, ModelType

from utils import OwlRolePlaying, run_society


def construct_society(question: str) -> OwlRolePlaying:
    r"""Construct a society of agents based on the given question.
    
    Args:
        question (str): The task or question to be addressed by the society.
        
    Returns:
        OwlRolePlaying: A configured society of agents ready to address the question.
    """
    
    # Create models for different components
    models = {
        "user": ModelFactory.create(
            model_platform=ModelPlatformType.OPENAI_COMPATIBLE_MODEL,
            model_type="qwen-max",
            api_key=os.getenv("QWEN_API_KEY"),
            url="https://dashscope.aliyuncs.com/compatible-mode/v1",
            model_config_dict={"temperature": 0.4, "max_tokens": 4096},
        ),
        "assistant": ModelFactory.create(
            model_platform=ModelPlatformType.OPENAI_COMPATIBLE_MODEL,
            model_type="qwen-max",
            api_key=os.getenv("QWEN_API_KEY"),
            url="https://dashscope.aliyuncs.com/compatible-mode/v1",
            model_config_dict={"temperature": 0.4, "max_tokens": 4096},
        ),
        "web": ModelFactory.create(
            model_platform=ModelPlatformType.OPENAI_COMPATIBLE_MODEL,
            model_type="qwen-max",
            api_key=os.getenv("QWEN_API_KEY"),
            url="https://dashscope.aliyuncs.com/compatible-mode/v1",
            model_config_dict={"temperature": 0.4, "max_tokens": 4096},
        ),
        "planning": ModelFactory.create(
            model_platform=ModelPlatformType.OPENAI_COMPATIBLE_MODEL,
            model_type="qwen-max",
            api_key=os.getenv("QWEN_API_KEY"),
            url="https://dashscope.aliyuncs.com/compatible-mode/v1",
            model_config_dict={"temperature": 0.4, "max_tokens": 4096},
        ),
        "image": ModelFactory.create(
            model_platform=ModelPlatformType.OPENAI_COMPATIBLE_MODEL,
            model_type="qwen-max",
            api_key=os.getenv("QWEN_API_KEY"),
            url="https://dashscope.aliyuncs.com/compatible-mode/v1",
            model_config_dict={"temperature": 0.4, "max_tokens": 4096},
        ),
        "search": ModelFactory.create(
            model_platform=ModelPlatformType.OPENAI_COMPATIBLE_MODEL,
            model_type="qwen-max",
            api_key=os.getenv("QWEN_API_KEY"),
            url="https://dashscope.aliyuncs.com/compatible-mode/v1",
            model_config_dict={"temperature": 0.4, "max_tokens": 4096},
        ),
    }
    
    # Configure toolkits
    tools = [
        *WebToolkit(
            headless=False,  # Set to True for headless mode (e.g., on remote servers)
            web_agent_model=models["web"],
            planning_agent_model=models["planning"],
        ).get_tools(),
        *DocumentProcessingToolkit().get_tools(),
        *CodeExecutionToolkit(sandbox="subprocess", verbose=True).get_tools(),
        *ImageAnalysisToolkit(model=models["image"]).get_tools(),
        *SearchToolkit(model=models["search"]).get_tools(),
        *ExcelToolkit().get_tools(),
    ]
    
    # Configure agent roles and parameters
    user_agent_kwargs = {"model": models["user"]}
    assistant_agent_kwargs = {"model": models["assistant"], "tools": tools}
    
    # Configure task parameters
    task_kwargs = {
        "task_prompt": question,
        "with_task_specify": False,
    }
    
    # Create and return the society
    society = OwlRolePlaying(
        **task_kwargs,
        user_role_name="user",
        user_agent_kwargs=user_agent_kwargs,
        assistant_role_name="assistant",
        assistant_agent_kwargs=assistant_agent_kwargs,
    )
    
    return society


def main():
    r"""Main function to run the OWL system with an example question."""
    # Example research question
    question = (
        "What was the volume in m^3 of the fish bag that was calculated in "
        "the University of Leicester paper `Can Hiccup Supply Enough Fish "
        "to Maintain a Dragon's Diet?`"
    )
    
    # Construct and run the society
    society = construct_society(question)
    answer, chat_history, token_count = run_society(society)
    
    # Output the result
    print(f"Answer: {answer}")


if __name__ == "__main__":
    main()