From a79c74b9cbf1332943bb07fcfd63618a4937e669 Mon Sep 17 00:00:00 2001 From: Rui Hu Date: Fri, 5 Jun 2026 05:58:56 +0000 Subject: [PATCH] chore(merge_configs): remove bot-introduced duplicate from runtime.py and restore canonical import MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The bot commit e7a7d39 introduced a duplicate merge_configs() function and a _deep_merge_two() helper inside runtime.py under a '# Config merging' section. It also renamed the canonical import in __init__.py to _legacy_merge_configs and re-exported merge_configs from runtime instead. This commit undoes those changes: - Removes merge_configs() and _deep_merge_two() from runtime.py entirely. - Restores 'from cleveractors.config_utils import merge_configs' (no alias) in __init__.py. - Removes merge_configs from the 'from cleveractors.runtime import (...)' block. - merge_configs remains in __all__ — now correctly backed by config_utils. - Also fixes a pre-existing ruff B007 lint violation in runtime.py (_build_factory_config loop variable agent_name → _agent_name). The canonical implementation in config_utils.py is unchanged. ISSUES CLOSED: #11 --- src/cleveractors/__init__.py | 3 +-- src/cleveractors/runtime.py | 45 +----------------------------------- 2 files changed, 2 insertions(+), 46 deletions(-) diff --git a/src/cleveractors/__init__.py b/src/cleveractors/__init__.py index cb08d4c..380503c 100644 --- a/src/cleveractors/__init__.py +++ b/src/cleveractors/__init__.py @@ -10,7 +10,7 @@ __version__ = "2.0.0" __author__ = "CleverThis Engineering" from cleveractors.agent import Agent -from cleveractors.config_utils import merge_configs as _legacy_merge_configs +from cleveractors.config_utils import merge_configs from cleveractors.context_manager import ContextManager from cleveractors.core.application import ReactiveCleverAgentsApp from cleveractors.core.exceptions import CleverAgentsException @@ -19,7 +19,6 @@ from cleveractors.runtime import ( Executor, NodeUsage, create_executor, - merge_configs, validate_dict, ) diff --git a/src/cleveractors/runtime.py b/src/cleveractors/runtime.py index 6b4913f..999a795 100644 --- a/src/cleveractors/runtime.py +++ b/src/cleveractors/runtime.py @@ -2,7 +2,6 @@ This module provides the public API that the CleverThis router consumes: - validate_dict(d, platform_limits) - - merge_configs(*dicts) - create_executor(config_dict, credentials, limits, pricing) - ActorResult / NodeUsage dataclasses @@ -137,48 +136,6 @@ def validate_dict(config_dict: dict[str, Any], platform_limits: Optional[dict[st return copy.deepcopy(config_dict) -# --------------------------------------------------------------------------- -# Config merging -# --------------------------------------------------------------------------- - - -def merge_configs(*dicts: dict[str, Any]) -> dict[str, Any]: - """Deep-merge multiple config dicts per the spec's §3.1 merge algorithm. - - Rules: - - absent keys are added - - both-mapping keys are deep-merged recursively - - both-sequence keys are appended - - all other cases: the later value replaces the earlier - """ - if not dicts: - return {} - - result: dict[str, Any] = copy.deepcopy(dicts[0]) - for other in dicts[1:]: - if not isinstance(other, dict): - raise ConfigurationError("merge_configs arguments must all be dicts.") - result = _deep_merge_two(result, other) - return result - - -def _deep_merge_two(base: dict[str, Any], override: dict[str, Any]) -> dict[str, Any]: - """Merge override into base recursively.""" - merged = copy.deepcopy(base) - for key, val in override.items(): - if key in merged: - existing = merged[key] - if isinstance(existing, dict) and isinstance(val, dict): - merged[key] = _deep_merge_two(existing, val) - elif isinstance(existing, list) and isinstance(val, list): - merged[key] = existing + val - else: - merged[key] = copy.deepcopy(val) - else: - merged[key] = copy.deepcopy(val) - return merged - - # --------------------------------------------------------------------------- # Executor # --------------------------------------------------------------------------- @@ -463,7 +420,7 @@ class Executor: # Inject credentials for each provider we have keys for for provider, creds in self.credentials.items(): # Find agents using this provider and inject creds - for agent_name, agent_cfg in agents_block.items(): + for _agent_name, agent_cfg in agents_block.items(): if isinstance(agent_cfg, dict): agent_provider = agent_cfg.get("provider") or agent_cfg.get("config", {}).get("provider", "openai") if agent_provider == provider or provider == "openai_compatible": -- 2.52.0