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

@@ -0,0 +1,123 @@
1
+ # SPDX-License-Identifier: Apache-2.0.
2
+ # Copyright (c) 2024 - 2025 Waldiez and contributors.
3
+ """Predefined YouTube search tool for Waldiez."""
4
+
5
+ import os
6
+ from typing import Any
7
+
8
+ from ._config import PredefinedToolConfig
9
+ from .protocol import PredefinedTool
10
+
11
+
12
+ class YouTubeSearchToolImpl(PredefinedTool):
13
+ """YouTube search tool for Waldiez."""
14
+
15
+ required_secrets: list[str] = ["YOUTUBE_API_KEY"]
16
+ required_kwargs: dict[str, type] = {
17
+ "youtube_search_engine_id": str,
18
+ }
19
+
20
+ @property
21
+ def name(self) -> str:
22
+ """Tool name."""
23
+ return "youtube_search"
24
+
25
+ @property
26
+ def description(self) -> str:
27
+ """Tool description."""
28
+ return "Search YouTube for a given query."
29
+
30
+ @property
31
+ def kwargs(self) -> dict[str, Any]:
32
+ """Keyword arguments for the tool, used for initialization."""
33
+ return {}
34
+
35
+ @property
36
+ def requirements(self) -> list[str]:
37
+ """Python requirements for the tool."""
38
+ return ["ag2[google-search, openai]"]
39
+
40
+ @property
41
+ def tags(self) -> list[str]:
42
+ """Tags for the tool, used for categorization."""
43
+ return ["youtube", "search", "video", "reference"]
44
+
45
+ @property
46
+ def tool_imports(self) -> list[str]:
47
+ """Imports required for the tool implementation."""
48
+ return [
49
+ "from autogen.tools.experimental import YoutubeSearchTool",
50
+ ]
51
+
52
+ def validate_secrets(self, secrets: dict[str, str]) -> list[str]:
53
+ """Validate secrets and return list of missing required ones.
54
+
55
+ Parameters
56
+ ----------
57
+ secrets : dict[str, str]
58
+ Dictionary of secrets/environment variables.
59
+
60
+ Returns
61
+ -------
62
+ list[str]
63
+ List of missing required secrets.
64
+ """
65
+ missing: list[str] = []
66
+ for secret in self.required_secrets:
67
+ if secret not in secrets:
68
+ missing.append(secret)
69
+ return missing
70
+
71
+ def validate_kwargs(self, kwargs: dict[str, Any]) -> list[str]:
72
+ """Validate keyword arguments and return list of missing required ones.
73
+
74
+ Parameters
75
+ ----------
76
+ kwargs : dict[str, Any]
77
+ Dictionary of keyword arguments.
78
+
79
+ Returns
80
+ -------
81
+ list[str]
82
+ List of missing required keyword arguments.
83
+ """
84
+ return []
85
+
86
+ def get_content(
87
+ self,
88
+ secrets: dict[str, str],
89
+ ) -> str:
90
+ """Get content for the tool.
91
+
92
+ Parameters
93
+ ----------
94
+ secrets : dict[str, str]
95
+ Dictionary of secrets/environment variables.
96
+
97
+ Returns
98
+ -------
99
+ str
100
+ The content for the tool.
101
+ """
102
+ os.environ["YOUTUBE_API_KEY"] = secrets.get("YOUTUBE_API_KEY", "")
103
+ content = f"""
104
+ youtube_api_key = os.environ.get("YOUTUBE_API_KEY", "")
105
+ if not youtube_api_key:
106
+ raise ValueError("YOUTUBE_API_KEY is required for YouTube search tool.")
107
+ {self.name} = YoutubeSearchTool(
108
+ youtube_api_key=youtube_api_key,
109
+ )
110
+ """
111
+ return content
112
+
113
+
114
+ YouTubeSearchTool = YouTubeSearchToolImpl()
115
+ YouTubeSearchConfig = PredefinedToolConfig(
116
+ name=YouTubeSearchTool.name,
117
+ description=YouTubeSearchTool.description,
118
+ required_secrets=YouTubeSearchTool.required_secrets,
119
+ required_kwargs=YouTubeSearchTool.required_kwargs,
120
+ requirements=YouTubeSearchTool.requirements,
121
+ tags=YouTubeSearchTool.tags,
122
+ implementation=YouTubeSearchTool,
123
+ )
@@ -0,0 +1,85 @@
1
+ # SPDX-License-Identifier: Apache-2.0.
2
+ # Copyright (c) 2024 - 2025 Waldiez and contributors.
3
+
4
+ """Predefined tool protocol definition for Waldiez."""
5
+
6
+ # pyright: reportReturnType=false
7
+ from typing import Any, Protocol, runtime_checkable
8
+
9
+
10
+ @runtime_checkable
11
+ class PredefinedTool(Protocol):
12
+ """Protocol for predefined tools in Waldiez."""
13
+
14
+ required_secrets: list[str]
15
+ required_kwargs: dict[str, type]
16
+
17
+ @property
18
+ def name(self) -> str:
19
+ """Tool name."""
20
+
21
+ @property
22
+ def description(self) -> str:
23
+ """Tool description."""
24
+
25
+ @property
26
+ def requirements(self) -> list[str]:
27
+ """Python requirements for the tool."""
28
+
29
+ @property
30
+ def tags(self) -> list[str]:
31
+ """Tags for the tool, used for categorization."""
32
+
33
+ @property
34
+ def tool_imports(self) -> list[str]:
35
+ """Imports required for the tool implementation."""
36
+
37
+ def get_content(
38
+ self,
39
+ secrets: dict[str, str],
40
+ ) -> str:
41
+ """Get the content of the tool.
42
+
43
+ Parameters
44
+ ----------
45
+ secrets : dict[str, str]
46
+ Dictionary of secrets/environment variables.
47
+
48
+ Returns
49
+ -------
50
+ str
51
+ Content of the tool.
52
+ """
53
+
54
+ def validate_secrets(self, secrets: dict[str, str]) -> list[str]:
55
+ """Validate secrets and return list of missing required ones.
56
+
57
+ Parameters
58
+ ----------
59
+ secrets : dict[str, str]
60
+ Dictionary of secrets/environment variables.
61
+
62
+ Returns
63
+ -------
64
+ list[str]
65
+ List of missing required secrets.
66
+ """
67
+
68
+ def validate_kwargs(self, kwargs: dict[str, Any]) -> list[str]:
69
+ """Validate keyword arguments and return list of missing required ones.
70
+
71
+ Parameters
72
+ ----------
73
+ kwargs : dict[str, Any]
74
+ Dictionary of keyword arguments.
75
+
76
+ Returns
77
+ -------
78
+ list[str]
79
+ List of missing required keyword arguments.
80
+
81
+ Raises
82
+ ------
83
+ ValueError
84
+ If any required keyword arguments are missing or of incorrect type.
85
+ """
@@ -0,0 +1,79 @@
1
+ # SPDX-License-Identifier: Apache-2.0.
2
+ # Copyright (c) 2024 - 2025 Waldiez and contributors.
3
+ """Predefined tools registry for Waldiez."""
4
+
5
+ from ._config import PredefinedToolConfig
6
+ from ._google import GoogleSearchConfig
7
+ from ._tavily import TavilySearchConfig
8
+ from ._wikipedia import WikipediaSearchConfig
9
+ from ._youtube import YouTubeSearchConfig
10
+
11
+ PREDEFINED_TOOLS: dict[str, PredefinedToolConfig] = {
12
+ GoogleSearchConfig.name: GoogleSearchConfig,
13
+ WikipediaSearchConfig.name: WikipediaSearchConfig,
14
+ YouTubeSearchConfig.name: YouTubeSearchConfig,
15
+ TavilySearchConfig.name: TavilySearchConfig,
16
+ }
17
+
18
+
19
+ def get_predefined_tool_config(tool_name: str) -> PredefinedToolConfig | None:
20
+ """Get configuration for a predefined tool.
21
+
22
+ Parameters
23
+ ----------
24
+ tool_name : str
25
+ Name of the tool to retrieve configuration for.
26
+
27
+ Returns
28
+ -------
29
+ PredefinedToolConfig | None
30
+ Configuration of the tool if it exists, otherwise None.
31
+ """
32
+ return PREDEFINED_TOOLS.get(tool_name)
33
+
34
+
35
+ def get_predefined_tool_requirements(tool_name: str) -> list[str]:
36
+ """Get requirements for a predefined tool.
37
+
38
+ Parameters
39
+ ----------
40
+ tool_name : str
41
+ Name of the tool to retrieve requirements for.
42
+
43
+ Returns
44
+ -------
45
+ list[str]
46
+ List of requirements for the tool,
47
+ or an empty list if the tool does not exist.
48
+ """
49
+ config = get_predefined_tool_config(tool_name)
50
+ return config.requirements if config else []
51
+
52
+
53
+ def get_predefined_tool_imports(tool_name: str) -> list[str]:
54
+ """Get imports for a predefined tool.
55
+
56
+ Parameters
57
+ ----------
58
+ tool_name : str
59
+ Name of the tool to retrieve imports for.
60
+
61
+ Returns
62
+ -------
63
+ list[str]
64
+ List of imports for the tool,
65
+ or an empty list if the tool does not exist.
66
+ """
67
+ config = get_predefined_tool_config(tool_name)
68
+ return config.implementation.tool_imports if config else []
69
+
70
+
71
+ def list_predefined_tools() -> list[str]:
72
+ """List all available predefined tools.
73
+
74
+ Returns
75
+ -------
76
+ list[str]
77
+ List of all predefined tool names.
78
+ """
79
+ return list(PREDEFINED_TOOLS.keys())
@@ -17,6 +17,10 @@ from ..common import (
17
17
  now,
18
18
  parse_code_string,
19
19
  )
20
+ from .predefined import (
21
+ get_predefined_tool_config,
22
+ list_predefined_tools,
23
+ )
20
24
  from .tool_data import WaldiezToolData
21
25
  from .tool_type import WaldiezToolType
22
26
 
@@ -179,6 +183,17 @@ class WaldiezTool(WaldiezBase):
179
183
  """
180
184
  return self.tool_type == "shared" or self.name == SHARED_TOOL_NAME
181
185
 
186
+ @property
187
+ def is_predefined(self) -> bool:
188
+ """Check if the tool is predefined.
189
+
190
+ Returns
191
+ -------
192
+ bool
193
+ True if the tool is predefined, False otherwise.
194
+ """
195
+ return self.tool_type == "predefined"
196
+
182
197
  @property
183
198
  def is_interop(self) -> bool:
184
199
  """Check if the tool is interoperability.
@@ -190,6 +205,16 @@ class WaldiezTool(WaldiezBase):
190
205
  """
191
206
  return self.tool_type in ("langchain", "crewai")
192
207
 
208
+ @property
209
+ def content(self) -> str:
210
+ """Get the content (source) of the tool."""
211
+ return self.data.content
212
+
213
+ @property
214
+ def secrets(self) -> dict[str, str]:
215
+ """Get the secrets (environment variables) of the tool."""
216
+ return self.data.secrets or {}
217
+
193
218
  def get_content(self) -> str:
194
219
  """Get the content of the tool.
195
220
 
@@ -198,11 +223,26 @@ class WaldiezTool(WaldiezBase):
198
223
  str
199
224
  The content of the tool.
200
225
  """
226
+ if self.is_predefined:
227
+ return self._generate_predefined_content()
201
228
  if self.is_shared or self.is_interop:
202
229
  return self.data.content
203
230
  # if custom, only the function content
204
231
  return get_function(self.data.content, self.name)
205
232
 
233
+ def _generate_predefined_content(self) -> str:
234
+ """Generate the content for a predefined tool.
235
+
236
+ Returns
237
+ -------
238
+ str
239
+ The content of the predefined tool.
240
+ """
241
+ config = get_predefined_tool_config(self.name)
242
+ if not config:
243
+ return ""
244
+ return config.get_content(self.data.secrets)
245
+
206
246
  def _validate_interop_tool(self) -> None:
207
247
  """Validate the interoperability tool.
208
248
 
@@ -253,6 +293,50 @@ class WaldiezTool(WaldiezBase):
253
293
  if error is not None or tree is None:
254
294
  raise ValueError(f"Invalid tool content: {error}")
255
295
 
296
+ def _validate_predefined_tool(self) -> None:
297
+ """Validate a predefined tool.
298
+
299
+ Raises
300
+ ------
301
+ ValueError
302
+ If the tool name is not in the content.
303
+ If the tool content is invalid.
304
+ """
305
+ if self.is_predefined:
306
+ config = get_predefined_tool_config(self.name)
307
+ if not config:
308
+ available_tools = list_predefined_tools()
309
+ raise ValueError(
310
+ f"Unknown predefined tool: {self.name}. "
311
+ f"Available tools: {available_tools}"
312
+ )
313
+ missing_secrets = config.validate_secrets(self.data.secrets)
314
+ if missing_secrets:
315
+ raise ValueError(
316
+ f"Missing required secrets for {self.name}: "
317
+ f"{missing_secrets}"
318
+ )
319
+ invalid_kwargs = config.validate_kwargs(self.data.kwargs)
320
+ if invalid_kwargs:
321
+ raise ValueError(
322
+ f"Invalid keyword arguments for {self.name}: "
323
+ f"{invalid_kwargs}"
324
+ )
325
+ # Update tool metadata from predefined config
326
+ if not self.description:
327
+ self.description = config.description
328
+
329
+ # Merge requirements
330
+ predefined_reqs = set(config.requirements)
331
+ existing_reqs = set(self.requirements)
332
+ self.requirements = list(predefined_reqs | existing_reqs)
333
+
334
+ # Merge tags
335
+ predefined_tags = set(config.tags)
336
+ existing_tags = set(self.tags)
337
+ self.tags = list(predefined_tags | existing_tags)
338
+ self.data.content = config.get_content(self.data.secrets)
339
+
256
340
  @model_validator(mode="after")
257
341
  def validate_data(self) -> Self:
258
342
  """Validate the data.
@@ -270,9 +354,18 @@ class WaldiezTool(WaldiezBase):
270
354
  """
271
355
  self._validate_custom_tool()
272
356
  self._validate_interop_tool()
273
- self._tool_imports = gather_code_imports(
274
- self.data.content, self.is_interop
275
- )
357
+ self._validate_predefined_tool()
358
+ if self.is_predefined:
359
+ config = get_predefined_tool_config(self.name)
360
+ if config:
361
+ self._tool_imports = (
362
+ ["import os"],
363
+ config.implementation.tool_imports,
364
+ )
365
+ else:
366
+ self._tool_imports = gather_code_imports(
367
+ self.data.content, self.is_interop
368
+ )
276
369
  # remove the imports from the content
277
370
  # we will place them at the top of the file
278
371
  all_imports = self._tool_imports[0] + self._tool_imports[1]
@@ -290,13 +383,3 @@ class WaldiezTool(WaldiezBase):
290
383
  valid_lines.pop()
291
384
  self.data.content = "\n".join(valid_lines)
292
385
  return self
293
-
294
- @property
295
- def content(self) -> str:
296
- """Get the content (source) of the tool."""
297
- return self.data.content
298
-
299
- @property
300
- def secrets(self) -> dict[str, str]:
301
- """Get the secrets (environment variables) of the tool."""
302
- return self.data.secrets or {}
@@ -2,6 +2,8 @@
2
2
  # Copyright (c) 2024 - 2025 Waldiez and contributors.
3
3
  """Waldiez Tool model."""
4
4
 
5
+ from typing import Any
6
+
5
7
  from pydantic import Field
6
8
  from typing_extensions import Annotated
7
9
 
@@ -49,3 +51,13 @@ class WaldiezToolData(WaldiezBase):
49
51
  description="The secrets (environment variables) of the tool.",
50
52
  ),
51
53
  ]
54
+ kwargs: Annotated[
55
+ dict[str, Any],
56
+ Field(
57
+ default_factory=dict,
58
+ title="Keyword Arguments",
59
+ description=(
60
+ "Keyword arguments for the tool, used for initialization."
61
+ ),
62
+ ),
63
+ ] = {}
@@ -4,5 +4,7 @@
4
4
 
5
5
  from typing_extensions import Literal
6
6
 
7
- WaldiezToolType = Literal["shared", "custom", "langchain", "crewai"]
7
+ WaldiezToolType = Literal[
8
+ "shared", "custom", "langchain", "crewai", "predefined"
9
+ ]
8
10
  """Possible types of a Waldiez Tool."""
@@ -95,6 +95,7 @@ def reload_autogen() -> None: # noqa: C901
95
95
  for name in sys.modules
96
96
  if name.startswith("autogen.")
97
97
  and not name.startswith("autogen.io")
98
+ and not name.startswith("autogen.tools")
98
99
  ],
99
100
  key=len,
100
101
  reverse=True, # Longer names (deeper modules) first
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: waldiez
3
- Version: 0.5.0
3
+ Version: 0.5.2
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,7 +27,7 @@ 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.3
30
+ Requires-Dist: ag2[openai]==0.9.4
31
31
  Requires-Dist: aiocsv==1.3.2
32
32
  Requires-Dist: aiofiles==24.1.0
33
33
  Requires-Dist: aiosqlite==0.21.0
@@ -37,33 +37,33 @@ Requires-Dist: graphviz<=0.21
37
37
  Requires-Dist: httpx<1
38
38
  Requires-Dist: jupytext
39
39
  Requires-Dist: nest-asyncio==1.6.0
40
- Requires-Dist: numpy<=2.3.0
40
+ Requires-Dist: numpy<=2.3.1
41
41
  Requires-Dist: pandas>=2
42
42
  Requires-Dist: parso==0.8.4
43
43
  Requires-Dist: pillow
44
44
  Requires-Dist: pip>=25
45
45
  Requires-Dist: pydantic<3,>=2.10.2
46
- Requires-Dist: rpds-py==0.25.1
46
+ Requires-Dist: rpds-py==0.26.0
47
47
  Requires-Dist: typer<1,>=0.9.0
48
48
  Provides-Extra: ag2-extras
49
- Requires-Dist: ag2[anthropic]==0.9.3; extra == 'ag2-extras'
50
- Requires-Dist: ag2[bedrock]==0.9.3; extra == 'ag2-extras'
51
- Requires-Dist: ag2[cohere]==0.9.3; extra == 'ag2-extras'
52
- Requires-Dist: ag2[gemini]==0.9.3; (sys_platform != 'win32') and extra == 'ag2-extras'
53
- Requires-Dist: ag2[gemini]==0.9.3; (sys_platform == 'win32' and platform_machine != 'arm64' and platform_machine != 'aarch64' and platform_machine != 'ARM64' and platform_machine != 'AARCH64') and extra == 'ag2-extras'
54
- Requires-Dist: ag2[groq]==0.9.3; extra == 'ag2-extras'
55
- Requires-Dist: ag2[interop-crewai]==0.9.3; extra == 'ag2-extras'
56
- Requires-Dist: ag2[interop-langchain]==0.9.3; extra == 'ag2-extras'
57
- Requires-Dist: ag2[lmm]==0.9.3; extra == 'ag2-extras'
58
- Requires-Dist: ag2[mistral]==0.9.3; extra == 'ag2-extras'
59
- Requires-Dist: ag2[neo4j]==0.9.3; (sys_platform != 'win32') and extra == 'ag2-extras'
60
- Requires-Dist: ag2[neo4j]==0.9.3; (sys_platform == 'win32' and platform_machine != 'arm64' and platform_machine != 'aarch64' and platform_machine != 'ARM64' and platform_machine != 'AARCH64') and extra == 'ag2-extras'
61
- Requires-Dist: ag2[ollama]==0.9.3; extra == 'ag2-extras'
62
- Requires-Dist: ag2[redis]==0.9.3; extra == 'ag2-extras'
63
- Requires-Dist: ag2[together]==0.9.3; (sys_platform != 'win32') and extra == 'ag2-extras'
64
- Requires-Dist: ag2[together]==0.9.3; (sys_platform == 'win32' and platform_machine != 'arm64' and platform_machine != 'aarch64' and platform_machine != 'ARM64' and platform_machine != 'AARCH64') and extra == 'ag2-extras'
65
- Requires-Dist: ag2[websockets]==0.9.3; extra == 'ag2-extras'
66
- Requires-Dist: ag2[websurfer]==0.9.3; extra == 'ag2-extras'
49
+ Requires-Dist: ag2[anthropic]==0.9.4; extra == 'ag2-extras'
50
+ Requires-Dist: ag2[bedrock]==0.9.4; extra == 'ag2-extras'
51
+ Requires-Dist: ag2[cohere]==0.9.4; extra == 'ag2-extras'
52
+ Requires-Dist: ag2[gemini]==0.9.4; (sys_platform != 'win32') and extra == 'ag2-extras'
53
+ Requires-Dist: ag2[gemini]==0.9.4; (sys_platform == 'win32' and platform_machine != 'arm64' and platform_machine != 'aarch64' and platform_machine != 'ARM64' and platform_machine != 'AARCH64') and extra == 'ag2-extras'
54
+ Requires-Dist: ag2[groq]==0.9.4; extra == 'ag2-extras'
55
+ Requires-Dist: ag2[interop-crewai]==0.9.4; extra == 'ag2-extras'
56
+ Requires-Dist: ag2[interop-langchain]==0.9.4; extra == 'ag2-extras'
57
+ Requires-Dist: ag2[lmm]==0.9.4; extra == 'ag2-extras'
58
+ Requires-Dist: ag2[mistral]==0.9.4; extra == 'ag2-extras'
59
+ Requires-Dist: ag2[neo4j]==0.9.4; (sys_platform != 'win32') and extra == 'ag2-extras'
60
+ Requires-Dist: ag2[neo4j]==0.9.4; (sys_platform == 'win32' and platform_machine != 'arm64' and platform_machine != 'aarch64' and platform_machine != 'ARM64' and platform_machine != 'AARCH64') and extra == 'ag2-extras'
61
+ Requires-Dist: ag2[ollama]==0.9.4; extra == 'ag2-extras'
62
+ Requires-Dist: ag2[redis]==0.9.4; extra == 'ag2-extras'
63
+ Requires-Dist: ag2[together]==0.9.4; (sys_platform != 'win32') and extra == 'ag2-extras'
64
+ Requires-Dist: ag2[together]==0.9.4; (sys_platform == 'win32' and platform_machine != 'arm64' and platform_machine != 'aarch64' and platform_machine != 'ARM64' and platform_machine != 'AARCH64') and extra == 'ag2-extras'
65
+ Requires-Dist: ag2[websockets]==0.9.4; extra == 'ag2-extras'
66
+ Requires-Dist: ag2[websurfer]==0.9.4; extra == 'ag2-extras'
67
67
  Requires-Dist: beautifulsoup4; extra == 'ag2-extras'
68
68
  Requires-Dist: chromadb>=0.5.10; (sys_platform != 'win32') and extra == 'ag2-extras'
69
69
  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'
@@ -103,15 +103,15 @@ Requires-Dist: sentence-transformers; (sys_platform == 'linux') and extra == 'ag
103
103
  Requires-Dist: weaviate-client<5,>=4; extra == 'ag2-extras'
104
104
  Requires-Dist: wikipedia-api<1.0,>=0.8.1; extra == 'ag2-extras'
105
105
  Provides-Extra: dev
106
- Requires-Dist: ag2[redis]==0.9.3; extra == 'dev'
107
- Requires-Dist: ag2[websockets]==0.9.3; extra == 'dev'
106
+ Requires-Dist: ag2[redis]==0.9.4; extra == 'dev'
107
+ Requires-Dist: ag2[websockets]==0.9.4; extra == 'dev'
108
108
  Requires-Dist: autoflake==2.3.1; extra == 'dev'
109
109
  Requires-Dist: bandit==1.8.5; extra == 'dev'
110
110
  Requires-Dist: black[jupyter]==25.1.0; extra == 'dev'
111
111
  Requires-Dist: build==1.2.2.post1; extra == 'dev'
112
- Requires-Dist: fakeredis<=3.30.0,>=2.28.1; extra == 'dev'
113
- Requires-Dist: fastjsonschema>=2.21; extra == 'dev'
114
- Requires-Dist: flake8==7.2.0; extra == 'dev'
112
+ Requires-Dist: fakeredis==2.30.1; extra == 'dev'
113
+ Requires-Dist: fastjsonschema>=2.21.1; extra == 'dev'
114
+ Requires-Dist: flake8==7.3.0; extra == 'dev'
115
115
  Requires-Dist: hatchling==1.27.0; extra == 'dev'
116
116
  Requires-Dist: jsonschema==4.24.0; extra == 'dev'
117
117
  Requires-Dist: jupyter-server==2.16.0; extra == 'dev'
@@ -128,8 +128,8 @@ Requires-Dist: pandas-stubs==2.2.3.250527; extra == 'dev'
128
128
  Requires-Dist: pre-commit==4.2.0; extra == 'dev'
129
129
  Requires-Dist: pydocstyle==6.3.0; extra == 'dev'
130
130
  Requires-Dist: pylint==3.3.7; extra == 'dev'
131
- Requires-Dist: python-dotenv==1.1.0; extra == 'dev'
132
- Requires-Dist: ruff==0.12.0; extra == 'dev'
131
+ Requires-Dist: python-dotenv>=1.1.0; extra == 'dev'
132
+ Requires-Dist: ruff==0.12.1; extra == 'dev'
133
133
  Requires-Dist: toml==0.10.2; (python_version <= '3.10') and extra == 'dev'
134
134
  Requires-Dist: types-jsonschema==4.24.0.20250528; extra == 'dev'
135
135
  Requires-Dist: types-pyyaml==6.0.12.20250516; extra == 'dev'
@@ -146,7 +146,7 @@ Requires-Dist: mkdocs-autorefs==1.4.2; extra == 'docs'
146
146
  Requires-Dist: mkdocs-awesome-nav==3.1.2; extra == 'docs'
147
147
  Requires-Dist: mkdocs-jupyter==0.25.1; extra == 'docs'
148
148
  Requires-Dist: mkdocs-macros-plugin==1.3.7; extra == 'docs'
149
- Requires-Dist: mkdocs-material==9.6.14; extra == 'docs'
149
+ Requires-Dist: mkdocs-material==9.6.15; extra == 'docs'
150
150
  Requires-Dist: mkdocs-minify-html-plugin==0.3.1; extra == 'docs'
151
151
  Requires-Dist: mkdocs-open-in-new-tab==1.0.8; extra == 'docs'
152
152
  Requires-Dist: mkdocs==1.6.1; extra == 'docs'
@@ -157,29 +157,29 @@ Requires-Dist: natsort==8.4.0; extra == 'docs'
157
157
  Provides-Extra: jupyter
158
158
  Requires-Dist: jupyter-server==2.16.0; extra == 'jupyter'
159
159
  Requires-Dist: jupyterlab<5.0,>=4.3.0; extra == 'jupyter'
160
- Requires-Dist: waldiez-jupyter==0.5.0; extra == 'jupyter'
160
+ Requires-Dist: waldiez-jupyter==0.5.2; extra == 'jupyter'
161
161
  Provides-Extra: mqtt
162
162
  Requires-Dist: paho-mqtt<3.0,>=2.1.0; extra == 'mqtt'
163
163
  Provides-Extra: redis
164
- Requires-Dist: ag2[redis]==0.9.3; extra == 'redis'
164
+ Requires-Dist: ag2[redis]==0.9.4; extra == 'redis'
165
165
  Provides-Extra: runner
166
- Requires-Dist: waldiez-runner==0.5.0; (python_version >= '3.11') and extra == 'runner'
166
+ Requires-Dist: waldiez-runner==0.5.2; (python_version >= '3.11') and extra == 'runner'
167
167
  Provides-Extra: studio
168
- Requires-Dist: waldiez-studio==0.5.0; extra == 'studio'
168
+ Requires-Dist: waldiez-studio==0.5.2; extra == 'studio'
169
169
  Provides-Extra: test
170
- Requires-Dist: ag2[redis]==0.9.3; extra == 'test'
171
- Requires-Dist: ag2[websockets]==0.9.3; extra == 'test'
172
- Requires-Dist: fakeredis<=3.30.0,>=2.28.1; extra == 'test'
170
+ Requires-Dist: ag2[redis]==0.9.4; extra == 'test'
171
+ Requires-Dist: ag2[websockets]==0.9.4; extra == 'test'
172
+ Requires-Dist: fakeredis==2.30.1; extra == 'test'
173
173
  Requires-Dist: paho-mqtt<3.0,>=2.1.0; extra == 'test'
174
174
  Requires-Dist: pytest-asyncio==1.0.0; extra == 'test'
175
175
  Requires-Dist: pytest-cov==6.2.1; extra == 'test'
176
176
  Requires-Dist: pytest-html==4.1.1; extra == 'test'
177
177
  Requires-Dist: pytest-sugar==1.0.0; extra == 'test'
178
178
  Requires-Dist: pytest-timeout==2.4.0; extra == 'test'
179
- Requires-Dist: pytest-xdist==3.7.0; extra == 'test'
179
+ Requires-Dist: pytest-xdist==3.8.0; extra == 'test'
180
180
  Requires-Dist: pytest==8.4.1; extra == 'test'
181
181
  Provides-Extra: websockets
182
- Requires-Dist: ag2[websockets]==0.9.3; extra == 'websockets'
182
+ Requires-Dist: ag2[websockets]==0.9.4; extra == 'websockets'
183
183
  Description-Content-Type: text/markdown
184
184
 
185
185
  # Waldiez