File size: 2,393 Bytes
1ccc56a
 
 
 
 
 
 
7da119d
1ccc56a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7da119d
 
 
 
 
1ccc56a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7da119d
1ccc56a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7da119d
1ccc56a
 
 
 
 
 
 
 
 
 
 
 
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
import asyncio
from pathlib import Path
from typing import List

from dotenv import load_dotenv

from camel.models import ModelFactory
from camel.toolkits import FunctionTool
from camel.types import ModelPlatformType, ModelType
from camel.logger import set_log_level

from utils.async_role_playing import OwlRolePlaying, run_society

from utils.mcp.mcp_toolkit_manager import MCPToolkitManager


load_dotenv()
set_log_level(level="DEBUG")


async def construct_society(
    question: str,
    tools: List[FunctionTool],
) -> OwlRolePlaying:
    r"""build a multi-agent OwlRolePlaying instance.

    Args:
        question (str): The question to ask.
        tools (List[FunctionTool]): The MCP tools to use.
    """
    models = {
        "user": ModelFactory.create(
            model_platform=ModelPlatformType.OPENAI,
            model_type=ModelType.GPT_4O,
            model_config_dict={"temperature": 0},
        ),
        "assistant": ModelFactory.create(
            model_platform=ModelPlatformType.OPENAI,
            model_type=ModelType.GPT_4O,
            model_config_dict={"temperature": 0},
        ),
    }

    user_agent_kwargs = {"model": models["user"]}
    assistant_agent_kwargs = {
        "model": models["assistant"],
        "tools": tools,
    }

    task_kwargs = {
        "task_prompt": question,
        "with_task_specify": False,
    }

    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


async def main():
    config_path = str(
        Path(__file__).parent / "utils/mcp/mcp_servers_config.json"
    )

    manager = MCPToolkitManager.from_config(config_path)

    question = (
        "I'd like a academic report about Guohao Li, including his research "
        "direction, published papers (up to 20), institutions, etc." 
        "Then organize the report in Markdown format and save it to my desktop"
    )

    # Connect to all MCP toolkits
    async with manager.connection():
        tools = manager.get_all_tools()

        society = await construct_society(question, tools)

        answer, chat_history, token_count = await run_society(society)

    print(f"\033[94mAnswer: {answer}\033[0m")


if __name__ == "__main__":
    asyncio.run(main())