waldiez 0.4.7__py3-none-any.whl → 0.4.8__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 (244) hide show
  1. waldiez/__init__.py +5 -5
  2. waldiez/_version.py +1 -1
  3. waldiez/cli.py +112 -73
  4. waldiez/exporter.py +61 -19
  5. waldiez/exporting/__init__.py +25 -6
  6. waldiez/exporting/agent/__init__.py +7 -3
  7. waldiez/exporting/agent/code_execution.py +114 -0
  8. waldiez/exporting/agent/exporter.py +354 -0
  9. waldiez/exporting/agent/extras/__init__.py +15 -0
  10. waldiez/exporting/agent/extras/captain_agent_extras.py +315 -0
  11. waldiez/exporting/agent/extras/group/target.py +178 -0
  12. waldiez/exporting/agent/extras/group_manager_agent_extas.py +500 -0
  13. waldiez/exporting/agent/extras/group_member_extras.py +181 -0
  14. waldiez/exporting/agent/extras/handoffs/__init__.py +19 -0
  15. waldiez/exporting/agent/extras/handoffs/after_work.py +78 -0
  16. waldiez/exporting/agent/extras/handoffs/available.py +74 -0
  17. waldiez/exporting/agent/extras/handoffs/condition.py +158 -0
  18. waldiez/exporting/agent/extras/handoffs/handoff.py +171 -0
  19. waldiez/exporting/agent/extras/handoffs/target.py +189 -0
  20. waldiez/exporting/agent/extras/rag/__init__.py +10 -0
  21. waldiez/exporting/agent/{utils/rag_user/chroma_utils.py → extras/rag/chroma_extras.py} +16 -15
  22. waldiez/exporting/agent/{utils/rag_user/mongo_utils.py → extras/rag/mongo_extras.py} +10 -10
  23. waldiez/exporting/agent/{utils/rag_user/pgvector_utils.py → extras/rag/pgvector_extras.py} +13 -13
  24. waldiez/exporting/agent/{utils/rag_user/qdrant_utils.py → extras/rag/qdrant_extras.py} +13 -13
  25. waldiez/exporting/agent/{utils/rag_user/vector_db.py → extras/rag/vector_db_extras.py} +59 -46
  26. waldiez/exporting/agent/extras/rag_user_proxy_agent_extras.py +245 -0
  27. waldiez/exporting/agent/extras/reasoning_agent_extras.py +88 -0
  28. waldiez/exporting/agent/factory.py +95 -0
  29. waldiez/exporting/agent/processor.py +150 -0
  30. waldiez/exporting/agent/system_message.py +36 -0
  31. waldiez/exporting/agent/termination.py +50 -0
  32. waldiez/exporting/chats/__init__.py +7 -3
  33. waldiez/exporting/chats/exporter.py +97 -0
  34. waldiez/exporting/chats/factory.py +65 -0
  35. waldiez/exporting/chats/processor.py +226 -0
  36. waldiez/exporting/chats/utils/__init__.py +6 -5
  37. waldiez/exporting/chats/utils/common.py +11 -45
  38. waldiez/exporting/chats/utils/group.py +55 -0
  39. waldiez/exporting/chats/utils/nested.py +37 -52
  40. waldiez/exporting/chats/utils/sequential.py +72 -61
  41. waldiez/exporting/chats/utils/{single_chat.py → single.py} +48 -50
  42. waldiez/exporting/core/__init__.py +196 -0
  43. waldiez/exporting/core/constants.py +17 -0
  44. waldiez/exporting/core/content.py +69 -0
  45. waldiez/exporting/core/context.py +244 -0
  46. waldiez/exporting/core/enums.py +89 -0
  47. waldiez/exporting/core/errors.py +19 -0
  48. waldiez/exporting/core/exporter.py +390 -0
  49. waldiez/exporting/core/exporters.py +67 -0
  50. waldiez/exporting/core/extras/__init__.py +39 -0
  51. waldiez/exporting/core/extras/agent_extras/__init__.py +27 -0
  52. waldiez/exporting/core/extras/agent_extras/captain_extras.py +57 -0
  53. waldiez/exporting/core/extras/agent_extras/group_manager_extras.py +102 -0
  54. waldiez/exporting/core/extras/agent_extras/rag_user_extras.py +53 -0
  55. waldiez/exporting/core/extras/agent_extras/reasoning_extras.py +68 -0
  56. waldiez/exporting/core/extras/agent_extras/standard_extras.py +263 -0
  57. waldiez/exporting/core/extras/base.py +241 -0
  58. waldiez/exporting/core/extras/chat_extras.py +118 -0
  59. waldiez/exporting/core/extras/flow_extras.py +70 -0
  60. waldiez/exporting/core/extras/model_extras.py +73 -0
  61. waldiez/exporting/core/extras/path_resolver.py +93 -0
  62. waldiez/exporting/core/extras/serializer.py +138 -0
  63. waldiez/exporting/core/extras/tool_extras.py +82 -0
  64. waldiez/exporting/core/protocols.py +259 -0
  65. waldiez/exporting/core/result.py +705 -0
  66. waldiez/exporting/core/types.py +329 -0
  67. waldiez/exporting/core/utils/__init__.py +11 -0
  68. waldiez/exporting/core/utils/comment.py +33 -0
  69. waldiez/exporting/core/utils/llm_config.py +117 -0
  70. waldiez/exporting/core/validation.py +96 -0
  71. waldiez/exporting/flow/__init__.py +6 -2
  72. waldiez/exporting/flow/execution_generator.py +193 -0
  73. waldiez/exporting/flow/exporter.py +107 -0
  74. waldiez/exporting/flow/factory.py +94 -0
  75. waldiez/exporting/flow/file_generator.py +214 -0
  76. waldiez/exporting/flow/merger.py +387 -0
  77. waldiez/exporting/flow/orchestrator.py +411 -0
  78. waldiez/exporting/flow/utils/__init__.py +9 -36
  79. waldiez/exporting/flow/utils/common.py +206 -0
  80. waldiez/exporting/flow/utils/importing.py +373 -0
  81. waldiez/exporting/flow/utils/linting.py +200 -0
  82. waldiez/exporting/flow/utils/{logging_utils.py → logging.py} +23 -9
  83. waldiez/exporting/models/__init__.py +3 -1
  84. waldiez/exporting/models/exporter.py +233 -0
  85. waldiez/exporting/models/factory.py +66 -0
  86. waldiez/exporting/models/processor.py +139 -0
  87. waldiez/exporting/tools/__init__.py +11 -0
  88. waldiez/exporting/tools/exporter.py +207 -0
  89. waldiez/exporting/tools/factory.py +57 -0
  90. waldiez/exporting/tools/processor.py +248 -0
  91. waldiez/exporting/tools/registration.py +133 -0
  92. waldiez/io/__init__.py +128 -0
  93. waldiez/io/_ws.py +199 -0
  94. waldiez/io/models/__init__.py +60 -0
  95. waldiez/io/models/base.py +66 -0
  96. waldiez/io/models/constants.py +78 -0
  97. waldiez/io/models/content/__init__.py +23 -0
  98. waldiez/io/models/content/audio.py +43 -0
  99. waldiez/io/models/content/base.py +45 -0
  100. waldiez/io/models/content/file.py +43 -0
  101. waldiez/io/models/content/image.py +96 -0
  102. waldiez/io/models/content/text.py +37 -0
  103. waldiez/io/models/content/video.py +43 -0
  104. waldiez/io/models/user_input.py +269 -0
  105. waldiez/io/models/user_response.py +215 -0
  106. waldiez/io/mqtt.py +681 -0
  107. waldiez/io/redis.py +782 -0
  108. waldiez/io/structured.py +419 -0
  109. waldiez/io/utils.py +184 -0
  110. waldiez/io/ws.py +298 -0
  111. waldiez/logger.py +481 -0
  112. waldiez/models/__init__.py +108 -51
  113. waldiez/models/agents/__init__.py +34 -70
  114. waldiez/models/agents/agent/__init__.py +10 -4
  115. waldiez/models/agents/agent/agent.py +466 -65
  116. waldiez/models/agents/agent/agent_data.py +119 -47
  117. waldiez/models/agents/agent/agent_type.py +13 -2
  118. waldiez/models/agents/agent/code_execution.py +12 -12
  119. waldiez/models/agents/agent/human_input_mode.py +8 -0
  120. waldiez/models/agents/agent/{linked_skill.py → linked_tool.py} +7 -7
  121. waldiez/models/agents/agent/nested_chat.py +35 -7
  122. waldiez/models/agents/agent/termination_message.py +30 -22
  123. waldiez/models/agents/{swarm_agent → agent}/update_system_message.py +22 -22
  124. waldiez/models/agents/agents.py +58 -63
  125. waldiez/models/agents/assistant/assistant.py +4 -4
  126. waldiez/models/agents/assistant/assistant_data.py +13 -1
  127. waldiez/models/agents/{captain_agent → captain}/captain_agent.py +5 -5
  128. waldiez/models/agents/{captain_agent → captain}/captain_agent_data.py +5 -5
  129. waldiez/models/agents/extra_requirements.py +11 -16
  130. waldiez/models/agents/group_manager/group_manager.py +103 -13
  131. waldiez/models/agents/group_manager/group_manager_data.py +36 -14
  132. waldiez/models/agents/group_manager/speakers.py +77 -24
  133. waldiez/models/agents/{rag_user → rag_user_proxy}/__init__.py +16 -16
  134. waldiez/models/agents/rag_user_proxy/rag_user_proxy.py +64 -0
  135. waldiez/models/agents/{rag_user/rag_user_data.py → rag_user_proxy/rag_user_proxy_data.py} +6 -5
  136. waldiez/models/agents/{rag_user → rag_user_proxy}/retrieve_config.py +182 -114
  137. waldiez/models/agents/{rag_user → rag_user_proxy}/vector_db_config.py +13 -13
  138. waldiez/models/agents/reasoning/reasoning_agent.py +6 -6
  139. waldiez/models/agents/reasoning/reasoning_agent_data.py +110 -63
  140. waldiez/models/agents/reasoning/reasoning_agent_reason_config.py +38 -10
  141. waldiez/models/agents/user_proxy/user_proxy.py +11 -7
  142. waldiez/models/agents/user_proxy/user_proxy_data.py +2 -2
  143. waldiez/models/chat/__init__.py +2 -1
  144. waldiez/models/chat/chat.py +166 -87
  145. waldiez/models/chat/chat_data.py +99 -136
  146. waldiez/models/chat/chat_message.py +33 -23
  147. waldiez/models/chat/chat_nested.py +31 -30
  148. waldiez/models/chat/chat_summary.py +10 -8
  149. waldiez/models/common/__init__.py +52 -2
  150. waldiez/models/common/ag2_version.py +1 -1
  151. waldiez/models/common/base.py +38 -7
  152. waldiez/models/common/dict_utils.py +42 -17
  153. waldiez/models/common/handoff.py +459 -0
  154. waldiez/models/common/id_generator.py +19 -0
  155. waldiez/models/common/method_utils.py +130 -68
  156. waldiez/{exporting/base/utils → models/common}/naming.py +38 -61
  157. waldiez/models/common/waldiez_version.py +37 -0
  158. waldiez/models/flow/__init__.py +9 -2
  159. waldiez/models/flow/connection.py +18 -0
  160. waldiez/models/flow/flow.py +311 -215
  161. waldiez/models/flow/flow_data.py +207 -40
  162. waldiez/models/flow/info.py +85 -0
  163. waldiez/models/flow/naming.py +131 -0
  164. waldiez/models/model/__init__.py +7 -1
  165. waldiez/models/model/extra_requirements.py +3 -12
  166. waldiez/models/model/model.py +76 -21
  167. waldiez/models/model/model_data.py +108 -20
  168. waldiez/models/tool/__init__.py +16 -0
  169. waldiez/models/tool/extra_requirements.py +36 -0
  170. waldiez/models/{skill/skill.py → tool/tool.py} +88 -88
  171. waldiez/models/tool/tool_data.py +51 -0
  172. waldiez/models/tool/tool_type.py +8 -0
  173. waldiez/models/waldiez.py +97 -80
  174. waldiez/runner.py +114 -49
  175. waldiez/running/__init__.py +1 -1
  176. waldiez/running/environment.py +49 -68
  177. waldiez/running/gen_seq_diagram.py +16 -14
  178. waldiez/running/running.py +53 -34
  179. waldiez/utils/__init__.py +0 -4
  180. waldiez/utils/cli_extras/jupyter.py +5 -3
  181. waldiez/utils/cli_extras/runner.py +6 -4
  182. waldiez/utils/cli_extras/studio.py +6 -4
  183. waldiez/utils/conflict_checker.py +15 -9
  184. waldiez/utils/flaml_warnings.py +5 -5
  185. {waldiez-0.4.7.dist-info → waldiez-0.4.8.dist-info}/METADATA +235 -91
  186. waldiez-0.4.8.dist-info/RECORD +200 -0
  187. waldiez/exporting/agent/agent_exporter.py +0 -297
  188. waldiez/exporting/agent/utils/__init__.py +0 -23
  189. waldiez/exporting/agent/utils/captain_agent.py +0 -263
  190. waldiez/exporting/agent/utils/code_execution.py +0 -65
  191. waldiez/exporting/agent/utils/group_manager.py +0 -220
  192. waldiez/exporting/agent/utils/rag_user/__init__.py +0 -7
  193. waldiez/exporting/agent/utils/rag_user/rag_user.py +0 -209
  194. waldiez/exporting/agent/utils/reasoning.py +0 -36
  195. waldiez/exporting/agent/utils/swarm_agent.py +0 -469
  196. waldiez/exporting/agent/utils/teachability.py +0 -41
  197. waldiez/exporting/agent/utils/termination_message.py +0 -44
  198. waldiez/exporting/base/__init__.py +0 -25
  199. waldiez/exporting/base/agent_position.py +0 -75
  200. waldiez/exporting/base/base_exporter.py +0 -118
  201. waldiez/exporting/base/export_position.py +0 -48
  202. waldiez/exporting/base/import_position.py +0 -23
  203. waldiez/exporting/base/mixin.py +0 -137
  204. waldiez/exporting/base/utils/__init__.py +0 -18
  205. waldiez/exporting/base/utils/comments.py +0 -96
  206. waldiez/exporting/base/utils/path_check.py +0 -68
  207. waldiez/exporting/base/utils/to_string.py +0 -84
  208. waldiez/exporting/chats/chats_exporter.py +0 -240
  209. waldiez/exporting/chats/utils/swarm.py +0 -210
  210. waldiez/exporting/flow/flow_exporter.py +0 -528
  211. waldiez/exporting/flow/utils/agent_utils.py +0 -204
  212. waldiez/exporting/flow/utils/chat_utils.py +0 -71
  213. waldiez/exporting/flow/utils/def_main.py +0 -77
  214. waldiez/exporting/flow/utils/flow_content.py +0 -202
  215. waldiez/exporting/flow/utils/flow_names.py +0 -116
  216. waldiez/exporting/flow/utils/importing_utils.py +0 -227
  217. waldiez/exporting/models/models_exporter.py +0 -199
  218. waldiez/exporting/models/utils.py +0 -174
  219. waldiez/exporting/skills/__init__.py +0 -9
  220. waldiez/exporting/skills/skills_exporter.py +0 -176
  221. waldiez/exporting/skills/utils.py +0 -369
  222. waldiez/models/agents/agent/teachability.py +0 -70
  223. waldiez/models/agents/rag_user/rag_user.py +0 -60
  224. waldiez/models/agents/swarm_agent/__init__.py +0 -50
  225. waldiez/models/agents/swarm_agent/after_work.py +0 -179
  226. waldiez/models/agents/swarm_agent/on_condition.py +0 -105
  227. waldiez/models/agents/swarm_agent/on_condition_available.py +0 -142
  228. waldiez/models/agents/swarm_agent/on_condition_target.py +0 -40
  229. waldiez/models/agents/swarm_agent/swarm_agent.py +0 -107
  230. waldiez/models/agents/swarm_agent/swarm_agent_data.py +0 -124
  231. waldiez/models/flow/utils.py +0 -232
  232. waldiez/models/skill/__init__.py +0 -16
  233. waldiez/models/skill/extra_requirements.py +0 -36
  234. waldiez/models/skill/skill_data.py +0 -53
  235. waldiez/models/skill/skill_type.py +0 -8
  236. waldiez/utils/pysqlite3_checker.py +0 -308
  237. waldiez/utils/rdps_checker.py +0 -122
  238. waldiez-0.4.7.dist-info/RECORD +0 -149
  239. /waldiez/models/agents/{captain_agent → captain}/__init__.py +0 -0
  240. /waldiez/models/agents/{captain_agent → captain}/captain_agent_lib_entry.py +0 -0
  241. {waldiez-0.4.7.dist-info → waldiez-0.4.8.dist-info}/WHEEL +0 -0
  242. {waldiez-0.4.7.dist-info → waldiez-0.4.8.dist-info}/entry_points.txt +0 -0
  243. {waldiez-0.4.7.dist-info → waldiez-0.4.8.dist-info}/licenses/LICENSE +0 -0
  244. {waldiez-0.4.7.dist-info → waldiez-0.4.8.dist-info}/licenses/NOTICE.md +0 -0
@@ -2,7 +2,7 @@
2
2
  # Copyright (c) 2024 - 2025 Waldiez and contributors.
3
3
  """Waldiez chat summary options."""
4
4
 
5
- from typing import Any, Dict, Optional
5
+ from typing import Any, Optional
6
6
 
7
7
  from pydantic import (
8
8
  Field,
@@ -32,35 +32,36 @@ class WaldiezChatSummary(WaldiezBase):
32
32
  The method to use for the LLM summary. Defaults to "last_msg".
33
33
  prompt : str
34
34
  The prompt for the LLM summary method.
35
- args : Optional[Dict[str, Any]]
35
+ args : Optional[dict[str, Any]]
36
36
  The additional arguments for the LLM summary method, by default None.
37
37
  """
38
38
 
39
39
  method: Annotated[
40
40
  Optional[WaldiezChatSummaryMethod],
41
41
  Field(
42
- "last_msg",
42
+ default="last_msg",
43
43
  title="Method",
44
44
  description="The method to use for the LLM summary.",
45
45
  ),
46
- ]
46
+ ] = "last_msg"
47
47
  prompt: Annotated[
48
48
  str,
49
49
  Field(
50
- "",
50
+ default="Summarize the conversation.",
51
51
  title="Prompt",
52
52
  description="The prompt for the LLM summary method.",
53
53
  ),
54
- ]
54
+ ] = "Summarize the conversation."
55
55
  args: Annotated[
56
- Dict[str, str],
56
+ dict[str, str],
57
57
  Field(
58
58
  title="Arguments",
59
59
  description="The additional arguments for the LLM summary method.",
60
60
  default_factory=dict,
61
61
  ),
62
- ]
62
+ ] = {}
63
63
 
64
+ # noinspection PyNestedDecorators
64
65
  @field_validator("method", mode="before")
65
66
  @classmethod
66
67
  def validate_summary_method(
@@ -86,6 +87,7 @@ class WaldiezChatSummary(WaldiezBase):
86
87
  return "reflection_with_llm"
87
88
  return value
88
89
 
90
+ # noinspection PyNestedDecorators
89
91
  @field_serializer("method")
90
92
  @classmethod
91
93
  def serialize_summary_method(
@@ -6,6 +6,27 @@ from .ag2_version import get_autogen_version
6
6
  from .base import WaldiezBase
7
7
  from .date_utils import now
8
8
  from .dict_utils import update_dict
9
+ from .handoff import (
10
+ WaldiezAgentTarget,
11
+ WaldiezContextBasedCondition,
12
+ WaldiezContextBasedTransition,
13
+ WaldiezContextStrLLMCondition,
14
+ WaldiezDefaultCondition,
15
+ WaldiezExpressionContextCondition,
16
+ WaldiezGroupOrNestedTarget,
17
+ WaldiezHandoff,
18
+ WaldiezHandoffCondition,
19
+ WaldiezHandoffTransition,
20
+ WaldiezLLMBasedCondition,
21
+ WaldiezLLMBasedTransition,
22
+ WaldiezRandomAgentTarget,
23
+ WaldiezSimpleTarget,
24
+ WaldiezStringContextCondition,
25
+ WaldiezStringLLMCondition,
26
+ WaldiezTransitionAvailability,
27
+ WaldiezTransitionTarget,
28
+ )
29
+ from .id_generator import get_id
9
30
  from .method_utils import (
10
31
  check_function,
11
32
  gather_code_imports,
@@ -13,15 +34,44 @@ from .method_utils import (
13
34
  get_function,
14
35
  parse_code_string,
15
36
  )
37
+ from .naming import (
38
+ MAX_VARIABLE_LENGTH,
39
+ get_valid_instance_name,
40
+ get_valid_python_variable_name,
41
+ )
42
+ from .waldiez_version import get_waldiez_version
16
43
 
17
44
  __all__ = [
45
+ "MAX_VARIABLE_LENGTH",
18
46
  "WaldiezBase",
19
- "now",
20
47
  "check_function",
48
+ "update_dict",
21
49
  "gather_code_imports",
22
50
  "get_autogen_version",
23
51
  "get_function",
52
+ "get_id",
53
+ "get_valid_instance_name",
54
+ "get_valid_python_variable_name",
55
+ "get_waldiez_version",
24
56
  "generate_function",
57
+ "now",
25
58
  "parse_code_string",
26
- "update_dict",
59
+ "WaldiezDefaultCondition",
60
+ "WaldiezAgentTarget",
61
+ "WaldiezContextBasedCondition",
62
+ "WaldiezContextBasedTransition",
63
+ "WaldiezContextStrLLMCondition",
64
+ "WaldiezExpressionContextCondition",
65
+ "WaldiezGroupOrNestedTarget",
66
+ "WaldiezHandoff",
67
+ "WaldiezHandoffCondition",
68
+ "WaldiezHandoffTransition",
69
+ "WaldiezLLMBasedCondition",
70
+ "WaldiezLLMBasedTransition",
71
+ "WaldiezRandomAgentTarget",
72
+ "WaldiezSimpleTarget",
73
+ "WaldiezStringContextCondition",
74
+ "WaldiezStringLLMCondition",
75
+ "WaldiezTransitionAvailability",
76
+ "WaldiezTransitionTarget",
27
77
  ]
@@ -27,4 +27,4 @@ def get_autogen_version() -> str:
27
27
  from autogen.version import __version__ as ag2 # type: ignore
28
28
  except ImportError as error: # pragma: no cover
29
29
  raise ValueError("ag2 is not installed.") from error
30
- return ag2
30
+ return ag2
@@ -2,7 +2,7 @@
2
2
  # Copyright (c) 2024 - 2025 Waldiez and contributors.
3
3
  """Base class to inherit from."""
4
4
 
5
- from typing import Any, Dict
5
+ from typing import Any
6
6
 
7
7
  from pydantic import BaseModel, ConfigDict
8
8
  from pydantic.alias_generators import to_camel
@@ -17,15 +17,15 @@ class WaldiezBase(BaseModel):
17
17
 
18
18
  model_config = ConfigDict(
19
19
  extra="ignore",
20
- # treat `skillId` as `skill_id`
20
+ # treat `toolId` as `tool_id`
21
21
  alias_generator=to_camel,
22
- # allow passing either `skill_id` or `skillId`
22
+ # allow passing either `tool_id` or `toolId`
23
23
  populate_by_name=True,
24
24
  # allow setting any attribute after initialization
25
25
  frozen=False,
26
26
  )
27
27
 
28
- def model_dump(self, **kwargs: Any) -> Dict[str, Any]:
28
+ def model_dump(self, **kwargs: Any) -> dict[str, Any]:
29
29
  """Dump the model to a dictionary.
30
30
 
31
31
  Parameters
@@ -33,17 +33,34 @@ class WaldiezBase(BaseModel):
33
33
  **kwargs : Any
34
34
  Additional keyword arguments.
35
35
 
36
+ The following are from the Pydantic `model_dump` method:
37
+ - mode: str | Literal['json', 'python'] = 'json',
38
+ - include: IncEx | None
39
+ - exclude: IncEx | None
40
+ - context: Any | None
41
+ - by_alias: bool | None (None defaults to True)
42
+ - exclude_unset: bool = False
43
+ - exclude_defaults: bool = False
44
+ - exclude_none: bool = False
45
+ - round_trip: bool = False
46
+ - warnings: bool | Literal['none', 'warn', 'error'] = True
47
+ - fallback: ((Any) -> Any) | None = None
48
+ - serialize_as_any: bool = False
49
+
36
50
  Returns
37
51
  -------
38
- Dict[str, Any]
52
+ dict[str, Any]
39
53
  The dictionary representation of the model.
40
54
  """
41
55
  by_alias = kwargs.pop("by_alias", None)
42
- if by_alias is None:
56
+ mode = kwargs.pop("mode", None)
57
+ if mode is None: # pragma: no branch
58
+ mode = "json"
59
+ if by_alias is None: # pragma: no branch
43
60
  by_alias = True
44
61
  if not isinstance(by_alias, bool):
45
62
  by_alias = True
46
- return super().model_dump(by_alias=by_alias, **kwargs)
63
+ return super().model_dump(by_alias=by_alias, mode=mode, **kwargs)
47
64
 
48
65
  def model_dump_json(self, **kwargs: Any) -> str:
49
66
  """Dump the model to a JSON string.
@@ -53,6 +70,20 @@ class WaldiezBase(BaseModel):
53
70
  **kwargs : Any
54
71
  Additional keyword arguments.
55
72
 
73
+ The following are from the Pydantic `model_dump_json` method:
74
+ - indent: int | None = None,
75
+ - include: IncEx | None = None,
76
+ - exclude: IncEx | None = None,
77
+ - context: Any | None = None,
78
+ - by_alias: bool | None = None, (None defaults to True)
79
+ - exclude_unset: bool = False,
80
+ - exclude_defaults: bool = False,
81
+ - exclude_none: bool = False,
82
+ - round_trip: bool = False,
83
+ - warnings: bool | Literal['none', 'warn', 'error'] = True,
84
+ - fallback: ((Any) -> Any) | None = None,
85
+ - serialize_as_any: bool = False
86
+
56
87
  Returns
57
88
  -------
58
89
  str
@@ -2,38 +2,63 @@
2
2
  # Copyright (c) 2024 - 2025 Waldiez and contributors.
3
3
  """Dictionary related utilities."""
4
4
 
5
- from typing import Any, Dict
5
+ import re
6
+ from typing import Any
6
7
 
8
+ BOOL_VALUES = {"true", "false"}
9
+ NULL_VALUES = {"none", "null", "nil", "undefined"}
7
10
 
8
- def update_dict(original: Dict[str, Any]) -> Dict[str, Any]:
9
- """
10
11
 
12
+ def update_dict(original: dict[str, Any]) -> dict[str, Any]:
13
+ """
11
14
  Try to determine the type of the dictionary values.
12
15
 
13
16
  Parameters
14
17
  ----------
15
- original : Dict[str, Any]
18
+ original : dict[str, Any]
16
19
  The original dictionary.
17
20
 
18
21
  Returns
19
22
  -------
20
- Dict[str, Any]
23
+ dict[str, Any]
21
24
  The updated dictionary with values converted to the detected types.
22
25
  """
23
- new_dict: Dict[str, Any] = {}
26
+ new_dict: dict[str, Any] = {}
27
+
24
28
  for key, value in original.items():
25
- value_lower = str(value).lower()
26
- if value_lower in ("none", "null"):
29
+ # Skip conversion if already the desired type
30
+ if not isinstance(value, str):
31
+ new_dict[key] = value
32
+ continue
33
+
34
+ value_stripped = value.strip()
35
+ if (
36
+ value_stripped.startswith('"') and value_stripped.endswith('"')
37
+ ) or (value_stripped.startswith("'") and value_stripped.endswith("'")):
38
+ value_stripped = value_stripped[1:-1]
39
+ if not value_stripped: # Empty or whitespace-only
40
+ new_dict[key] = value
41
+ continue
42
+
43
+ value_lower = value_stripped.lower()
44
+
45
+ # Check for None/null
46
+ if value_lower in NULL_VALUES:
27
47
  new_dict[key] = None
28
- elif value_lower in ("true", "false"):
48
+ # Check for boolean
49
+ elif value_lower in BOOL_VALUES:
29
50
  new_dict[key] = value_lower == "true"
30
- elif str(value).isdigit():
31
- new_dict[key] = int(value)
32
- elif str(value).replace(".", "").isdigit():
33
- try:
34
- new_dict[key] = float(value)
35
- except ValueError: # pragma: no cover
36
- new_dict[key] = value
51
+ # Check for integer
52
+ elif re.fullmatch(r"[-+]?\d+", value_stripped):
53
+ new_dict[key] = int(value_stripped)
54
+ # Check for float
37
55
  else:
38
- new_dict[key] = value
56
+ try:
57
+ # This handles floats, scientific notation, etc.
58
+ float_val = float(value_stripped)
59
+ new_dict[key] = float_val
60
+ except ValueError:
61
+ # Keep as string if conversion fails
62
+ new_dict[key] = value_stripped
63
+
39
64
  return new_dict