praisonaiagents 0.0.17__py3-none-any.whl → 0.0.19__py3-none-any.whl

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.
@@ -16,6 +16,8 @@ from .main import (
16
16
  display_generating,
17
17
  clean_triple_backticks,
18
18
  error_logs,
19
+ register_display_callback,
20
+ display_callbacks,
19
21
  )
20
22
 
21
23
  __all__ = [
@@ -32,4 +34,6 @@ __all__ = [
32
34
  'display_generating',
33
35
  'clean_triple_backticks',
34
36
  'error_logs',
37
+ 'register_display_callback',
38
+ 'display_callbacks',
35
39
  ]
praisonaiagents/main.py CHANGED
@@ -12,6 +12,7 @@ from rich.text import Text
12
12
  from rich.markdown import Markdown
13
13
  from rich.logging import RichHandler
14
14
  from rich.live import Live
15
+ import asyncio
15
16
 
16
17
  LOGLEVEL = os.environ.get('LOGLEVEL', 'INFO').upper()
17
18
 
@@ -25,6 +26,13 @@ logging.basicConfig(
25
26
  # Global list to store error logs
26
27
  error_logs = []
27
28
 
29
+ # Global callback registry
30
+ display_callbacks = {}
31
+
32
+ def register_display_callback(display_type: str, callback_fn):
33
+ """Register a callback function for a specific display type."""
34
+ display_callbacks[display_type] = callback_fn
35
+
28
36
  def _clean_display_content(content: str, max_length: int = 20000) -> str:
29
37
  """Helper function to clean and truncate content for display."""
30
38
  if not content or not str(content).strip():
@@ -49,18 +57,28 @@ def display_interaction(message, response, markdown=True, generation_time=None,
49
57
  """Display the interaction between user and assistant."""
50
58
  if console is None:
51
59
  console = Console()
52
- if generation_time:
53
- console.print(Text(f"Response generated in {generation_time:.1f}s", style="dim"))
54
-
60
+
55
61
  # Handle multimodal content (list)
56
62
  if isinstance(message, list):
57
- # Extract just the text content from the multimodal message
58
63
  text_content = next((item["text"] for item in message if item["type"] == "text"), "")
59
64
  message = text_content
60
65
 
61
66
  message = _clean_display_content(str(message))
62
67
  response = _clean_display_content(str(response))
63
68
 
69
+ # Execute callback if registered
70
+ if 'interaction' in display_callbacks:
71
+ display_callbacks['interaction'](
72
+ message=message,
73
+ response=response,
74
+ markdown=markdown,
75
+ generation_time=generation_time
76
+ )
77
+
78
+ # Existing display logic...
79
+ if generation_time:
80
+ console.print(Text(f"Response generated in {generation_time:.1f}s", style="dim"))
81
+
64
82
  if markdown:
65
83
  console.print(Panel.fit(Markdown(message), title="Message", border_style="cyan"))
66
84
  console.print(Panel.fit(Markdown(response), title="Response", border_style="cyan"))
@@ -74,6 +92,11 @@ def display_self_reflection(message: str, console=None):
74
92
  if console is None:
75
93
  console = Console()
76
94
  message = _clean_display_content(str(message))
95
+
96
+ # Execute callback if registered
97
+ if 'self_reflection' in display_callbacks:
98
+ display_callbacks['self_reflection'](message=message)
99
+
77
100
  console.print(Panel.fit(Text(message, style="bold yellow"), title="Self Reflection", border_style="magenta"))
78
101
 
79
102
  def display_instruction(message: str, console=None):
@@ -82,6 +105,11 @@ def display_instruction(message: str, console=None):
82
105
  if console is None:
83
106
  console = Console()
84
107
  message = _clean_display_content(str(message))
108
+
109
+ # Execute callback if registered
110
+ if 'instruction' in display_callbacks:
111
+ display_callbacks['instruction'](message=message)
112
+
85
113
  console.print(Panel.fit(Text(message, style="bold blue"), title="Instruction", border_style="cyan"))
86
114
 
87
115
  def display_tool_call(message: str, console=None):
@@ -90,6 +118,11 @@ def display_tool_call(message: str, console=None):
90
118
  if console is None:
91
119
  console = Console()
92
120
  message = _clean_display_content(str(message))
121
+
122
+ # Execute callback if registered
123
+ if 'tool_call' in display_callbacks:
124
+ display_callbacks['tool_call'](message=message)
125
+
93
126
  console.print(Panel.fit(Text(message, style="bold cyan"), title="Tool Call", border_style="green"))
94
127
 
95
128
  def display_error(message: str, console=None):
@@ -98,19 +131,178 @@ def display_error(message: str, console=None):
98
131
  if console is None:
99
132
  console = Console()
100
133
  message = _clean_display_content(str(message))
134
+
135
+ # Execute callback if registered
136
+ if 'error' in display_callbacks:
137
+ display_callbacks['error'](message=message)
138
+
101
139
  console.print(Panel.fit(Text(message, style="bold red"), title="Error", border_style="red"))
102
- # Store errors
103
140
  error_logs.append(message)
104
141
 
105
142
  def display_generating(content: str = "", start_time: Optional[float] = None):
106
143
  if not content or not str(content).strip():
107
- return Panel("", title="", border_style="green") # Return empty panel when no content
144
+ return Panel("", title="", border_style="green")
145
+
108
146
  elapsed_str = ""
109
147
  if start_time is not None:
110
148
  elapsed = time.time() - start_time
111
149
  elapsed_str = f" {elapsed:.1f}s"
112
150
 
113
151
  content = _clean_display_content(str(content))
152
+
153
+ # Execute callback if registered
154
+ if 'generating' in display_callbacks:
155
+ display_callbacks['generating'](
156
+ content=content,
157
+ elapsed_time=elapsed_str.strip() if elapsed_str else None
158
+ )
159
+
160
+ return Panel(Markdown(content), title=f"Generating...{elapsed_str}", border_style="green")
161
+
162
+ # Async versions with 'a' prefix
163
+ async def adisplay_interaction(message, response, markdown=True, generation_time=None, console=None):
164
+ """Async version of display_interaction."""
165
+ if console is None:
166
+ console = Console()
167
+
168
+ if isinstance(message, list):
169
+ text_content = next((item["text"] for item in message if item["type"] == "text"), "")
170
+ message = text_content
171
+
172
+ message = _clean_display_content(str(message))
173
+ response = _clean_display_content(str(response))
174
+
175
+ if 'interaction' in display_callbacks:
176
+ callback = display_callbacks['interaction']
177
+ if asyncio.iscoroutinefunction(callback):
178
+ await callback(
179
+ message=message,
180
+ response=response,
181
+ markdown=markdown,
182
+ generation_time=generation_time
183
+ )
184
+ else:
185
+ loop = asyncio.get_event_loop()
186
+ await loop.run_in_executor(
187
+ None,
188
+ callback,
189
+ message,
190
+ response,
191
+ markdown,
192
+ generation_time
193
+ )
194
+
195
+ if generation_time:
196
+ console.print(Text(f"Response generated in {generation_time:.1f}s", style="dim"))
197
+
198
+ if markdown:
199
+ console.print(Panel.fit(Markdown(message), title="Message", border_style="cyan"))
200
+ console.print(Panel.fit(Markdown(response), title="Response", border_style="cyan"))
201
+ else:
202
+ console.print(Panel.fit(Text(message, style="bold green"), title="Message", border_style="cyan"))
203
+ console.print(Panel.fit(Text(response, style="bold blue"), title="Response", border_style="cyan"))
204
+
205
+ async def adisplay_self_reflection(message: str, console=None):
206
+ """Async version of display_self_reflection."""
207
+ if not message or not message.strip():
208
+ return
209
+ if console is None:
210
+ console = Console()
211
+ message = _clean_display_content(str(message))
212
+
213
+ if 'self_reflection' in display_callbacks:
214
+ callback = display_callbacks['self_reflection']
215
+ if asyncio.iscoroutinefunction(callback):
216
+ await callback(message=message)
217
+ else:
218
+ loop = asyncio.get_event_loop()
219
+ await loop.run_in_executor(None, callback, message)
220
+
221
+ console.print(Panel.fit(Text(message, style="bold yellow"), title="Self Reflection", border_style="magenta"))
222
+
223
+ async def adisplay_instruction(message: str, console=None):
224
+ """Async version of display_instruction."""
225
+ if not message or not message.strip():
226
+ return
227
+ if console is None:
228
+ console = Console()
229
+ message = _clean_display_content(str(message))
230
+
231
+ if 'instruction' in display_callbacks:
232
+ callback = display_callbacks['instruction']
233
+ if asyncio.iscoroutinefunction(callback):
234
+ await callback(message=message)
235
+ else:
236
+ loop = asyncio.get_event_loop()
237
+ await loop.run_in_executor(None, callback, message)
238
+
239
+ console.print(Panel.fit(Text(message, style="bold blue"), title="Instruction", border_style="cyan"))
240
+
241
+ async def adisplay_tool_call(message: str, console=None):
242
+ """Async version of display_tool_call."""
243
+ if not message or not message.strip():
244
+ return
245
+ if console is None:
246
+ console = Console()
247
+ message = _clean_display_content(str(message))
248
+
249
+ if 'tool_call' in display_callbacks:
250
+ callback = display_callbacks['tool_call']
251
+ if asyncio.iscoroutinefunction(callback):
252
+ await callback(message=message)
253
+ else:
254
+ loop = asyncio.get_event_loop()
255
+ await loop.run_in_executor(None, callback, message)
256
+
257
+ console.print(Panel.fit(Text(message, style="bold cyan"), title="Tool Call", border_style="green"))
258
+
259
+ async def adisplay_error(message: str, console=None):
260
+ """Async version of display_error."""
261
+ if not message or not message.strip():
262
+ return
263
+ if console is None:
264
+ console = Console()
265
+ message = _clean_display_content(str(message))
266
+
267
+ if 'error' in display_callbacks:
268
+ callback = display_callbacks['error']
269
+ if asyncio.iscoroutinefunction(callback):
270
+ await callback(message=message)
271
+ else:
272
+ loop = asyncio.get_event_loop()
273
+ await loop.run_in_executor(None, callback, message)
274
+
275
+ console.print(Panel.fit(Text(message, style="bold red"), title="Error", border_style="red"))
276
+ error_logs.append(message)
277
+
278
+ async def adisplay_generating(content: str = "", start_time: Optional[float] = None):
279
+ """Async version of display_generating."""
280
+ if not content or not str(content).strip():
281
+ return Panel("", title="", border_style="green")
282
+
283
+ elapsed_str = ""
284
+ if start_time is not None:
285
+ elapsed = time.time() - start_time
286
+ elapsed_str = f" {elapsed:.1f}s"
287
+
288
+ content = _clean_display_content(str(content))
289
+
290
+ if 'generating' in display_callbacks:
291
+ callback = display_callbacks['generating']
292
+ if asyncio.iscoroutinefunction(callback):
293
+ await callback(
294
+ content=content,
295
+ elapsed_time=elapsed_str.strip() if elapsed_str else None
296
+ )
297
+ else:
298
+ loop = asyncio.get_event_loop()
299
+ await loop.run_in_executor(
300
+ None,
301
+ callback,
302
+ content,
303
+ elapsed_str.strip() if elapsed_str else None
304
+ )
305
+
114
306
  return Panel(Markdown(content), title=f"Generating...{elapsed_str}", border_style="green")
115
307
 
116
308
  def clean_triple_backticks(text: str) -> str:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: praisonaiagents
3
- Version: 0.0.17
3
+ Version: 0.0.19
4
4
  Summary: Praison AI agents for completing complex tasks with Self Reflection Agents
5
5
  Author: Mervin Praison
6
6
  Requires-Dist: pydantic
@@ -1,5 +1,5 @@
1
- praisonaiagents/__init__.py,sha256=gI8vEabBTRPsE_E8GA5sBMi4sTtJI-YokPrH2Nor-k0,741
2
- praisonaiagents/main.py,sha256=K2OxVKPmo4dNJbSWIsXDi_hm9CRx5O4km_74UGcszhk,5744
1
+ praisonaiagents/__init__.py,sha256=bXQwi56S1iZOXs_TyXs3doxVxAeRAyqKVyZEIoBOipM,853
2
+ praisonaiagents/main.py,sha256=XtrOfVDK4KEaclOTBxUXpc_q9F44Udue6u1W8wMvSrg,12529
3
3
  praisonaiagents/agent/__init__.py,sha256=sKO8wGEXvtCrvV1e834r1Okv0XAqAxqZCqz6hKLiTvA,79
4
4
  praisonaiagents/agent/agent.py,sha256=_UmUWGbZjd3tApPX2T6RPB5Pll3Gos97XBhhg_zmfn8,30662
5
5
  praisonaiagents/agents/__init__.py,sha256=7RDeQNSqZg5uBjD4M_0p_F6YgfWuDuxPFydPU50kDYc,120
@@ -16,7 +16,7 @@ praisonaiagents/process/__init__.py,sha256=lkYbL7Hn5a0ldvJtkdH23vfIIZLIcanK-65C0
16
16
  praisonaiagents/process/process.py,sha256=4qXdrCDQPH5MtvHvdJVURXKNgSl6ae3OYTiqAF_A2ZU,24295
17
17
  praisonaiagents/task/__init__.py,sha256=VL5hXVmyGjINb34AalxpBMl-YW9m5EDcRkMTKkSSl7c,80
18
18
  praisonaiagents/task/task.py,sha256=UiiWgLDOdX_w0opP8h8-u-leVZlq1CkpGUmf7L2qyJs,3110
19
- praisonaiagents-0.0.17.dist-info/METADATA,sha256=oh0bnTHpGDwnn15L-t8v4kdApFBwOZ_BKj24mGnJUqA,233
20
- praisonaiagents-0.0.17.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
21
- praisonaiagents-0.0.17.dist-info/top_level.txt,sha256=_HsRddrJ23iDx5TTqVUVvXG2HeHBL5voshncAMDGjtA,16
22
- praisonaiagents-0.0.17.dist-info/RECORD,,
19
+ praisonaiagents-0.0.19.dist-info/METADATA,sha256=engdE6dLJ0SxfZv28CX2MKTZuYc04I_CdIWBjOdijXA,233
20
+ praisonaiagents-0.0.19.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
21
+ praisonaiagents-0.0.19.dist-info/top_level.txt,sha256=_HsRddrJ23iDx5TTqVUVvXG2HeHBL5voshncAMDGjtA,16
22
+ praisonaiagents-0.0.19.dist-info/RECORD,,