Copy an existing memory configuration Args: memory_name: Name of the memory system to copy new_name: New name for the copied memory. If None, uses original name. new_version: New version for the copied memory. If None, increments version.
(self,
memory_name: str,
new_name: Optional[str] = None,
new_version: Optional[str] = None,
new_config: Optional[Dict[str, Any]] = None)
| 554 | raise |
| 555 | |
| 556 | async def copy(self, |
| 557 | memory_name: str, |
| 558 | new_name: Optional[str] = None, |
| 559 | new_version: Optional[str] = None, |
| 560 | new_config: Optional[Dict[str, Any]] = None) -> MemoryConfig: |
| 561 | """Copy an existing memory configuration |
| 562 | |
| 563 | Args: |
| 564 | memory_name: Name of the memory system to copy |
| 565 | new_name: New name for the copied memory. If None, uses original name. |
| 566 | new_version: New version for the copied memory. If None, increments version. |
| 567 | new_config: New configuration dict for the copied memory. If None, uses original config. |
| 568 | |
| 569 | Returns: |
| 570 | MemoryConfig: New memory configuration |
| 571 | """ |
| 572 | try: |
| 573 | original_config = self._memory_configs.get(memory_name) |
| 574 | if original_config is None: |
| 575 | raise ValueError(f"Memory {memory_name} not found") |
| 576 | |
| 577 | if original_config.cls is None: |
| 578 | raise ValueError(f"Cannot copy memory {memory_name}: no class provided") |
| 579 | |
| 580 | # Determine new name |
| 581 | if new_name is None: |
| 582 | new_name = memory_name |
| 583 | |
| 584 | # Prepare config dict (merge original config with new config) |
| 585 | memory_config_dict = original_config.config.copy() if original_config.config else {} |
| 586 | if new_config: |
| 587 | # Merge new config into original config |
| 588 | memory_config_dict.update(new_config) |
| 589 | |
| 590 | # Instantiate memory instance (copy is a runtime operation) |
| 591 | try: |
| 592 | memory_instance = original_config.cls(**memory_config_dict) |
| 593 | except Exception as e: |
| 594 | logger.error(f"| ❌ Failed to create memory instance for {original_config.cls.__name__}: {e}") |
| 595 | raise ValueError(f"Failed to instantiate memory {original_config.cls.__name__} with provided config: {e}") |
| 596 | |
| 597 | # Apply name override if provided (after instantiation) |
| 598 | if new_name != memory_name: |
| 599 | memory_instance.name = new_name |
| 600 | |
| 601 | memory_description = memory_instance.description |
| 602 | memory_metadata = getattr(memory_instance, 'metadata', {}) |
| 603 | memory_require_grad = memory_config_dict.get("require_grad", memory_instance.require_grad) if memory_config_dict and "require_grad" in memory_config_dict else memory_instance.require_grad |
| 604 | |
| 605 | # Determine new version from version_manager |
| 606 | if new_version is None: |
| 607 | if new_name == memory_name: |
| 608 | # If copying with same name, get next version from version_manager |
| 609 | new_version = await version_manager.generate_next_version("memory", new_name, "patch") |
| 610 | else: |
| 611 | # If copying with different name, get or generate version for new name |
| 612 | new_version = await version_manager.get_version("memory", new_name) |
| 613 |
nothing calls this directly
no test coverage detected