| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | from typing import Any, Dict, Optional, Union |
| |
|
| | from camel.agents import ChatAgent |
| | from camel.configs import ChatGPTConfig |
| | from camel.messages import SystemMessage, UserChatMessage |
| | from camel.prompts import PromptTemplateGenerator, TextPrompt |
| | from camel.typing import ModelType, RoleType, TaskType |
| |
|
| |
|
| | class TaskSpecifyAgent(ChatAgent): |
| | r"""An agent that Specifies a given task prompt by prompting the user to |
| | provide more details. |
| | |
| | Attributes: |
| | DEFAULT_WORD_LIMIT (int): The default word limit for the task prompt. |
| | task_specify_prompt (TextPrompt): The prompt for specifying the task. |
| | |
| | Args: |
| | model (ModelType): The type of model to use for the agent. |
| | (default: :obj:`ModelType.GPT_3_5_TURBO`) |
| | task_type (TaskType): The type of task for which to generate a prompt. |
| | (default: :obj:`TaskType.AI_SOCIETY`) |
| | model_config (Any): The configuration for the model. |
| | (default: :obj:`None`) |
| | task_specify_prompt (Optional[TextPrompt]): The prompt for specifying |
| | the task. (default: :obj:`None`) |
| | word_limit (int): The word limit for the task prompt. |
| | (default: :obj:`50`) |
| | """ |
| | DEFAULT_WORD_LIMIT = 50 |
| |
|
| | def __init__( |
| | self, |
| | model: Optional[ModelType] = None, |
| | task_type: TaskType = TaskType.AI_SOCIETY, |
| | model_config: Optional[Any] = None, |
| | task_specify_prompt: Optional[Union[str, TextPrompt]] = None, |
| | word_limit: int = DEFAULT_WORD_LIMIT, |
| | ) -> None: |
| |
|
| | if task_specify_prompt is None: |
| | task_specify_prompt_template = PromptTemplateGenerator( |
| | ).get_task_specify_prompt(task_type) |
| |
|
| | self.task_specify_prompt = task_specify_prompt_template.format( |
| | word_limit=word_limit) |
| | else: |
| | self.task_specify_prompt = task_specify_prompt |
| |
|
| | model_config = model_config or ChatGPTConfig(temperature=1.0) |
| |
|
| | system_message = SystemMessage( |
| | role_name="Task Specifier", |
| | role_type=RoleType.ASSISTANT, |
| | content="You can make a task more specific.", |
| | ) |
| | super().__init__(system_message, model, model_config) |
| |
|
| | def step( |
| | self, |
| | original_task_prompt: Union[str, TextPrompt], |
| | meta_dict: Optional[Dict[str, Any]] = None, |
| | ) -> TextPrompt: |
| | r"""Specify the given task prompt by providing more details. |
| | |
| | Args: |
| | original_task_prompt (Union[str, TextPrompt]): The original task |
| | prompt. |
| | meta_dict (Optional[Dict[str, Any]]): A dictionary containing |
| | additional information to include in the prompt. |
| | (default: :obj:`None`) |
| | |
| | Returns: |
| | TextPrompt: The specified task prompt. |
| | """ |
| | self.reset() |
| | self.task_specify_prompt = self.task_specify_prompt.format( |
| | task=original_task_prompt) |
| |
|
| | if meta_dict is not None: |
| | self.task_specify_prompt = (self.task_specify_prompt.format( |
| | **meta_dict)) |
| |
|
| | task_msg = UserChatMessage(role_name="Task Specifier", |
| | content=self.task_specify_prompt) |
| | specifier_response = super().step(task_msg) |
| | if (specifier_response.msgs is None |
| | or len(specifier_response.msgs) == 0): |
| | raise RuntimeError("Task specification failed.") |
| | specified_task_msg = specifier_response.msgs[0] |
| |
|
| | if specifier_response.terminated: |
| | raise RuntimeError("Task specification failed.") |
| |
|
| | return TextPrompt(specified_task_msg.content) |
| |
|
| |
|
| | class TaskPlannerAgent(ChatAgent): |
| | r"""An agent that helps divide a task into subtasks based on the input |
| | task prompt. |
| | |
| | Attributes: |
| | task_planner_prompt (TextPrompt): A prompt for the agent to divide |
| | the task into subtasks. |
| | |
| | Args: |
| | model (ModelType): The type of model to use for the agent. |
| | (default: :obj:`ModelType.GPT_3_5_TURBO`) |
| | model_config (Any): The configuration for the model. |
| | (default: :obj:`None`) |
| | """ |
| |
|
| | def __init__( |
| | self, |
| | model: Optional[ModelType] = None, |
| | model_config: Any = None, |
| | ) -> None: |
| |
|
| | self.task_planner_prompt = TextPrompt( |
| | "Divide this task into subtasks: {task}. Be concise.") |
| |
|
| | system_message = SystemMessage( |
| | role_name="Task Planner", |
| | role_type=RoleType.ASSISTANT, |
| | content="You are a helpful task planner.", |
| | ) |
| | super().__init__(system_message, model, model_config) |
| |
|
| | def step( |
| | self, |
| | task_prompt: Union[str, TextPrompt], |
| | ) -> TextPrompt: |
| | r"""Generate subtasks based on the input task prompt. |
| | |
| | Args: |
| | task_prompt (Union[str, TextPrompt]): The prompt for the task to |
| | be divided into subtasks. |
| | |
| | Returns: |
| | TextPrompt: A prompt for the subtasks generated by the agent. |
| | """ |
| | |
| | self.reset() |
| | self.task_planner_prompt = self.task_planner_prompt.format( |
| | task=task_prompt) |
| |
|
| | task_msg = UserChatMessage(role_name="Task Planner", |
| | content=self.task_planner_prompt) |
| | |
| | task_tesponse = super().step(task_msg) |
| |
|
| | if task_tesponse.msgs is None: |
| | raise RuntimeError("Got None Subtasks messages.") |
| | if task_tesponse.terminated: |
| | raise RuntimeError("Task planning failed.") |
| |
|
| | sub_tasks_msg = task_tesponse.msgs[0] |
| | return TextPrompt(sub_tasks_msg.content) |
| |
|