Skip to content

Commit abdb7cf

Browse files
fix: wrapper architecture - framework-adapter migration, remove duplicate stack, clean dead code
- Fix framework adapter signature mismatches (Issue 1) - Update all adapters to accept tools_dict, agent_callback, task_callback, cli_config kwargs - Port missing capabilities from legacy _run_* methods to adapters - Enhance CrewAI adapter with full parameter support (llm, max_iter, max_rpm, etc.) - Enhance PraisonAI adapter with InteractiveRuntime support for ACP/LSP - Remove duplicate persistence stack (Issue 2) - Delete storage/ directory with 5 unused adapter files - Eliminates parallel implementations for Redis, PostgreSQL, MongoDB, DynamoDB - db/adapter.py continues using persistence.factory as intended - Clean up dead ToolRegistry code (Issue 3) - Remove ToolRegistry initialization and dead load_tools_from_* methods - Remove all dead _run_* methods (~700 lines of unreachable code) - Eliminate per-instance autogen tool scanning on hot path Aligns wrapper with protocol-driven core principle: heavy implementations in wrapper, protocols in core, single source of truth per concern. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 4222121 commit abdb7cf

9 files changed

Lines changed: 135 additions & 1974 deletions

File tree

src/praisonai/praisonai/agents_generator.py

Lines changed: 0 additions & 870 deletions
Large diffs are not rendered by default.

src/praisonai/praisonai/framework_adapters/autogen_adapter.py

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"""
66

77
import logging
8-
from typing import Dict, List, Any
8+
from typing import Dict, List, Any, Optional, Callable
99
from .base import BaseFrameworkAdapter
1010

1111
logger = logging.getLogger(__name__)
@@ -26,7 +26,17 @@ def is_available(self) -> bool:
2626
except ImportError:
2727
return False
2828

29-
def run(self, config: Dict[str, Any], llm_config: List[Dict], topic: str) -> str:
29+
def run(
30+
self,
31+
config: Dict[str, Any],
32+
llm_config: List[Dict],
33+
topic: str,
34+
*,
35+
tools_dict: Optional[Dict[str, Any]] = None,
36+
agent_callback: Optional[Callable] = None,
37+
task_callback: Optional[Callable] = None,
38+
cli_config: Optional[Dict[str, Any]] = None,
39+
) -> str:
3040
"""
3141
Run AutoGen v0.2 with given configuration.
3242
@@ -110,7 +120,17 @@ def is_available(self) -> bool:
110120
except ImportError:
111121
return False
112122

113-
def run(self, config: Dict[str, Any], llm_config: List[Dict], topic: str) -> str:
123+
def run(
124+
self,
125+
config: Dict[str, Any],
126+
llm_config: List[Dict],
127+
topic: str,
128+
*,
129+
tools_dict: Optional[Dict[str, Any]] = None,
130+
agent_callback: Optional[Callable] = None,
131+
task_callback: Optional[Callable] = None,
132+
cli_config: Optional[Dict[str, Any]] = None,
133+
) -> str:
114134
"""
115135
Run AutoGen v0.4 with given configuration.
116136
@@ -148,7 +168,17 @@ def is_available(self) -> bool:
148168
except Exception:
149169
return False
150170

151-
def run(self, config: Dict[str, Any], llm_config: List[Dict], topic: str) -> str:
171+
def run(
172+
self,
173+
config: Dict[str, Any],
174+
llm_config: List[Dict],
175+
topic: str,
176+
*,
177+
tools_dict: Optional[Dict[str, Any]] = None,
178+
agent_callback: Optional[Callable] = None,
179+
task_callback: Optional[Callable] = None,
180+
cli_config: Optional[Dict[str, Any]] = None,
181+
) -> str:
152182
"""
153183
Run AG2 with given configuration.
154184

src/praisonai/praisonai/framework_adapters/crewai_adapter.py

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"""
66

77
import logging
8-
from typing import Dict, List, Any, Optional
8+
from typing import Dict, List, Any, Optional, Callable
99
from .base import BaseFrameworkAdapter, scoped_telemetry_disable
1010

1111
logger = logging.getLogger(__name__)
@@ -33,8 +33,8 @@ def run(
3333
topic: str,
3434
*,
3535
tools_dict: Optional[Dict[str, Any]] = None,
36-
agent_callback = None,
37-
task_callback = None,
36+
agent_callback: Optional[Callable] = None,
37+
task_callback: Optional[Callable] = None,
3838
cli_config: Optional[Dict[str, Any]] = None,
3939
) -> str:
4040
"""
@@ -73,29 +73,68 @@ def run(
7373
agent_tools = agent_details.get('tools', [])
7474
agent_tool_list = [tools_dict[t] for t in agent_tools if t in tools_dict]
7575

76+
# Extract LLM config for this agent
77+
agent_llm = None
78+
function_calling_llm = None
79+
if llm_config:
80+
# Use first config as default
81+
agent_llm = llm_config[0]
82+
function_calling_llm = llm_config[0] if len(llm_config) == 1 else llm_config[1] if len(llm_config) > 1 else llm_config[0]
83+
7684
agent = Agent(
7785
role=agent_details.get('role', agent_name),
7886
goal=self._format_template(agent_details.get('goal', ''), topic=topic),
7987
backstory=self._format_template(agent_details.get('backstory', ''), topic=topic),
8088
tools=agent_tool_list,
81-
verbose=True,
82-
allow_delegation=agent_details.get('allow_delegation', False)
89+
allow_delegation=agent_details.get('allow_delegation', False),
90+
llm=agent_llm,
91+
function_calling_llm=function_calling_llm,
92+
max_iter=agent_details.get('max_iter', 15),
93+
max_rpm=agent_details.get('max_rpm'),
94+
max_execution_time=agent_details.get('max_execution_time'),
95+
verbose=agent_details.get('verbose', True),
96+
cache=agent_details.get('cache', True),
97+
system_template=agent_details.get('system_template'),
98+
prompt_template=agent_details.get('prompt_template'),
99+
response_template=agent_details.get('response_template'),
83100
)
84101
if agent_callback:
85102
agent.step_callback = agent_callback
86103
agents[agent_name] = agent
87104

105+
# Store tasks by name for context linking
106+
tasks_dict = {}
107+
88108
# Create tasks
89109
for agent_name, agent_details in config.get('roles', {}).items():
90110
for task_name, task_details in agent_details.get('tasks', {}).items():
91111
task = Task(
92112
description=self._format_template(task_details['description'], topic=topic),
93113
expected_output=self._format_template(task_details['expected_output'], topic=topic),
94-
agent=agents[agent_name]
114+
agent=agents[agent_name],
115+
tools=task_details.get('tools', []),
116+
async_execution=task_details.get('async_execution', False),
117+
config=task_details.get('config', {}),
118+
output_json=task_details.get('output_json'),
119+
output_pydantic=task_details.get('output_pydantic'),
120+
output_file=task_details.get('output_file', ''),
121+
callback=task_details.get('callback'),
122+
human_input=task_details.get('human_input', False),
123+
create_directory=task_details.get('create_directory', False)
95124
)
96125
if task_callback:
97126
task.callback = task_callback
98127
tasks.append(task)
128+
tasks_dict[task_name] = task
129+
130+
# Set up task contexts - second pass to link dependencies
131+
for agent_name, agent_details in config.get('roles', {}).items():
132+
for task_name, task_details in agent_details.get('tasks', {}).items():
133+
if 'context' in task_details:
134+
task = tasks_dict[task_name]
135+
context_tasks = [tasks_dict[ctx] for ctx in task_details['context']
136+
if ctx in tasks_dict]
137+
task.context = context_tasks
99138

100139
# Create and run crew
101140
crew = Crew(

src/praisonai/praisonai/framework_adapters/praisonai_adapter.py

Lines changed: 56 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"""
66

77
import logging
8-
from typing import Dict, List, Any, Optional
8+
from typing import Dict, List, Any, Optional, Callable
99
from .base import BaseFrameworkAdapter
1010

1111
logger = logging.getLogger(__name__)
@@ -33,8 +33,8 @@ def run(
3333
topic: str,
3434
*,
3535
tools_dict: Optional[Dict[str, Any]] = None,
36-
agent_callback = None,
37-
task_callback = None,
36+
agent_callback: Optional[Callable] = None,
37+
task_callback: Optional[Callable] = None,
3838
cli_config: Optional[Dict[str, Any]] = None,
3939
) -> str:
4040
"""
@@ -59,6 +59,55 @@ def run(
5959

6060
logger.info("Starting PraisonAI execution...")
6161

62+
# Load tools from tools.py if available
63+
tools_list = []
64+
if tools_dict:
65+
tools_list = list(tools_dict.values())
66+
67+
# Check for InteractiveRuntime (ACP/LSP) configuration
68+
global_config = config.get('config', {})
69+
acp_enabled = global_config.get('acp', False)
70+
lsp_enabled = global_config.get('lsp', False)
71+
72+
if acp_enabled or lsp_enabled:
73+
try:
74+
import asyncio
75+
import os
76+
from praisonai.cli.features.interactive_runtime import InteractiveRuntime, RuntimeConfig
77+
from praisonai.cli.features.agent_tools import create_agent_centric_tools
78+
79+
# Use scoped event loop instead of process-global mutations
80+
runtime_config = RuntimeConfig(
81+
workspace=os.getcwd(),
82+
acp_enabled=acp_enabled,
83+
lsp_enabled=lsp_enabled,
84+
approval_mode=os.environ.get("PRAISONAI_APPROVAL_MODE", "prompt")
85+
)
86+
interactive_runtime = InteractiveRuntime(runtime_config)
87+
logger.info(f"Starting InteractiveRuntime (ACP: {acp_enabled}, LSP: {lsp_enabled})")
88+
89+
# Create a scoped event loop instead of modifying process globals
90+
interactive_loop = asyncio.new_event_loop()
91+
try:
92+
interactive_loop.run_until_complete(interactive_runtime.start())
93+
94+
centric_tools = create_agent_centric_tools(interactive_runtime)
95+
logger.info(f"Loaded {len(centric_tools)} InteractiveRuntime tools")
96+
tools_list.extend(centric_tools)
97+
98+
finally:
99+
try:
100+
interactive_loop.run_until_complete(interactive_runtime.stop())
101+
except Exception as stop_error:
102+
logger.warning(f"Error stopping InteractiveRuntime: {stop_error}")
103+
finally:
104+
interactive_loop.close()
105+
106+
except ImportError as e:
107+
logger.warning(f"Failed to load InteractiveRuntime components: {e}")
108+
except Exception as e:
109+
logger.error(f"Error starting InteractiveRuntime: {e}")
110+
62111
# Basic implementation - create agents and tasks from config
63112
agents = {}
64113
tasks = []
@@ -74,12 +123,15 @@ def run(
74123
goal_filled = self._format_template(details.get('goal', ''), topic=topic)
75124
backstory_filled = self._format_template(details.get('backstory', ''), topic=topic)
76125

77-
# Resolve tools for this agent from tools_dict
126+
# Resolve tools for this agent from tools_dict and tools_list
78127
agent_tool_list = []
79128
if tools_dict:
80129
agent_tools = details.get('tools', [])
81130
agent_tool_list = [tools_dict[t] for t in agent_tools if t in tools_dict]
82131

132+
# Also add from global tools_list
133+
agent_tool_list.extend(tools_list)
134+
83135
# Create basic agent
84136
agent = PraisonAgent(
85137
name=role_filled,

src/praisonai/praisonai/storage/__init__.py

Lines changed: 0 additions & 36 deletions
This file was deleted.

0 commit comments

Comments
 (0)