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.
Files changed (138) hide show
  1. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/PKG-INFO +1 -1
  2. versionhq-1.2.1.8/docs/core/Agent.md → versionhq-1.2.1.9/docs/core/agent/index.md +116 -88
  3. versionhq-1.2.1.8/docs/core/task.md → versionhq-1.2.1.9/docs/core/task/index.md +1 -1
  4. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/mkdocs.yml +7 -4
  5. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/pyproject.toml +1 -1
  6. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/__init__.py +1 -1
  7. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/task_graph/draft.py +15 -14
  8. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/task_graph/model.py +6 -2
  9. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq.egg-info/PKG-INFO +1 -1
  10. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq.egg-info/SOURCES.txt +3 -3
  11. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/formation_test.py +0 -1
  12. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/task_graph/doc_test.py +2 -6
  13. versionhq-1.2.1.9/tests/task_graph/task_graph_test.py +26 -0
  14. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/uv.lock +31 -31
  15. versionhq-1.2.1.8/tests/task_graph/task_graph_test.py +0 -18
  16. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/.env.sample +0 -0
  17. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/.github/workflows/deploy_docs.yml +0 -0
  18. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/.github/workflows/publish.yml +0 -0
  19. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/.github/workflows/publish_testpypi.yml +0 -0
  20. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/.github/workflows/run_tests.yml +0 -0
  21. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/.github/workflows/security_check.yml +0 -0
  22. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/.gitignore +0 -0
  23. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/.pre-commit-config.yaml +0 -0
  24. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/.python-version +0 -0
  25. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/LICENSE +0 -0
  26. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/README.md +0 -0
  27. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/SECURITY.md +0 -0
  28. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/db/preprocess.py +0 -0
  29. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/docs/CNAME +0 -0
  30. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/docs/_logos/favicon.ico +0 -0
  31. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/docs/_logos/logo192.png +0 -0
  32. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/docs/core/task/evaluation.md +0 -0
  33. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/docs/core/task/response-field.md +0 -0
  34. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/docs/core/task/task-output.md +0 -0
  35. /versionhq-1.2.1.8/docs/core/task-graph.md → /versionhq-1.2.1.9/docs/core/task-graph/index.md +0 -0
  36. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/docs/core/tool.md +0 -0
  37. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/docs/index.md +0 -0
  38. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/docs/quickstart.md +0 -0
  39. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/docs/stylesheets/main.css +0 -0
  40. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/docs/tags.md +0 -0
  41. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/requirements-dev.txt +0 -0
  42. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/requirements.txt +0 -0
  43. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/runtime.txt +0 -0
  44. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/setup.cfg +0 -0
  45. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/_utils/__init__.py +0 -0
  46. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/_utils/i18n.py +0 -0
  47. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/_utils/logger.py +0 -0
  48. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/_utils/process_config.py +0 -0
  49. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/_utils/usage_metrics.py +0 -0
  50. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/_utils/vars.py +0 -0
  51. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/agent/TEMPLATES/Backstory.py +0 -0
  52. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/agent/TEMPLATES/__init__.py +0 -0
  53. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/agent/__init__.py +0 -0
  54. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/agent/inhouse_agents.py +0 -0
  55. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/agent/model.py +0 -0
  56. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/agent/parser.py +0 -0
  57. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/agent/rpm_controller.py +0 -0
  58. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/agent_network/__init__.py +0 -0
  59. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/agent_network/model.py +0 -0
  60. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/cli/__init__.py +0 -0
  61. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/clients/__init__.py +0 -0
  62. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/clients/customer/__init__.py +0 -0
  63. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/clients/customer/model.py +0 -0
  64. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/clients/product/__init__.py +0 -0
  65. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/clients/product/model.py +0 -0
  66. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/clients/workflow/__init__.py +0 -0
  67. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/clients/workflow/model.py +0 -0
  68. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/knowledge/__init__.py +0 -0
  69. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/knowledge/_utils.py +0 -0
  70. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/knowledge/embedding.py +0 -0
  71. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/knowledge/model.py +0 -0
  72. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/knowledge/source.py +0 -0
  73. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/knowledge/source_docling.py +0 -0
  74. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/knowledge/storage.py +0 -0
  75. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/llm/__init__.py +0 -0
  76. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/llm/llm_vars.py +0 -0
  77. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/llm/model.py +0 -0
  78. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/memory/__init__.py +0 -0
  79. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/memory/contextual_memory.py +0 -0
  80. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/memory/model.py +0 -0
  81. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/storage/__init__.py +0 -0
  82. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/storage/base.py +0 -0
  83. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/storage/ltm_sqlite_storage.py +0 -0
  84. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/storage/mem0_storage.py +0 -0
  85. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/storage/rag_storage.py +0 -0
  86. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/storage/task_output_storage.py +0 -0
  87. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/storage/utils.py +0 -0
  88. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/task/TEMPLATES/Description.py +0 -0
  89. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/task/__init__.py +0 -0
  90. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/task/evaluate.py +0 -0
  91. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/task/formation.py +0 -0
  92. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/task/formatter.py +0 -0
  93. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/task/log_handler.py +0 -0
  94. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/task/model.py +0 -0
  95. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/task/structured_response.py +0 -0
  96. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/task_graph/__init__.py +0 -0
  97. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/task_graph/colors.py +0 -0
  98. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/tool/__init__.py +0 -0
  99. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/tool/cache_handler.py +0 -0
  100. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/tool/composio_tool.py +0 -0
  101. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/tool/composio_tool_vars.py +0 -0
  102. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/tool/decorator.py +0 -0
  103. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/tool/model.py +0 -0
  104. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq/tool/tool_handler.py +0 -0
  105. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq.egg-info/dependency_links.txt +0 -0
  106. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq.egg-info/requires.txt +0 -0
  107. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/src/versionhq.egg-info/top_level.txt +0 -0
  108. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/__init__.py +0 -0
  109. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/agent/__init__.py +0 -0
  110. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/agent/agent_test.py +0 -0
  111. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/agent/doc_test.py +0 -0
  112. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/agent_network/Prompts/Demo_test.py +0 -0
  113. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/agent_network/__init__.py +0 -0
  114. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/agent_network/agent_network_test.py +0 -0
  115. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/cli/__init__.py +0 -0
  116. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/clients/customer_test.py +0 -0
  117. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/clients/product_test.py +0 -0
  118. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/clients/workflow_test.py +0 -0
  119. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/conftest.py +0 -0
  120. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/doc_test.py +0 -0
  121. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/knowledge/__init__.py +0 -0
  122. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/knowledge/knowledge_test.py +0 -0
  123. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/knowledge/mock_report_compressed.pdf +0 -0
  124. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/llm/__init__.py +0 -0
  125. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/llm/llm_test.py +0 -0
  126. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/memory/__init__.py +0 -0
  127. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/memory/memory_test.py +0 -0
  128. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/task/__init__.py +0 -0
  129. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/task/doc_taskoutput_test.py +0 -0
  130. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/task/doc_test.py +0 -0
  131. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/task/llm_connection_test.py +0 -0
  132. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/task/task_test.py +0 -0
  133. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/task_graph/__init__.py +0 -0
  134. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/tool/__init__.py +0 -0
  135. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/tool/composio_test.py +0 -0
  136. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/tool/doc_test.py +0 -0
  137. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/tool/tool_test.py +0 -0
  138. {versionhq-1.2.1.8 → versionhq-1.2.1.9}/tests/usecase_test.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: versionhq
3
- Version: 1.2.1.8
3
+ Version: 1.2.1.9
4
4
  Summary: An agentic orchestration framework for building agent networks that handle task automation.
5
5
  Author-email: Kuriko Iwai <kuriko@versi0n.io>
6
6
  License: MIT License
@@ -27,9 +27,9 @@ agent = vhq.Agent(
27
27
 
28
28
  <hr />
29
29
 
30
- ## Customization
30
+ ## Customizing
31
31
 
32
- ### Model optimization
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
- ### Switching models
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
- ### Developer Prompt (System Prompt)
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
- ## Task Execution Rules
134
+ <hr />
135
+
136
+ ## Executing Tasks
131
137
 
132
- ### Delegation
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
- ### Max Retry Limit
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
- ### Maximum Number of Iterations (MaxIt)
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
- ### Callbacks
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
- ### Context Window
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
- ### Max Tokens
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
- ### Maximum Execution Time
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
- ### Maximum RPM (Requests Per Minute)
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
- ### Other LLM Configuration
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
- ### Knowledge Sources
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
- ## Memory
402
+ ## Accessing Memories
377
403
 
378
- ### Store task execution results in memory
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
- ### RAG Storage
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
- ### Model configuration
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
- ### Updating model values
481
+ **Updating existing agents**
454
482
 
455
483
  `[class method]`<bold>`update(self, **kwargs) -> Self`</bold>
456
484
 
@@ -435,7 +435,7 @@ Refer <a href="/core/task/task-output">TaskOutput</a> class for details.
435
435
  <hr>
436
436
 
437
437
 
438
- ## Ref
438
+ ## Reference
439
439
 
440
440
  ### Variables
441
441
 
@@ -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: 'core/agent.md'
114
- - Task Graph: 'core/task-graph.md'
114
+ - Agent:
115
+ - 'core/agent/index.md'
116
+ - Task Graph:
117
+ - 'core/task-graph/index.md'
115
118
  - Task:
116
- - Task: 'core/task.md'
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
- - Examples:
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.8"
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"
@@ -31,7 +31,7 @@ from versionhq.task.formation import form_agent_network
31
31
  from versionhq.task_graph.draft import workflow
32
32
 
33
33
 
34
- __version__ = "1.2.1.8"
34
+ __version__ = "1.2.1.9"
35
35
  __all__ = [
36
36
  "Agent",
37
37
 
@@ -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}. The workflow should consist of a list of tasks, 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.",
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 k, v in task_graph.nodes.items() if v.task.name == res["name"]][0]
83
- target = [v for k, v in task_graph.nodes.items() if v.task.name == target_task_name][0]
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(source_node_identifier=source.identifier, target_node_identifier=target.identifier, dependency_type=dependency_type)
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
- # if human:
91
- # print('Proceed? Y/n:')
92
- # x = input()
89
+ task_graph.visualize()
93
90
 
94
- # if x.lower() == "y":
95
- # print("ok. generating agent network")
91
+ if human:
92
+ print('Proceed? Y/n:')
93
+ x = input()
96
94
 
97
- # else:
98
- # request = input("request?")
99
- # print('ok. regenerating the graph based on your input: ', request)
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
- self._save(title=f"vhq-Diagram {str(self.id)}")
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: versionhq
3
- Version: 1.2.1.8
3
+ Version: 1.2.1.9
4
4
  Summary: An agentic orchestration framework for building agent networks that handle task automation.
5
5
  Author-email: Kuriko Iwai <kuriko@versi0n.io>
6
6
  License: MIT License
@@ -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
@@ -33,7 +33,6 @@ def _test_specific_formation():
33
33
  task="Describe the color of the sky by weather condition",
34
34
  expected_outcome="Dict that pairs color of the sky with specific weather condition",
35
35
  formation=item,
36
-
37
36
  )
38
37
 
39
38
  assert isinstance(network, vhq.AgentNetwork)
@@ -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.5"
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/d2/0c/145830eec4375a995fe7ba0e597944576b891fb568911e8535eca7e2b9ab/litellm-1.61.5.tar.gz", hash = "sha256:0fda7698e64933e100398d2b3ed5d1dc096021adf699c885f8baf5a7b0d7589c", size = 6477731 }
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/cc/7b/e30a2cb2d4cf92de7d2469cef8afc7439c3c523b533055da0f5e69520d0b/litellm-1.61.5-py3-none-any.whl", hash = "sha256:0f842fe96d8354fce71bdb50b7b8d86b329653161885a047de4a9c78e0cfbe82", size = 6783018 },
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.8"
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 = "14.2"
4182
- source = { registry = "https://pypi.org/simple" }
4183
- sdist = { url = "https://files.pythonhosted.org/packages/94/54/8359678c726243d19fae38ca14a334e740782336c9f19700858c4eb64a1e/websockets-14.2.tar.gz", hash = "sha256:5059ed9c54945efb321f097084b4c7e52c246f2c869815876a69d1efc4ad6eb5", size = 164394 }
4184
- wheels = [
4185
- { url = "https://files.pythonhosted.org/packages/15/b6/504695fb9a33df0ca56d157f5985660b5fc5b4bf8c78f121578d2d653392/websockets-14.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3bdc8c692c866ce5fefcaf07d2b55c91d6922ac397e031ef9b774e5b9ea42166", size = 163088 },
4186
- { url = "https://files.pythonhosted.org/packages/81/26/ebfb8f6abe963c795122439c6433c4ae1e061aaedfc7eff32d09394afbae/websockets-14.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c93215fac5dadc63e51bcc6dceca72e72267c11def401d6668622b47675b097f", size = 160745 },
4187
- { url = "https://files.pythonhosted.org/packages/a1/c6/1435ad6f6dcbff80bb95e8986704c3174da8866ddb751184046f5c139ef6/websockets-14.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1c9b6535c0e2cf8a6bf938064fb754aaceb1e6a4a51a80d884cd5db569886910", size = 160995 },
4188
- { url = "https://files.pythonhosted.org/packages/96/63/900c27cfe8be1a1f2433fc77cd46771cf26ba57e6bdc7cf9e63644a61863/websockets-14.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a52a6d7cf6938e04e9dceb949d35fbdf58ac14deea26e685ab6368e73744e4c", size = 170543 },
4189
- { url = "https://files.pythonhosted.org/packages/00/8b/bec2bdba92af0762d42d4410593c1d7d28e9bfd952c97a3729df603dc6ea/websockets-14.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9f05702e93203a6ff5226e21d9b40c037761b2cfb637187c9802c10f58e40473", size = 169546 },
4190
- { url = "https://files.pythonhosted.org/packages/6b/a9/37531cb5b994f12a57dec3da2200ef7aadffef82d888a4c29a0d781568e4/websockets-14.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22441c81a6748a53bfcb98951d58d1af0661ab47a536af08920d129b4d1c3473", size = 169911 },
4191
- { url = "https://files.pythonhosted.org/packages/60/d5/a6eadba2ed9f7e65d677fec539ab14a9b83de2b484ab5fe15d3d6d208c28/websockets-14.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd9b868d78b194790e6236d9cbc46d68aba4b75b22497eb4ab64fa640c3af56", size = 170183 },
4192
- { url = "https://files.pythonhosted.org/packages/76/57/a338ccb00d1df881c1d1ee1f2a20c9c1b5b29b51e9e0191ee515d254fea6/websockets-14.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1a5a20d5843886d34ff8c57424cc65a1deda4375729cbca4cb6b3353f3ce4142", size = 169623 },
4193
- { url = "https://files.pythonhosted.org/packages/64/22/e5f7c33db0cb2c1d03b79fd60d189a1da044e2661f5fd01d629451e1db89/websockets-14.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:34277a29f5303d54ec6468fb525d99c99938607bc96b8d72d675dee2b9f5bf1d", size = 169583 },
4194
- { url = "https://files.pythonhosted.org/packages/aa/2e/2b4662237060063a22e5fc40d46300a07142afe30302b634b4eebd717c07/websockets-14.2-cp311-cp311-win32.whl", hash = "sha256:02687db35dbc7d25fd541a602b5f8e451a238ffa033030b172ff86a93cb5dc2a", size = 163969 },
4195
- { url = "https://files.pythonhosted.org/packages/94/a5/0cda64e1851e73fc1ecdae6f42487babb06e55cb2f0dc8904b81d8ef6857/websockets-14.2-cp311-cp311-win_amd64.whl", hash = "sha256:862e9967b46c07d4dcd2532e9e8e3c2825e004ffbf91a5ef9dde519ee2effb0b", size = 164408 },
4196
- { url = "https://files.pythonhosted.org/packages/c1/81/04f7a397653dc8bec94ddc071f34833e8b99b13ef1a3804c149d59f92c18/websockets-14.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1f20522e624d7ffbdbe259c6b6a65d73c895045f76a93719aa10cd93b3de100c", size = 163096 },
4197
- { url = "https://files.pythonhosted.org/packages/ec/c5/de30e88557e4d70988ed4d2eabd73fd3e1e52456b9f3a4e9564d86353b6d/websockets-14.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:647b573f7d3ada919fd60e64d533409a79dcf1ea21daeb4542d1d996519ca967", size = 160758 },
4198
- { url = "https://files.pythonhosted.org/packages/e5/8c/d130d668781f2c77d106c007b6c6c1d9db68239107c41ba109f09e6c218a/websockets-14.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6af99a38e49f66be5a64b1e890208ad026cda49355661549c507152113049990", size = 160995 },
4199
- { url = "https://files.pythonhosted.org/packages/a6/bc/f6678a0ff17246df4f06765e22fc9d98d1b11a258cc50c5968b33d6742a1/websockets-14.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:091ab63dfc8cea748cc22c1db2814eadb77ccbf82829bac6b2fbe3401d548eda", size = 170815 },
4200
- { url = "https://files.pythonhosted.org/packages/d8/b2/8070cb970c2e4122a6ef38bc5b203415fd46460e025652e1ee3f2f43a9a3/websockets-14.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b374e8953ad477d17e4851cdc66d83fdc2db88d9e73abf755c94510ebddceb95", size = 169759 },
4201
- { url = "https://files.pythonhosted.org/packages/81/da/72f7caabd94652e6eb7e92ed2d3da818626e70b4f2b15a854ef60bf501ec/websockets-14.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a39d7eceeea35db85b85e1169011bb4321c32e673920ae9c1b6e0978590012a3", size = 170178 },
4202
- { url = "https://files.pythonhosted.org/packages/31/e0/812725b6deca8afd3a08a2e81b3c4c120c17f68c9b84522a520b816cda58/websockets-14.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0a6f3efd47ffd0d12080594f434faf1cd2549b31e54870b8470b28cc1d3817d9", size = 170453 },
4203
- { url = "https://files.pythonhosted.org/packages/66/d3/8275dbc231e5ba9bb0c4f93144394b4194402a7a0c8ffaca5307a58ab5e3/websockets-14.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:065ce275e7c4ffb42cb738dd6b20726ac26ac9ad0a2a48e33ca632351a737267", size = 169830 },
4204
- { url = "https://files.pythonhosted.org/packages/a3/ae/e7d1a56755ae15ad5a94e80dd490ad09e345365199600b2629b18ee37bc7/websockets-14.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e9d0e53530ba7b8b5e389c02282f9d2aa47581514bd6049d3a7cffe1385cf5fe", size = 169824 },
4205
- { url = "https://files.pythonhosted.org/packages/b6/32/88ccdd63cb261e77b882e706108d072e4f1c839ed723bf91a3e1f216bf60/websockets-14.2-cp312-cp312-win32.whl", hash = "sha256:20e6dd0984d7ca3037afcb4494e48c74ffb51e8013cac71cf607fffe11df7205", size = 163981 },
4206
- { url = "https://files.pythonhosted.org/packages/b3/7d/32cdb77990b3bdc34a306e0a0f73a1275221e9a66d869f6ff833c95b56ef/websockets-14.2-cp312-cp312-win_amd64.whl", hash = "sha256:44bba1a956c2c9d268bdcdf234d5e5ff4c9b6dc3e300545cbe99af59dda9dcce", size = 164421 },
4207
- { url = "https://files.pythonhosted.org/packages/7b/c8/d529f8a32ce40d98309f4470780631e971a5a842b60aec864833b3615786/websockets-14.2-py3-none-any.whl", hash = "sha256:7a6ceec4ea84469f15cf15807a747e9efe57e369c384fa86e022b3bea679b79b", size = 157416 },
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