waldiez 0.1.6__tar.gz → 0.1.8__tar.gz

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 (98) hide show
  1. waldiez-0.1.8/PKG-INFO +241 -0
  2. waldiez-0.1.8/README.md +170 -0
  3. {waldiez-0.1.6 → waldiez-0.1.8}/pyproject.toml +39 -29
  4. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/__init__.py +0 -2
  5. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/_version.py +1 -1
  6. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/cli.py +10 -6
  7. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/agents/rag_user/chroma_utils.py +1 -2
  8. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/chats/nested.py +2 -12
  9. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/utils/logging_utils.py +1 -0
  10. waldiez-0.1.8/waldiez/io/__init__.py +142 -0
  11. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/agent/nested_chat.py +4 -8
  12. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/waldiez.py +18 -11
  13. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/runner.py +24 -10
  14. waldiez-0.1.6/PKG-INFO +0 -180
  15. waldiez-0.1.6/README.md +0 -106
  16. waldiez-0.1.6/waldiez/io_stream.py +0 -181
  17. waldiez-0.1.6/waldiez/stream/__init__.py +0 -7
  18. waldiez-0.1.6/waldiez/stream/consumer.py +0 -139
  19. waldiez-0.1.6/waldiez/stream/provider.py +0 -339
  20. waldiez-0.1.6/waldiez/stream/server.py +0 -412
  21. {waldiez-0.1.6 → waldiez-0.1.8}/.gitignore +0 -0
  22. {waldiez-0.1.6 → waldiez-0.1.8}/LICENSE +0 -0
  23. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/__main__.py +0 -0
  24. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporter.py +0 -0
  25. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/__init__.py +0 -0
  26. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/agents/__init__.py +0 -0
  27. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/agents/agent.py +0 -0
  28. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/agents/agent_skills.py +0 -0
  29. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/agents/code_execution.py +0 -0
  30. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/agents/group_manager.py +0 -0
  31. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/agents/llm_config.py +0 -0
  32. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/agents/rag_user/__init__.py +0 -0
  33. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/agents/rag_user/mongo_utils.py +0 -0
  34. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/agents/rag_user/pgvector_utils.py +0 -0
  35. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/agents/rag_user/qdrant_utils.py +0 -0
  36. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/agents/rag_user/rag_user.py +0 -0
  37. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/agents/rag_user/vector_db.py +0 -0
  38. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/agents/teachability.py +0 -0
  39. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/agents/termination_message.py +0 -0
  40. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/chats/__init__.py +0 -0
  41. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/chats/chats.py +0 -0
  42. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/chats/helpers.py +0 -0
  43. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/flow/__init__.py +0 -0
  44. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/flow/def_main.py +0 -0
  45. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/flow/flow.py +0 -0
  46. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/models/__init__.py +0 -0
  47. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/skills/__init__.py +0 -0
  48. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/utils/__init__.py +0 -0
  49. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/utils/comments.py +0 -0
  50. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/utils/importing.py +0 -0
  51. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/utils/method_utils.py +0 -0
  52. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/utils/naming.py +0 -0
  53. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/utils/object_string.py +0 -0
  54. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/utils/path_check.py +0 -0
  55. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/__init__.py +0 -0
  56. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/__init__.py +0 -0
  57. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/agent/__init__.py +0 -0
  58. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/agent/agent.py +0 -0
  59. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/agent/agent_data.py +0 -0
  60. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/agent/code_execution.py +0 -0
  61. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/agent/linked_skill.py +0 -0
  62. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/agent/teachability.py +0 -0
  63. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/agent/termination_message.py +0 -0
  64. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/agents.py +0 -0
  65. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/assistant/__init__.py +0 -0
  66. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/assistant/assistant.py +0 -0
  67. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/assistant/assistant_data.py +0 -0
  68. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/group_manager/__init__.py +0 -0
  69. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/group_manager/group_manager.py +0 -0
  70. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/group_manager/group_manager_data.py +0 -0
  71. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/group_manager/speakers.py +0 -0
  72. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/rag_user/__init__.py +0 -0
  73. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/rag_user/rag_user.py +0 -0
  74. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/rag_user/rag_user_data.py +0 -0
  75. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/rag_user/retrieve_config.py +0 -0
  76. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/rag_user/vector_db_config.py +0 -0
  77. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/user_proxy/__init__.py +0 -0
  78. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/user_proxy/user_proxy.py +0 -0
  79. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/user_proxy/user_proxy_data.py +0 -0
  80. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/chat/__init__.py +0 -0
  81. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/chat/chat.py +0 -0
  82. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/chat/chat_data.py +0 -0
  83. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/chat/chat_message.py +0 -0
  84. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/chat/chat_nested.py +0 -0
  85. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/chat/chat_summary.py +0 -0
  86. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/common/__init__.py +0 -0
  87. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/common/base.py +0 -0
  88. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/common/method_utils.py +0 -0
  89. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/flow/__init__.py +0 -0
  90. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/flow/flow.py +0 -0
  91. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/flow/flow_data.py +0 -0
  92. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/model/__init__.py +0 -0
  93. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/model/model.py +0 -0
  94. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/model/model_data.py +0 -0
  95. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/skill/__init__.py +0 -0
  96. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/skill/skill.py +0 -0
  97. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/skill/skill_data.py +0 -0
  98. {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/py.typed +0 -0
waldiez-0.1.8/PKG-INFO ADDED
@@ -0,0 +1,241 @@
1
+ Metadata-Version: 2.3
2
+ Name: waldiez
3
+ Version: 0.1.8
4
+ Summary: waldiez
5
+ Project-URL: homepage, https://waldiez.github.io/waldiez/
6
+ Project-URL: repository, https://github.com/waldiez/waldiez.git
7
+ Author-email: Panagiotis Kasnesis <pkasnesis@thingenious.io>, Lazaros Toumanidis <laztoum@protonmail.com>
8
+ Classifier: Development Status :: 3 - Alpha
9
+ Classifier: Intended Audience :: Developers
10
+ Classifier: Intended Audience :: Science/Research
11
+ Classifier: License :: OSI Approved :: MIT License
12
+ Classifier: Operating System :: OS Independent
13
+ Classifier: Programming Language :: Python
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Requires-Python: <3.13,>=3.10
19
+ Requires-Dist: ag2==0.3.2
20
+ Requires-Dist: jupytext
21
+ Provides-Extra: ag2-extras
22
+ Requires-Dist: ag2[anthropic]==0.3.2; extra == 'ag2-extras'
23
+ Requires-Dist: ag2[bedrock]==0.3.2; extra == 'ag2-extras'
24
+ Requires-Dist: ag2[gemini]==0.3.2; extra == 'ag2-extras'
25
+ Requires-Dist: ag2[groq]==0.3.2; extra == 'ag2-extras'
26
+ Requires-Dist: ag2[mistral]==0.3.2; extra == 'ag2-extras'
27
+ Requires-Dist: ag2[retrievechat-mongodb]==0.3.2; extra == 'ag2-extras'
28
+ Requires-Dist: ag2[retrievechat-pgvector]==0.3.2; extra == 'ag2-extras'
29
+ Requires-Dist: ag2[retrievechat-qdrant]==0.3.2; extra == 'ag2-extras'
30
+ Requires-Dist: ag2[retrievechat]==0.3.2; extra == 'ag2-extras'
31
+ Requires-Dist: ag2[together]==0.3.2; extra == 'ag2-extras'
32
+ Requires-Dist: ag2[websurfer]==0.3.2; extra == 'ag2-extras'
33
+ Requires-Dist: chromadb==0.5.3; extra == 'ag2-extras'
34
+ Requires-Dist: fastembed==0.4.2; extra == 'ag2-extras'
35
+ Requires-Dist: pgvector>=0.2.5; extra == 'ag2-extras'
36
+ Requires-Dist: psycopg[binary]>=3.1.18; extra == 'ag2-extras'
37
+ Requires-Dist: pymongo==4.10.1; extra == 'ag2-extras'
38
+ Requires-Dist: qdrant-client==1.12.1; extra == 'ag2-extras'
39
+ Provides-Extra: dev
40
+ Requires-Dist: autoflake==2.3.1; extra == 'dev'
41
+ Requires-Dist: bandit==1.7.10; extra == 'dev'
42
+ Requires-Dist: black[jupyter]==24.10.0; extra == 'dev'
43
+ Requires-Dist: flake8==7.1.1; extra == 'dev'
44
+ Requires-Dist: isort==5.13.2; extra == 'dev'
45
+ Requires-Dist: mypy==1.13.0; extra == 'dev'
46
+ Requires-Dist: pre-commit==4.0.1; extra == 'dev'
47
+ Requires-Dist: pydocstyle==6.3.0; extra == 'dev'
48
+ Requires-Dist: pylint==3.3.1; extra == 'dev'
49
+ Requires-Dist: python-dotenv==1.0.1; extra == 'dev'
50
+ Requires-Dist: ruff==0.7.4; extra == 'dev'
51
+ Requires-Dist: types-pyyaml==6.0.12; extra == 'dev'
52
+ Requires-Dist: yamllint==1.35.1; extra == 'dev'
53
+ Provides-Extra: docs
54
+ Requires-Dist: mdx-include==1.4.2; extra == 'docs'
55
+ Requires-Dist: mdx-truly-sane-lists==1.3; extra == 'docs'
56
+ Requires-Dist: mkdocs-jupyter==0.25.1; extra == 'docs'
57
+ Requires-Dist: mkdocs-macros-plugin==1.3.7; extra == 'docs'
58
+ Requires-Dist: mkdocs-material==9.5.44; extra == 'docs'
59
+ Requires-Dist: mkdocs-minify-html-plugin==0.2.3; extra == 'docs'
60
+ Requires-Dist: mkdocs==1.6.1; extra == 'docs'
61
+ Requires-Dist: mkdocstrings-python==1.12.2; extra == 'docs'
62
+ Requires-Dist: mkdocstrings[crystal,python]==0.27.0; extra == 'docs'
63
+ Provides-Extra: test
64
+ Requires-Dist: pytest-cov==6.0.0; extra == 'test'
65
+ Requires-Dist: pytest-html==4.1.1; extra == 'test'
66
+ Requires-Dist: pytest-sugar==1.0.0; extra == 'test'
67
+ Requires-Dist: pytest-timeout==2.3.1; extra == 'test'
68
+ Requires-Dist: pytest-xdist==3.6.1; extra == 'test'
69
+ Requires-Dist: pytest==8.3.3; extra == 'test'
70
+ Description-Content-Type: text/markdown
71
+
72
+ # Waldiez
73
+
74
+ ![CI Build](https://github.com/waldiez/waldiez/actions/workflows/main.yaml/badge.svg) [![Coverage Status](https://coveralls.io/repos/github/waldiez/waldiez/badge.svg)](https://coveralls.io/github/waldiez/waldiez) [![PyPI version](https://badge.fury.io/waldiez/waldiez.svg)](https://badge.fury.io/py/waldiez)
75
+
76
+ Translate a Waldiez flow:
77
+
78
+ ![Flow](https://raw.githubusercontent.com/waldiez/waldiez/refs/heads/main/docs/static/images/overview.webp)
79
+
80
+ To a python script or a jupyter notebook with the corresponding [ag2](https://github.com/ag2ai/ag2/) agents and chats.
81
+
82
+ ## Features
83
+
84
+ - Export .waldiez flows to .py or .ipynb
85
+ - Run a .waldiez flow
86
+ - Include a `logs` folder with the logs of the flow in csv format
87
+ - Provide a custom [IOSStream](https://ag2ai.github.io/ag2/docs/reference/io/base#iostream) to handle input and output.
88
+
89
+ ## Installation
90
+
91
+ On PyPI:
92
+
93
+ ```bash
94
+ python -m pip install waldiez
95
+ ```
96
+
97
+ From the repository:
98
+
99
+ ```bash
100
+ python -m pip install git+https://github.com/waldiez/waldiez.git
101
+ ```
102
+
103
+ ## Usage
104
+
105
+ ### CLI
106
+
107
+ ```bash
108
+ # Export a Waldiez flow to a python script or a jupyter notebook
109
+ waldiez --export /path/to/a/flow.waldiez --output /path/to/an/output/flow[.py|.ipynb]
110
+ # Export and run the script, optionally force generation if the output file already exists
111
+ waldiez /path/to/a/flow.waldiez --output /path/to/an/output/flow[.py] [--force]
112
+ ```
113
+
114
+ ### Using docker/podman
115
+
116
+ ```shell
117
+ CONTAINER_COMMAND=docker # or podman
118
+ # pull the image
119
+ $CONTAINER_COMMAND pull waldiez/waldiez
120
+ # Export a Waldiez flow to a python script or a jupyter notebook
121
+ $CONTAINER_COMMAND run \
122
+ --rm \
123
+ -v /path/to/a/flow.waldiez:/flow.waldiez \
124
+ -v /path/to/an/output:/output \
125
+ waldiez/waldiez --export /flow.waldiez --output /output/flow[.py|.ipynb]
126
+
127
+ # with selinux and/or podman, you might get permission (or file not found) errors, so you can try:
128
+ $CONTAINER_COMMAND run \
129
+ --rm \
130
+ -v /path/to/a/flow.waldiez:/flow.waldiez \
131
+ -v /path/to/an/output:/output \
132
+ --userns=keep-id \
133
+ --security-opt label=disable \
134
+ waldiez/waldiez --export /flow.waldiez --output /output/flow[.py|.ipynb]
135
+ ```
136
+
137
+ ```shell
138
+ # Export and run the script
139
+ $CONTAINER_COMMAND run --rm -v /path/to/a/flow.waldiez:/flow.waldiez -v /path/to/an/output:/output waldiez/waldiez /flow.waldiez --output /output/output[.py]
140
+ ```
141
+
142
+ ### As a library
143
+
144
+ #### Export a flow
145
+
146
+ ```python
147
+ # Export a Waldiez flow to a python script or a jupyter notebook
148
+ from waldiez import WaldiezExporter
149
+ flow_path = "/path/to/a/flow.waldiez"
150
+ output_path = "/path/to/an/output.py" # or .ipynb
151
+ exporter = WaldiezExporter.load(flow_path)
152
+ exporter.export(output_path)
153
+ ```
154
+
155
+ #### Run a flow
156
+
157
+ ```python
158
+ # Run a flow
159
+ from waldiez import WaldiezRunner
160
+ flow_path = "/path/to/a/flow.waldiez"
161
+ output_path = "/path/to/an/output.py"
162
+ runner = WaldiezRunner.load(flow_path)
163
+ runner.run(output_path=output_path)
164
+ ```
165
+
166
+ #### Run a flow with a custom IOStream
167
+
168
+ ```python
169
+ # Run the flow with a custom IOStream
170
+ # In case the standard 'input' and 'print' functions cannot be used
171
+ import time
172
+ import threading
173
+
174
+ from typing import Any
175
+
176
+ from waldiez import WaldiezRunner
177
+ from waldiez.io import WaldiezIOStream
178
+
179
+ flow_path = "/path/to/a/flow.waldiez"
180
+ output_path = "/path/to/an/output.py"
181
+
182
+
183
+ def custom_print_function(*args: Any, sep: str = " ", **kwargs: Any) -> None:
184
+ """Custom print function."""
185
+ print(*args, sep=sep, **kwargs)
186
+
187
+
188
+ # Custom input handler
189
+ class InputProcessorWrapper:
190
+ """Wrapper input processor.
191
+
192
+ To manage the interaction between the custom input processor and IOStream.
193
+ """
194
+
195
+ def __init__(self):
196
+ self.stream = None # Placeholder for the WaldiezIOStream instance
197
+ self.lock = threading.Lock() # Ensure thread-safe operations
198
+
199
+ def custom_input_processor(self, prompt: str) -> None:
200
+ """Simulate external input and send it back to the IOStream."""
201
+ def external_input_simulation():
202
+ with self.lock: # Ensure thread-safe access
203
+ time.sleep(2) # Simulate delay for network input
204
+ if self.stream:
205
+ self.stream.set_input("Simulated external input")
206
+ else:
207
+ raise RuntimeError("Stream reference not set!")
208
+
209
+ threading.Thread(target=external_input_simulation, daemon=True).start()
210
+
211
+ def set_stream(self, stream: "WaldiezIOStream"):
212
+ """Set the WaldiezIOStream instance."""
213
+ with self.lock: # Ensure thread-safe setting of the stream
214
+ self.stream = stream
215
+
216
+ processor_wrapper = InputProcessorWrapper()
217
+
218
+ stream = WaldiezIOStream(
219
+ input_timeout=30,
220
+ print_function=
221
+ on_prompt_input=processor_wrapper.custom_input_processor,
222
+ )
223
+
224
+ # Link the processor wrapper to the WaldiezIOStream instance
225
+ processor_wrapper.set_stream(custom_stream)
226
+
227
+ with WaldiezIOStream.set_default(io_stream):
228
+ runner = WaldiezRunner.load(flow_path)
229
+ runner.run(stream=io_stream, output_path=output_path)
230
+
231
+ ```
232
+
233
+ ### Tools
234
+
235
+ - [ag2 (formerly AutoGen)](https://github.com/ag2ai/ag2)
236
+ - [juptytext](https://github.com/mwouts/jupytext)
237
+ - [pydantic](https://github.com/pydantic/pydantic)
238
+
239
+ ## License
240
+
241
+ This project is licensed under the MIT License - see the [LICENSE](https://github.com/waldiez/waldiez/blob/main/LICENSE) file for details.
@@ -0,0 +1,170 @@
1
+ # Waldiez
2
+
3
+ ![CI Build](https://github.com/waldiez/waldiez/actions/workflows/main.yaml/badge.svg) [![Coverage Status](https://coveralls.io/repos/github/waldiez/waldiez/badge.svg)](https://coveralls.io/github/waldiez/waldiez) [![PyPI version](https://badge.fury.io/waldiez/waldiez.svg)](https://badge.fury.io/py/waldiez)
4
+
5
+ Translate a Waldiez flow:
6
+
7
+ ![Flow](https://raw.githubusercontent.com/waldiez/waldiez/refs/heads/main/docs/static/images/overview.webp)
8
+
9
+ To a python script or a jupyter notebook with the corresponding [ag2](https://github.com/ag2ai/ag2/) agents and chats.
10
+
11
+ ## Features
12
+
13
+ - Export .waldiez flows to .py or .ipynb
14
+ - Run a .waldiez flow
15
+ - Include a `logs` folder with the logs of the flow in csv format
16
+ - Provide a custom [IOSStream](https://ag2ai.github.io/ag2/docs/reference/io/base#iostream) to handle input and output.
17
+
18
+ ## Installation
19
+
20
+ On PyPI:
21
+
22
+ ```bash
23
+ python -m pip install waldiez
24
+ ```
25
+
26
+ From the repository:
27
+
28
+ ```bash
29
+ python -m pip install git+https://github.com/waldiez/waldiez.git
30
+ ```
31
+
32
+ ## Usage
33
+
34
+ ### CLI
35
+
36
+ ```bash
37
+ # Export a Waldiez flow to a python script or a jupyter notebook
38
+ waldiez --export /path/to/a/flow.waldiez --output /path/to/an/output/flow[.py|.ipynb]
39
+ # Export and run the script, optionally force generation if the output file already exists
40
+ waldiez /path/to/a/flow.waldiez --output /path/to/an/output/flow[.py] [--force]
41
+ ```
42
+
43
+ ### Using docker/podman
44
+
45
+ ```shell
46
+ CONTAINER_COMMAND=docker # or podman
47
+ # pull the image
48
+ $CONTAINER_COMMAND pull waldiez/waldiez
49
+ # Export a Waldiez flow to a python script or a jupyter notebook
50
+ $CONTAINER_COMMAND run \
51
+ --rm \
52
+ -v /path/to/a/flow.waldiez:/flow.waldiez \
53
+ -v /path/to/an/output:/output \
54
+ waldiez/waldiez --export /flow.waldiez --output /output/flow[.py|.ipynb]
55
+
56
+ # with selinux and/or podman, you might get permission (or file not found) errors, so you can try:
57
+ $CONTAINER_COMMAND run \
58
+ --rm \
59
+ -v /path/to/a/flow.waldiez:/flow.waldiez \
60
+ -v /path/to/an/output:/output \
61
+ --userns=keep-id \
62
+ --security-opt label=disable \
63
+ waldiez/waldiez --export /flow.waldiez --output /output/flow[.py|.ipynb]
64
+ ```
65
+
66
+ ```shell
67
+ # Export and run the script
68
+ $CONTAINER_COMMAND run --rm -v /path/to/a/flow.waldiez:/flow.waldiez -v /path/to/an/output:/output waldiez/waldiez /flow.waldiez --output /output/output[.py]
69
+ ```
70
+
71
+ ### As a library
72
+
73
+ #### Export a flow
74
+
75
+ ```python
76
+ # Export a Waldiez flow to a python script or a jupyter notebook
77
+ from waldiez import WaldiezExporter
78
+ flow_path = "/path/to/a/flow.waldiez"
79
+ output_path = "/path/to/an/output.py" # or .ipynb
80
+ exporter = WaldiezExporter.load(flow_path)
81
+ exporter.export(output_path)
82
+ ```
83
+
84
+ #### Run a flow
85
+
86
+ ```python
87
+ # Run a flow
88
+ from waldiez import WaldiezRunner
89
+ flow_path = "/path/to/a/flow.waldiez"
90
+ output_path = "/path/to/an/output.py"
91
+ runner = WaldiezRunner.load(flow_path)
92
+ runner.run(output_path=output_path)
93
+ ```
94
+
95
+ #### Run a flow with a custom IOStream
96
+
97
+ ```python
98
+ # Run the flow with a custom IOStream
99
+ # In case the standard 'input' and 'print' functions cannot be used
100
+ import time
101
+ import threading
102
+
103
+ from typing import Any
104
+
105
+ from waldiez import WaldiezRunner
106
+ from waldiez.io import WaldiezIOStream
107
+
108
+ flow_path = "/path/to/a/flow.waldiez"
109
+ output_path = "/path/to/an/output.py"
110
+
111
+
112
+ def custom_print_function(*args: Any, sep: str = " ", **kwargs: Any) -> None:
113
+ """Custom print function."""
114
+ print(*args, sep=sep, **kwargs)
115
+
116
+
117
+ # Custom input handler
118
+ class InputProcessorWrapper:
119
+ """Wrapper input processor.
120
+
121
+ To manage the interaction between the custom input processor and IOStream.
122
+ """
123
+
124
+ def __init__(self):
125
+ self.stream = None # Placeholder for the WaldiezIOStream instance
126
+ self.lock = threading.Lock() # Ensure thread-safe operations
127
+
128
+ def custom_input_processor(self, prompt: str) -> None:
129
+ """Simulate external input and send it back to the IOStream."""
130
+ def external_input_simulation():
131
+ with self.lock: # Ensure thread-safe access
132
+ time.sleep(2) # Simulate delay for network input
133
+ if self.stream:
134
+ self.stream.set_input("Simulated external input")
135
+ else:
136
+ raise RuntimeError("Stream reference not set!")
137
+
138
+ threading.Thread(target=external_input_simulation, daemon=True).start()
139
+
140
+ def set_stream(self, stream: "WaldiezIOStream"):
141
+ """Set the WaldiezIOStream instance."""
142
+ with self.lock: # Ensure thread-safe setting of the stream
143
+ self.stream = stream
144
+
145
+ processor_wrapper = InputProcessorWrapper()
146
+
147
+ stream = WaldiezIOStream(
148
+ input_timeout=30,
149
+ print_function=
150
+ on_prompt_input=processor_wrapper.custom_input_processor,
151
+ )
152
+
153
+ # Link the processor wrapper to the WaldiezIOStream instance
154
+ processor_wrapper.set_stream(custom_stream)
155
+
156
+ with WaldiezIOStream.set_default(io_stream):
157
+ runner = WaldiezRunner.load(flow_path)
158
+ runner.run(stream=io_stream, output_path=output_path)
159
+
160
+ ```
161
+
162
+ ### Tools
163
+
164
+ - [ag2 (formerly AutoGen)](https://github.com/ag2ai/ag2)
165
+ - [juptytext](https://github.com/mwouts/jupytext)
166
+ - [pydantic](https://github.com/pydantic/pydantic)
167
+
168
+ ## License
169
+
170
+ This project is licensed under the MIT License - see the [LICENSE](https://github.com/waldiez/waldiez/blob/main/LICENSE) file for details.
@@ -22,13 +22,12 @@ classifiers = [
22
22
  ]
23
23
  dependencies = [
24
24
  "jupytext",
25
- "autogen-agentchat==0.2.37",
26
- "twisted==24.10.0",
25
+ "ag2==0.3.2"
27
26
  ]
28
27
 
29
28
  [project.urls]
30
- homepage = 'https://waldiez.github.io/py/'
31
- repository = 'https://github.com/waldiez/py.git'
29
+ homepage = 'https://waldiez.github.io/waldiez/'
30
+ repository = 'https://github.com/waldiez/waldiez.git'
32
31
 
33
32
  [tool.hatch.build.targets.sdist]
34
33
  packages = ["waldiez", "waldiez.*"]
@@ -50,33 +49,33 @@ dev = [
50
49
  'pydocstyle==6.3.0',
51
50
  'pylint==3.3.1',
52
51
  'python-dotenv==1.0.1',
53
- 'ruff==0.7.1',
52
+ 'ruff==0.7.4',
54
53
  'types-PyYAML==6.0.12',
55
54
  'yamllint==1.35.1',
56
55
  ]
57
- autogen_extras =[
58
- 'chromadb==0.5.15',
59
- 'fastembed==0.4.1',
60
- 'pgvector==0.3.5',
61
- 'psycopg[binary]>=3.2.3',
62
- 'autogen-agentchat[retrievechat]==0.2.37',
63
- 'autogen-agentchat[retrievechat-pgvector]==0.2.37',
64
- 'autogen-agentchat[retrievechat-mongodb]==0.2.37',
65
- 'autogen-agentchat[retrievechat-qdrant]==0.2.37',
66
- 'autogen-agentchat[retrievechat-couchbase]==0.2.37',
67
- 'autogen-agentchat[gemini]==0.2.37',
68
- 'autogen-agentchat[together]==0.2.37',
69
- 'autogen-agentchat[anthropic]==0.2.37',
70
- 'autogen-agentchat[mistral]==0.2.37',
71
- 'autogen-agentchat[groq]==0.2.37',
72
- 'autogen-agentchat[bedrock]==0.2.37',
73
- 'autogen-agentchat[websurfer]==0.2.37',
56
+ ag2_extras =[
57
+ 'chromadb==0.5.3',
58
+ 'fastembed==0.4.2',
59
+ 'pgvector>=0.2.5',
60
+ 'psycopg[binary]>=3.1.18',
61
+ 'ag2[retrievechat]==0.3.2',
62
+ 'ag2[retrievechat-pgvector]==0.3.2',
63
+ 'ag2[retrievechat-mongodb]==0.3.2',
64
+ 'ag2[retrievechat-qdrant]==0.3.2',
65
+ 'ag2[gemini]==0.3.2',
66
+ 'ag2[together]==0.3.2',
67
+ 'ag2[anthropic]==0.3.2',
68
+ 'ag2[mistral]==0.3.2',
69
+ 'ag2[groq]==0.3.2',
70
+ 'ag2[bedrock]==0.3.2',
71
+ 'ag2[websurfer]==0.3.2',
72
+ 'ag2[together]==0.3.2',
74
73
  'pymongo==4.10.1',
75
- 'qdrant-client==1.12.0',
74
+ 'qdrant-client==1.12.1',
76
75
  ]
77
76
  test = [
78
77
  'pytest==8.3.3',
79
- 'pytest-cov==5.0.0',
78
+ 'pytest-cov==6.0.0',
80
79
  'pytest-html==4.1.1',
81
80
  'pytest-sugar==1.0.0',
82
81
  'pytest-timeout==2.3.1',
@@ -87,10 +86,10 @@ docs = [
87
86
  'mdx_truly_sane_lists==1.3',
88
87
  'mkdocs==1.6.1',
89
88
  'mkdocs-jupyter==0.25.1',
90
- 'mkdocs-macros-plugin==1.3.6',
91
- 'mkdocs-material==9.5.42',
89
+ 'mkdocs-macros-plugin==1.3.7',
90
+ 'mkdocs-material==9.5.44',
92
91
  'mkdocs-minify-html-plugin==0.2.3',
93
- 'mkdocstrings[crystal,python]==0.26.2',
92
+ 'mkdocstrings[crystal,python]==0.27.0',
94
93
  'mkdocstrings-python==1.12.2'
95
94
  ]
96
95
 
@@ -271,7 +270,18 @@ line-ending = "lf"
271
270
 
272
271
  # pytest
273
272
  [tool.pytest.ini_options]
274
- # filterwarnings = []
273
+ filterwarnings = [
274
+ # DeprecationWarning:
275
+ # Type google._upb._message.MessageMapContainer uses PyType_Spec with a metaclass that has custom tp_new.
276
+ # This is deprecated and will no longer be allowed in Python 3.14.
277
+ #
278
+ # autogen/logger/logger_utils.py:9: DeprecationWarning:
279
+ # datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version
280
+ #
281
+ # DeprecationWarning:
282
+ # reactor.stop cannot be used inside unit tests
283
+ "ignore::DeprecationWarning",
284
+ ]
275
285
  python_files = [
276
286
  "tests.py",
277
287
  "test_*.py",
@@ -283,7 +293,7 @@ addopts = """
283
293
  --exitfirst \
284
294
  --durations=10 \
285
295
  --color=yes \
286
- --timeout=30
296
+ --timeout=120
287
297
  """
288
298
 
289
299
 
@@ -2,14 +2,12 @@
2
2
 
3
3
  from ._version import __version__
4
4
  from .exporter import WaldiezExporter
5
- from .io_stream import WaldiezIOStream
6
5
  from .models import Waldiez
7
6
  from .runner import WaldiezRunner
8
7
 
9
8
  __all__ = [
10
9
  "Waldiez",
11
10
  "WaldiezExporter",
12
- "WaldiezIOStream",
13
11
  "WaldiezRunner",
14
12
  "__version__",
15
13
  ]
@@ -1,3 +1,3 @@
1
1
  """Version information for Waldiez."""
2
2
 
3
- __version__ = "0.1.6"
3
+ __version__ = "0.1.8"
@@ -6,14 +6,15 @@ import logging
6
6
  import os
7
7
  import sys
8
8
  from pathlib import Path
9
- from typing import Any, Dict, Optional
10
-
11
- from autogen import ChatResult # type: ignore[import-untyped]
9
+ from typing import TYPE_CHECKING, Any, Dict, Optional
12
10
 
13
11
  from . import Waldiez, __version__
14
12
  from .exporter import WaldiezExporter
15
13
  from .runner import WaldiezRunner
16
14
 
15
+ if TYPE_CHECKING:
16
+ from autogen import ChatResult # type: ignore[import-untyped]
17
+
17
18
 
18
19
  def get_parser() -> argparse.ArgumentParser:
19
20
  """Get the argument parser for the Waldiez package.
@@ -28,7 +29,7 @@ def get_parser() -> argparse.ArgumentParser:
28
29
  prog="waldiez",
29
30
  )
30
31
  parser.add_argument(
31
- "waldiez",
32
+ "file",
32
33
  type=str,
33
34
  help="Path to the Waldiez flow (*.waldiez) file.",
34
35
  )
@@ -66,7 +67,7 @@ def get_parser() -> argparse.ArgumentParser:
66
67
  return parser
67
68
 
68
69
 
69
- def _log_result(result: ChatResult) -> None:
70
+ def _log_result(result: "ChatResult") -> None:
70
71
  """Log the result of the Waldiez flow."""
71
72
  logger = logging.getLogger("waldiez::cli")
72
73
  logger.info("Chat History:\n")
@@ -94,9 +95,12 @@ def _run(data: Dict[str, Any], output_path: Optional[str]) -> None:
94
95
  def main() -> None:
95
96
  """Parse the command line arguments and run the Waldiez flow."""
96
97
  parser = get_parser()
98
+ if len(sys.argv) == 1:
99
+ parser.print_help()
100
+ sys.exit(0)
97
101
  args = parser.parse_args()
98
102
  logger = _get_logger()
99
- waldiez_file: str = args.waldiez
103
+ waldiez_file: str = args.file
100
104
  if not os.path.exists(waldiez_file):
101
105
  logger.error("File not found: %s", waldiez_file)
102
106
  sys.exit(1)
@@ -109,8 +109,7 @@ def get_chroma_db_args(
109
109
  f" embedding_function={embedding_function_arg},\n"
110
110
  )
111
111
  # The RAG example:
112
- # https://microsoft.github.io/autogen/docs/\
113
- # notebooks/agentchat_groupchat_RAG
112
+ # https://ag2ai.github.io/ag2/docs/notebooks/agentchat_groupchat_RAG/
114
113
  # raises `InvalidCollectionException`: Collection groupchat does not exist.
115
114
  # https://github.com/chroma-core/chroma/issues/861
116
115
  # https://github.com/microsoft/autogen/issues/3551#issuecomment-2366930994
@@ -14,7 +14,6 @@ from .helpers import escape_summary_args_quotes
14
14
 
15
15
 
16
16
  def get_nested_chat_trigger_agent_names(
17
- all_chats: List[WaldiezChat],
18
17
  nested_chat: WaldiezAgentNestedChat,
19
18
  agent_names: Dict[str, str],
20
19
  ) -> str:
@@ -22,8 +21,6 @@ def get_nested_chat_trigger_agent_names(
22
21
 
23
22
  Parameters
24
23
  ----------
25
- all_chats : List[WaldiezChat]
26
- All the chats in the flow.
27
24
  nested_chat : WaldiezAgentNestedChat
28
25
  The nested chat.
29
26
  agent_names : Dict[str, str]
@@ -34,14 +31,7 @@ def get_nested_chat_trigger_agent_names(
34
31
  str
35
32
  The trigger agent names.
36
33
  """
37
- trigger_agent_ids: List[str] = []
38
- for message in nested_chat.triggered_by:
39
- waldiez_chat = next(chat for chat in all_chats if chat.id == message.id)
40
- if message.is_reply:
41
- trigger_agent_ids.append(waldiez_chat.target)
42
- else:
43
- trigger_agent_ids.append(waldiez_chat.source)
44
- agents = [agent_names[agent_id] for agent_id in trigger_agent_ids]
34
+ agents = [agent_names[agent_id] for agent_id in nested_chat.triggered_by]
45
35
  trigger_string = f'{[", ".join(agents)]}'
46
36
  return trigger_string.replace("'", '"')
47
37
 
@@ -228,7 +218,7 @@ def export_nested_chat(
228
218
  use_suffix = len(agent.data.nested_chats) > 1
229
219
  for index, entry in enumerate(agent.data.nested_chats):
230
220
  trigger_names = get_nested_chat_trigger_agent_names(
231
- all_chats=all_chats, nested_chat=entry, agent_names=agent_names
221
+ nested_chat=entry, agent_names=agent_names
232
222
  )
233
223
  chat_queue, extra_methods = get_nested_chat_queue(
234
224
  nested_chat=entry,
@@ -14,6 +14,7 @@ get_sqlite_to_csv_call_string
14
14
 
15
15
 
16
16
  # Check issue:
17
+ # Also check if in ag2 this still applies
17
18
  # https://github.com/microsoft/autogen/issues/2286
18
19
  # we cannot log new agents if they have code_execution enabled
19
20
  # we get `Path` is not JSON serializable (on code_executor)