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.
- waldiez/_version.py +1 -1
- waldiez/cli.py +112 -24
- waldiez/exporting/agent/exporter.py +3 -0
- waldiez/exporting/agent/extras/captain_agent_extras.py +44 -7
- waldiez/exporting/agent/extras/handoffs/condition.py +3 -1
- waldiez/exporting/chats/utils/common.py +25 -23
- waldiez/exporting/core/__init__.py +0 -2
- waldiez/exporting/core/context.py +13 -13
- waldiez/exporting/core/protocols.py +0 -141
- waldiez/exporting/core/result.py +5 -5
- waldiez/exporting/flow/merger.py +2 -2
- waldiez/exporting/flow/orchestrator.py +1 -0
- waldiez/exporting/flow/utils/common.py +2 -2
- waldiez/exporting/flow/utils/importing.py +1 -0
- waldiez/exporting/flow/utils/logging.py +6 -7
- waldiez/exporting/tools/exporter.py +5 -0
- waldiez/exporting/tools/factory.py +4 -0
- waldiez/exporting/tools/processor.py +5 -1
- waldiez/io/_ws.py +13 -5
- waldiez/io/models/content/image.py +1 -0
- waldiez/io/models/user_input.py +4 -4
- waldiez/io/models/user_response.py +1 -0
- waldiez/io/mqtt.py +1 -1
- waldiez/io/structured.py +17 -17
- waldiez/io/utils.py +1 -1
- waldiez/io/ws.py +9 -11
- waldiez/logger.py +180 -63
- waldiez/models/agents/agent/update_system_message.py +0 -2
- waldiez/models/agents/doc_agent/doc_agent.py +8 -1
- waldiez/models/common/dict_utils.py +169 -40
- waldiez/models/flow/flow.py +6 -6
- waldiez/models/flow/info.py +5 -1
- waldiez/models/model/_llm.py +28 -14
- waldiez/models/model/model.py +4 -1
- waldiez/models/model/model_data.py +18 -5
- waldiez/models/tool/predefined/_config.py +5 -1
- waldiez/models/tool/predefined/_duckduckgo.py +4 -0
- waldiez/models/tool/predefined/_email.py +474 -0
- waldiez/models/tool/predefined/_google.py +8 -6
- waldiez/models/tool/predefined/_perplexity.py +3 -0
- waldiez/models/tool/predefined/_searxng.py +3 -0
- waldiez/models/tool/predefined/_tavily.py +4 -1
- waldiez/models/tool/predefined/_wikipedia.py +4 -1
- waldiez/models/tool/predefined/_youtube.py +4 -1
- waldiez/models/tool/predefined/protocol.py +3 -0
- waldiez/models/tool/tool.py +22 -4
- waldiez/models/waldiez.py +12 -0
- waldiez/runner.py +37 -54
- waldiez/running/__init__.py +6 -0
- waldiez/running/base_runner.py +310 -353
- waldiez/running/environment.py +1 -0
- waldiez/running/exceptions.py +9 -0
- waldiez/running/post_run.py +4 -4
- waldiez/running/pre_run.py +51 -40
- waldiez/running/protocol.py +21 -101
- waldiez/running/run_results.py +1 -1
- waldiez/running/standard_runner.py +84 -277
- waldiez/running/step_by_step/__init__.py +46 -0
- waldiez/running/step_by_step/breakpoints_mixin.py +188 -0
- waldiez/running/step_by_step/step_by_step_models.py +224 -0
- waldiez/running/step_by_step/step_by_step_runner.py +745 -0
- waldiez/running/subprocess_runner/__base__.py +282 -0
- waldiez/running/subprocess_runner/__init__.py +16 -0
- waldiez/running/subprocess_runner/_async_runner.py +362 -0
- waldiez/running/subprocess_runner/_sync_runner.py +455 -0
- waldiez/running/subprocess_runner/runner.py +561 -0
- waldiez/running/timeline_processor.py +1 -1
- waldiez/running/utils.py +376 -1
- waldiez/utils/version.py +2 -6
- waldiez/ws/__init__.py +70 -0
- waldiez/ws/__main__.py +15 -0
- waldiez/ws/_file_handler.py +201 -0
- waldiez/ws/cli.py +211 -0
- waldiez/ws/client_manager.py +835 -0
- waldiez/ws/errors.py +416 -0
- waldiez/ws/models.py +971 -0
- waldiez/ws/reloader.py +342 -0
- waldiez/ws/server.py +469 -0
- waldiez/ws/session_manager.py +393 -0
- waldiez/ws/session_stats.py +83 -0
- waldiez/ws/utils.py +385 -0
- {waldiez-0.5.8.dist-info → waldiez-0.5.10.dist-info}/METADATA +74 -74
- {waldiez-0.5.8.dist-info → waldiez-0.5.10.dist-info}/RECORD +87 -65
- waldiez/running/patch_io_stream.py +0 -210
- {waldiez-0.5.8.dist-info → waldiez-0.5.10.dist-info}/WHEEL +0 -0
- {waldiez-0.5.8.dist-info → waldiez-0.5.10.dist-info}/entry_points.txt +0 -0
- {waldiez-0.5.8.dist-info → waldiez-0.5.10.dist-info}/licenses/LICENSE +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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.
|
|
51
|
-
Requires-Dist: ag2[autobuild]==0.9.
|
|
52
|
-
Requires-Dist: ag2[bedrock]==0.9.
|
|
53
|
-
Requires-Dist: ag2[blendsearch]==0.9.
|
|
54
|
-
Requires-Dist: ag2[cohere]==0.9.
|
|
55
|
-
Requires-Dist: ag2[commsagent-discord]==0.9.
|
|
56
|
-
Requires-Dist: ag2[commsagent-slack]==0.9.
|
|
57
|
-
Requires-Dist: ag2[commsagent-telegram]==0.9.
|
|
58
|
-
Requires-Dist: ag2[crawl4ai]==0.9.
|
|
59
|
-
Requires-Dist: ag2[duckduckgo]==0.9.
|
|
60
|
-
Requires-Dist: ag2[
|
|
61
|
-
Requires-Dist: ag2[
|
|
62
|
-
Requires-Dist: ag2[
|
|
63
|
-
Requires-Dist: ag2[
|
|
64
|
-
Requires-Dist: ag2[
|
|
65
|
-
Requires-Dist: ag2[
|
|
66
|
-
Requires-Dist: ag2[
|
|
67
|
-
Requires-Dist: ag2[
|
|
68
|
-
Requires-Dist: ag2[
|
|
69
|
-
Requires-Dist: ag2[
|
|
70
|
-
Requires-Dist: ag2[
|
|
71
|
-
Requires-Dist: ag2[
|
|
72
|
-
Requires-Dist: ag2[
|
|
73
|
-
Requires-Dist: ag2[
|
|
74
|
-
Requires-Dist: ag2[
|
|
75
|
-
Requires-Dist: ag2[
|
|
76
|
-
Requires-Dist: ag2[
|
|
77
|
-
Requires-Dist: ag2[
|
|
78
|
-
Requires-Dist: ag2[
|
|
79
|
-
Requires-Dist: ag2[
|
|
80
|
-
Requires-Dist: ag2[
|
|
81
|
-
Requires-Dist:
|
|
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.
|
|
103
|
-
Requires-Dist: ag2[websockets]==0.9.
|
|
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.
|
|
109
|
-
Requires-Dist: fastjsonschema>=2.21.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
131
|
-
Requires-Dist: types-jsonschema==4.25.0.
|
|
132
|
-
Requires-Dist: types-
|
|
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.
|
|
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.
|
|
146
|
-
Requires-Dist: mkdocs-material==9.6.
|
|
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.
|
|
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.
|
|
158
|
-
Requires-Dist: waldiez-jupyter==0.5.
|
|
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.
|
|
170
|
+
Requires-Dist: ag2[redis]==0.9.9; extra == 'redis'
|
|
163
171
|
Provides-Extra: runner
|
|
164
|
-
Requires-Dist: waldiez-runner==0.5.
|
|
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.
|
|
174
|
+
Requires-Dist: waldiez-studio==0.5.10; extra == 'studio'
|
|
167
175
|
Provides-Extra: test
|
|
168
|
-
Requires-Dist: ag2[redis]==0.9.
|
|
169
|
-
Requires-Dist: ag2[websockets]==0.9.
|
|
170
|
-
Requires-Dist: fakeredis==2.
|
|
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.
|
|
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.
|
|
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:
|