versionhq 1.2.1.8__tar.gz → 1.2.1.9__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.
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/PKG-INFO +1 -1
- versionhq-1.2.1.8/docs/core/Agent.md → versionhq-1.2.1.9/docs/core/agent/index.md +116 -88
- versionhq-1.2.1.8/docs/core/task.md → versionhq-1.2.1.9/docs/core/task/index.md +1 -1
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/mkdocs.yml +7 -4
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/pyproject.toml +1 -1
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/__init__.py +1 -1
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/task_graph/draft.py +15 -14
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/task_graph/model.py +6 -2
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq.egg-info/PKG-INFO +1 -1
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq.egg-info/SOURCES.txt +3 -3
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/formation_test.py +0 -1
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/task_graph/doc_test.py +2 -6
- versionhq-1.2.1.9/tests/task_graph/task_graph_test.py +26 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/uv.lock +31 -31
- versionhq-1.2.1.8/tests/task_graph/task_graph_test.py +0 -18
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/.env.sample +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/.github/workflows/deploy_docs.yml +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/.github/workflows/publish.yml +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/.github/workflows/publish_testpypi.yml +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/.github/workflows/run_tests.yml +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/.github/workflows/security_check.yml +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/.gitignore +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/.pre-commit-config.yaml +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/.python-version +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/LICENSE +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/README.md +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/SECURITY.md +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/db/preprocess.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/docs/CNAME +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/docs/_logos/favicon.ico +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/docs/_logos/logo192.png +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/docs/core/task/evaluation.md +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/docs/core/task/response-field.md +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/docs/core/task/task-output.md +0 -0
- /versionhq-1.2.1.8/docs/core/task-graph.md → /versionhq-1.2.1.9/docs/core/task-graph/index.md +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/docs/core/tool.md +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/docs/index.md +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/docs/quickstart.md +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/docs/stylesheets/main.css +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/docs/tags.md +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/requirements-dev.txt +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/requirements.txt +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/runtime.txt +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/setup.cfg +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/_utils/__init__.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/_utils/i18n.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/_utils/logger.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/_utils/process_config.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/_utils/usage_metrics.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/_utils/vars.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/agent/TEMPLATES/Backstory.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/agent/TEMPLATES/__init__.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/agent/__init__.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/agent/inhouse_agents.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/agent/model.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/agent/parser.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/agent/rpm_controller.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/agent_network/__init__.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/agent_network/model.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/cli/__init__.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/clients/__init__.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/clients/customer/__init__.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/clients/customer/model.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/clients/product/__init__.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/clients/product/model.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/clients/workflow/__init__.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/clients/workflow/model.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/knowledge/__init__.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/knowledge/_utils.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/knowledge/embedding.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/knowledge/model.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/knowledge/source.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/knowledge/source_docling.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/knowledge/storage.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/llm/__init__.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/llm/llm_vars.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/llm/model.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/memory/__init__.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/memory/contextual_memory.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/memory/model.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/storage/__init__.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/storage/base.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/storage/ltm_sqlite_storage.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/storage/mem0_storage.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/storage/rag_storage.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/storage/task_output_storage.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/storage/utils.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/task/TEMPLATES/Description.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/task/__init__.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/task/evaluate.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/task/formation.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/task/formatter.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/task/log_handler.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/task/model.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/task/structured_response.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/task_graph/__init__.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/task_graph/colors.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/tool/__init__.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/tool/cache_handler.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/tool/composio_tool.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/tool/composio_tool_vars.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/tool/decorator.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/tool/model.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/tool/tool_handler.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq.egg-info/dependency_links.txt +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq.egg-info/requires.txt +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq.egg-info/top_level.txt +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/__init__.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/agent/__init__.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/agent/agent_test.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/agent/doc_test.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/agent_network/Prompts/Demo_test.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/agent_network/__init__.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/agent_network/agent_network_test.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/cli/__init__.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/clients/customer_test.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/clients/product_test.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/clients/workflow_test.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/conftest.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/doc_test.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/knowledge/__init__.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/knowledge/knowledge_test.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/knowledge/mock_report_compressed.pdf +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/llm/__init__.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/llm/llm_test.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/memory/__init__.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/memory/memory_test.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/task/__init__.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/task/doc_taskoutput_test.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/task/doc_test.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/task/llm_connection_test.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/task/task_test.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/task_graph/__init__.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/tool/__init__.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/tool/composio_test.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/tool/doc_test.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/tool/tool_test.py +0 -0
- {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/usecase_test.py +0 -0
@@ -27,9 +27,9 @@ agent = vhq.Agent(
|
|
27
27
|
|
28
28
|
<hr />
|
29
29
|
|
30
|
-
##
|
30
|
+
## Customizing
|
31
31
|
|
32
|
-
|
32
|
+
**Model Optimization**
|
33
33
|
|
34
34
|
`[var]`<bold>`llm: Optional[str | LLM | Dict[str, Any]] = "gpt-4o"`</bold>
|
35
35
|
|
@@ -47,7 +47,9 @@ agent = vhq.Agent(
|
|
47
47
|
)
|
48
48
|
```
|
49
49
|
|
50
|
-
|
50
|
+
<hr/>
|
51
|
+
|
52
|
+
**Switching Models**
|
51
53
|
|
52
54
|
`[class method]`<bold>`update_llm(self, llm: Any = None, llm_config: Optional[Dict[str, Any]] = None) -> Self`<bold>
|
53
55
|
|
@@ -69,12 +71,14 @@ assert agent.llm.max_tokens == 3000
|
|
69
71
|
|
70
72
|
<hr/>
|
71
73
|
|
72
|
-
|
74
|
+
**Developer Prompt (System Prompt)**
|
73
75
|
|
74
76
|
`[var]`<bold>`backstory: Optional[str] = TEMPLATE_BACKSTORY`<bold>
|
75
77
|
|
76
78
|
Backstory will be drafted automatically using the given role, goal and other values in the Agent model, and converted into the **developer prompt** when the agent executes the task.
|
77
79
|
|
80
|
+
<hr/>
|
81
|
+
|
78
82
|
**Backstory template (full) for auto drafting:**
|
79
83
|
|
80
84
|
```python
|
@@ -127,9 +131,11 @@ agent = vhq.Agent(
|
|
127
131
|
)
|
128
132
|
```
|
129
133
|
|
130
|
-
|
134
|
+
<hr />
|
135
|
+
|
136
|
+
## Executing Tasks
|
131
137
|
|
132
|
-
|
138
|
+
**Delegation**
|
133
139
|
|
134
140
|
`[var]`<bold>`allow_delegation: [bool] = False`</bold>
|
135
141
|
|
@@ -145,7 +151,9 @@ agent = vhq.Agent(
|
|
145
151
|
)
|
146
152
|
```
|
147
153
|
|
148
|
-
|
154
|
+
<hr />
|
155
|
+
|
156
|
+
**Max Retry Limit**
|
149
157
|
|
150
158
|
`[var]`<bold>`max_retry_limit: Optional[int] = 2`</bold>
|
151
159
|
|
@@ -161,7 +169,9 @@ agent = vhq.Agent(
|
|
161
169
|
)
|
162
170
|
```
|
163
171
|
|
164
|
-
|
172
|
+
<hr />
|
173
|
+
|
174
|
+
**Maximum Number of Iterations (maxit)**
|
165
175
|
|
166
176
|
`[var]`<bold>`maxit: Optional[int] = 25`</bold>
|
167
177
|
|
@@ -179,76 +189,9 @@ agent = vhq.Agent(
|
|
179
189
|
)
|
180
190
|
```
|
181
191
|
|
182
|
-
|
183
|
-
|
184
|
-
`[var]`<bold>`callbacks: Optional[List[Callable]] = None`</bold>
|
185
|
-
|
186
|
-
You can add callback functions that the agent will run after executing any task.
|
187
|
-
|
188
|
-
By default, raw response from the agent will be added to the arguments of the callback function.
|
189
|
-
|
190
|
-
e.g. Format a response after executing the task:
|
191
|
-
|
192
|
-
```python
|
193
|
-
import json
|
194
|
-
import versionhq as vhq
|
195
|
-
from typing import Dict, Any
|
196
|
-
|
197
|
-
|
198
|
-
def format_response(res: str = None) -> str | Dict[str, Any]:
|
199
|
-
try:
|
200
|
-
r = json.dumps(eval(res))
|
201
|
-
formatted_res = json.loads(r)
|
202
|
-
return formatted_res
|
203
|
-
except:
|
204
|
-
return res
|
205
|
-
|
206
|
-
agent = vhq.Agent(
|
207
|
-
role="Marketing Analyst",
|
208
|
-
goal="Coping with increased price competition in saturated markets.",
|
209
|
-
callbacks=[format_response]
|
210
|
-
)
|
211
|
-
```
|
212
|
-
|
213
|
-
**Multiple callbacks to call**
|
214
|
-
|
215
|
-
The callback functions are called in order of the list index referring to the task response and response from the previous callback functions by default.
|
216
|
-
|
217
|
-
e.g. Validate an initial response from the assigned agent, and format the response.
|
218
|
-
|
219
|
-
```python
|
220
|
-
import json
|
221
|
-
from typing import Dict, Any
|
222
|
-
import versionhq as vhq
|
223
|
-
|
224
|
-
def assessment(res: str) -> str:
|
225
|
-
try:
|
226
|
-
sub_agent = vhq.Agent(role="Validator", goal="Validate the given solutions.")
|
227
|
-
task = vhq.Task(
|
228
|
-
description=f"Assess the given solution based on feasibilities and fits to client's strategies, then refine the solution if necessary.\nSolution: {res}"
|
229
|
-
)
|
230
|
-
r = task.sync_execute(agent=sub_agent)
|
231
|
-
return r.raw
|
232
|
-
|
233
|
-
except:
|
234
|
-
return res
|
235
|
-
|
236
|
-
def format_response(res: str = None) -> str | Dict[str, Any]:
|
237
|
-
try:
|
238
|
-
r = json.dumps(eval(res))
|
239
|
-
formatted_res = json.loads(r)
|
240
|
-
return formatted_res
|
241
|
-
except:
|
242
|
-
return res
|
243
|
-
|
244
|
-
agent = vhq.Agent(
|
245
|
-
role="Marketing Analyst",
|
246
|
-
goal="Build solutions to address increased price competition in saturated markets",
|
247
|
-
callbacks=[assessment, format_response] # add multiple funcs as callbacks - executed in order of index
|
248
|
-
)
|
249
|
-
```
|
192
|
+
<hr />
|
250
193
|
|
251
|
-
|
194
|
+
**Context Window**
|
252
195
|
|
253
196
|
`[var]`<bold>`respect_context_window: [bool] = True`</bold>
|
254
197
|
|
@@ -260,7 +203,10 @@ By default, the agent will follow **the 80% rule** - where they only use 80% of
|
|
260
203
|
|
261
204
|
You can turn off this rule by setting `respect_context_window` False to have larger context window.
|
262
205
|
|
263
|
-
|
206
|
+
|
207
|
+
<hr />
|
208
|
+
|
209
|
+
**Max Tokens**
|
264
210
|
|
265
211
|
`[var]`<bold>`max_tokens: Optional[int] = None`</bold>
|
266
212
|
|
@@ -268,7 +214,10 @@ Max tokens defines the maximum number of tokens in the generated response. Token
|
|
268
214
|
|
269
215
|
By default, the agent will follow the default max_tokens of the model, but you can specify the max token to limit the length of the generated output.
|
270
216
|
|
271
|
-
|
217
|
+
|
218
|
+
<hr />
|
219
|
+
|
220
|
+
**Maximum Execution Time**
|
272
221
|
|
273
222
|
`[var]`<bold>`max_execution_times: Optional[int] = None`</bold>
|
274
223
|
|
@@ -276,7 +225,10 @@ The maximum amount of wall clock time to spend in the execution loop.
|
|
276
225
|
|
277
226
|
By default, the agent will follow the default setting of the model.
|
278
227
|
|
279
|
-
|
228
|
+
|
229
|
+
<hr />
|
230
|
+
|
231
|
+
**Maximum RPM (Requests Per Minute)**
|
280
232
|
|
281
233
|
`[var]`<bold>`max_rpm: Optional[int] = None`</bold>
|
282
234
|
|
@@ -284,7 +236,9 @@ The maximum number of requests that the agent can send to the LLM.
|
|
284
236
|
|
285
237
|
By default, the agent will follow the default setting of the model. When the value is given, we let the model sleep for 60 seconds when the number of executions exceeds the maximum requests per minute.
|
286
238
|
|
287
|
-
|
239
|
+
<hr />
|
240
|
+
|
241
|
+
**Other LLM Configuration**
|
288
242
|
|
289
243
|
`[var]`<bold>`llm_config: Optional[Dict[str, Any]] = None`</bold>
|
290
244
|
|
@@ -326,12 +280,84 @@ print(agent.llm)
|
|
326
280
|
# max_completion_tokens=10000,
|
327
281
|
# )
|
328
282
|
```
|
283
|
+
<hr >
|
284
|
+
|
285
|
+
## Callbacks
|
286
|
+
|
287
|
+
`[var]`<bold>`callbacks: Optional[List[Callable]] = None`</bold>
|
288
|
+
|
289
|
+
You can add callback functions that the agent will run after executing any task.
|
290
|
+
|
291
|
+
By default, raw response from the agent will be added to the arguments of the callback function.
|
292
|
+
|
293
|
+
e.g. Format a response after executing the task:
|
294
|
+
|
295
|
+
```python
|
296
|
+
import json
|
297
|
+
import versionhq as vhq
|
298
|
+
from typing import Dict, Any
|
299
|
+
|
300
|
+
|
301
|
+
def format_response(res: str = None) -> str | Dict[str, Any]:
|
302
|
+
try:
|
303
|
+
r = json.dumps(eval(res))
|
304
|
+
formatted_res = json.loads(r)
|
305
|
+
return formatted_res
|
306
|
+
except:
|
307
|
+
return res
|
308
|
+
|
309
|
+
agent = vhq.Agent(
|
310
|
+
role="Marketing Analyst",
|
311
|
+
goal="Coping with increased price competition in saturated markets.",
|
312
|
+
callbacks=[format_response]
|
313
|
+
)
|
314
|
+
```
|
315
|
+
|
316
|
+
<hr />
|
317
|
+
|
318
|
+
**Multiple callbacks to call**
|
319
|
+
|
320
|
+
The callback functions are called in order of the list index referring to the task response and response from the previous callback functions by default.
|
321
|
+
|
322
|
+
e.g. Validate an initial response from the assigned agent, and format the response.
|
323
|
+
|
324
|
+
```python
|
325
|
+
import json
|
326
|
+
from typing import Dict, Any
|
327
|
+
import versionhq as vhq
|
328
|
+
|
329
|
+
def assessment(res: str) -> str:
|
330
|
+
try:
|
331
|
+
sub_agent = vhq.Agent(role="Validator", goal="Validate the given solutions.")
|
332
|
+
task = vhq.Task(
|
333
|
+
description=f"Assess the given solution based on feasibilities and fits to client's strategies, then refine the solution if necessary.\nSolution: {res}"
|
334
|
+
)
|
335
|
+
r = task.sync_execute(agent=sub_agent)
|
336
|
+
return r.raw
|
337
|
+
|
338
|
+
except:
|
339
|
+
return res
|
340
|
+
|
341
|
+
def format_response(res: str = None) -> str | Dict[str, Any]:
|
342
|
+
try:
|
343
|
+
r = json.dumps(eval(res))
|
344
|
+
formatted_res = json.loads(r)
|
345
|
+
return formatted_res
|
346
|
+
except:
|
347
|
+
return res
|
348
|
+
|
349
|
+
agent = vhq.Agent(
|
350
|
+
role="Marketing Analyst",
|
351
|
+
goal="Build solutions to address increased price competition in saturated markets",
|
352
|
+
callbacks=[assessment, format_response] # add multiple funcs as callbacks - executed in order of index
|
353
|
+
)
|
354
|
+
```
|
329
355
|
|
330
356
|
<hr />
|
331
357
|
|
332
|
-
## Knowledge
|
358
|
+
## Building Knowledge
|
333
359
|
|
334
|
-
|
360
|
+
**Knowlege Source**
|
335
361
|
|
336
362
|
`[var]`<bold>`knowledge_sources: Optional[List[KnowledgeSource]] = None`</bold>
|
337
363
|
|
@@ -373,9 +399,9 @@ assert "gold" in res.raw == True
|
|
373
399
|
|
374
400
|
<hr />
|
375
401
|
|
376
|
-
##
|
402
|
+
## Accessing Memories
|
377
403
|
|
378
|
-
|
404
|
+
Store task execution results in memory
|
379
405
|
|
380
406
|
`[var]`<bold>`use_memory: bool = False`</bold>
|
381
407
|
|
@@ -397,7 +423,9 @@ print(agent.long_term_memory)
|
|
397
423
|
# returns LongTermMemory object.
|
398
424
|
```
|
399
425
|
|
400
|
-
|
426
|
+
<hr />
|
427
|
+
|
428
|
+
**RAG Storage**
|
401
429
|
|
402
430
|
When the agent is not given any `memory_config` values, they will create `RAGStorage` to store memory:
|
403
431
|
|
@@ -418,7 +446,7 @@ MEM0 Storage
|
|
418
446
|
|
419
447
|
## Utilities
|
420
448
|
|
421
|
-
|
449
|
+
**Model configuration**
|
422
450
|
|
423
451
|
`[var]`<bold>`config: Optional[Dict[str, Any]] = None`</bold>
|
424
452
|
|
@@ -450,7 +478,7 @@ agent = vhq.Agent(
|
|
450
478
|
|
451
479
|
<hr />
|
452
480
|
|
453
|
-
|
481
|
+
**Updating existing agents**
|
454
482
|
|
455
483
|
`[class method]`<bold>`update(self, **kwargs) -> Self`</bold>
|
456
484
|
|
@@ -94,6 +94,7 @@ theme:
|
|
94
94
|
- header.autohide
|
95
95
|
- navigation.tabs
|
96
96
|
- navigation.path
|
97
|
+
- navigation.expand
|
97
98
|
- navigation.top
|
98
99
|
- navigation.footer
|
99
100
|
- navigation.indexes
|
@@ -110,16 +111,18 @@ nav:
|
|
110
111
|
- Home: 'index.md'
|
111
112
|
- Quick Start: 'quickstart.md'
|
112
113
|
- Core Components:
|
113
|
-
- Agent:
|
114
|
-
|
114
|
+
- Agent:
|
115
|
+
- 'core/agent/index.md'
|
116
|
+
- Task Graph:
|
117
|
+
- 'core/task-graph/index.md'
|
115
118
|
- Task:
|
116
|
-
-
|
119
|
+
- 'core/task/index.md'
|
117
120
|
- ResponseField: 'core/task/response-field.md'
|
118
121
|
- TaskOutput: 'core/task/task-output.md'
|
119
122
|
- Evaluation: 'core/task/evaluation.md'
|
120
123
|
- Tool: 'core/tool.md'
|
121
124
|
- Tags: 'tags.md'
|
122
|
-
-
|
125
|
+
- Cases:
|
123
126
|
- Playground: https://versi0n.io/playground
|
124
127
|
- Experiment - Agent Performance: https://github.com/versionHQ/exp-agent-performance
|
125
128
|
- Change Log: https://github.com/versionHQ/multi-agent-system/releases
|
@@ -15,7 +15,7 @@ exclude = ["test*", "__pycache__", "*.egg-info"]
|
|
15
15
|
|
16
16
|
[project]
|
17
17
|
name = "versionhq"
|
18
|
-
version = "1.2.1.
|
18
|
+
version = "1.2.1.9"
|
19
19
|
authors = [{ name = "Kuriko Iwai", email = "kuriko@versi0n.io" }]
|
20
20
|
description = "An agentic orchestration framework for building agent networks that handle task automation."
|
21
21
|
readme = "README.md"
|
@@ -49,7 +49,7 @@ def workflow(final_output: Type[BaseModel], context: Any = None, human: bool = T
|
|
49
49
|
)
|
50
50
|
|
51
51
|
task = Task(
|
52
|
-
description=f"Design a resource-efficient workflow to achieve the following goal: {final_output_prompt}.
|
52
|
+
description=dedent(f"Design a resource-efficient workflow to achieve the following goal: {final_output_prompt}. The workflow should consist of a list of detailed tasks that represent decision making points, each with the following information:\nname: A concise name of the task\ndescription: A concise description of the task.\nconnections: A list of target tasks that this task connects to.\ndependency_types: The type of dependency between this task and each of its connected task. Use the following dependency types: {dep_type_prompt}.\n\nPrioritize minimizing resource consumption (computation, memory, and data transfer) when defining tasks, connections, and dependencies. Consider how data is passed between tasks and aim to reduce unnecessary data duplication or transfer. Explain any design choices made to optimize resource usage."),
|
53
53
|
response_fields=[
|
54
54
|
ResponseField(title="tasks", data_type=list, items=dict, properties=[
|
55
55
|
ResponseField(title="name", data_type=str),
|
@@ -79,23 +79,24 @@ def workflow(final_output: Type[BaseModel], context: Any = None, human: bool = T
|
|
79
79
|
dependency_types = [DependencyType[dt] if DependencyType[dt] else DependencyType.FINISH_TO_START for dt in res["dependency_types"]]
|
80
80
|
|
81
81
|
for i, target_task_name in enumerate(res["connections"]):
|
82
|
-
source = [v for
|
83
|
-
target = [v for
|
82
|
+
source = [v for v in task_graph.nodes.values() if v.task.name == res["name"]][0]
|
83
|
+
target = [v for v in task_graph.nodes.values() if v.task.name == target_task_name][0]
|
84
84
|
dependency_type = dependency_types[i]
|
85
|
-
task_graph.add_dependency(
|
85
|
+
task_graph.add_dependency(
|
86
|
+
source_node_identifier=source.identifier, target_node_identifier=target.identifier, dependency_type=dependency_type)
|
86
87
|
|
87
|
-
## test purpose
|
88
|
-
# task_graph.visualize()
|
89
88
|
|
90
|
-
|
91
|
-
# print('Proceed? Y/n:')
|
92
|
-
# x = input()
|
89
|
+
task_graph.visualize()
|
93
90
|
|
94
|
-
|
95
|
-
|
91
|
+
if human:
|
92
|
+
print('Proceed? Y/n:')
|
93
|
+
x = input()
|
96
94
|
|
97
|
-
|
98
|
-
|
99
|
-
|
95
|
+
if x.lower() == "y":
|
96
|
+
print("ok. generating agent network")
|
97
|
+
|
98
|
+
else:
|
99
|
+
request = input("request?")
|
100
|
+
print('ok. regenerating the graph based on your input: ', request)
|
100
101
|
|
101
102
|
return task_graph
|
@@ -398,7 +398,7 @@ class TaskGraph(Graph):
|
|
398
398
|
return self._return_node_object(identifier).status
|
399
399
|
|
400
400
|
|
401
|
-
def visualize(self, layout: str = None):
|
401
|
+
def visualize(self, layout: str = None, should_save: bool = False):
|
402
402
|
from matplotlib.lines import Line2D
|
403
403
|
from versionhq.task_graph.colors import white, black, darkgrey, grey, primary, orange, lightgreen, green, darkgreen, darkergreen
|
404
404
|
|
@@ -475,7 +475,9 @@ class TaskGraph(Graph):
|
|
475
475
|
|
476
476
|
plt.legend(handles=legend_elements, loc='lower right')
|
477
477
|
plt.title(f"vhq-Diagram {str(self.id)}")
|
478
|
-
|
478
|
+
|
479
|
+
if should_save:
|
480
|
+
self._save(title=f"vhq-Diagram {str(self.id)}")
|
479
481
|
plt.show(block=False)
|
480
482
|
|
481
483
|
|
@@ -559,5 +561,7 @@ class TaskGraph(Graph):
|
|
559
561
|
node_identifier = edge.target.identifier
|
560
562
|
self.outputs.update({ node_identifier: res })
|
561
563
|
|
564
|
+
self.concl = res
|
565
|
+
self.concl_template = self.concl_template if self.concl_template else res.pydantic.__class__ if res.pydantic else None
|
562
566
|
# last_task_output = [v for v in self.outputs.values()][len([v for v in self.outputs.values()]) - 1] if [v for v in self.outputs.values()] else None
|
563
567
|
return res, self.outputs
|
@@ -23,13 +23,13 @@ docs/quickstart.md
|
|
23
23
|
docs/tags.md
|
24
24
|
docs/_logos/favicon.ico
|
25
25
|
docs/_logos/logo192.png
|
26
|
-
docs/core/Agent.md
|
27
|
-
docs/core/task-graph.md
|
28
|
-
docs/core/task.md
|
29
26
|
docs/core/tool.md
|
27
|
+
docs/core/agent/index.md
|
30
28
|
docs/core/task/evaluation.md
|
29
|
+
docs/core/task/index.md
|
31
30
|
docs/core/task/response-field.md
|
32
31
|
docs/core/task/task-output.md
|
32
|
+
docs/core/task-graph/index.md
|
33
33
|
docs/stylesheets/main.css
|
34
34
|
src/versionhq/__init__.py
|
35
35
|
src/versionhq.egg-info/PKG-INFO
|
@@ -1,4 +1,4 @@
|
|
1
|
-
def test_create_and_activate_network():
|
1
|
+
def test_create_and_activate_network(monkeypatch):
|
2
2
|
import versionhq as vhq
|
3
3
|
|
4
4
|
task_graph = vhq.TaskGraph(directed=False, should_reform=True)
|
@@ -31,8 +31,4 @@ def test_create_and_activate_network():
|
|
31
31
|
|
32
32
|
assert last_task_output is not None and isinstance(last_task_output, vhq.TaskOutput)
|
33
33
|
assert [k in task_graph.nodes.keys() and v and isinstance(v, vhq.TaskOutput) for k, v in outputs.items()]
|
34
|
-
|
35
|
-
task_graph.visualize()
|
36
|
-
|
37
|
-
|
38
|
-
test_create_and_activate_network()
|
34
|
+
assert task_graph.concl == last_task_output and task_graph.concl_template == None
|
@@ -0,0 +1,26 @@
|
|
1
|
+
from unittest.mock import patch
|
2
|
+
|
3
|
+
|
4
|
+
def test_draft():
|
5
|
+
import versionhq as vhq
|
6
|
+
from pydantic import BaseModel
|
7
|
+
|
8
|
+
class Trip(BaseModel):
|
9
|
+
name: str
|
10
|
+
location: str
|
11
|
+
description: str
|
12
|
+
date: str
|
13
|
+
cousine: str
|
14
|
+
why_its_suitable: str
|
15
|
+
|
16
|
+
|
17
|
+
with patch('builtins.input', return_value='Y'):
|
18
|
+
task_graph = vhq.workflow(
|
19
|
+
Trip,
|
20
|
+
context="Planning a suprise day trip for my friend to celebrate her birthday. We live in CA and we like to have Korean food.",
|
21
|
+
human=True
|
22
|
+
)
|
23
|
+
assert task_graph
|
24
|
+
assert [k == node.identifier and node.task and isinstance(node, vhq.Node) for k, node in task_graph.nodes.items()]
|
25
|
+
assert [isinstance(edge.dependency_type, vhq.DependencyType) and isinstance(edge, vhq.Edge) for k, edge in task_graph.edges.items()]
|
26
|
+
assert [k in task_graph.nodes.keys() and v.status == vhq.TaskStatus.NOT_STARTED for k, v in task_graph.nodes.items()]
|
@@ -1551,7 +1551,7 @@ wheels = [
|
|
1551
1551
|
|
1552
1552
|
[[package]]
|
1553
1553
|
name = "litellm"
|
1554
|
-
version = "1.61.
|
1554
|
+
version = "1.61.6"
|
1555
1555
|
source = { registry = "https://pypi.org/simple" }
|
1556
1556
|
dependencies = [
|
1557
1557
|
{ name = "aiohttp" },
|
@@ -1567,9 +1567,9 @@ dependencies = [
|
|
1567
1567
|
{ name = "tokenizers", version = "0.19.1", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64' and sys_platform == 'darwin'" },
|
1568
1568
|
{ name = "tokenizers", version = "0.21.0", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" },
|
1569
1569
|
]
|
1570
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
1570
|
+
sdist = { url = "https://files.pythonhosted.org/packages/a2/14/18de26bb3b9f2427f4296b8110fdcefa2389079f8090d4a96fd938288f0d/litellm-1.61.6.tar.gz", hash = "sha256:2c613823f86ce2aa7956e2458857ab6aa62258dc7da9816bfdac90735be270be", size = 6477831 }
|
1571
1571
|
wheels = [
|
1572
|
-
{ url = "https://files.pythonhosted.org/packages/
|
1572
|
+
{ url = "https://files.pythonhosted.org/packages/9a/27/c44a6de2bb1c46eaf52da2750cf84ad20e56d8d8454459905a253b299f3d/litellm-1.61.6-py3-none-any.whl", hash = "sha256:eef4c4a84a2c93de4c6d5a05a785f9b0cc61f63bafb3b3dc83d977db649e1b13", size = 6783058 },
|
1573
1573
|
]
|
1574
1574
|
|
1575
1575
|
[[package]]
|
@@ -3980,7 +3980,7 @@ wheels = [
|
|
3980
3980
|
|
3981
3981
|
[[package]]
|
3982
3982
|
name = "versionhq"
|
3983
|
-
version = "1.2.1.
|
3983
|
+
version = "1.2.1.9"
|
3984
3984
|
source = { editable = "." }
|
3985
3985
|
dependencies = [
|
3986
3986
|
{ name = "appdirs" },
|
@@ -4178,33 +4178,33 @@ wheels = [
|
|
4178
4178
|
|
4179
4179
|
[[package]]
|
4180
4180
|
name = "websockets"
|
4181
|
-
version = "
|
4182
|
-
source = { registry = "https://pypi.org/simple" }
|
4183
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
4184
|
-
wheels = [
|
4185
|
-
{ url = "https://files.pythonhosted.org/packages/
|
4186
|
-
{ url = "https://files.pythonhosted.org/packages/
|
4187
|
-
{ url = "https://files.pythonhosted.org/packages/
|
4188
|
-
{ url = "https://files.pythonhosted.org/packages/
|
4189
|
-
{ url = "https://files.pythonhosted.org/packages/
|
4190
|
-
{ url = "https://files.pythonhosted.org/packages/
|
4191
|
-
{ url = "https://files.pythonhosted.org/packages/
|
4192
|
-
{ url = "https://files.pythonhosted.org/packages/
|
4193
|
-
{ url = "https://files.pythonhosted.org/packages/
|
4194
|
-
{ url = "https://files.pythonhosted.org/packages/
|
4195
|
-
{ url = "https://files.pythonhosted.org/packages/
|
4196
|
-
{ url = "https://files.pythonhosted.org/packages/
|
4197
|
-
{ url = "https://files.pythonhosted.org/packages/
|
4198
|
-
{ url = "https://files.pythonhosted.org/packages/
|
4199
|
-
{ url = "https://files.pythonhosted.org/packages/
|
4200
|
-
{ url = "https://files.pythonhosted.org/packages/
|
4201
|
-
{ url = "https://files.pythonhosted.org/packages/
|
4202
|
-
{ url = "https://files.pythonhosted.org/packages/
|
4203
|
-
{ url = "https://files.pythonhosted.org/packages/
|
4204
|
-
{ url = "https://files.pythonhosted.org/packages/
|
4205
|
-
{ url = "https://files.pythonhosted.org/packages/
|
4206
|
-
{ url = "https://files.pythonhosted.org/packages/
|
4207
|
-
{ url = "https://files.pythonhosted.org/packages/
|
4181
|
+
version = "15.0"
|
4182
|
+
source = { registry = "https://pypi.org/simple" }
|
4183
|
+
sdist = { url = "https://files.pythonhosted.org/packages/2e/7a/8bc4d15af7ff30f7ba34f9a172063bfcee9f5001d7cef04bee800a658f33/websockets-15.0.tar.gz", hash = "sha256:ca36151289a15b39d8d683fd8b7abbe26fc50be311066c5f8dcf3cb8cee107ab", size = 175574 }
|
4184
|
+
wheels = [
|
4185
|
+
{ url = "https://files.pythonhosted.org/packages/ee/16/81a7403c8c0a33383de647e89c07824ea6a654e3877d6ff402cbae298cb8/websockets-15.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:dd24c4d256558429aeeb8d6c24ebad4e982ac52c50bc3670ae8646c181263965", size = 174702 },
|
4186
|
+
{ url = "https://files.pythonhosted.org/packages/ef/40/4629202386a3bf1195db9fe41baeb1d6dfd8d72e651d9592d81dae7fdc7c/websockets-15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f83eca8cbfd168e424dfa3b3b5c955d6c281e8fc09feb9d870886ff8d03683c7", size = 172359 },
|
4187
|
+
{ url = "https://files.pythonhosted.org/packages/7b/33/dfb650e822bc7912d8c542c452497867af91dec81e7b5bf96aca5b419d58/websockets-15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4095a1f2093002c2208becf6f9a178b336b7572512ee0a1179731acb7788e8ad", size = 172604 },
|
4188
|
+
{ url = "https://files.pythonhosted.org/packages/2e/52/666743114513fcffd43ee5df261a1eb5d41f8e9861b7a190b730732c19ba/websockets-15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb915101dfbf318486364ce85662bb7b020840f68138014972c08331458d41f3", size = 182145 },
|
4189
|
+
{ url = "https://files.pythonhosted.org/packages/9c/63/5273f146b13aa4a057a95ab0855d9990f3a1ced63693f4365135d1abfacc/websockets-15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:45d464622314973d78f364689d5dbb9144e559f93dca11b11af3f2480b5034e1", size = 181152 },
|
4190
|
+
{ url = "https://files.pythonhosted.org/packages/0f/ae/075697f3f97de7c26b73ae96d952e13fa36393e0db3f028540b28954e0a9/websockets-15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ace960769d60037ca9625b4c578a6f28a14301bd2a1ff13bb00e824ac9f73e55", size = 181523 },
|
4191
|
+
{ url = "https://files.pythonhosted.org/packages/25/87/06d091bbcbe01903bed3dad3bb4a1a3c516f61e611ec31fffb28abe4974b/websockets-15.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c7cd4b1015d2f60dfe539ee6c95bc968d5d5fad92ab01bb5501a77393da4f596", size = 181791 },
|
4192
|
+
{ url = "https://files.pythonhosted.org/packages/77/08/5063b6cc1b2aa1fba2ee3b578b777db22fde7145f121d07fd878811e983b/websockets-15.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4f7290295794b5dec470867c7baa4a14182b9732603fd0caf2a5bf1dc3ccabf3", size = 181231 },
|
4193
|
+
{ url = "https://files.pythonhosted.org/packages/86/ff/af23084df0a7405bb2add12add8c17d6192a8de9480f1b90d12352ba2b7d/websockets-15.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3abd670ca7ce230d5a624fd3d55e055215d8d9b723adee0a348352f5d8d12ff4", size = 181191 },
|
4194
|
+
{ url = "https://files.pythonhosted.org/packages/21/ce/b2bdfcf49201dee0b899edc6a814755763ec03d74f2714923d38453a9e8d/websockets-15.0-cp311-cp311-win32.whl", hash = "sha256:110a847085246ab8d4d119632145224d6b49e406c64f1bbeed45c6f05097b680", size = 175666 },
|
4195
|
+
{ url = "https://files.pythonhosted.org/packages/8d/7b/444edcd5365538c226b631897975a65bbf5ccf27c77102e17d8f12a306ea/websockets-15.0-cp311-cp311-win_amd64.whl", hash = "sha256:8d7bbbe2cd6ed80aceef2a14e9f1c1b61683194c216472ed5ff33b700e784e37", size = 176105 },
|
4196
|
+
{ url = "https://files.pythonhosted.org/packages/22/1e/92c4547d7b2a93f848aedaf37e9054111bc00dc11bff4385ca3f80dbb412/websockets-15.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:cccc18077acd34c8072578394ec79563664b1c205f7a86a62e94fafc7b59001f", size = 174709 },
|
4197
|
+
{ url = "https://files.pythonhosted.org/packages/9f/37/eae4830a28061ba552516d84478686b637cd9e57d6a90b45ad69e89cb0af/websockets-15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d4c22992e24f12de340ca5f824121a5b3e1a37ad4360b4e1aaf15e9d1c42582d", size = 172372 },
|
4198
|
+
{ url = "https://files.pythonhosted.org/packages/46/2f/b409f8b8aa9328d5a47f7a301a43319d540d70cf036d1e6443675978a988/websockets-15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1206432cc6c644f6fc03374b264c5ff805d980311563202ed7fef91a38906276", size = 172607 },
|
4199
|
+
{ url = "https://files.pythonhosted.org/packages/d6/81/d7e2e4542d4b4df849b0110df1b1f94f2647b71ab4b65d672090931ad2bb/websockets-15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d3cc75ef3e17490042c47e0523aee1bcc4eacd2482796107fd59dd1100a44bc", size = 182422 },
|
4200
|
+
{ url = "https://files.pythonhosted.org/packages/b6/91/3b303160938d123eea97f58be363f7dbec76e8c59d587e07b5bc257dd584/websockets-15.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b89504227a5311610e4be16071465885a0a3d6b0e82e305ef46d9b064ce5fb72", size = 181362 },
|
4201
|
+
{ url = "https://files.pythonhosted.org/packages/f2/8b/df6807f1ca339c567aba9a7ab03bfdb9a833f625e8d2b4fc7529e4c701de/websockets-15.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56e3efe356416bc67a8e093607315951d76910f03d2b3ad49c4ade9207bf710d", size = 181787 },
|
4202
|
+
{ url = "https://files.pythonhosted.org/packages/21/37/e6d3d5ebb0ebcaf98ae84904205c9dcaf3e0fe93e65000b9f08631ed7309/websockets-15.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0f2205cdb444a42a7919690238fb5979a05439b9dbb73dd47c863d39640d85ab", size = 182058 },
|
4203
|
+
{ url = "https://files.pythonhosted.org/packages/c9/df/6aca296f2be4c638ad20908bb3d7c94ce7afc8d9b4b2b0780d1fc59b359c/websockets-15.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:aea01f40995fa0945c020228ab919b8dfc93fc8a9f2d3d705ab5b793f32d9e99", size = 181434 },
|
4204
|
+
{ url = "https://files.pythonhosted.org/packages/88/f1/75717a982bab39bbe63c83f9df0e7753e5c98bab907eb4fb5d97fe5c8c11/websockets-15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a9f8e33747b1332db11cf7fcf4a9512bef9748cb5eb4d3f7fbc8c30d75dc6ffc", size = 181431 },
|
4205
|
+
{ url = "https://files.pythonhosted.org/packages/e7/15/cee9e63ed9ac5bfc1a3ae8fc6c02c41745023c21eed622eef142d8fdd749/websockets-15.0-cp312-cp312-win32.whl", hash = "sha256:32e02a2d83f4954aa8c17e03fe8ec6962432c39aca4be7e8ee346b05a3476904", size = 175678 },
|
4206
|
+
{ url = "https://files.pythonhosted.org/packages/4e/00/993974c60f40faabb725d4dbae8b072ef73b4c4454bd261d3b1d34ace41f/websockets-15.0-cp312-cp312-win_amd64.whl", hash = "sha256:ffc02b159b65c05f2ed9ec176b715b66918a674bd4daed48a9a7a590dd4be1aa", size = 176119 },
|
4207
|
+
{ url = "https://files.pythonhosted.org/packages/e8/b2/31eec524b53f01cd8343f10a8e429730c52c1849941d1f530f8253b6d934/websockets-15.0-py3-none-any.whl", hash = "sha256:51ffd53c53c4442415b613497a34ba0aa7b99ac07f1e4a62db5dcd640ae6c3c3", size = 169023 },
|
4208
4208
|
]
|
4209
4209
|
|
4210
4210
|
[[package]]
|
@@ -1,18 +0,0 @@
|
|
1
|
-
def test_draft():
|
2
|
-
import versionhq as vhq
|
3
|
-
from pydantic import BaseModel
|
4
|
-
|
5
|
-
class Test(BaseModel):
|
6
|
-
name: str
|
7
|
-
location: str
|
8
|
-
description: str
|
9
|
-
date: str
|
10
|
-
cousine: str
|
11
|
-
why_its_suitable: str
|
12
|
-
|
13
|
-
task_graph = vhq.workflow(Test, context="Planning a suprise trip to my friend for her birthday.", human=True)
|
14
|
-
|
15
|
-
assert task_graph
|
16
|
-
assert [k == node.identifier and node.task and isinstance(node, vhq.Node) for k, node in task_graph.nodes.items()]
|
17
|
-
assert [isinstance(edge.dependency_type, vhq.DependencyType) and isinstance(edge, vhq.Edge) for k, edge in task_graph.edges.items()]
|
18
|
-
assert [k in task_graph.nodes.keys() and v.status == vhq.TaskStatus.NOT_STARTED for k, v in task_graph.nodes.items()]
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
/versionhq-1.2.1.8/docs/core/task-graph.md → /versionhq-1.2.1.9/docs/core/task-graph/index.md
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|