File size: 2,628 Bytes
b3509ba
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from swarmai.agents.AgentBase import AgentBase
from swarmai.utils.ai_engines.GPTConversEngine import GPTConversEngine
from swarmai.utils.task_queue.Task import Task
from swarmai.utils.PromptFactory import PromptFactory

class GeneralPurposeAgent(AgentBase):
    """Manager agent class that is responsible for breaking down the tasks into subtasks and assigning them into the task queue.
    """

    def __init__(self, agent_id, agent_type, swarm, logger):
        super().__init__(agent_id, agent_type, swarm, logger)
        self.engine = GPTConversEngine("gpt-3.5-turbo", 0.5, 1000)
        
        self.TASK_METHODS = {}
        for method in self.swarm.TASK_TYPES:
            if method != "breakdown_to_subtasks":
                self.TASK_METHODS[method] = self._think

    def perform_task(self):
        self.step = "perform_task"
        try:
            # self.task is already taken in the beginning of the cycle in AgentBase
            if not isinstance(self.task, Task):
                raise Exception(f"Task is not of type Task, but {type(self.task)}")
            
            task_type = self.task.task_type
            if task_type not in self.TASK_METHODS:
                raise Exception(f"Task type {task_type} is not supported by the agent {self.agent_id} of type {self.agent_type}")
            
            self.result = self.TASK_METHODS[task_type](self.task.task_description)
            return True
        except Exception as e:
            self.log(f"Agent {self.agent_id} of type {self.agent_type} failed to perform the task {self.task.task_description} with error {e}", level = "error")
            return False

    def share(self):
        pass

    def _think(self, task_description):
        self.step = "think"
        prompt = (
            "Act as an analyst and worker."
            f"You need to perform a task: {task_description}. The type of the task is {self.task.task_type}."
            "If you don't have capabilities to perform the task (for example no google access), return empty string (or just a space)"
            "Make sure to actually solve the task and provide a valid solution; avoid describing how you would do it."
        )
        # generate a conversation
        conversation = [
            {"role": "user", "content": prompt}
        ]

        result = self.engine.call_model(conversation)

        # add to shared memory
        self._send_data_to_swarm(result)
        self.log(f"Agent {self.agent_id} of type {self.agent_type} thought about the task:\n{task_description}\n\nand shared the following result:\n{result}", level = "info")
        return result