Spaces:
Running
Running
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
""" | |
@Time : 2023/5/23 17:25 | |
@Author : alexanderwu | |
@File : searcher.py | |
@Modified By: mashenquan, 2023-11-1. According to Chapter 2.2.1 and 2.2.2 of RFC 116, change the data type of | |
the `cause_by` value in the `Message` to a string to support the new message distribution feature. | |
""" | |
from typing import Optional | |
from pydantic import Field, model_validator | |
from metagpt.actions import SearchAndSummarize | |
from metagpt.actions.action_node import ActionNode | |
from metagpt.actions.action_output import ActionOutput | |
from metagpt.logs import logger | |
from metagpt.roles import Role | |
from metagpt.schema import Message | |
from metagpt.tools.search_engine import SearchEngine | |
class Searcher(Role): | |
""" | |
Represents a Searcher role responsible for providing search services to users. | |
Attributes: | |
name (str): Name of the searcher. | |
profile (str): Role profile. | |
goal (str): Goal of the searcher. | |
constraints (str): Constraints or limitations for the searcher. | |
search_engine (SearchEngine): The search engine to use. | |
""" | |
name: str = Field(default="Alice") | |
profile: str = Field(default="Smart Assistant") | |
goal: str = "Provide search services for users" | |
constraints: str = "Answer is rich and complete" | |
search_engine: Optional[SearchEngine] = None | |
def post_root(self): | |
if self.search_engine: | |
self.set_actions([SearchAndSummarize(search_engine=self.search_engine, context=self.context)]) | |
else: | |
self.set_actions([SearchAndSummarize]) | |
return self | |
async def _act_sp(self) -> Message: | |
"""Performs the search action in a single process.""" | |
logger.info(f"{self._setting}: to do {self.rc.todo}({self.rc.todo.name})") | |
response = await self.rc.todo.run(self.rc.memory.get(k=0)) | |
if isinstance(response, (ActionOutput, ActionNode)): | |
msg = Message( | |
content=response.content, | |
instruct_content=response.instruct_content, | |
role=self.profile, | |
cause_by=self.rc.todo, | |
) | |
else: | |
msg = Message(content=response, role=self.profile, cause_by=self.rc.todo) | |
self.rc.memory.add(msg) | |
return msg | |
async def _act(self) -> Message: | |
"""Determines the mode of action for the searcher.""" | |
return await self._act_sp() | |