waldiez 0.5.8__py3-none-any.whl → 0.5.10__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.

Potentially problematic release.


This version of waldiez might be problematic. Click here for more details.

Files changed (88) hide show
  1. waldiez/_version.py +1 -1
  2. waldiez/cli.py +112 -24
  3. waldiez/exporting/agent/exporter.py +3 -0
  4. waldiez/exporting/agent/extras/captain_agent_extras.py +44 -7
  5. waldiez/exporting/agent/extras/handoffs/condition.py +3 -1
  6. waldiez/exporting/chats/utils/common.py +25 -23
  7. waldiez/exporting/core/__init__.py +0 -2
  8. waldiez/exporting/core/context.py +13 -13
  9. waldiez/exporting/core/protocols.py +0 -141
  10. waldiez/exporting/core/result.py +5 -5
  11. waldiez/exporting/flow/merger.py +2 -2
  12. waldiez/exporting/flow/orchestrator.py +1 -0
  13. waldiez/exporting/flow/utils/common.py +2 -2
  14. waldiez/exporting/flow/utils/importing.py +1 -0
  15. waldiez/exporting/flow/utils/logging.py +6 -7
  16. waldiez/exporting/tools/exporter.py +5 -0
  17. waldiez/exporting/tools/factory.py +4 -0
  18. waldiez/exporting/tools/processor.py +5 -1
  19. waldiez/io/_ws.py +13 -5
  20. waldiez/io/models/content/image.py +1 -0
  21. waldiez/io/models/user_input.py +4 -4
  22. waldiez/io/models/user_response.py +1 -0
  23. waldiez/io/mqtt.py +1 -1
  24. waldiez/io/structured.py +17 -17
  25. waldiez/io/utils.py +1 -1
  26. waldiez/io/ws.py +9 -11
  27. waldiez/logger.py +180 -63
  28. waldiez/models/agents/agent/update_system_message.py +0 -2
  29. waldiez/models/agents/doc_agent/doc_agent.py +8 -1
  30. waldiez/models/common/dict_utils.py +169 -40
  31. waldiez/models/flow/flow.py +6 -6
  32. waldiez/models/flow/info.py +5 -1
  33. waldiez/models/model/_llm.py +28 -14
  34. waldiez/models/model/model.py +4 -1
  35. waldiez/models/model/model_data.py +18 -5
  36. waldiez/models/tool/predefined/_config.py +5 -1
  37. waldiez/models/tool/predefined/_duckduckgo.py +4 -0
  38. waldiez/models/tool/predefined/_email.py +474 -0
  39. waldiez/models/tool/predefined/_google.py +8 -6
  40. waldiez/models/tool/predefined/_perplexity.py +3 -0
  41. waldiez/models/tool/predefined/_searxng.py +3 -0
  42. waldiez/models/tool/predefined/_tavily.py +4 -1
  43. waldiez/models/tool/predefined/_wikipedia.py +4 -1
  44. waldiez/models/tool/predefined/_youtube.py +4 -1
  45. waldiez/models/tool/predefined/protocol.py +3 -0
  46. waldiez/models/tool/tool.py +22 -4
  47. waldiez/models/waldiez.py +12 -0
  48. waldiez/runner.py +37 -54
  49. waldiez/running/__init__.py +6 -0
  50. waldiez/running/base_runner.py +310 -353
  51. waldiez/running/environment.py +1 -0
  52. waldiez/running/exceptions.py +9 -0
  53. waldiez/running/post_run.py +4 -4
  54. waldiez/running/pre_run.py +51 -40
  55. waldiez/running/protocol.py +21 -101
  56. waldiez/running/run_results.py +1 -1
  57. waldiez/running/standard_runner.py +84 -277
  58. waldiez/running/step_by_step/__init__.py +46 -0
  59. waldiez/running/step_by_step/breakpoints_mixin.py +188 -0
  60. waldiez/running/step_by_step/step_by_step_models.py +224 -0
  61. waldiez/running/step_by_step/step_by_step_runner.py +745 -0
  62. waldiez/running/subprocess_runner/__base__.py +282 -0
  63. waldiez/running/subprocess_runner/__init__.py +16 -0
  64. waldiez/running/subprocess_runner/_async_runner.py +362 -0
  65. waldiez/running/subprocess_runner/_sync_runner.py +455 -0
  66. waldiez/running/subprocess_runner/runner.py +561 -0
  67. waldiez/running/timeline_processor.py +1 -1
  68. waldiez/running/utils.py +376 -1
  69. waldiez/utils/version.py +2 -6
  70. waldiez/ws/__init__.py +70 -0
  71. waldiez/ws/__main__.py +15 -0
  72. waldiez/ws/_file_handler.py +201 -0
  73. waldiez/ws/cli.py +211 -0
  74. waldiez/ws/client_manager.py +835 -0
  75. waldiez/ws/errors.py +416 -0
  76. waldiez/ws/models.py +971 -0
  77. waldiez/ws/reloader.py +342 -0
  78. waldiez/ws/server.py +469 -0
  79. waldiez/ws/session_manager.py +393 -0
  80. waldiez/ws/session_stats.py +83 -0
  81. waldiez/ws/utils.py +385 -0
  82. {waldiez-0.5.8.dist-info → waldiez-0.5.10.dist-info}/METADATA +74 -74
  83. {waldiez-0.5.8.dist-info → waldiez-0.5.10.dist-info}/RECORD +87 -65
  84. waldiez/running/patch_io_stream.py +0 -210
  85. {waldiez-0.5.8.dist-info → waldiez-0.5.10.dist-info}/WHEEL +0 -0
  86. {waldiez-0.5.8.dist-info → waldiez-0.5.10.dist-info}/entry_points.txt +0 -0
  87. {waldiez-0.5.8.dist-info → waldiez-0.5.10.dist-info}/licenses/LICENSE +0 -0
  88. {waldiez-0.5.8.dist-info → waldiez-0.5.10.dist-info}/licenses/NOTICE.md +0 -0
waldiez/ws/utils.py ADDED
@@ -0,0 +1,385 @@
1
+ # SPDX-License-Identifier: Apache-2.0.
2
+ # Copyright (c) 2024 - 2025 Waldiez and contributors.
3
+ """Utilities for WebSocket server management."""
4
+
5
+ import asyncio
6
+ import json
7
+ import logging
8
+ import socket
9
+ import time
10
+ from contextlib import closing
11
+ from dataclasses import asdict, dataclass
12
+ from typing import TYPE_CHECKING, Any
13
+
14
+ import websockets
15
+
16
+ if TYPE_CHECKING:
17
+ from .server import WaldiezWsServer
18
+
19
+
20
+ @dataclass
21
+ class ErrorStats:
22
+ """Error stats."""
23
+
24
+ total_errors: int
25
+ error_counts: dict[str, int]
26
+ most_common_error: str | None = None
27
+
28
+ def to_dict(self) -> dict[str, Any]:
29
+ """Convert to dictionary.
30
+
31
+ Returns
32
+ -------
33
+ dict[str, Any]
34
+ Dictionary representation of the error stats
35
+ """
36
+ return asdict(self)
37
+
38
+
39
+ @dataclass
40
+ class ServerHealth:
41
+ """Server health status."""
42
+
43
+ status: str # "healthy", "degraded", "unhealthy"
44
+ uptime_seconds: float
45
+ active_connections: int
46
+ total_connections: int
47
+ messages_received: int
48
+ messages_sent: int
49
+ memory_usage_mb: float | None = None
50
+ timestamp: float = 0.0
51
+ error_stats: ErrorStats | None = None
52
+
53
+ def __post_init__(self) -> None:
54
+ """Set timestamp after initialization."""
55
+ if self.timestamp == 0.0:
56
+ self.timestamp = time.time()
57
+ if not self.error_stats:
58
+ self.error_stats = ErrorStats(
59
+ total_errors=0, error_counts={}, most_common_error=None
60
+ )
61
+
62
+ def to_dict(self) -> dict[str, Any]:
63
+ """Convert to dictionary.
64
+
65
+ Returns
66
+ -------
67
+ dict[str, Any]
68
+ Dictionary representation of the health status
69
+ """
70
+ my_dict = asdict(self)
71
+ my_dict["error_stats"] = (
72
+ self.error_stats.to_dict() if self.error_stats else None
73
+ )
74
+ return my_dict
75
+
76
+
77
+ class HealthChecker:
78
+ """Health checker for WebSocket server."""
79
+
80
+ def __init__(self, server: "WaldiezWsServer"):
81
+ """Initialize health checker.
82
+
83
+ Parameters
84
+ ----------
85
+ server : WaldiezWsServer
86
+ Server instance to monitor
87
+ """
88
+ self.server = server
89
+ self.check_interval = 30.0 # seconds
90
+ self.task: asyncio.Task[Any] | None = None
91
+ self.last_health: ServerHealth | None = None
92
+
93
+ def start(self) -> None:
94
+ """Start health monitoring."""
95
+ if self.task and not self.task.done():
96
+ return
97
+
98
+ self.task = asyncio.create_task(self._monitor_loop())
99
+
100
+ def stop(self) -> None:
101
+ """Stop health monitoring."""
102
+ if self.task and not self.task.done(): # pragma: no branch
103
+ self.task.cancel()
104
+
105
+ async def _monitor_loop(self) -> None:
106
+ """Health monitoring loop."""
107
+ while True:
108
+ # pylint: disable=too-many-try-statements,broad-exception-caught
109
+ try:
110
+ await asyncio.sleep(self.check_interval)
111
+ health = await self.check_health()
112
+ self.last_health = health
113
+
114
+ # Log health status
115
+ if health.status != "healthy":
116
+ logger = logging.getLogger(__name__)
117
+ logger.warning("Server health: %s", health.status)
118
+
119
+ except asyncio.CancelledError:
120
+ break
121
+ except Exception as e:
122
+ logger = logging.getLogger(__name__)
123
+ logger.error("Health check error: %s", e)
124
+
125
+ async def check_health(self) -> ServerHealth:
126
+ """Check server health.
127
+
128
+ Returns
129
+ -------
130
+ ServerHealth
131
+ Current health status
132
+ """
133
+ stats = self.server.get_stats()
134
+ # error_handler = self.server.error_handler
135
+
136
+ # Determine health status
137
+ status = "healthy"
138
+
139
+ # Check for error rate
140
+ total_messages = stats["messages_received"] + stats["messages_sent"]
141
+ if total_messages > 0:
142
+ error_rate = stats["errors_total"] / total_messages
143
+ if error_rate > 0.1: # More than 10% errors
144
+ status = "unhealthy"
145
+ elif error_rate > 0.05: # More than 5% errors
146
+ status = "degraded"
147
+
148
+ # Check if server is running
149
+ if not stats["is_running"]:
150
+ status = "unhealthy"
151
+
152
+ # Get memory usage (optional)
153
+ memory_usage: float | None = None
154
+ try:
155
+ # pylint: disable=import-outside-toplevel
156
+ # noinspection PyUnusedImports
157
+ import psutil
158
+
159
+ process = psutil.Process()
160
+ memory_usage = process.memory_info().rss / 1024 / 1024 # MB
161
+ except ImportError:
162
+ pass
163
+
164
+ return ServerHealth(
165
+ status=status,
166
+ uptime_seconds=stats["uptime_seconds"],
167
+ active_connections=stats["connections_active"],
168
+ total_connections=stats["connections_total"],
169
+ messages_received=stats["messages_received"],
170
+ messages_sent=stats["messages_sent"],
171
+ memory_usage_mb=memory_usage,
172
+ error_stats=stats["error_stats"],
173
+ )
174
+
175
+ def get_last_health(self) -> ServerHealth | None:
176
+ """Get last health check result.
177
+
178
+ Returns
179
+ -------
180
+ Optional[ServerHealth]
181
+ Last health status or None if no check performed
182
+ """
183
+ return self.last_health
184
+
185
+
186
+ # noinspection PyBroadException
187
+ class ConnectionManager:
188
+ """Manages WebSocket connections and provides utilities."""
189
+
190
+ def __init__(self, server: "WaldiezWsServer"):
191
+ """Initialize connection manager.
192
+
193
+ Parameters
194
+ ----------
195
+ server : WaldiezWsServer
196
+ Server instance
197
+ """
198
+ self.server = server
199
+
200
+ async def ping_all_clients(self) -> dict[str, bool]:
201
+ """Ping all connected clients.
202
+
203
+ Returns
204
+ -------
205
+ dict[str, bool]
206
+ Map of client_id to ping success status
207
+ """
208
+ results: dict[str, bool] = {}
209
+ ping_message: dict[str, Any] = {
210
+ "type": "pong",
211
+ "timestamp": time.time(),
212
+ }
213
+
214
+ for client_id, client in self.server.clients.items():
215
+ try:
216
+ success = await client.send_message(ping_message)
217
+ results[client_id] = success
218
+ except Exception: # pylint: disable=broad-exception-caught
219
+ results[client_id] = False
220
+
221
+ return results
222
+
223
+ async def disconnect_client(
224
+ self, client_id: str, reason: str = "Server initiated"
225
+ ) -> bool:
226
+ """Disconnect a specific client.
227
+
228
+ Parameters
229
+ ----------
230
+ client_id : str
231
+ Client to disconnect
232
+ reason : str
233
+ Disconnection reason
234
+
235
+ Returns
236
+ -------
237
+ bool
238
+ True if client was disconnected successfully
239
+ """
240
+ if client_id not in self.server.clients:
241
+ return False
242
+
243
+ client = self.server.clients[client_id]
244
+ try:
245
+ await client.send_message(
246
+ {
247
+ "type": "disconnect",
248
+ "reason": reason,
249
+ "timestamp": time.time(),
250
+ }
251
+ )
252
+ await client.websocket.close(code=1000, reason=reason)
253
+ return True
254
+ except Exception: # pylint: disable=broad-exception-caught
255
+ return False
256
+
257
+ def get_client_info(self, client_id: str) -> dict[str, Any] | None:
258
+ """Get information about a specific client.
259
+
260
+ Parameters
261
+ ----------
262
+ client_id : str
263
+ Client ID
264
+
265
+ Returns
266
+ -------
267
+ dict[str, Any] | None
268
+ Client information or None if not found
269
+ """
270
+ if client_id not in self.server.clients:
271
+ return None
272
+
273
+ client = self.server.clients[client_id]
274
+ return {
275
+ "client_id": client_id,
276
+ "remote_address": client.remote_address,
277
+ "user_agent": client.user_agent,
278
+ "is_active": client.is_active,
279
+ "connection_time": client.connection_time,
280
+ "connection_duration": client.connection_duration,
281
+ }
282
+
283
+ def list_clients(self) -> dict[str, dict[str, Any]]:
284
+ """List all connected clients.
285
+
286
+ Returns
287
+ -------
288
+ dict[str, dict[str, Any]]
289
+ Map of client_id to client information
290
+ """
291
+ clients = {
292
+ client_id: self.get_client_info(client_id)
293
+ for client_id in self.server.clients
294
+ }
295
+ return {
296
+ client_id: info
297
+ for client_id, info in clients.items()
298
+ if info is not None
299
+ }
300
+
301
+
302
+ async def test_server_connection(
303
+ host: str = "localhost", port: int = 8765, timeout: float = 5.0
304
+ ) -> dict[str, Any]:
305
+ """Test connection to WebSocket server.
306
+
307
+ Parameters
308
+ ----------
309
+ host : str
310
+ Server host
311
+ port : int
312
+ Server port
313
+ timeout : float
314
+ Connection timeout
315
+
316
+ Returns
317
+ -------
318
+ dict[str, Any]
319
+ Test results
320
+ """
321
+ start_time = time.time()
322
+ result: dict[str, Any] = {
323
+ "success": False,
324
+ "error": None,
325
+ "response_time_ms": 0.0,
326
+ "server_response": None,
327
+ }
328
+ # pylint: disable=too-many-try-statements,broad-exception-caught
329
+ try:
330
+ uri = f"ws://{host}:{port}"
331
+
332
+ async with websockets.connect(uri, ping_interval=None) as websocket:
333
+ # Send ping message
334
+ ping_msg = {"action": "ping"}
335
+ await websocket.send(json.dumps(ping_msg))
336
+
337
+ # Wait for response
338
+ response = await asyncio.wait_for(websocket.recv(), timeout=timeout)
339
+ result["server_response"] = json.loads(response)
340
+ result["success"] = True
341
+
342
+ except asyncio.TimeoutError:
343
+ result["error"] = "Connection timeout"
344
+ except ConnectionRefusedError:
345
+ result["error"] = "Connection refused - server may not be running"
346
+ except Exception as e:
347
+ result["error"] = str(e)
348
+
349
+ result["response_time_ms"] = (time.time() - start_time) * 1000
350
+ return result
351
+
352
+
353
+ def is_port_available(port: int) -> bool:
354
+ """Check if the port is available.
355
+
356
+ Parameters
357
+ ----------
358
+ port : int
359
+ Port number
360
+
361
+ Returns
362
+ -------
363
+ bool
364
+ True if port is available
365
+ """
366
+ try:
367
+ with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as sock:
368
+ sock.bind(("", port))
369
+ return True
370
+ except OSError:
371
+ return False
372
+
373
+
374
+ def get_available_port() -> int:
375
+ """Get an available port.
376
+
377
+ Returns
378
+ -------
379
+ int
380
+ An available port number
381
+ """
382
+ with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as soc:
383
+ soc.bind(("", 0))
384
+ soc.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
385
+ return soc.getsockname()[1]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: waldiez
3
- Version: 0.5.8
3
+ Version: 0.5.10
4
4
  Dynamic: Keywords
5
5
  Summary: Make AG2 Agents Collaborate: Drag, Drop, and Orchestrate with Waldiez.
6
6
  Project-URL: Homepage, https://waldiez.io
@@ -27,11 +27,10 @@ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
27
27
  Classifier: Topic :: Software Development :: Code Generators
28
28
  Classifier: Typing :: Typed
29
29
  Requires-Python: <3.14,>=3.10
30
- Requires-Dist: ag2[openai]==0.9.7
30
+ Requires-Dist: ag2[openai]==0.9.9
31
31
  Requires-Dist: aiocsv==1.3.2
32
32
  Requires-Dist: aiofiles==24.1.0
33
33
  Requires-Dist: aiosqlite==0.21.0
34
- Requires-Dist: asyncer==0.0.8
35
34
  Requires-Dist: click<8.2
36
35
  Requires-Dist: graphviz<=0.21
37
36
  Requires-Dist: httpx<1
@@ -43,50 +42,55 @@ Requires-Dist: parso==0.8.4
43
42
  Requires-Dist: pillow
44
43
  Requires-Dist: pip>=25.1.1
45
44
  Requires-Dist: platformdirs==4.3.8
45
+ Requires-Dist: psutil==7.0.0
46
46
  Requires-Dist: pydantic<3,>=2.10.2
47
- Requires-Dist: rpds-py==0.26.0
47
+ Requires-Dist: rpds-py==0.27.0
48
48
  Requires-Dist: typer<1,>=0.9.0
49
+ Requires-Dist: watchdog==6.0.0
50
+ Requires-Dist: websockets==15.0.1
49
51
  Provides-Extra: ag2-extras
50
- Requires-Dist: ag2[anthropic]==0.9.7; extra == 'ag2-extras'
51
- Requires-Dist: ag2[autobuild]==0.9.7; extra == 'ag2-extras'
52
- Requires-Dist: ag2[bedrock]==0.9.7; extra == 'ag2-extras'
53
- Requires-Dist: ag2[blendsearch]==0.9.7; extra == 'ag2-extras'
54
- Requires-Dist: ag2[cohere]==0.9.7; extra == 'ag2-extras'
55
- Requires-Dist: ag2[commsagent-discord]==0.9.7; extra == 'ag2-extras'
56
- Requires-Dist: ag2[commsagent-slack]==0.9.7; extra == 'ag2-extras'
57
- Requires-Dist: ag2[commsagent-telegram]==0.9.7; extra == 'ag2-extras'
58
- Requires-Dist: ag2[crawl4ai]==0.9.7; extra == 'ag2-extras'
59
- Requires-Dist: ag2[duckduckgo]==0.9.7; extra == 'ag2-extras'
60
- Requires-Dist: ag2[gemini-realtime]==0.9.7; (sys_platform != 'win32') and extra == 'ag2-extras'
61
- Requires-Dist: ag2[gemini-realtime]==0.9.7; (sys_platform == 'win32' and platform_machine != 'arm64' and platform_machine != 'aarch64' and platform_machine != 'ARM64' and platform_machine != 'AARCH64') and extra == 'ag2-extras'
62
- Requires-Dist: ag2[gemini]==0.9.7; (sys_platform != 'win32') and extra == 'ag2-extras'
63
- Requires-Dist: ag2[gemini]==0.9.7; (sys_platform == 'win32' and platform_machine != 'arm64' and platform_machine != 'aarch64' and platform_machine != 'ARM64' and platform_machine != 'AARCH64') and extra == 'ag2-extras'
64
- Requires-Dist: ag2[google-api]==0.9.7; extra == 'ag2-extras'
65
- Requires-Dist: ag2[google-client]==0.9.7; extra == 'ag2-extras'
66
- Requires-Dist: ag2[google-search]==0.9.7; extra == 'ag2-extras'
67
- Requires-Dist: ag2[groq]==0.9.7; extra == 'ag2-extras'
68
- Requires-Dist: ag2[interop-crewai]==0.9.7; extra == 'ag2-extras'
69
- Requires-Dist: ag2[interop-langchain]==0.9.7; extra == 'ag2-extras'
70
- Requires-Dist: ag2[lmm]==0.9.7; extra == 'ag2-extras'
71
- Requires-Dist: ag2[mcp]==0.9.7; extra == 'ag2-extras'
72
- Requires-Dist: ag2[mistral]==0.9.7; extra == 'ag2-extras'
73
- Requires-Dist: ag2[neo4j]==0.9.7; (sys_platform != 'win32') and extra == 'ag2-extras'
74
- Requires-Dist: ag2[neo4j]==0.9.7; (sys_platform == 'win32' and platform_machine != 'arm64' and platform_machine != 'aarch64' and platform_machine != 'ARM64' and platform_machine != 'AARCH64') and extra == 'ag2-extras'
75
- Requires-Dist: ag2[ollama]==0.9.7; extra == 'ag2-extras'
76
- Requires-Dist: ag2[openai-realtime]==0.9.7; extra == 'ag2-extras'
77
- Requires-Dist: ag2[rag]==0.9.7; extra == 'ag2-extras'
78
- Requires-Dist: ag2[redis]==0.9.7; extra == 'ag2-extras'
79
- Requires-Dist: ag2[tavily]==0.9.7; extra == 'ag2-extras'
80
- Requires-Dist: ag2[together]==0.9.7; (sys_platform != 'win32') and extra == 'ag2-extras'
81
- Requires-Dist: ag2[together]==0.9.7; (sys_platform == 'win32' and platform_machine != 'arm64' and platform_machine != 'aarch64' and platform_machine != 'ARM64' and platform_machine != 'AARCH64') and extra == 'ag2-extras'
82
- Requires-Dist: ag2[twilio]==0.9.7; extra == 'ag2-extras'
83
- Requires-Dist: ag2[websockets]==0.9.7; extra == 'ag2-extras'
84
- Requires-Dist: ag2[websurfer]==0.9.7; extra == 'ag2-extras'
85
- Requires-Dist: ag2[wikipedia]==0.9.7; extra == 'ag2-extras'
52
+ Requires-Dist: ag2[anthropic]==0.9.9; extra == 'ag2-extras'
53
+ Requires-Dist: ag2[autobuild]==0.9.9; extra == 'ag2-extras'
54
+ Requires-Dist: ag2[bedrock]==0.9.9; extra == 'ag2-extras'
55
+ Requires-Dist: ag2[blendsearch]==0.9.9; extra == 'ag2-extras'
56
+ Requires-Dist: ag2[cohere]==0.9.9; extra == 'ag2-extras'
57
+ Requires-Dist: ag2[commsagent-discord]==0.9.9; extra == 'ag2-extras'
58
+ Requires-Dist: ag2[commsagent-slack]==0.9.9; extra == 'ag2-extras'
59
+ Requires-Dist: ag2[commsagent-telegram]==0.9.9; extra == 'ag2-extras'
60
+ Requires-Dist: ag2[crawl4ai]==0.9.9; extra == 'ag2-extras'
61
+ Requires-Dist: ag2[duckduckgo]==0.9.9; extra == 'ag2-extras'
62
+ Requires-Dist: ag2[google-api]==0.9.9; extra == 'ag2-extras'
63
+ Requires-Dist: ag2[google-client]==0.9.9; extra == 'ag2-extras'
64
+ Requires-Dist: ag2[google-search]==0.9.9; extra == 'ag2-extras'
65
+ Requires-Dist: ag2[groq]==0.9.9; extra == 'ag2-extras'
66
+ Requires-Dist: ag2[interop-crewai]==0.9.9; extra == 'ag2-extras'
67
+ Requires-Dist: ag2[interop-langchain]==0.9.9; extra == 'ag2-extras'
68
+ Requires-Dist: ag2[lmm]==0.9.9; extra == 'ag2-extras'
69
+ Requires-Dist: ag2[mcp]==0.9.9; extra == 'ag2-extras'
70
+ Requires-Dist: ag2[mistral]==0.9.9; extra == 'ag2-extras'
71
+ Requires-Dist: ag2[neo4j]==0.9.9; (sys_platform != 'win32') and extra == 'ag2-extras'
72
+ Requires-Dist: ag2[neo4j]==0.9.9; (sys_platform == 'win32' and platform_machine != 'arm64' and platform_machine != 'aarch64' and platform_machine != 'ARM64' and platform_machine != 'AARCH64') and extra == 'ag2-extras'
73
+ Requires-Dist: ag2[ollama]==0.9.9; extra == 'ag2-extras'
74
+ Requires-Dist: ag2[openai-realtime]==0.9.9; extra == 'ag2-extras'
75
+ Requires-Dist: ag2[redis]==0.9.9; extra == 'ag2-extras'
76
+ Requires-Dist: ag2[tavily]==0.9.9; extra == 'ag2-extras'
77
+ Requires-Dist: ag2[together]==0.9.9; (sys_platform != 'win32') and extra == 'ag2-extras'
78
+ Requires-Dist: ag2[together]==0.9.9; (sys_platform == 'win32' and platform_machine != 'arm64' and platform_machine != 'aarch64' and platform_machine != 'ARM64' and platform_machine != 'AARCH64') and extra == 'ag2-extras'
79
+ Requires-Dist: ag2[twilio]==0.9.9; extra == 'ag2-extras'
80
+ Requires-Dist: ag2[websockets]==0.9.9; extra == 'ag2-extras'
81
+ Requires-Dist: ag2[websurfer]==0.9.9; extra == 'ag2-extras'
82
+ Requires-Dist: ag2[wikipedia]==0.9.9; extra == 'ag2-extras'
83
+ Requires-Dist: chromadb<2,>=0.5; extra == 'ag2-extras'
86
84
  Requires-Dist: chromadb>=0.5.10; (sys_platform != 'win32') and extra == 'ag2-extras'
87
85
  Requires-Dist: chromadb>=0.5.10; (sys_platform == 'win32' and platform_machine != 'arm64' and platform_machine != 'aarch64' and platform_machine != 'ARM64' and platform_machine != 'AARCH64') and extra == 'ag2-extras'
88
86
  Requires-Dist: couchbase>=4.4.0; extra == 'ag2-extras'
87
+ Requires-Dist: docling<3,>=2.15.1; extra == 'ag2-extras'
89
88
  Requires-Dist: fastembed>=0.3.1; extra == 'ag2-extras'
89
+ Requires-Dist: llama-index-embeddings-huggingface; extra == 'ag2-extras'
90
+ Requires-Dist: llama-index-llms-langchain; extra == 'ag2-extras'
91
+ Requires-Dist: llama-index-vector-stores-chroma; extra == 'ag2-extras'
92
+ Requires-Dist: llama-index-vector-stores-mongodb; extra == 'ag2-extras'
93
+ Requires-Dist: llama-index<1,>=0.12; extra == 'ag2-extras'
90
94
  Requires-Dist: pgvector>=0.4.0; extra == 'ag2-extras'
91
95
  Requires-Dist: psycopg>=3.2.6; (sys_platform == 'linux') and extra == 'ag2-extras'
92
96
  Requires-Dist: psycopg>=3.2.6; (sys_platform == 'win32' and platform_machine == 'AARCH64') and extra == 'ag2-extras'
@@ -98,20 +102,23 @@ Requires-Dist: pydantic-ai>=0.0.21; extra == 'ag2-extras'
98
102
  Requires-Dist: pymongo>=4.11; extra == 'ag2-extras'
99
103
  Requires-Dist: qdrant-client[fastembed]; (sys_platform != 'win32') and extra == 'ag2-extras'
100
104
  Requires-Dist: qdrant-client[fastembed]; (sys_platform == 'win32' and platform_machine != 'arm64' and platform_machine != 'aarch64' and platform_machine != 'ARM64' and platform_machine != 'AARCH64') and extra == 'ag2-extras'
105
+ Requires-Dist: requests<3,>=2.32.3; extra == 'ag2-extras'
106
+ Requires-Dist: selenium<5,>=4.28.1; extra == 'ag2-extras'
107
+ Requires-Dist: webdriver-manager==4.0.2; extra == 'ag2-extras'
101
108
  Provides-Extra: dev
102
- Requires-Dist: ag2[redis]==0.9.7; extra == 'dev'
103
- Requires-Dist: ag2[websockets]==0.9.7; extra == 'dev'
109
+ Requires-Dist: ag2[redis]==0.9.9; extra == 'dev'
110
+ Requires-Dist: ag2[websockets]==0.9.9; extra == 'dev'
104
111
  Requires-Dist: autoflake==2.3.1; extra == 'dev'
105
112
  Requires-Dist: bandit==1.8.6; extra == 'dev'
106
113
  Requires-Dist: black[jupyter]==25.1.0; extra == 'dev'
107
114
  Requires-Dist: build==1.3.0; extra == 'dev'
108
- Requires-Dist: fakeredis==2.30.3; extra == 'dev'
109
- Requires-Dist: fastjsonschema>=2.21.1; extra == 'dev'
115
+ Requires-Dist: fakeredis==2.31.0; extra == 'dev'
116
+ Requires-Dist: fastjsonschema>=2.21.2; extra == 'dev'
110
117
  Requires-Dist: flake8==7.3.0; extra == 'dev'
111
118
  Requires-Dist: hatchling==1.27.0; extra == 'dev'
112
- Requires-Dist: jsonschema==4.25.0; extra == 'dev'
119
+ Requires-Dist: jsonschema==4.25.1; extra == 'dev'
113
120
  Requires-Dist: jupyter-server==2.16.0; extra == 'dev'
114
- Requires-Dist: jupyterlab==4.4.5; extra == 'dev'
121
+ Requires-Dist: jupyterlab==4.4.6; extra == 'dev'
115
122
  Requires-Dist: mypy-extensions>=1.1.0; extra == 'dev'
116
123
  Requires-Dist: mypy==1.17.1; extra == 'dev'
117
124
  Requires-Dist: nbclient>=0.10.2; extra == 'dev'
@@ -121,17 +128,18 @@ Requires-Dist: nodeenv>=1.9.1; extra == 'dev'
121
128
  Requires-Dist: notebook-shim>=0.2.4; extra == 'dev'
122
129
  Requires-Dist: paho-mqtt<3.0,>=2.1.0; extra == 'dev'
123
130
  Requires-Dist: pandas-stubs==2.3.0.250703; extra == 'dev'
124
- Requires-Dist: pre-commit==4.2.0; extra == 'dev'
131
+ Requires-Dist: pre-commit==4.3.0; extra == 'dev'
125
132
  Requires-Dist: pydocstyle==6.3.0; extra == 'dev'
126
- Requires-Dist: pylint==3.3.7; extra == 'dev'
133
+ Requires-Dist: pylint==3.3.8; extra == 'dev'
127
134
  Requires-Dist: python-dotenv>=1.1.1; extra == 'dev'
128
- Requires-Dist: ruff==0.12.7; extra == 'dev'
135
+ Requires-Dist: ruff==0.12.9; extra == 'dev'
129
136
  Requires-Dist: toml==0.10.2; (python_version <= '3.10') and extra == 'dev'
130
- Requires-Dist: types-aiofiles==24.1.0.20250801; extra == 'dev'
131
- Requires-Dist: types-jsonschema==4.25.0.20250720; extra == 'dev'
132
- Requires-Dist: types-pyyaml==6.0.12.20250516; extra == 'dev'
137
+ Requires-Dist: types-aiofiles==24.1.0.20250809; extra == 'dev'
138
+ Requires-Dist: types-jsonschema==4.25.0.20250809; extra == 'dev'
139
+ Requires-Dist: types-psutil==7.0.0.20250801; extra == 'dev'
140
+ Requires-Dist: types-pyyaml==6.0.12.20250809; extra == 'dev'
133
141
  Requires-Dist: types-redis==4.6.0.20241004; extra == 'dev'
134
- Requires-Dist: types-requests==2.32.4.20250611; extra == 'dev'
142
+ Requires-Dist: types-requests==2.32.4.20250809; extra == 'dev'
135
143
  Requires-Dist: types-toml==0.10.8.20240310; extra == 'dev'
136
144
  Requires-Dist: watchdog==6.0.0; extra == 'dev'
137
145
  Requires-Dist: yamllint==1.37.1; extra == 'dev'
@@ -142,43 +150,43 @@ Requires-Dist: mdx-truly-sane-lists==1.3; extra == 'docs'
142
150
  Requires-Dist: mkdocs-autorefs==1.4.2; extra == 'docs'
143
151
  Requires-Dist: mkdocs-awesome-nav==3.1.2; extra == 'docs'
144
152
  Requires-Dist: mkdocs-jupyter==0.25.1; extra == 'docs'
145
- Requires-Dist: mkdocs-macros-plugin==1.3.7; extra == 'docs'
146
- Requires-Dist: mkdocs-material==9.6.16; extra == 'docs'
153
+ Requires-Dist: mkdocs-macros-plugin==1.3.9; extra == 'docs'
154
+ Requires-Dist: mkdocs-material==9.6.17; extra == 'docs'
147
155
  Requires-Dist: mkdocs-minify-html-plugin==0.3.4; extra == 'docs'
148
156
  Requires-Dist: mkdocs-open-in-new-tab==1.0.8; extra == 'docs'
149
157
  Requires-Dist: mkdocs==1.6.1; extra == 'docs'
150
158
  Requires-Dist: mkdocstrings-crystal==0.3.7; extra == 'docs'
151
- Requires-Dist: mkdocstrings-python==1.16.12; extra == 'docs'
159
+ Requires-Dist: mkdocstrings-python==1.17.0; extra == 'docs'
152
160
  Requires-Dist: mkdocstrings[crystal,python]==0.30.0; extra == 'docs'
153
161
  Requires-Dist: natsort==8.4.0; extra == 'docs'
154
162
  Provides-Extra: jupyter
155
163
  Requires-Dist: ipywidgets==8.1.7; extra == 'jupyter'
156
164
  Requires-Dist: jupyter-server==2.16.0; extra == 'jupyter'
157
- Requires-Dist: jupyterlab==4.4.5; extra == 'jupyter'
158
- Requires-Dist: waldiez-jupyter==0.5.8; extra == 'jupyter'
165
+ Requires-Dist: jupyterlab==4.4.6; extra == 'jupyter'
166
+ Requires-Dist: waldiez-jupyter==0.5.10; extra == 'jupyter'
159
167
  Provides-Extra: mqtt
160
168
  Requires-Dist: paho-mqtt<3.0,>=2.1.0; extra == 'mqtt'
161
169
  Provides-Extra: redis
162
- Requires-Dist: ag2[redis]==0.9.7; extra == 'redis'
170
+ Requires-Dist: ag2[redis]==0.9.9; extra == 'redis'
163
171
  Provides-Extra: runner
164
- Requires-Dist: waldiez-runner==0.5.8; (python_version >= '3.11') and extra == 'runner'
172
+ Requires-Dist: waldiez-runner==0.5.10; (python_version >= '3.11') and extra == 'runner'
165
173
  Provides-Extra: studio
166
- Requires-Dist: waldiez-studio==0.5.8; extra == 'studio'
174
+ Requires-Dist: waldiez-studio==0.5.10; extra == 'studio'
167
175
  Provides-Extra: test
168
- Requires-Dist: ag2[redis]==0.9.7; extra == 'test'
169
- Requires-Dist: ag2[websockets]==0.9.7; extra == 'test'
170
- Requires-Dist: fakeredis==2.30.3; extra == 'test'
176
+ Requires-Dist: ag2[redis]==0.9.9; extra == 'test'
177
+ Requires-Dist: ag2[websockets]==0.9.9; extra == 'test'
178
+ Requires-Dist: fakeredis==2.31.0; extra == 'test'
171
179
  Requires-Dist: paho-mqtt<3.0,>=2.1.0; extra == 'test'
172
180
  Requires-Dist: pytest-asyncio==1.1.0; extra == 'test'
173
181
  Requires-Dist: pytest-cov==6.2.1; extra == 'test'
174
182
  Requires-Dist: pytest-env==1.1.5; extra == 'test'
175
183
  Requires-Dist: pytest-html==4.1.1; extra == 'test'
176
- Requires-Dist: pytest-sugar==1.0.0; extra == 'test'
184
+ Requires-Dist: pytest-sugar==1.1.0; extra == 'test'
177
185
  Requires-Dist: pytest-timeout==2.4.0; extra == 'test'
178
186
  Requires-Dist: pytest-xdist==3.8.0; extra == 'test'
179
187
  Requires-Dist: pytest==8.4.1; extra == 'test'
180
188
  Provides-Extra: websockets
181
- Requires-Dist: ag2[websockets]==0.9.7; extra == 'websockets'
189
+ Requires-Dist: ag2[websockets]==0.9.9; extra == 'websockets'
182
190
  Description-Content-Type: text/markdown
183
191
 
184
192
  # Waldiez
@@ -344,14 +352,6 @@ runner = WaldiezRunner.load(Path(flow_path))
344
352
  runner.run(output_path=output_path)
345
353
  ```
346
354
 
347
- ### Tools
348
-
349
- - [ag2 (formerly AutoGen)](https://github.com/ag2ai/ag2)
350
- - [juptytext](https://github.com/mwouts/jupytext)
351
- - [pydantic](https://github.com/pydantic/pydantic)
352
- - [typer](https://github.com/fastapi/typer)
353
- - [asyncer](https://github.com/fastapi/asyncer)
354
-
355
355
  ## Known Conflicts
356
356
 
357
357
  - **autogen-agentchat**: This package conflicts with `ag2`. Ensure that `autogen-agentchat` is uninstalled before installing `waldiez`. If you have already installed `autogen-agentchat`, you can uninstall it with the following command: