Source code for camel.societies.workforce.single_agent_worker
# ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
from __future__ import annotations
import json
from typing import Any, List
from colorama import Fore
from camel.agents import ChatAgent
from camel.messages.base import BaseMessage
from camel.societies.workforce.prompts import PROCESS_TASK_PROMPT
from camel.societies.workforce.utils import TaskResult
from camel.societies.workforce.worker import Worker
from camel.tasks.task import Task, TaskState
from camel.utils import print_text_animated
[docs]
class SingleAgentWorker(Worker):
r"""A worker node that consists of a single agent.
Args:
description (str): Description of the node.
worker (ChatAgent): Worker of the node. A single agent.
"""
def __init__(
self,
description: str,
worker: ChatAgent,
) -> None:
super().__init__(description)
self.worker = worker
[docs]
def reset(self) -> Any:
r"""Resets the worker to its initial state."""
super().reset()
self.worker.reset()
async def _process_task(
self, task: Task, dependencies: List[Task]
) -> TaskState:
r"""Processes a task with its dependencies.
This method asynchronously processes a given task, considering its
dependencies, by sending a generated prompt to a worker. It updates
the task's result based on the agent's response.
Args:
task (Task): The task to process, which includes necessary details
like content and type.
dependencies (List[Task]): Tasks that the given task depends on.
Returns:
TaskState: `TaskState.DONE` if processed successfully, otherwise
`TaskState.FAILED`.
"""
dependency_tasks_info = self._get_dep_tasks_info(dependencies)
prompt = PROCESS_TASK_PROMPT.format(
content=task.content,
dependency_tasks_info=dependency_tasks_info,
additional_info=task.additional_info,
)
req = BaseMessage.make_user_message(
role_name="User",
content=prompt,
)
try:
response = self.worker.step(req, response_format=TaskResult)
except Exception as e:
print(
f"{Fore.RED}Error occurred while processing task {task.id}:"
f"\n{e}{Fore.RESET}"
)
return TaskState.FAILED
print(f"======\n{Fore.GREEN}Reply from {self}:{Fore.RESET}")
result_dict = json.loads(response.msg.content)
task_result = TaskResult(**result_dict)
color = Fore.RED if task_result.failed else Fore.GREEN
print_text_animated(
f"\n{color}{task_result.content}{Fore.RESET}\n======",
delay=0.005,
)
if task_result.failed:
return TaskState.FAILED
task.result = task_result.content
return TaskState.DONE