diff --git a/parea/utils/trace_utils.py b/parea/utils/trace_utils.py index d85ca4ca..e3ad0212 100644 --- a/parea/utils/trace_utils.py +++ b/parea/utils/trace_utils.py @@ -183,14 +183,14 @@ def call_eval_funcs_then_log(trace_id: str, eval_funcs: list[Callable] = None, a try: inputs = data.inputs target = data.target - if access_output_of_func: - output = json.loads(data.output) - output = access_output_of_func(output) - output_for_eval_metrics = json.dumps(output) - else: - output_for_eval_metrics = data.output - data.output_for_eval_metrics = output_for_eval_metrics if eval_funcs and data.status == "success": + if access_output_of_func: + output = json.loads(data.output) + output = access_output_of_func(output) + output_for_eval_metrics = json.dumps(output) + else: + output_for_eval_metrics = data.output + data.output_for_eval_metrics = output_for_eval_metrics data.scores = [] for func in eval_funcs: try: diff --git a/parea/wrapper/wrapper.py b/parea/wrapper/wrapper.py index 81fc9e55..bb49cf0a 100644 --- a/parea/wrapper/wrapper.py +++ b/parea/wrapper/wrapper.py @@ -94,6 +94,7 @@ def async_decorator(self, orig_func: Callable) -> Callable: async def wrapper(*args, **kwargs): trace_id, start_time = self._init_trace() response = None + exception = None error = None cache_hit = False cache_key = self.convert_kwargs_to_cache_request(args, kwargs) @@ -106,12 +107,16 @@ async def wrapper(*args, **kwargs): if response is None: response = await orig_func(*args, **kwargs) except Exception as e: + exception = e error = str(e) if self.cache: await self.cache.ainvalidate(cache_key) - raise finally: - return await self._acleanup_trace(trace_id, start_time, error, cache_hit, args, kwargs, response) + if exception is not None: + self._cleanup_trace(trace_id, start_time, error, cache_hit, args, kwargs, response) + raise exception + else: + return self._cleanup_trace(trace_id, start_time, error, cache_hit, args, kwargs, response) return wrapper @@ -123,6 +128,7 @@ def wrapper(*args, **kwargs): error = None cache_hit = False cache_key = self.convert_kwargs_to_cache_request(args, kwargs) + exception = None try: if self.cache: cache_result = self.cache.get(cache_key) @@ -132,12 +138,16 @@ def wrapper(*args, **kwargs): if response is None: response = orig_func(*args, **kwargs) except Exception as e: + exception = e error = str(e) if self.cache: self.cache.invalidate(cache_key) - raise e finally: - return self._cleanup_trace(trace_id, start_time, error, cache_hit, args, kwargs, response) + if exception is not None: + self._cleanup_trace(trace_id, start_time, error, cache_hit, args, kwargs, response) + raise exception + else: + return self._cleanup_trace(trace_id, start_time, error, cache_hit, args, kwargs, response) return wrapper diff --git a/pyproject.toml b/pyproject.toml index d4b3be8b..37a758f0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,7 +6,7 @@ build-backend = "poetry.core.masonry.api" [tool.poetry] name = "parea-ai" packages = [{ include = "parea" }] -version = "0.2.13" +version = "0.2.14" description = "Parea python sdk" readme = "README.md" authors = ["joel-parea-ai "]