"""Trajectory preprocessing operation for task memory generation. This module provides operations to preprocess and classify trajectories into success and failure categories based on score thresholds. """ from typing import List, Dict from flowllm.core.context import C from flowllm.core.op import BaseAsyncOp from loguru import logger from reme_ai.schema import Trajectory @C.register_op() class TrajectoryPreprocessOp(BaseAsyncOp): """Preprocess trajectories: validate and classify by success/failure. This operation classifies trajectories into success and failure categories based on score thresholds, preparing them for downstream memory extraction operations. """ file_path: str = __file__ async def async_execute(self): """Preprocess trajectories: validate and classify""" trajectories: list = self.context.get("trajectories", []) trajectories: List[Trajectory] = [Trajectory(**x) if isinstance(x, dict) else x for x in trajectories] # Classify trajectories classified = self._classify_trajectories(trajectories) logger.info( f"Classified trajectories - Success: {len(classified['success'])}, " f"Failure: {len(classified['failure'])}, All: {len(classified['all'])}", ) # Set context for downstream operators self.context.success_trajectories = classified["success"] self.context.failure_trajectories = classified["failure"] self.context.all_trajectories = classified["all"] def _classify_trajectories(self, trajectories: List[Trajectory]) -> Dict[str, List[Trajectory]]: """Classify trajectories based on score threshold""" success_trajectories = [] failure_trajectories = [] success_threshold = self.op_params.get("success_threshold", 1.0) for traj in trajectories: is_success = traj.score >= success_threshold if is_success: success_trajectories.append(traj) else: failure_trajectories.append(traj) return { "success": success_trajectories, "failure": failure_trajectories, "all": trajectories, }