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.
- waldiez-0.1.8/PKG-INFO +241 -0
- waldiez-0.1.8/README.md +170 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/pyproject.toml +39 -29
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/__init__.py +0 -2
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/_version.py +1 -1
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/cli.py +10 -6
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/agents/rag_user/chroma_utils.py +1 -2
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/chats/nested.py +2 -12
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/utils/logging_utils.py +1 -0
- waldiez-0.1.8/waldiez/io/__init__.py +142 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/agent/nested_chat.py +4 -8
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/waldiez.py +18 -11
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/runner.py +24 -10
- waldiez-0.1.6/PKG-INFO +0 -180
- waldiez-0.1.6/README.md +0 -106
- waldiez-0.1.6/waldiez/io_stream.py +0 -181
- waldiez-0.1.6/waldiez/stream/__init__.py +0 -7
- waldiez-0.1.6/waldiez/stream/consumer.py +0 -139
- waldiez-0.1.6/waldiez/stream/provider.py +0 -339
- waldiez-0.1.6/waldiez/stream/server.py +0 -412
- {waldiez-0.1.6 → waldiez-0.1.8}/.gitignore +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/LICENSE +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/__main__.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporter.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/__init__.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/agents/__init__.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/agents/agent.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/agents/agent_skills.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/agents/code_execution.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/agents/group_manager.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/agents/llm_config.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/agents/rag_user/__init__.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/agents/rag_user/mongo_utils.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/agents/rag_user/pgvector_utils.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/agents/rag_user/qdrant_utils.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/agents/rag_user/rag_user.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/agents/rag_user/vector_db.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/agents/teachability.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/agents/termination_message.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/chats/__init__.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/chats/chats.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/chats/helpers.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/flow/__init__.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/flow/def_main.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/flow/flow.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/models/__init__.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/skills/__init__.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/utils/__init__.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/utils/comments.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/utils/importing.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/utils/method_utils.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/utils/naming.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/utils/object_string.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/exporting/utils/path_check.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/__init__.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/__init__.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/agent/__init__.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/agent/agent.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/agent/agent_data.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/agent/code_execution.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/agent/linked_skill.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/agent/teachability.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/agent/termination_message.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/agents.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/assistant/__init__.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/assistant/assistant.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/assistant/assistant_data.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/group_manager/__init__.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/group_manager/group_manager.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/group_manager/group_manager_data.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/group_manager/speakers.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/rag_user/__init__.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/rag_user/rag_user.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/rag_user/rag_user_data.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/rag_user/retrieve_config.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/rag_user/vector_db_config.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/user_proxy/__init__.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/user_proxy/user_proxy.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/agents/user_proxy/user_proxy_data.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/chat/__init__.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/chat/chat.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/chat/chat_data.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/chat/chat_message.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/chat/chat_nested.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/chat/chat_summary.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/common/__init__.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/common/base.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/common/method_utils.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/flow/__init__.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/flow/flow.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/flow/flow_data.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/model/__init__.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/model/model.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/model/model_data.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/skill/__init__.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/skill/skill.py +0 -0
- {waldiez-0.1.6 → waldiez-0.1.8}/waldiez/models/skill/skill_data.py +0 -0
- {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
|
+
 [](https://coveralls.io/github/waldiez/waldiez) [](https://badge.fury.io/py/waldiez)
|
|
75
|
+
|
|
76
|
+
Translate a Waldiez flow:
|
|
77
|
+
|
|
78
|
+

|
|
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.
|
waldiez-0.1.8/README.md
ADDED
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
# Waldiez
|
|
2
|
+
|
|
3
|
+
 [](https://coveralls.io/github/waldiez/waldiez) [](https://badge.fury.io/py/waldiez)
|
|
4
|
+
|
|
5
|
+
Translate a Waldiez flow:
|
|
6
|
+
|
|
7
|
+

|
|
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
|
-
"
|
|
26
|
-
"twisted==24.10.0",
|
|
25
|
+
"ag2==0.3.2"
|
|
27
26
|
]
|
|
28
27
|
|
|
29
28
|
[project.urls]
|
|
30
|
-
homepage = 'https://waldiez.github.io/
|
|
31
|
-
repository = 'https://github.com/waldiez/
|
|
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.
|
|
52
|
+
'ruff==0.7.4',
|
|
54
53
|
'types-PyYAML==6.0.12',
|
|
55
54
|
'yamllint==1.35.1',
|
|
56
55
|
]
|
|
57
|
-
|
|
58
|
-
'chromadb==0.5.
|
|
59
|
-
'fastembed==0.4.
|
|
60
|
-
'pgvector
|
|
61
|
-
'psycopg[binary]>=3.
|
|
62
|
-
'
|
|
63
|
-
'
|
|
64
|
-
'
|
|
65
|
-
'
|
|
66
|
-
'
|
|
67
|
-
'
|
|
68
|
-
'
|
|
69
|
-
'
|
|
70
|
-
'
|
|
71
|
-
'
|
|
72
|
-
'
|
|
73
|
-
'
|
|
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.
|
|
74
|
+
'qdrant-client==1.12.1',
|
|
76
75
|
]
|
|
77
76
|
test = [
|
|
78
77
|
'pytest==8.3.3',
|
|
79
|
-
'pytest-cov==
|
|
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.
|
|
91
|
-
'mkdocs-material==9.5.
|
|
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.
|
|
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
|
-
|
|
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=
|
|
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
|
]
|
|
@@ -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
|
-
"
|
|
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.
|
|
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://
|
|
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
|
-
|
|
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
|
-
|
|
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)
|