diff --git a/platoon/config_defs.py b/platoon/config_defs.py index 1fc6c3a..3f83a20 100644 --- a/platoon/config_defs.py +++ b/platoon/config_defs.py @@ -37,6 +37,8 @@ class RolloutConfig: timeout: int | None = None # Trajectory timeout (entire rollout) step_timeout: int = 300 # Per-step timeout (agent.act + env.step) return_dict: bool = False + propogate_root_success: bool = False + skip_subagent_reward_computation: bool = False inference_params: InferenceParams = field(default_factory=InferenceParams) def __post_init__(self) -> None: diff --git a/platoon/utils/subagent_rewards.py b/platoon/utils/subagent_rewards.py new file mode 100644 index 0000000..d7c2639 --- /dev/null +++ b/platoon/utils/subagent_rewards.py @@ -0,0 +1,64 @@ +from __future__ import annotations + +from typing import Any + +from platoon.episode.trajectory import TrajectoryCollection + + +def _get_trajectories(trajectory_collection: dict[str, Any] | TrajectoryCollection) -> dict[str, Any]: + return ( + trajectory_collection["trajectories"] + if isinstance(trajectory_collection, dict) + else trajectory_collection.trajectories + ) + + +def _get_trajectory_reward(trajectory: Any) -> float: + return float(trajectory["reward"] if isinstance(trajectory, dict) else trajectory.reward) + + +def _set_trajectory_reward(trajectory: Any, reward: float) -> None: + if isinstance(trajectory, dict): + trajectory["reward"] = reward + else: + trajectory.reward = reward + + +def _get_steps(trajectory: Any) -> list[Any]: + return trajectory.get("steps", []) if isinstance(trajectory, dict) else trajectory.steps + + +def _get_step_reward_misc(step: Any) -> dict[str, Any]: + if isinstance(step, dict): + return step.setdefault("misc", {}).setdefault("reward_misc", {}) + if step.misc is None: + step.misc = {} + return step.misc.setdefault("reward_misc", {}) + + +def propogate_root_success( + trajectory_collection: dict[str, Any] | TrajectoryCollection, +) -> dict[str, Any] | TrajectoryCollection: + """Rewrite recursive rollout rewards so all trajectories use root success.""" + trajectories = _get_trajectories(trajectory_collection) + if not trajectories: + return trajectory_collection + + _, root_trajectory = next(iter(trajectories.items())) + root_steps = _get_steps(root_trajectory) + root_success = _get_trajectory_reward(root_trajectory) + if root_steps: + root_success = float(_get_step_reward_misc(root_steps[-1]).get("reward/success", root_success)) + + for trajectory in trajectories.values(): + _set_trajectory_reward(trajectory, root_success) + steps = _get_steps(trajectory) + if steps: + _get_step_reward_misc(steps[-1])["reward/success"] = root_success + for step in steps: + reward_misc = _get_step_reward_misc(step) + launched = float(reward_misc.get("reward/subagent_launched", 0.0)) + if launched > 0: + reward_misc["reward/subagent_succeeded"] = launched * root_success + + return trajectory_collection diff --git a/plugins/appworld/platoon/appworld/env.py b/plugins/appworld/platoon/appworld/env.py index c4e7ef9..85b588b 100644 --- a/plugins/appworld/platoon/appworld/env.py +++ b/plugins/appworld/platoon/appworld/env.py @@ -488,10 +488,12 @@ def __init__( task: Task, code_executor: AppWorldCodeExecutor | None = None, timeout_seconds: int | None = DEFAULT_APPWORLD_TIMEOUT_SECONDS, + skip_subagent_reward_computation: bool = False, **kwargs, ): if code_executor is None: code_executor = AppWorldCodeExecutor(task, timeout_seconds=timeout_seconds) + self._skip_subagent_reward_computation = skip_subagent_reward_computation super().__init__(task, code_executor, **kwargs) @@ -506,6 +508,11 @@ async def reset(self) -> CodeActObservation: async def evaluate(self) -> tuple[float, dict]: score, reward_misc = 0., {} + is_subagent_task = isinstance(self._task, SubTask) and bool(self._task.parent_tasks) + if self._skip_subagent_reward_computation and is_subagent_task: + reward_misc["reason"] = "Skipped subagent reward computation" + reward_misc["reward/success"] = 0.0 + return 0.0, reward_misc if self._state.finished: if isinstance(self._task, SubTask) and self._task.parent_tasks: @@ -541,6 +548,7 @@ async def fork(self, task: Task) -> AppWorldEnv: return type(self)( task, code_executor=code_executor, + skip_subagent_reward_computation=self._skip_subagent_reward_computation, ) @@ -552,11 +560,18 @@ def __init__( task: Task, code_executor: AppWorldRecursiveCodeExecutor | None = None, timeout_seconds: int | None = DEFAULT_APPWORLD_TIMEOUT_SECONDS, + skip_subagent_reward_computation: bool = False, **kwargs, ): if code_executor is None: code_executor = AppWorldRecursiveCodeExecutor(task, timeout_seconds=timeout_seconds) - super().__init__(task, code_executor, **kwargs) + super().__init__( + task, + code_executor, + timeout_seconds=timeout_seconds, + skip_subagent_reward_computation=skip_subagent_reward_computation, + **kwargs, + ) @property def code_executor(self) -> AppWorldRecursiveCodeExecutor: @@ -643,6 +658,7 @@ def __init__( code_executor: AppWorldDepthAwareCodeExecutor | None = None, subagent_max_steps: int = 25, timeout_seconds: int | None = DEFAULT_APPWORLD_TIMEOUT_SECONDS, + skip_subagent_reward_computation: bool = False, **kwargs, ): self._subagent_max_steps = subagent_max_steps @@ -652,7 +668,13 @@ def __init__( subagent_max_steps=subagent_max_steps, timeout_seconds=timeout_seconds, ) - super().__init__(task, code_executor, **kwargs) + super().__init__( + task, + code_executor, + timeout_seconds=timeout_seconds, + skip_subagent_reward_computation=skip_subagent_reward_computation, + **kwargs, + ) async def fork(self, task: Task) -> "AppWorldDepthAwareEnv": code_executor = await self.code_executor.fork(task) @@ -660,5 +682,6 @@ async def fork(self, task: Task) -> "AppWorldDepthAwareEnv": task, code_executor=code_executor, subagent_max_steps=self._subagent_max_steps, + skip_subagent_reward_computation=self._skip_subagent_reward_computation, ) \ No newline at end of file diff --git a/plugins/appworld/platoon/appworld/rollout.py b/plugins/appworld/platoon/appworld/rollout.py index 08db8e0..4b283cf 100644 --- a/plugins/appworld/platoon/appworld/rollout.py +++ b/plugins/appworld/platoon/appworld/rollout.py @@ -8,6 +8,7 @@ from platoon.episode.loop import run_episode from platoon.episode.trajectory import DepthAwareStepBudgetTracker, TrajectoryCollection from platoon.utils.llm_client import LiteLLMClient +from platoon.utils.subagent_rewards import propogate_root_success from platoon.visualization.event_sinks import JsonlFileSink from .agent import AppWorldAgent, AppWorldDepthAwareAgent, AppWorldRecursiveAgent @@ -88,7 +89,11 @@ async def run_recursive_rollout(task: Task, config: RolloutConfig) -> dict | Tra base_url=config.model_endpoint, api_key=config.model_api_key, ) - env = AppWorldRecursiveEnv(task, timeout_seconds=config.step_timeout) + env = AppWorldRecursiveEnv( + task, + timeout_seconds=config.step_timeout, + skip_subagent_reward_computation=config.skip_subagent_reward_computation, + ) agent = AppWorldRecursiveAgent( llm_client=llm_client, inference_params=config.inference_params, @@ -123,10 +128,14 @@ async def run_recursive_rollout(task: Task, config: RolloutConfig) -> dict | Tra ) raise + result: dict | TrajectoryCollection if config.return_dict: - return current_trajectory_collection.get().to_dict() + result = current_trajectory_collection.get().to_dict() else: - return current_trajectory_collection.get() + result = current_trajectory_collection.get() + if config.propogate_root_success: + result = propogate_root_success(result) + return result except Exception as e: if config.verbose: @@ -171,6 +180,7 @@ async def run_depth_aware_rollout( task, subagent_max_steps=per_subagent_max_steps, timeout_seconds=config.step_timeout, + skip_subagent_reward_computation=config.skip_subagent_reward_computation, ) agent = AppWorldDepthAwareAgent( llm_client=llm_client, @@ -209,10 +219,14 @@ async def run_depth_aware_rollout( ) raise + result: dict | TrajectoryCollection if config.return_dict: - return current_trajectory_collection.get().to_dict() + result = current_trajectory_collection.get().to_dict() else: - return current_trajectory_collection.get() + result = current_trajectory_collection.get() + if config.propogate_root_success: + result = propogate_root_success(result) + return result except Exception as e: if config.verbose: diff --git a/plugins/deepdive/platoon/deepdive/env.py b/plugins/deepdive/platoon/deepdive/env.py index 2cbb1af..6297b9c 100644 --- a/plugins/deepdive/platoon/deepdive/env.py +++ b/plugins/deepdive/platoon/deepdive/env.py @@ -223,9 +223,10 @@ async def fork(self, task: Task) -> DeepDiveRecursiveCodeExecutor: ) class DeepDiveEnv(CodeActEnv): - def __init__(self, task: Task): + def __init__(self, task: Task, skip_subagent_reward_computation: bool = False): #task.fork_strategy = "task" super().__init__(task, DeepDiveCodeExecutor(task)) + self._skip_subagent_reward_computation = skip_subagent_reward_computation def _parse_rubric_response(self, response: str) -> dict: """Parse the LLM response to extract structured data. @@ -282,6 +283,12 @@ def parse_rubric_response(self, response: str) -> tuple[float, str]: async def evaluate(self) -> tuple[float, dict]: score, reward_misc = 0., {} + is_subagent_task = "deepdive" not in (self._task.id or "") + if self._skip_subagent_reward_computation and is_subagent_task: + reward_misc["reason"] = "Skipped subagent reward computation" + reward_misc["success"] = False + reward_misc["reward/success"] = 0.0 + return 0.0, reward_misc final_message = finish_message.get() if final_message is None and self._state.history: @@ -347,8 +354,9 @@ def __init__( self, task: Task, subagent_max_steps: int | None = 25, + skip_subagent_reward_computation: bool = False, ): - super().__init__(task) + super().__init__(task, skip_subagent_reward_computation=skip_subagent_reward_computation) self._code_executor = DeepDiveRecursiveCodeExecutor( task=task, subagent_max_steps=subagent_max_steps @@ -372,4 +380,5 @@ async def fork(self, task: Task) -> DeepDiveRecursiveEnv: return DeepDiveRecursiveEnv( task=task, subagent_max_steps=self.subagent_max_steps, + skip_subagent_reward_computation=self._skip_subagent_reward_computation, ) diff --git a/plugins/deepdive/platoon/deepdive/rollout.py b/plugins/deepdive/platoon/deepdive/rollout.py index 2e4fbf5..36c9985 100644 --- a/plugins/deepdive/platoon/deepdive/rollout.py +++ b/plugins/deepdive/platoon/deepdive/rollout.py @@ -12,6 +12,7 @@ from platoon.episode.loop import run_episode from platoon.episode.trajectory import DepthAwareStepBudgetTracker, TrajectoryCollection from platoon.utils.llm_client import LiteLLMClient +from platoon.utils.subagent_rewards import propogate_root_success from platoon.visualization.event_sinks import JsonlFileSink from .agent import DeepDiveAgent, DeepDiveRecursiveAgent @@ -91,7 +92,10 @@ async def run_recursive_rollout(task: Task, config: RolloutConfig) -> dict | Tra base_url=config.model_endpoint, api_key=config.model_api_key, ) - env = DeepDiveRecursiveEnv(task) + env = DeepDiveRecursiveEnv( + task, + skip_subagent_reward_computation=config.skip_subagent_reward_computation, + ) agent = DeepDiveRecursiveAgent( llm_client=llm_client, inference_params=config.inference_params, @@ -133,9 +137,14 @@ async def run_recursive_rollout(task: Task, config: RolloutConfig) -> dict | Tra ) raise + result: dict | TrajectoryCollection if config.return_dict: - return current_trajectory_collection.get().to_dict() - return current_trajectory_collection.get() + result = current_trajectory_collection.get().to_dict() + else: + result = current_trajectory_collection.get() + if config.propogate_root_success: + result = propogate_root_success(result) + return result except Exception as e: if config.verbose: print(f"Error running rollout for task {task.id}: {e}") diff --git a/plugins/oolong/platoon/oolong/env.py b/plugins/oolong/platoon/oolong/env.py index 2c3804d..be0a90a 100644 --- a/plugins/oolong/platoon/oolong/env.py +++ b/plugins/oolong/platoon/oolong/env.py @@ -140,11 +140,12 @@ async def fork(self, task: Task) -> OolongRecursiveCodeExecutor: class OolongEnv(CodeActEnv): - def __init__(self, task: Task): + def __init__(self, task: Task, skip_subagent_reward_computation: bool = False): task.fork_strategy = "task" code_executor = OolongCodeExecutor(task) # Remove context task misc to avoid massive context logging in events self.context = task.misc.pop('context') + self._skip_subagent_reward_computation = skip_subagent_reward_computation super().__init__(task, code_executor) def _parse_rubric_response(self, response: str) -> dict: @@ -204,6 +205,11 @@ async def evaluate(self) -> tuple[float, dict]: score = 0.0 reward_misc = {} + is_subagent_task = "oolong" not in (self._task.id or "") + if self._skip_subagent_reward_computation and is_subagent_task: + reward_misc["reason"] = "Skipped subagent reward computation" + reward_misc["reward/success"] = 0.0 + return 0.0, reward_misc if self._state.finished: if not "oolong" in self._task.id: @@ -287,12 +293,13 @@ async def evaluate(self) -> tuple[float, dict]: class OolongRecursiveEnv(OolongEnv): def __init__(self, task: Task, subagent_max_steps: int | None = 25, + skip_subagent_reward_computation: bool = False, ): code_executor = OolongRecursiveCodeExecutor( task, subagent_max_steps=subagent_max_steps ) - super().__init__(task) + super().__init__(task, skip_subagent_reward_computation=skip_subagent_reward_computation) self._code_executor = code_executor self.subagent_max_steps = subagent_max_steps @@ -315,6 +322,7 @@ async def fork(self, task: Task) -> OolongRecursiveEnv: return OolongRecursiveEnv( task, subagent_max_steps=self.subagent_max_steps, + skip_subagent_reward_computation=self._skip_subagent_reward_computation, ) diff --git a/plugins/oolong/platoon/oolong/rollout.py b/plugins/oolong/platoon/oolong/rollout.py index fd9447f..96129fa 100644 --- a/plugins/oolong/platoon/oolong/rollout.py +++ b/plugins/oolong/platoon/oolong/rollout.py @@ -3,6 +3,7 @@ from .agent import OolongAgent, OolongRecursiveAgent from platoon.config_defs import RolloutConfig from platoon.utils.llm_client import LiteLLMClient +from platoon.utils.subagent_rewards import propogate_root_success from platoon.episode.context import current_trajectory_collection, budget_tracker from platoon.episode.loop import run_episode from platoon.episode.trajectory import TrajectoryCollection, DepthAwareStepBudgetTracker @@ -109,7 +110,10 @@ async def run_recursive_rollout(task: Task, config: RolloutConfig) -> dict | Tra # Disable Qwen3 reasoning/thinking mode for faster inference # default_extra_body={"chat_template_kwargs": {"enable_thinking": False}}, ) - env = OolongRecursiveEnv(task) + env = OolongRecursiveEnv( + task, + skip_subagent_reward_computation=config.skip_subagent_reward_computation, + ) agent = OolongRecursiveAgent( llm_client=llm_client, inference_params=config.inference_params, @@ -150,10 +154,14 @@ async def run_recursive_rollout(task: Task, config: RolloutConfig) -> dict | Tra logger.warning(f"Process {os.getpid()}: Task cancellation did not complete in 5s for {task.id}, abandoning") raise + result: dict | TrajectoryCollection if config.return_dict: - return current_trajectory_collection.get().to_dict() + result = current_trajectory_collection.get().to_dict() else: - return current_trajectory_collection.get() + result = current_trajectory_collection.get() + if config.propogate_root_success: + result = propogate_root_success(result) + return result except Exception as e: if config.verbose: diff --git a/plugins/textcraft/platoon/textcraft/configs/areal/textcraft_synth_ctx40000_depth_aware_medium_areal.yaml b/plugins/textcraft/platoon/textcraft/configs/areal/textcraft_synth_ctx40000_depth_aware_medium_areal.yaml index b8fc811..2095fac 100644 --- a/plugins/textcraft/platoon/textcraft/configs/areal/textcraft_synth_ctx40000_depth_aware_medium_areal.yaml +++ b/plugins/textcraft/platoon/textcraft/configs/areal/textcraft_synth_ctx40000_depth_aware_medium_areal.yaml @@ -1,5 +1,5 @@ experiment_name: recursive-agents -trial_name: textcraft-synth-single-target-areal-ctx40000-cispo-4b-depth-aware-medium-trial-3 +trial_name: textcraft-synth-single-target-areal-ctx40000-cispo-4b-depth-aware-root-propogated-medium-trial-0 seed: 343 total_train_epochs: 10 @@ -42,11 +42,13 @@ workflow_config: rollout_config: model_name: ${actor.path} max_steps: 25 - output_dir: /mnt/efs/tmp/areal/experiments/textcraft-synth-single-target-areal-ctx40000-cispo-4b-depth-aware-medium-trial-3 + output_dir: /mnt/efs/tmp/areal/experiments/textcraft-synth-single-target-areal-ctx40000-cispo-4b-depth-aware-root-propogated-medium-trial-0 verbose: True train: true timeout: 7200 step_timeout: 7200 + propogate_root_success: true + skip_subagent_reward_computation: false group_size: 8 leave_one_out_baseline: True # Use leave-one-out baseline for advantage centering depth_level_weighting: True # Weight trajectories inversely by depth-level frequency diff --git a/plugins/textcraft/platoon/textcraft/env.py b/plugins/textcraft/platoon/textcraft/env.py index 5c6c9c8..9168a59 100644 --- a/plugins/textcraft/platoon/textcraft/env.py +++ b/plugins/textcraft/platoon/textcraft/env.py @@ -15,7 +15,7 @@ IPythonCodeExecutor, safe_asyncio, ) -from platoon.episode.context import finish_message +from platoon.episode.context import current_trajectory, finish_message from .recipe_loader import RecipeDatabase @@ -507,6 +507,7 @@ def __init__( initial_inventory: Optional[Dict[str, int]] = None, _share_inventory: bool = False, use_synth: bool = False, + skip_subagent_reward_computation: bool = False, ): """Initialize the TextCraft environment. @@ -540,6 +541,7 @@ def __init__( self._recipes_dir = recipes_dir self._recipe_db = recipe_db self._use_synth = use_synth + self._skip_subagent_reward_computation = skip_subagent_reward_computation # Always copy initial inventory for bookkeeping (to compare against for evaluation) # This is separate from whether the working inventory is shared with parent self._initial_inventory = initial_inventory.copy() if initial_inventory else {} @@ -548,6 +550,11 @@ async def evaluate(self) -> Tuple[float, dict]: """Evaluate if the task goal is achieved.""" score = 0.0 reward_misc = {} + is_subagent_task = "textcraft" not in (self._task.id or "") + if self._skip_subagent_reward_computation and is_subagent_task: + reward_misc["success"] = False + reward_misc["reward/success"] = 0.0 + return 0.0, reward_misc # Only give reward if agent explicitly called finish() if self._state.finished: @@ -631,6 +638,7 @@ async def fork(self, task: Task) -> "TextCraftEnv": initial_inventory=self._code_executor.inventory, _share_inventory=True, # Share inventory by reference for subagent propagation use_synth=self._use_synth, + skip_subagent_reward_computation=self._skip_subagent_reward_computation, ) return forked_env @@ -679,6 +687,7 @@ def __init__( initial_inventory: Optional[Dict[str, int]] = None, _share_inventory: bool = False, use_synth: bool = False, + skip_subagent_reward_computation: bool = False, ): super().__init__( task, @@ -687,6 +696,7 @@ def __init__( initial_inventory=initial_inventory, _share_inventory=_share_inventory, use_synth=use_synth, + skip_subagent_reward_computation=skip_subagent_reward_computation, ) # Use self._recipes_dir and self._initial_inventory which were set by parent class # (parent applies defaults: recipes_dir from __file__, inventory from task.misc) @@ -738,6 +748,7 @@ async def fork(self, task: Task) -> "TextCraftRecursiveEnv": initial_inventory=self._code_executor.inventory, _share_inventory=True, use_synth=self._use_synth, + skip_subagent_reward_computation=self._skip_subagent_reward_computation, ) return forked_env @@ -937,6 +948,7 @@ def __init__( initial_inventory: Optional[Dict[str, int]] = None, _share_inventory: bool = False, use_synth: bool = False, + skip_subagent_reward_computation: bool = False, ): # Let the parent chain set up defaults (recipes_dir, initial_inventory, etc.) super().__init__( @@ -946,6 +958,7 @@ def __init__( initial_inventory=initial_inventory, _share_inventory=_share_inventory, use_synth=use_synth, + skip_subagent_reward_computation=skip_subagent_reward_computation, ) self._subagent_max_steps = subagent_max_steps @@ -979,6 +992,7 @@ async def fork(self, task: Task) -> "TextCraftDepthAwareEnv": initial_inventory=self._code_executor.inventory, _share_inventory=True, use_synth=self._use_synth, + skip_subagent_reward_computation=self._skip_subagent_reward_computation, ) diff --git a/plugins/textcraft/platoon/textcraft/rollout.py b/plugins/textcraft/platoon/textcraft/rollout.py index eef4cc8..8f50c4e 100644 --- a/plugins/textcraft/platoon/textcraft/rollout.py +++ b/plugins/textcraft/platoon/textcraft/rollout.py @@ -8,6 +8,7 @@ from platoon.episode.loop import run_episode from platoon.episode.trajectory import TrajectoryCollection from platoon.utils.llm_client import LLMClient +from platoon.utils.subagent_rewards import propogate_root_success from platoon.visualization.event_sinks import JsonlFileSink from .agent import TextCraftAgent, TextCraftRecursiveAgent @@ -86,7 +87,10 @@ async def run_recursive_rollout(task: Task, config: RolloutConfig) -> dict | Tra # Disable Qwen3 reasoning/thinking mode for faster inference default_extra_body={"chat_template_kwargs": {"enable_thinking": False}}, ) - env = TextCraftRecursiveEnv(task) + env = TextCraftRecursiveEnv( + task, + skip_subagent_reward_computation=config.skip_subagent_reward_computation, + ) agent = TextCraftRecursiveAgent( llm_client=llm_client, inference_params=config.inference_params, @@ -120,10 +124,14 @@ async def run_recursive_rollout(task: Task, config: RolloutConfig) -> dict | Tra ) raise + result: dict | TrajectoryCollection if config.return_dict: - return current_trajectory_collection.get().to_dict() + result = current_trajectory_collection.get().to_dict() else: - return current_trajectory_collection.get() + result = current_trajectory_collection.get() + if config.propogate_root_success: + result = propogate_root_success(result) + return result except Exception as e: if config.verbose: diff --git a/plugins/textcraft/platoon/textcraft/synth_rollout.py b/plugins/textcraft/platoon/textcraft/synth_rollout.py index 294c4af..9110da7 100644 --- a/plugins/textcraft/platoon/textcraft/synth_rollout.py +++ b/plugins/textcraft/platoon/textcraft/synth_rollout.py @@ -10,6 +10,7 @@ from platoon.episode.loop import run_episode from platoon.episode.trajectory import DepthAwareStepBudgetTracker, TrajectoryCollection from platoon.utils.llm_client import LiteLLMClient +from platoon.utils.subagent_rewards import propogate_root_success from platoon.visualization.event_sinks import JsonlFileSink from .agent import TextCraftAgent, TextCraftDepthAwareAgent, TextCraftRecursiveAgent @@ -108,6 +109,7 @@ async def run_synth_depth_aware_rollout( env = create_synth_depth_aware_env( task, subagent_max_steps=per_agent_max_steps, + skip_subagent_reward_computation=config.skip_subagent_reward_computation, ) agent = TextCraftDepthAwareAgent( llm_client=llm_client, @@ -145,10 +147,14 @@ async def run_synth_depth_aware_rollout( ) raise + result: dict | TrajectoryCollection if config.return_dict: - return current_trajectory_collection.get().to_dict() + result = current_trajectory_collection.get().to_dict() else: - return current_trajectory_collection.get() + result = current_trajectory_collection.get() + if config.propogate_root_success: + result = propogate_root_success(result) + return result except Exception as e: if config.verbose: @@ -171,7 +177,10 @@ async def run_synth_recursive_rollout(task: Task, config: RolloutConfig) -> dict # Disable Qwen3 reasoning/thinking mode for faster inference # default_extra_body={"chat_template_kwargs": {"enable_thinking": False}}, ) - env = create_synth_recursive_env(task) + env = create_synth_recursive_env( + task, + skip_subagent_reward_computation=config.skip_subagent_reward_computation, + ) agent = TextCraftRecursiveAgent( llm_client=llm_client, inference_params=config.inference_params, @@ -205,10 +214,14 @@ async def run_synth_recursive_rollout(task: Task, config: RolloutConfig) -> dict ) raise + result: dict | TrajectoryCollection if config.return_dict: - return current_trajectory_collection.get().to_dict() + result = current_trajectory_collection.get().to_dict() else: - return current_trajectory_collection.get() + result = current_trajectory_collection.get() + if config.propogate_root_success: + result = propogate_root_success(result) + return result except Exception as e: if config.verbose: diff --git a/plugins/textcraft/uv.lock b/plugins/textcraft/uv.lock index 78a7ac7..8c23ef8 100644 --- a/plugins/textcraft/uv.lock +++ b/plugins/textcraft/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 2 +revision = 3 requires-python = "==3.12.*" resolution-markers = [ "sys_platform == 'linux' and extra != 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker'", @@ -48,7 +48,7 @@ wheels = [ [[package]] name = "ai-rubric" -version = "0.2.2" +version = "0.2.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jinja2" }, @@ -56,9 +56,9 @@ dependencies = [ { name = "networkx" }, { name = "plotly" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0e/e9/d131e3932fd01ec0a820990b983c31860480d47093078a093170aa9dfdbb/ai_rubric-0.2.2.tar.gz", hash = "sha256:ce8aaa222e84ee6495d37b3dfb94174b257f08c3e5ec13b88f816dd6afbcb99e", size = 694896, upload-time = "2025-09-07T04:17:36.265Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/3b/e8fd1ff134c396b4d6e4449f72970ccd6ddc4db01a13b11ecc5ba165e968/ai_rubric-0.2.4.tar.gz", hash = "sha256:2ccf2db3d87a2cc234e0dfa8cbcac45aabb79f359d30c648b0900e84792e9e60", size = 731238, upload-time = "2026-03-09T23:59:07.895Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cd/dc/9d6b7bd939facd39035aea07b28ebf3510d89a5ea9f25b00f9a18a56d6fd/ai_rubric-0.2.2-py3-none-any.whl", hash = "sha256:55f3c8916b6468cca3dd7fde6f5e8c6525966c0e759de5f5c593acbc7d07c544", size = 38770, upload-time = "2025-09-07T04:17:35.16Z" }, + { url = "https://files.pythonhosted.org/packages/bd/4b/26ac0c1ede93b0e345debbf517d4ea8ac1b8993f33ce88583b5e8624bd8d/ai_rubric-0.2.4-py3-none-any.whl", hash = "sha256:343ec6c29fdc538aa312719eb0a76b611e21d3a633332d4f7cc1b836932946d3", size = 39554, upload-time = "2026-03-09T23:59:06.634Z" }, ] [[package]] @@ -725,7 +725,7 @@ name = "cffi" version = "2.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pycparser", marker = "implementation_name != 'PyPy'" }, + { name = "pycparser", marker = "implementation_name != 'PyPy' or (extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } wheels = [ @@ -1017,8 +1017,8 @@ name = "cupy-cuda12x" version = "13.6.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "fastrlock" }, - { name = "numpy" }, + { name = "fastrlock", marker = "sys_platform != 'darwin'" }, + { name = "numpy", marker = "sys_platform != 'darwin'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/12/c5/7e7fc4816d0de0154e5d9053242c3a08a0ca8b43ee656a6f7b3b95055a7b/cupy_cuda12x-13.6.0-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:a6970ceefe40f9acbede41d7fe17416bd277b1bd2093adcde457b23b578c5a59", size = 127334633, upload-time = "2025-08-18T08:24:43.065Z" }, @@ -1791,7 +1791,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "filelock" }, { name = "fsspec" }, - { name = "hf-xet", marker = "platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64'" }, + { name = "hf-xet", marker = "platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64' or (extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker')" }, { name = "packaging" }, { name = "pyyaml" }, { name = "requests" }, @@ -1943,7 +1943,7 @@ name = "ipykernel" version = "7.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "appnope", marker = "sys_platform == 'darwin'" }, + { name = "appnope", marker = "sys_platform == 'darwin' or (extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker')" }, { name = "comm" }, { name = "debugpy" }, { name = "ipython" }, @@ -1967,12 +1967,12 @@ name = "ipython" version = "9.7.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "colorama", marker = "sys_platform == 'win32' or (extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker')" }, { name = "decorator" }, { name = "ipython-pygments-lexers" }, { name = "jedi" }, { name = "matplotlib-inline" }, - { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "pexpect", marker = "(sys_platform != 'emscripten' and sys_platform != 'win32') or (sys_platform == 'emscripten' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker') or (sys_platform == 'win32' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker')" }, { name = "prompt-toolkit" }, { name = "pygments" }, { name = "stack-data" }, @@ -2262,7 +2262,7 @@ dependencies = [ { name = "nbformat" }, { name = "packaging" }, { name = "prometheus-client" }, - { name = "pywinpty", marker = "os_name == 'nt' and sys_platform != 'linux'" }, + { name = "pywinpty", marker = "(os_name == 'nt' and sys_platform != 'darwin' and sys_platform != 'linux') or (os_name == 'nt' and sys_platform == 'darwin' and extra != 'extra-17-platoon-textcraft-areal') or (os_name != 'nt' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker') or (sys_platform == 'darwin' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker') or (sys_platform == 'linux' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker')" }, { name = "pyzmq" }, { name = "send2trash" }, { name = "terminado" }, @@ -2280,7 +2280,7 @@ name = "jupyter-server-terminals" version = "0.5.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pywinpty", marker = "os_name == 'nt' and sys_platform != 'linux'" }, + { name = "pywinpty", marker = "(os_name == 'nt' and sys_platform != 'darwin' and sys_platform != 'linux') or (os_name == 'nt' and sys_platform == 'darwin' and extra != 'extra-17-platoon-textcraft-areal') or (os_name != 'nt' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker') or (sys_platform == 'darwin' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker') or (sys_platform == 'linux' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker')" }, { name = "terminado" }, ] sdist = { url = "https://files.pythonhosted.org/packages/fc/d5/562469734f476159e99a55426d697cbf8e7eb5efe89fb0e0b4f83a3d3459/jupyter_server_terminals-0.5.3.tar.gz", hash = "sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269", size = 31430, upload-time = "2024-03-12T14:37:03.049Z" } @@ -2680,12 +2680,12 @@ name = "mlx-lm" version = "0.28.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "jinja2", marker = "sys_platform != 'linux'" }, + { name = "jinja2", marker = "sys_platform == 'darwin'" }, { name = "mlx", marker = "sys_platform == 'darwin'" }, - { name = "numpy", marker = "sys_platform != 'linux'" }, - { name = "protobuf", marker = "sys_platform != 'linux'" }, - { name = "pyyaml", marker = "sys_platform != 'linux'" }, - { name = "transformers", version = "4.56.1", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform != 'linux'" }, + { name = "numpy", marker = "sys_platform == 'darwin'" }, + { name = "protobuf", marker = "sys_platform == 'darwin'" }, + { name = "pyyaml", marker = "sys_platform == 'darwin'" }, + { name = "transformers", version = "4.56.1", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'darwin'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/51/f6/15e002d52c28d8c544ec3aaf9053677468333e6ef0e76ea68579fd77b76d/mlx_lm-0.28.3.tar.gz", hash = "sha256:75df2b925d343ebaf50b63008dede4fe98cd3b02b1b24b7da71ebeb198d674f0", size = 214455, upload-time = "2025-10-17T21:44:33.921Z" } wheels = [ @@ -3064,7 +3064,7 @@ name = "nvidia-cudnn-cu12" version = "9.10.2.21" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-cublas-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cublas-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (platform_machine == 'aarch64' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker') or (sys_platform == 'linux' and extra != 'extra-17-platoon-textcraft-areal') or (sys_platform != 'linux' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker')" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/fa/41/e79269ce215c857c935fd86bcfe91a451a584dfc27f1e068f568b9ad1ab7/nvidia_cudnn_cu12-9.10.2.21-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:c9132cc3f8958447b4910a1720036d9eff5928cc3179b0a51fb6d167c6cc87d8", size = 705026878, upload-time = "2025-06-06T21:52:51.348Z" }, @@ -3087,7 +3087,7 @@ name = "nvidia-cufft-cu12" version = "11.3.3.83" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-nvjitlink-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-nvjitlink-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (platform_machine == 'aarch64' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker') or (sys_platform == 'linux' and extra != 'extra-17-platoon-textcraft-areal') or (sys_platform != 'linux' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker')" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/60/bc/7771846d3a0272026c416fbb7e5f4c1f146d6d80704534d0b187dd6f4800/nvidia_cufft_cu12-11.3.3.83-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:848ef7224d6305cdb2a4df928759dca7b1201874787083b6e7550dd6765ce69a", size = 193109211, upload-time = "2025-03-07T01:44:56.873Z" }, @@ -3119,9 +3119,9 @@ name = "nvidia-cusolver-cu12" version = "11.7.3.90" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-cublas-cu12", marker = "sys_platform == 'linux'" }, - { name = "nvidia-cusparse-cu12", marker = "sys_platform == 'linux'" }, - { name = "nvidia-nvjitlink-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cublas-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (platform_machine == 'aarch64' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker') or (sys_platform == 'linux' and extra != 'extra-17-platoon-textcraft-areal') or (sys_platform != 'linux' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker')" }, + { name = "nvidia-cusparse-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (platform_machine == 'aarch64' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker') or (sys_platform == 'linux' and extra != 'extra-17-platoon-textcraft-areal') or (sys_platform != 'linux' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker')" }, + { name = "nvidia-nvjitlink-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (platform_machine == 'aarch64' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker') or (sys_platform == 'linux' and extra != 'extra-17-platoon-textcraft-areal') or (sys_platform != 'linux' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker')" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/c8/32/f7cd6ce8a7690544d084ea21c26e910a97e077c9b7f07bf5de623ee19981/nvidia_cusolver_cu12-11.7.3.90-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:db9ed69dbef9715071232caa9b69c52ac7de3a95773c2db65bdba85916e4e5c0", size = 267229841, upload-time = "2025-03-07T01:46:54.356Z" }, @@ -3134,7 +3134,7 @@ name = "nvidia-cusparse-cu12" version = "12.5.8.93" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-nvjitlink-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-nvjitlink-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (platform_machine == 'aarch64' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker') or (sys_platform == 'linux' and extra != 'extra-17-platoon-textcraft-areal') or (sys_platform != 'linux' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker')" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/bc/f7/cd777c4109681367721b00a106f491e0d0d15cfa1fd59672ce580ce42a97/nvidia_cusparse_cu12-12.5.8.93-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9b6c161cb130be1a07a27ea6923df8141f3c295852f4b260c65f18f3e0a091dc", size = 288117129, upload-time = "2025-03-07T01:47:40.407Z" }, @@ -3609,7 +3609,7 @@ wandb = [ [package.metadata] requires-dist = [ - { name = "ai-rubric", specifier = ">=0.2.2" }, + { name = "ai-rubric", specifier = ">=0.2.4" }, { name = "areal", extras = ["cuda"], marker = "extra == 'areal'", git = "https://github.com/inclusionAI/AReaL.git?rev=35b57e2d2743f7158894239acda8b71f7226b955" }, { name = "datasets" }, { name = "ipython", specifier = ">=9.4.0" }, @@ -4250,7 +4250,7 @@ name = "pyzmq" version = "27.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cffi", marker = "implementation_name == 'pypy'" }, + { name = "cffi", marker = "implementation_name == 'pypy' or (extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/04/0b/3c9baedbdf613ecaa7aa07027780b8867f57b6293b6ee50de316c9f3222b/pyzmq-27.1.0.tar.gz", hash = "sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540", size = 281750, upload-time = "2025-09-08T23:10:18.157Z" } wheels = [ @@ -5027,8 +5027,8 @@ name = "terminado" version = "0.18.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "ptyprocess", marker = "os_name != 'nt'" }, - { name = "pywinpty", marker = "os_name == 'nt' and sys_platform != 'linux'" }, + { name = "ptyprocess", marker = "os_name != 'nt' or (extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker')" }, + { name = "pywinpty", marker = "(os_name == 'nt' and sys_platform != 'darwin' and sys_platform != 'linux') or (os_name == 'nt' and sys_platform == 'darwin' and extra != 'extra-17-platoon-textcraft-areal') or (os_name != 'nt' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker') or (sys_platform == 'darwin' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker') or (sys_platform == 'linux' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker')" }, { name = "tornado" }, ] sdist = { url = "https://files.pythonhosted.org/packages/8a/11/965c6fd8e5cc254f1fe142d547387da17a8ebfd75a3455f637c663fb38a0/terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e", size = 32701, upload-time = "2024-03-12T14:34:39.026Z" } @@ -5216,23 +5216,23 @@ dependencies = [ { name = "fsspec" }, { name = "jinja2" }, { name = "networkx" }, - { name = "nvidia-cublas-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cuda-cupti-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cuda-nvrtc-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cuda-runtime-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cudnn-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cufft-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cufile-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-curand-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cusolver-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cusparse-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cusparselt-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-nccl-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-nvjitlink-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-nvtx-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cublas-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker') or (sys_platform != 'linux' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker')" }, + { name = "nvidia-cuda-cupti-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker') or (sys_platform != 'linux' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker')" }, + { name = "nvidia-cuda-nvrtc-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker') or (sys_platform != 'linux' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker')" }, + { name = "nvidia-cuda-runtime-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker') or (sys_platform != 'linux' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker')" }, + { name = "nvidia-cudnn-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker') or (sys_platform != 'linux' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker')" }, + { name = "nvidia-cufft-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker') or (sys_platform != 'linux' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker')" }, + { name = "nvidia-cufile-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker') or (sys_platform != 'linux' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker')" }, + { name = "nvidia-curand-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker') or (sys_platform != 'linux' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker')" }, + { name = "nvidia-cusolver-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker') or (sys_platform != 'linux' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker')" }, + { name = "nvidia-cusparse-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker') or (sys_platform != 'linux' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker')" }, + { name = "nvidia-cusparselt-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker') or (sys_platform != 'linux' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker')" }, + { name = "nvidia-nccl-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker') or (sys_platform != 'linux' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker')" }, + { name = "nvidia-nvjitlink-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker') or (sys_platform != 'linux' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker')" }, + { name = "nvidia-nvtx-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker') or (sys_platform != 'linux' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker')" }, { name = "setuptools" }, { name = "sympy" }, - { name = "triton", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "triton", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker') or (sys_platform != 'linux' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker')" }, { name = "typing-extensions" }, ] wheels = [ @@ -5327,7 +5327,7 @@ name = "tqdm" version = "4.67.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "colorama", marker = "sys_platform == 'win32' or (extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload-time = "2024-11-24T20:12:22.481Z" } wheels = [ @@ -5400,7 +5400,7 @@ name = "triton" version = "3.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "setuptools", marker = "sys_platform == 'linux'" }, + { name = "setuptools", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (platform_machine == 'aarch64' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker') or (sys_platform == 'linux' and extra != 'extra-17-platoon-textcraft-areal') or (sys_platform != 'linux' and extra == 'extra-17-platoon-textcraft-areal' and extra == 'extra-17-platoon-textcraft-tinker')" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/d0/66/b1eb52839f563623d185f0927eb3530ee4d5ffe9d377cdaf5346b306689e/triton-3.4.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:31c1d84a5c0ec2c0f8e8a072d7fd150cab84a9c239eaddc6706c081bfae4eb04", size = 155560068, upload-time = "2025-07-30T19:58:37.081Z" }, @@ -5821,8 +5821,8 @@ name = "xformers" version = "0.0.32.post1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", marker = "sys_platform == 'linux'" }, - { name = "torch", marker = "sys_platform == 'linux'" }, + { name = "numpy", marker = "platform_machine != 'aarch64' and sys_platform == 'linux'" }, + { name = "torch", marker = "platform_machine != 'aarch64' and sys_platform == 'linux'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/6f/33/3b9c4d3d5b2da453d27de891df4ad653ac5795324961aa3a5c15b0353fe6/xformers-0.0.32.post1.tar.gz", hash = "sha256:1de84a45c497c8d92326986508d81f4b0a8c6be4d3d62a29b8ad6048a6ab51e1", size = 12106196, upload-time = "2025-08-14T18:07:45.486Z" } wheels = [