Executes the node optimization based on the given method. Note: If an error occurs during optimization, an exception is raised instead of returning, because the upper layer will handle the error and return the original unoptimized node. Args: node (Node
(node: Node, optim_method_str: str, logger)
| 238 | |
| 239 | @staticmethod |
| 240 | def do_node_optim(node: Node, optim_method_str: str, logger): |
| 241 | """ |
| 242 | Executes the node optimization based on the given method. |
| 243 | |
| 244 | Note: If an error occurs during optimization, an exception is raised instead of returning, |
| 245 | because the upper layer will handle the error and return the original unoptimized node. |
| 246 | |
| 247 | Args: |
| 248 | node (Node): The node to be optimized. |
| 249 | optim_method_str (str): The optimization method in JSON string format. |
| 250 | logger: The logger for logging information and errors. |
| 251 | |
| 252 | Returns: |
| 253 | tuple: The optimized Node object, a boolean indicating if the update was successful, |
| 254 | and the optimization method (JSON if successful, otherwise a string). |
| 255 | """ |
| 256 | optim_method = json.loads(optim_method_str) |
| 257 | |
| 258 | # Validity check, attempt update only if successful |
| 259 | check_status, reasons = NodeOptimizer.validate_dict(optim_method) |
| 260 | |
| 261 | if not check_status: |
| 262 | logger.error(f"Error in validating optim_method: {reasons}, optim_method: {optim_method}") |
| 263 | raise ValueError(f"Error in validating optim_method: {reasons}") |
| 264 | else: |
| 265 | logger.debug(f"succeed in validating optim_method, load the json successfully.") |
| 266 | # try to optim the node |
| 267 | for rule in optim_method: |
| 268 | action = rule.get("action") |
| 269 | if action == "add_role": |
| 270 | role_name = rule["role_name"] |
| 271 | role_description = rule["role_description"] |
| 272 | role_prompt = rule["role_prompt"] |
| 273 | role_prompt_key = "step_" + role_name |
| 274 | assert role_name not in node.node_prompt_paddings.keys(), f"Role name '{role_name}' already exists." |
| 275 | node.node_prompt_templates[role_prompt_key] = role_prompt |
| 276 | node.node_roles_description[role_name] = role_description |
| 277 | node.node_prompt_paddings[role_name] = { |
| 278 | role_prompt_key: {"value_source": "case", "value": "input_data"}} |
| 279 | |
| 280 | elif action == "delete_role": |
| 281 | role_name = rule["role_name"] |
| 282 | node.node_roles.pop(role_name) |
| 283 | node.node_roles_description.pop(role_name) |
| 284 | node.node_primary_prompts.pop(role_name) |
| 285 | node.node_prompt_templates.pop(role_name) |
| 286 | node.node_prompt_paddings.pop(role_name) |
| 287 | if len(node.node_prompt_paddings) == 0: |
| 288 | raise ValueError("The node should have at least one role.") |
| 289 | # begin role may need to be updated |
| 290 | if node.begin_role == role_name: |
| 291 | node.begin_role = next(iter(node.node_prompt_templates)) |
| 292 | |
| 293 | elif action == "update_role_description": |
| 294 | role_name = rule["role_name"] |
| 295 | role_description = rule["role_description"] |
| 296 | node.node_roles_description[role_name] = role_description |
| 297 |
no test coverage detected