praisonaiagents 0.0.149__tar.gz → 0.0.151__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/PKG-INFO +1 -1
  2. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/__init__.py +12 -1
  3. praisonaiagents-0.0.151/praisonaiagents/flow_display.py +194 -0
  4. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/main.py +4 -0
  5. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents.egg-info/PKG-INFO +1 -1
  6. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents.egg-info/SOURCES.txt +1 -0
  7. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/pyproject.toml +1 -1
  8. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/README.md +0 -0
  9. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/_logging.py +0 -0
  10. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/_warning_patch.py +0 -0
  11. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/agent/__init__.py +0 -0
  12. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/agent/agent.py +0 -0
  13. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/agent/context_agent.py +0 -0
  14. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/agent/handoff.py +0 -0
  15. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/agent/image_agent.py +0 -0
  16. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/agent/router_agent.py +0 -0
  17. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/agents/__init__.py +0 -0
  18. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/agents/agents.py +0 -0
  19. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/agents/autoagents.py +0 -0
  20. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/approval.py +0 -0
  21. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/guardrails/__init__.py +0 -0
  22. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/guardrails/guardrail_result.py +0 -0
  23. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/guardrails/llm_guardrail.py +0 -0
  24. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/knowledge/__init__.py +0 -0
  25. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/knowledge/chunking.py +0 -0
  26. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/knowledge/knowledge.py +0 -0
  27. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/llm/__init__.py +0 -0
  28. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/llm/llm.py +0 -0
  29. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/llm/model_capabilities.py +0 -0
  30. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/llm/model_router.py +0 -0
  31. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/llm/openai_client.py +0 -0
  32. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/mcp/__init__.py +0 -0
  33. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/mcp/mcp.py +0 -0
  34. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/mcp/mcp_http_stream.py +0 -0
  35. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/mcp/mcp_sse.py +0 -0
  36. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/memory/__init__.py +0 -0
  37. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/memory/memory.py +0 -0
  38. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/process/__init__.py +0 -0
  39. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/process/process.py +0 -0
  40. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/session.py +0 -0
  41. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/task/__init__.py +0 -0
  42. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/task/task.py +0 -0
  43. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/telemetry/__init__.py +0 -0
  44. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/telemetry/integration.py +0 -0
  45. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/telemetry/performance_cli.py +0 -0
  46. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/telemetry/performance_monitor.py +0 -0
  47. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/telemetry/performance_utils.py +0 -0
  48. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/telemetry/telemetry.py +0 -0
  49. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/tools/README.md +0 -0
  50. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/tools/__init__.py +0 -0
  51. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/tools/arxiv_tools.py +0 -0
  52. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/tools/calculator_tools.py +0 -0
  53. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/tools/csv_tools.py +0 -0
  54. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/tools/duckdb_tools.py +0 -0
  55. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/tools/duckduckgo_tools.py +0 -0
  56. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/tools/excel_tools.py +0 -0
  57. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/tools/file_tools.py +0 -0
  58. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/tools/json_tools.py +0 -0
  59. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/tools/mongodb_tools.py +0 -0
  60. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/tools/newspaper_tools.py +0 -0
  61. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/tools/pandas_tools.py +0 -0
  62. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/tools/python_tools.py +0 -0
  63. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/tools/searxng_tools.py +0 -0
  64. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/tools/shell_tools.py +0 -0
  65. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/tools/spider_tools.py +0 -0
  66. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/tools/test.py +0 -0
  67. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/tools/tools.py +0 -0
  68. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/tools/train/data/generatecot.py +0 -0
  69. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/tools/wikipedia_tools.py +0 -0
  70. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/tools/xml_tools.py +0 -0
  71. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/tools/yaml_tools.py +0 -0
  72. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents/tools/yfinance_tools.py +0 -0
  73. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents.egg-info/dependency_links.txt +0 -0
  74. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents.egg-info/requires.txt +0 -0
  75. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/praisonaiagents.egg-info/top_level.txt +0 -0
  76. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/setup.cfg +0 -0
  77. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/tests/test-graph-memory.py +0 -0
  78. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/tests/test.py +0 -0
  79. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/tests/test_context_agent.py +0 -0
  80. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/tests/test_embedding_logging.py +0 -0
  81. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/tests/test_fix_comprehensive.py +0 -0
  82. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/tests/test_gemini_streaming_fix.py +0 -0
  83. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/tests/test_handoff_compatibility.py +0 -0
  84. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/tests/test_http_stream_basic.py +0 -0
  85. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/tests/test_llm_self_reflection_direct.py +0 -0
  86. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/tests/test_ollama_async_fix.py +0 -0
  87. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/tests/test_ollama_fix.py +0 -0
  88. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/tests/test_ollama_sequential_fix.py +0 -0
  89. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/tests/test_posthog_fixed.py +0 -0
  90. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/tests/test_self_reflection_comprehensive.py +0 -0
  91. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/tests/test_self_reflection_fix_simple.py +0 -0
  92. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/tests/test_self_reflection_fix_verification.py +0 -0
  93. {praisonaiagents-0.0.149 → praisonaiagents-0.0.151}/tests/test_validation_feedback.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: praisonaiagents
3
- Version: 0.0.149
3
+ Version: 0.0.151
4
4
  Summary: Praison AI agents for completing complex tasks with Self Reflection Agents
5
5
  Author: Mervin Praison
6
6
  Requires-Python: >=3.10
@@ -32,6 +32,12 @@ from .session import Session
32
32
  from .memory.memory import Memory
33
33
  from .guardrails import GuardrailResult, LLMGuardrail
34
34
  from .agent.handoff import Handoff, handoff, handoff_filters, RECOMMENDED_PROMPT_PREFIX, prompt_with_handoff_instructions
35
+ # Flow display
36
+ try:
37
+ from .flow_display import FlowDisplay, track_workflow
38
+ except ImportError:
39
+ FlowDisplay = None
40
+ track_workflow = None
35
41
  from .main import (
36
42
  TaskOutput,
37
43
  ReflectionOutput,
@@ -135,4 +141,9 @@ __all__ = [
135
141
 
136
142
  # Add MCP to __all__ if available
137
143
  if _mcp_available:
138
- __all__.append('MCP')
144
+ __all__.append('MCP')
145
+
146
+ # Add flow display if available
147
+ if FlowDisplay is not None:
148
+ __all__.extend(['FlowDisplay', 'track_workflow'])
149
+
@@ -0,0 +1,194 @@
1
+ """
2
+ Flow Display for PraisonAI Agents
3
+
4
+ Visual display with agents in center and tools on sides.
5
+ """
6
+
7
+ from typing import Dict, List, Set, Tuple
8
+ from collections import defaultdict
9
+ import threading
10
+ from rich.console import Console
11
+ from rich.panel import Panel
12
+ from rich.text import Text
13
+ from rich.align import Align
14
+ from rich.columns import Columns
15
+ from rich.table import Table
16
+ from rich import box
17
+
18
+ class FlowDisplay:
19
+ """Displays agent workflow with agents centered and tools on sides."""
20
+
21
+ def __init__(self):
22
+ self.console = Console()
23
+ self.agents = [] # List of agents in order
24
+ self.agent_tools = defaultdict(list) # agent -> [tools]
25
+ self.tracking = False
26
+ self.lock = threading.Lock()
27
+
28
+ def start(self):
29
+ """Start tracking workflow."""
30
+ self.tracking = True
31
+ self.agents.clear()
32
+ self.agent_tools.clear()
33
+
34
+ # Register callbacks
35
+ try:
36
+ from praisonaiagents.main import register_display_callback
37
+
38
+ def on_interaction(**kwargs):
39
+ if self.tracking:
40
+ agent = kwargs.get('agent_name', 'Unknown')
41
+ self._add_agent(agent)
42
+
43
+ def on_tool_call(message, **kwargs):
44
+ if self.tracking and "called function" in message:
45
+ parts = message.split("'")
46
+ if len(parts) > 1:
47
+ tool_name = parts[1]
48
+ agent = kwargs.get('agent_name', 'Unknown')
49
+ self._add_tool(agent, tool_name)
50
+
51
+ register_display_callback('interaction', on_interaction)
52
+ register_display_callback('tool_call', on_tool_call)
53
+
54
+ except ImportError:
55
+ pass
56
+
57
+ def stop(self):
58
+ """Stop tracking and display the flow."""
59
+ self.tracking = False
60
+ self.display()
61
+
62
+ def _add_agent(self, name: str):
63
+ """Add an agent if not already present."""
64
+ with self.lock:
65
+ if name not in self.agents:
66
+ self.agents.append(name)
67
+
68
+ def _add_tool(self, agent_name: str, tool_name: str):
69
+ """Add a tool to an agent."""
70
+ with self.lock:
71
+ if agent_name not in self.agents:
72
+ self.agents.append(agent_name)
73
+ if tool_name not in self.agent_tools[agent_name]:
74
+ self.agent_tools[agent_name].append(tool_name)
75
+
76
+ def display(self):
77
+ """Display the flow chart with agents in center and tools on sides."""
78
+ if not self.agents:
79
+ return
80
+
81
+ self.console.print("\n[bold cyan]🔄 Agent Workflow Flow[/bold cyan]\n")
82
+
83
+ # Display start
84
+ self._display_centered_node("── start ──", "grey35")
85
+ self._display_arrow_down()
86
+
87
+ # Display each agent with their tools
88
+ for i, agent in enumerate(self.agents):
89
+ self._display_agent_with_tools(agent)
90
+
91
+ # Add arrow to next agent or end
92
+ if i < len(self.agents) - 1:
93
+ self._display_arrow_down()
94
+
95
+ # Display end
96
+ self._display_arrow_down()
97
+ self._display_centered_node("── end ──", "grey35")
98
+
99
+ def _display_agent_with_tools(self, agent: str):
100
+ """Display agent with tools on the sides."""
101
+ tools = self.agent_tools.get(agent, [])
102
+
103
+ if not tools:
104
+ # No tools - just agent
105
+ self._display_centered_node(agent, "purple")
106
+ else:
107
+ # Split tools between left and right
108
+ left_tools = tools[::2] # Even indices
109
+ right_tools = tools[1::2] # Odd indices
110
+
111
+ # Create the layout
112
+ table = Table(show_header=False, show_edge=False, box=None, padding=0)
113
+ table.add_column(justify="center", min_width=20) # Left tools
114
+ table.add_column(justify="center", min_width=5) # Space
115
+ table.add_column(justify="center", min_width=20) # Agent
116
+ table.add_column(justify="center", min_width=5) # Space
117
+ table.add_column(justify="center", min_width=20) # Right tools
118
+
119
+ # Create panels
120
+ left_panel = self._create_tools_panel(left_tools) if left_tools else ""
121
+ agent_panel = Panel(
122
+ Text(agent, style="white on purple", justify="center"),
123
+ style="white on purple",
124
+ box=box.ROUNDED,
125
+ padding=(0, 2)
126
+ )
127
+ right_panel = self._create_tools_panel(right_tools) if right_tools else ""
128
+
129
+ # Add row
130
+ table.add_row(left_panel, "", agent_panel, "", right_panel)
131
+
132
+ # Display centered
133
+ self.console.print(Align.center(table))
134
+
135
+ # Show arrows
136
+ if left_tools or right_tools:
137
+ arrow_parts = []
138
+ if left_tools:
139
+ arrow_parts.append("←→")
140
+ else:
141
+ arrow_parts.append(" ")
142
+
143
+ arrow_parts.append(" ") # Center space
144
+
145
+ if right_tools:
146
+ arrow_parts.append("←→")
147
+ else:
148
+ arrow_parts.append(" ")
149
+
150
+ self.console.print(Align.center(Text("".join(arrow_parts))))
151
+
152
+ def _create_tools_panel(self, tools: List[str]) -> Panel:
153
+ """Create a panel for tools."""
154
+ if not tools:
155
+ return ""
156
+
157
+ if len(tools) == 1:
158
+ return Panel(
159
+ Text(tools[0], style="black on yellow", justify="center"),
160
+ style="black on yellow",
161
+ box=box.ROUNDED,
162
+ padding=(0, 1)
163
+ )
164
+ else:
165
+ # Multiple tools
166
+ content = "\n".join(tools)
167
+ return Panel(
168
+ Text(content, style="black on yellow", justify="center"),
169
+ style="black on yellow",
170
+ box=box.ROUNDED,
171
+ padding=(0, 1)
172
+ )
173
+
174
+ def _display_centered_node(self, label: str, color: str):
175
+ """Display a centered node."""
176
+ panel = Panel(
177
+ Text(label, style=f"white on {color}", justify="center"),
178
+ style=f"white on {color}",
179
+ box=box.ROUNDED,
180
+ padding=(0, 2)
181
+ )
182
+ self.console.print(Align.center(panel))
183
+
184
+ def _display_arrow_down(self):
185
+ """Display a downward arrow."""
186
+ self.console.print()
187
+ self.console.print(Align.center("↓"))
188
+ self.console.print()
189
+
190
+
191
+ # Simple function to create and use
192
+ def track_workflow():
193
+ """Create a flow display tracker."""
194
+ return FlowDisplay()
@@ -154,6 +154,10 @@ def display_interaction(message, response, markdown=True, generation_time=None,
154
154
 
155
155
  message = _clean_display_content(str(message))
156
156
  response = _clean_display_content(str(response))
157
+
158
+ # Skip display if response is empty (common with Gemini tool calls)
159
+ if not response or not response.strip():
160
+ return
157
161
 
158
162
  # Execute synchronous callbacks
159
163
  execute_sync_callback(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: praisonaiagents
3
- Version: 0.0.149
3
+ Version: 0.0.151
4
4
  Summary: Praison AI agents for completing complex tasks with Self Reflection Agents
5
5
  Author: Mervin Praison
6
6
  Requires-Python: >=3.10
@@ -4,6 +4,7 @@ praisonaiagents/__init__.py
4
4
  praisonaiagents/_logging.py
5
5
  praisonaiagents/_warning_patch.py
6
6
  praisonaiagents/approval.py
7
+ praisonaiagents/flow_display.py
7
8
  praisonaiagents/main.py
8
9
  praisonaiagents/session.py
9
10
  praisonaiagents.egg-info/PKG-INFO
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "praisonaiagents"
7
- version = "0.0.149"
7
+ version = "0.0.151"
8
8
  description = "Praison AI agents for completing complex tasks with Self Reflection Agents"
9
9
  requires-python = ">=3.10"
10
10
  authors = [