From d148a3217bbe6eb2aa80bdd0132801da98fd1a14 Mon Sep 17 00:00:00 2001 From: seehi <6580@pm.me> Date: Wed, 5 Jun 2024 23:26:09 +0800 Subject: [PATCH] add handle_exception to ensure robustness --- metagpt/exp_pool/decorator.py | 14 ++++++++++++-- metagpt/exp_pool/manager.py | 3 +++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/metagpt/exp_pool/decorator.py b/metagpt/exp_pool/decorator.py index 9eb4d9e61..9cf924779 100644 --- a/metagpt/exp_pool/decorator.py +++ b/metagpt/exp_pool/decorator.py @@ -10,6 +10,7 @@ from metagpt.exp_pool.manager import ExperienceManager, exp_manager from metagpt.exp_pool.schema import Experience, Metric, QueryType, Score from metagpt.exp_pool.scorers import ExperienceScorer, SimpleScorer from metagpt.utils.async_helper import NestAsyncio +from metagpt.utils.exceptions import handle_exception ReturnType = TypeVar("ReturnType") @@ -50,8 +51,7 @@ def exp_cache( return exp await handler.execute_function() - await handler.evaluate_experience() - handler.save_experience() + await handler.process_experience() return handler._result @@ -87,6 +87,16 @@ class ExpCacheHandler(BaseModel): """Execute the function, and save the result.""" self._result = await self._execute_function() + @handle_exception + async def process_experience(self): + """Process experience. + + Evaluates and saves experience. + Use `handle_exception` to ensure robustness, do not stop subsequent operations. + """ + await self.evaluate_experience() + self.save_experience() + async def evaluate_experience(self): """Evaluate the experience, and save the score.""" diff --git a/metagpt/exp_pool/manager.py b/metagpt/exp_pool/manager.py index 58499104d..546086b37 100644 --- a/metagpt/exp_pool/manager.py +++ b/metagpt/exp_pool/manager.py @@ -8,6 +8,7 @@ from metagpt.config2 import Config, config from metagpt.exp_pool.schema import MAX_SCORE, Experience, QueryType from metagpt.rag.engines import SimpleEngine from metagpt.rag.schema import ChromaRetrieverConfig, LLMRankerConfig +from metagpt.utils.exceptions import handle_exception class ExperienceManager(BaseModel): @@ -34,6 +35,7 @@ class ExperienceManager(BaseModel): ) return self + @handle_exception def create_exp(self, exp: Experience): """Adds an experience to the storage if writing is enabled. @@ -45,6 +47,7 @@ class ExperienceManager(BaseModel): self.storage.add_objs([exp]) + @handle_exception(default_return=[]) async def query_exps(self, req: str, tag: str = "", query_type: QueryType = QueryType.SEMANTIC) -> list[Experience]: """Retrieves and filters experiences.