waldiez 0.1.7__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 (97) hide show
  1. {waldiez-0.1.7 → waldiez-0.1.8}/PKG-INFO +83 -51
  2. waldiez-0.1.8/README.md +170 -0
  3. {waldiez-0.1.7 → waldiez-0.1.8}/pyproject.toml +27 -25
  4. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/_version.py +1 -1
  5. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/exporting/agents/rag_user/chroma_utils.py +1 -2
  6. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/exporting/chats/nested.py +2 -12
  7. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/exporting/utils/logging_utils.py +1 -0
  8. waldiez-0.1.8/waldiez/io/__init__.py +142 -0
  9. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/agents/agent/nested_chat.py +4 -8
  10. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/waldiez.py +5 -8
  11. waldiez-0.1.7/README.md +0 -135
  12. waldiez-0.1.7/waldiez/io/__init__.py +0 -181
  13. waldiez-0.1.7/waldiez/io/stream/__init__.py +0 -7
  14. waldiez-0.1.7/waldiez/io/stream/consumer.py +0 -139
  15. waldiez-0.1.7/waldiez/io/stream/provider.py +0 -343
  16. waldiez-0.1.7/waldiez/io/stream/server.py +0 -438
  17. {waldiez-0.1.7 → waldiez-0.1.8}/.gitignore +0 -0
  18. {waldiez-0.1.7 → waldiez-0.1.8}/LICENSE +0 -0
  19. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/__init__.py +0 -0
  20. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/__main__.py +0 -0
  21. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/cli.py +0 -0
  22. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/exporter.py +0 -0
  23. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/exporting/__init__.py +0 -0
  24. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/exporting/agents/__init__.py +0 -0
  25. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/exporting/agents/agent.py +0 -0
  26. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/exporting/agents/agent_skills.py +0 -0
  27. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/exporting/agents/code_execution.py +0 -0
  28. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/exporting/agents/group_manager.py +0 -0
  29. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/exporting/agents/llm_config.py +0 -0
  30. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/exporting/agents/rag_user/__init__.py +0 -0
  31. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/exporting/agents/rag_user/mongo_utils.py +0 -0
  32. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/exporting/agents/rag_user/pgvector_utils.py +0 -0
  33. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/exporting/agents/rag_user/qdrant_utils.py +0 -0
  34. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/exporting/agents/rag_user/rag_user.py +0 -0
  35. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/exporting/agents/rag_user/vector_db.py +0 -0
  36. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/exporting/agents/teachability.py +0 -0
  37. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/exporting/agents/termination_message.py +0 -0
  38. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/exporting/chats/__init__.py +0 -0
  39. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/exporting/chats/chats.py +0 -0
  40. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/exporting/chats/helpers.py +0 -0
  41. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/exporting/flow/__init__.py +0 -0
  42. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/exporting/flow/def_main.py +0 -0
  43. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/exporting/flow/flow.py +0 -0
  44. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/exporting/models/__init__.py +0 -0
  45. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/exporting/skills/__init__.py +0 -0
  46. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/exporting/utils/__init__.py +0 -0
  47. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/exporting/utils/comments.py +0 -0
  48. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/exporting/utils/importing.py +0 -0
  49. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/exporting/utils/method_utils.py +0 -0
  50. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/exporting/utils/naming.py +0 -0
  51. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/exporting/utils/object_string.py +0 -0
  52. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/exporting/utils/path_check.py +0 -0
  53. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/__init__.py +0 -0
  54. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/agents/__init__.py +0 -0
  55. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/agents/agent/__init__.py +0 -0
  56. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/agents/agent/agent.py +0 -0
  57. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/agents/agent/agent_data.py +0 -0
  58. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/agents/agent/code_execution.py +0 -0
  59. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/agents/agent/linked_skill.py +0 -0
  60. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/agents/agent/teachability.py +0 -0
  61. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/agents/agent/termination_message.py +0 -0
  62. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/agents/agents.py +0 -0
  63. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/agents/assistant/__init__.py +0 -0
  64. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/agents/assistant/assistant.py +0 -0
  65. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/agents/assistant/assistant_data.py +0 -0
  66. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/agents/group_manager/__init__.py +0 -0
  67. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/agents/group_manager/group_manager.py +0 -0
  68. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/agents/group_manager/group_manager_data.py +0 -0
  69. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/agents/group_manager/speakers.py +0 -0
  70. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/agents/rag_user/__init__.py +0 -0
  71. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/agents/rag_user/rag_user.py +0 -0
  72. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/agents/rag_user/rag_user_data.py +0 -0
  73. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/agents/rag_user/retrieve_config.py +0 -0
  74. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/agents/rag_user/vector_db_config.py +0 -0
  75. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/agents/user_proxy/__init__.py +0 -0
  76. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/agents/user_proxy/user_proxy.py +0 -0
  77. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/agents/user_proxy/user_proxy_data.py +0 -0
  78. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/chat/__init__.py +0 -0
  79. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/chat/chat.py +0 -0
  80. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/chat/chat_data.py +0 -0
  81. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/chat/chat_message.py +0 -0
  82. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/chat/chat_nested.py +0 -0
  83. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/chat/chat_summary.py +0 -0
  84. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/common/__init__.py +0 -0
  85. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/common/base.py +0 -0
  86. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/common/method_utils.py +0 -0
  87. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/flow/__init__.py +0 -0
  88. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/flow/flow.py +0 -0
  89. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/flow/flow_data.py +0 -0
  90. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/model/__init__.py +0 -0
  91. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/model/model.py +0 -0
  92. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/model/model_data.py +0 -0
  93. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/skill/__init__.py +0 -0
  94. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/skill/skill.py +0 -0
  95. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/models/skill/skill_data.py +0 -0
  96. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/py.typed +0 -0
  97. {waldiez-0.1.7 → waldiez-0.1.8}/waldiez/runner.py +0 -0
@@ -1,11 +1,10 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: waldiez
3
- Version: 0.1.7
3
+ Version: 0.1.8
4
4
  Summary: waldiez
5
- Project-URL: homepage, https://waldiez.github.io/py/
6
- Project-URL: repository, https://github.com/waldiez/py.git
5
+ Project-URL: homepage, https://waldiez.github.io/waldiez/
6
+ Project-URL: repository, https://github.com/waldiez/waldiez.git
7
7
  Author-email: Panagiotis Kasnesis <pkasnesis@thingenious.io>, Lazaros Toumanidis <laztoum@protonmail.com>
8
- License-File: LICENSE
9
8
  Classifier: Development Status :: 3 - Alpha
10
9
  Classifier: Intended Audience :: Developers
11
10
  Classifier: Intended Audience :: Science/Research
@@ -17,28 +16,26 @@ Classifier: Programming Language :: Python :: 3.10
17
16
  Classifier: Programming Language :: Python :: 3.11
18
17
  Classifier: Programming Language :: Python :: 3.12
19
18
  Requires-Python: <3.13,>=3.10
20
- Requires-Dist: autogen-agentchat==0.2.37
19
+ Requires-Dist: ag2==0.3.2
21
20
  Requires-Dist: jupytext
22
- Requires-Dist: twisted==24.10.0
23
- Provides-Extra: autogen-extras
24
- Requires-Dist: autogen-agentchat[anthropic]==0.2.37; extra == 'autogen-extras'
25
- Requires-Dist: autogen-agentchat[bedrock]==0.2.37; extra == 'autogen-extras'
26
- Requires-Dist: autogen-agentchat[gemini]==0.2.37; extra == 'autogen-extras'
27
- Requires-Dist: autogen-agentchat[groq]==0.2.37; extra == 'autogen-extras'
28
- Requires-Dist: autogen-agentchat[mistral]==0.2.37; extra == 'autogen-extras'
29
- Requires-Dist: autogen-agentchat[retrievechat-couchbase]==0.2.37; extra == 'autogen-extras'
30
- Requires-Dist: autogen-agentchat[retrievechat-mongodb]==0.2.37; extra == 'autogen-extras'
31
- Requires-Dist: autogen-agentchat[retrievechat-pgvector]==0.2.37; extra == 'autogen-extras'
32
- Requires-Dist: autogen-agentchat[retrievechat-qdrant]==0.2.37; extra == 'autogen-extras'
33
- Requires-Dist: autogen-agentchat[retrievechat]==0.2.37; extra == 'autogen-extras'
34
- Requires-Dist: autogen-agentchat[together]==0.2.37; extra == 'autogen-extras'
35
- Requires-Dist: autogen-agentchat[websurfer]==0.2.37; extra == 'autogen-extras'
36
- Requires-Dist: chromadb==0.5.17; extra == 'autogen-extras'
37
- Requires-Dist: fastembed==0.4.1; extra == 'autogen-extras'
38
- Requires-Dist: pgvector==0.3.6; extra == 'autogen-extras'
39
- Requires-Dist: psycopg[binary]>=3.2.3; extra == 'autogen-extras'
40
- Requires-Dist: pymongo==4.10.1; extra == 'autogen-extras'
41
- Requires-Dist: qdrant-client==1.12.1; extra == 'autogen-extras'
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'
42
39
  Provides-Extra: dev
43
40
  Requires-Dist: autoflake==2.3.1; extra == 'dev'
44
41
  Requires-Dist: bandit==1.7.10; extra == 'dev'
@@ -50,7 +47,7 @@ Requires-Dist: pre-commit==4.0.1; extra == 'dev'
50
47
  Requires-Dist: pydocstyle==6.3.0; extra == 'dev'
51
48
  Requires-Dist: pylint==3.3.1; extra == 'dev'
52
49
  Requires-Dist: python-dotenv==1.0.1; extra == 'dev'
53
- Requires-Dist: ruff==0.7.2; extra == 'dev'
50
+ Requires-Dist: ruff==0.7.4; extra == 'dev'
54
51
  Requires-Dist: types-pyyaml==6.0.12; extra == 'dev'
55
52
  Requires-Dist: yamllint==1.35.1; extra == 'dev'
56
53
  Provides-Extra: docs
@@ -58,11 +55,11 @@ Requires-Dist: mdx-include==1.4.2; extra == 'docs'
58
55
  Requires-Dist: mdx-truly-sane-lists==1.3; extra == 'docs'
59
56
  Requires-Dist: mkdocs-jupyter==0.25.1; extra == 'docs'
60
57
  Requires-Dist: mkdocs-macros-plugin==1.3.7; extra == 'docs'
61
- Requires-Dist: mkdocs-material==9.5.43; extra == 'docs'
58
+ Requires-Dist: mkdocs-material==9.5.44; extra == 'docs'
62
59
  Requires-Dist: mkdocs-minify-html-plugin==0.2.3; extra == 'docs'
63
60
  Requires-Dist: mkdocs==1.6.1; extra == 'docs'
64
61
  Requires-Dist: mkdocstrings-python==1.12.2; extra == 'docs'
65
- Requires-Dist: mkdocstrings[crystal,python]==0.26.2; extra == 'docs'
62
+ Requires-Dist: mkdocstrings[crystal,python]==0.27.0; extra == 'docs'
66
63
  Provides-Extra: test
67
64
  Requires-Dist: pytest-cov==6.0.0; extra == 'test'
68
65
  Requires-Dist: pytest-html==4.1.1; extra == 'test'
@@ -74,20 +71,20 @@ Description-Content-Type: text/markdown
74
71
 
75
72
  # Waldiez
76
73
 
77
- ![CI Build](https://github.com/waldiez/py/actions/workflows/main.yaml/badge.svg) [![Coverage Status](https://coveralls.io/repos/github/waldiez/py/badge.svg)](https://coveralls.io/github/waldiez/py) [![PyPI version](https://badge.fury.io/py/waldiez.svg)](https://badge.fury.io/py/waldiez)
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)
78
75
 
79
76
  Translate a Waldiez flow:
80
77
 
81
- ![Flow](https://raw.githubusercontent.com/waldiez/py/refs/heads/main/docs/flow.png)
78
+ ![Flow](https://raw.githubusercontent.com/waldiez/waldiez/refs/heads/main/docs/static/images/overview.webp)
82
79
 
83
- To a python script or a jupyter notebook with the corresponding [autogen](https://github.com/microsoft/autogen/) agents and chats.
80
+ To a python script or a jupyter notebook with the corresponding [ag2](https://github.com/ag2ai/ag2/) agents and chats.
84
81
 
85
82
  ## Features
86
83
 
87
84
  - Export .waldiez flows to .py or .ipynb
88
85
  - Run a .waldiez flow
89
86
  - Include a `logs` folder with the logs of the flow in csv format
90
- - Provide a custom [IOSStream](https://autogen-ai.github.io/autogen/docs/reference/io/base#iostream) to handle input and output.
87
+ - Provide a custom [IOSStream](https://ag2ai.github.io/ag2/docs/reference/io/base#iostream) to handle input and output.
91
88
 
92
89
  ## Installation
93
90
 
@@ -100,7 +97,7 @@ python -m pip install waldiez
100
97
  From the repository:
101
98
 
102
99
  ```bash
103
- python -m pip install git+https://github.com/waldiez/py.git
100
+ python -m pip install git+https://github.com/waldiez/waldiez.git
104
101
  ```
105
102
 
106
103
  ## Usage
@@ -119,13 +116,13 @@ waldiez /path/to/a/flow.waldiez --output /path/to/an/output/flow[.py] [--force]
119
116
  ```shell
120
117
  CONTAINER_COMMAND=docker # or podman
121
118
  # pull the image
122
- $CONTAINER_COMMAND pull waldiez/py
119
+ $CONTAINER_COMMAND pull waldiez/waldiez
123
120
  # Export a Waldiez flow to a python script or a jupyter notebook
124
121
  $CONTAINER_COMMAND run \
125
122
  --rm \
126
123
  -v /path/to/a/flow.waldiez:/flow.waldiez \
127
124
  -v /path/to/an/output:/output \
128
- waldiez/py --export /flow.waldiez --output /output/flow[.py|.ipynb]
125
+ waldiez/waldiez --export /flow.waldiez --output /output/flow[.py|.ipynb]
129
126
 
130
127
  # with selinux and/or podman, you might get permission (or file not found) errors, so you can try:
131
128
  $CONTAINER_COMMAND run \
@@ -134,12 +131,12 @@ $CONTAINER_COMMAND run \
134
131
  -v /path/to/an/output:/output \
135
132
  --userns=keep-id \
136
133
  --security-opt label=disable \
137
- waldiez/py --export /flow.waldiez --output /output/flow[.py|.ipynb]
134
+ waldiez/waldiez --export /flow.waldiez --output /output/flow[.py|.ipynb]
138
135
  ```
139
136
 
140
137
  ```shell
141
138
  # Export and run the script
142
- $CONTAINER_COMMAND run --rm -v /path/to/a/flow.waldiez:/flow.waldiez -v /path/to/an/output:/output waldiez/py /flow.waldiez --output /output/output[.py]
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]
143
140
  ```
144
141
 
145
142
  ### As a library
@@ -170,40 +167,75 @@ runner.run(output_path=output_path)
170
167
 
171
168
  ```python
172
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
+
173
176
  from waldiez import WaldiezRunner
174
177
  from waldiez.io import WaldiezIOStream
175
178
 
176
179
  flow_path = "/path/to/a/flow.waldiez"
177
180
  output_path = "/path/to/an/output.py"
178
181
 
179
- def print_function(*values, **args) -> None:
180
- """A custom print function."""
181
- print(values)
182
182
 
183
- def on_prompt_input(prompt: str) -> str:
184
- """A custom input function."""
185
- return input(prompt)
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!")
186
208
 
187
- io_stream = WaldiezIOStream(
188
- print_function=print_function,
189
- on_prompt_input=on_prompt_input,
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(
190
219
  input_timeout=30,
220
+ print_function=
221
+ on_prompt_input=processor_wrapper.custom_input_processor,
191
222
  )
223
+
224
+ # Link the processor wrapper to the WaldiezIOStream instance
225
+ processor_wrapper.set_stream(custom_stream)
226
+
192
227
  with WaldiezIOStream.set_default(io_stream):
193
228
  runner = WaldiezRunner.load(flow_path)
194
229
  runner.run(stream=io_stream, output_path=output_path)
195
230
 
196
- io_stream.close()
197
-
198
231
  ```
199
232
 
200
233
  ### Tools
201
234
 
202
- - [autogen](https://github.com/microsoft/autogen/)
235
+ - [ag2 (formerly AutoGen)](https://github.com/ag2ai/ag2)
203
236
  - [juptytext](https://github.com/mwouts/jupytext)
204
- - [twisted](https://github.com/twisted/twisted)
205
237
  - [pydantic](https://github.com/pydantic/pydantic)
206
238
 
207
239
  ## License
208
240
 
209
- This project is licensed under the MIT License - see the [LICENSE](https://github.com/waldiez/py/blob/main/LICENSE) file for details.
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,27 +49,27 @@ dev = [
50
49
  'pydocstyle==6.3.0',
51
50
  'pylint==3.3.1',
52
51
  'python-dotenv==1.0.1',
53
- 'ruff==0.7.2',
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.17',
59
- 'fastembed==0.4.1',
60
- 'pgvector==0.3.6',
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
74
  'qdrant-client==1.12.1',
76
75
  ]
@@ -88,9 +87,9 @@ docs = [
88
87
  'mkdocs==1.6.1',
89
88
  'mkdocs-jupyter==0.25.1',
90
89
  'mkdocs-macros-plugin==1.3.7',
91
- 'mkdocs-material==9.5.43',
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
 
@@ -278,6 +277,9 @@ filterwarnings = [
278
277
  #
279
278
  # autogen/logger/logger_utils.py:9: DeprecationWarning:
280
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
281
283
  "ignore::DeprecationWarning",
282
284
  ]
283
285
  python_files = [
@@ -291,7 +293,7 @@ addopts = """
291
293
  --exitfirst \
292
294
  --durations=10 \
293
295
  --color=yes \
294
- --timeout=60
296
+ --timeout=120
295
297
  """
296
298
 
297
299
 
@@ -1,3 +1,3 @@
1
1
  """Version information for Waldiez."""
2
2
 
3
- __version__ = "0.1.7"
3
+ __version__ = "0.1.8"
@@ -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)