|
|
|
|
|
""" |
|
@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 |
|
|
|
@model_validator(mode="after") |
|
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() |
|
|