versionhq 1.1.12.2__tar.gz → 1.1.12.3__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 (108) hide show
  1. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/.gitignore +3 -0
  2. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/PKG-INFO +23 -8
  3. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/README.md +21 -6
  4. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/pyproject.toml +3 -2
  5. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/runtime.txt +0 -1
  6. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/__init__.py +5 -2
  7. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/task/formation.py +3 -12
  8. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/team/model.py +2 -2
  9. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq.egg-info/PKG-INFO +23 -8
  10. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq.egg-info/SOURCES.txt +1 -0
  11. versionhq-1.1.12.3/tests/doc_test.py +16 -0
  12. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/tests/task/task_test.py +1 -1
  13. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/tests/team/team_test.py +6 -6
  14. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/uv.lock +110 -1
  15. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/.github/workflows/publish.yml +0 -0
  16. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/.github/workflows/publish_testpypi.yml +0 -0
  17. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/.github/workflows/run_tests.yml +0 -0
  18. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/.github/workflows/security_check.yml +0 -0
  19. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/.pre-commit-config.yaml +0 -0
  20. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/.python-version +0 -0
  21. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/LICENSE +0 -0
  22. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/SECURITY.md +0 -0
  23. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/db/preprocess.py +0 -0
  24. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/requirements-dev.txt +0 -0
  25. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/requirements.txt +0 -0
  26. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/setup.cfg +0 -0
  27. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/_utils/__init__.py +0 -0
  28. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/_utils/i18n.py +0 -0
  29. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/_utils/logger.py +0 -0
  30. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/_utils/process_config.py +0 -0
  31. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/_utils/usage_metrics.py +0 -0
  32. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/_utils/vars.py +0 -0
  33. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/agent/TEMPLATES/Backstory.py +0 -0
  34. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/agent/TEMPLATES/__init__.py +0 -0
  35. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/agent/__init__.py +0 -0
  36. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/agent/inhouse_agents.py +0 -0
  37. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/agent/model.py +0 -0
  38. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/agent/parser.py +0 -0
  39. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/agent/rpm_controller.py +0 -0
  40. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/cli/__init__.py +0 -0
  41. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/clients/__init__.py +0 -0
  42. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/clients/customer/__init__.py +0 -0
  43. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/clients/customer/model.py +0 -0
  44. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/clients/product/__init__.py +0 -0
  45. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/clients/product/model.py +0 -0
  46. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/clients/workflow/__init__.py +0 -0
  47. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/clients/workflow/model.py +0 -0
  48. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/knowledge/__init__.py +0 -0
  49. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/knowledge/_utils.py +0 -0
  50. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/knowledge/embedding.py +0 -0
  51. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/knowledge/model.py +0 -0
  52. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/knowledge/source.py +0 -0
  53. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/knowledge/source_docling.py +0 -0
  54. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/knowledge/storage.py +0 -0
  55. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/llm/__init__.py +0 -0
  56. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/llm/llm_vars.py +0 -0
  57. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/llm/model.py +0 -0
  58. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/memory/__init__.py +0 -0
  59. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/memory/contextual_memory.py +0 -0
  60. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/memory/model.py +0 -0
  61. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/storage/__init__.py +0 -0
  62. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/storage/base.py +0 -0
  63. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/storage/ltm_sqlite_storage.py +0 -0
  64. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/storage/mem0_storage.py +0 -0
  65. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/storage/rag_storage.py +0 -0
  66. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/storage/task_output_storage.py +0 -0
  67. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/storage/utils.py +0 -0
  68. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/task/TEMPLATES/Description.py +0 -0
  69. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/task/__init__.py +0 -0
  70. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/task/evaluate.py +0 -0
  71. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/task/formatter.py +0 -0
  72. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/task/log_handler.py +0 -0
  73. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/task/model.py +0 -0
  74. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/task/structured_response.py +0 -0
  75. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/team/__init__.py +0 -0
  76. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/team/team_planner.py +0 -0
  77. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/tool/__init__.py +0 -0
  78. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/tool/cache_handler.py +0 -0
  79. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/tool/composio_tool.py +0 -0
  80. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/tool/composio_tool_vars.py +0 -0
  81. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/tool/decorator.py +0 -0
  82. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/tool/model.py +0 -0
  83. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq/tool/tool_handler.py +0 -0
  84. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq.egg-info/dependency_links.txt +0 -0
  85. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq.egg-info/requires.txt +0 -0
  86. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/src/versionhq.egg-info/top_level.txt +0 -0
  87. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/tests/__init__.py +0 -0
  88. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/tests/agent/__init__.py +0 -0
  89. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/tests/agent/agent_test.py +0 -0
  90. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/tests/cli/__init__.py +0 -0
  91. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/tests/clients/customer_test.py +0 -0
  92. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/tests/clients/product_test.py +0 -0
  93. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/tests/clients/workflow_test.py +0 -0
  94. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/tests/conftest.py +0 -0
  95. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/tests/knowledge/__init__.py +0 -0
  96. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/tests/knowledge/knowledge_test.py +0 -0
  97. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/tests/knowledge/mock_report_compressed.pdf +0 -0
  98. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/tests/llm/__init__.py +0 -0
  99. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/tests/llm/llm_test.py +0 -0
  100. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/tests/memory/__init__.py +0 -0
  101. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/tests/memory/memory_test.py +0 -0
  102. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/tests/task/__init__.py +0 -0
  103. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/tests/task/llm_connection_test.py +0 -0
  104. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/tests/team/Prompts/Demo_test.py +0 -0
  105. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/tests/team/__init__.py +0 -0
  106. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/tests/tool/__init__.py +0 -0
  107. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/tests/tool/composio_test.py +0 -0
  108. {versionhq-1.1.12.2 → versionhq-1.1.12.3}/tests/tool/tool_test.py +0 -0
@@ -5,6 +5,9 @@ entity_memory.py
5
5
 
6
6
  train.py
7
7
 
8
+ mkdocs.yml
9
+ docs/
10
+
8
11
  dist/
9
12
  lib/
10
13
  build/
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: versionhq
3
- Version: 1.1.12.2
4
- Summary: Agentic orchestration framework for task automation
3
+ Version: 1.1.12.3
4
+ Summary: An agentic orchestration framework for multi-agent system that shares memory, knowledge base, and RAG tools.
5
5
  Author-email: Kuriko Iwai <kuriko@versi0n.io>
6
6
  License: MIT License
7
7
 
@@ -103,9 +103,10 @@ Agentic orchestration framework to deploy agent network and handle complex task
103
103
  - [Key Features](#key-features)
104
104
  - [Agent formation](#agent-formation)
105
105
  - [Quick Start](#quick-start)
106
- - [Case 1. Solo Agent:](#case-1-solo-agent)
106
+ - [Generate agent networks and launch task execution:](#generate-agent-networks-and-launch-task-execution)
107
+ - [Solo Agent:](#solo-agent)
107
108
  - [Return a structured output with a summary in string.](#return-a-structured-output-with-a-summary-in-string)
108
- - [Case 2. Supervising:](#case-2-supervising)
109
+ - [Supervising:](#supervising)
109
110
  - [Technologies Used](#technologies-used)
110
111
  - [Project Structure](#project-structure)
111
112
  - [Setup](#setup)
@@ -123,9 +124,9 @@ Agentic orchestration framework to deploy agent network and handle complex task
123
124
 
124
125
  ## Key Features
125
126
 
126
- Generate multi-agent systems based on the task complexity, execute tasks, and evaluate output based on the given criteria.
127
+ `versionhq` is a Python framework that can generate agent networks for complex task automation without human interaction.
127
128
 
128
- Agents are model-agnostic, and can handle and share RAG tools, knowledge, memory, and callbacks among other agents. (self-learn)
129
+ Agents are model-agnostic, and will improve task output, while oprimizing token cost and job latency, by sharing their memory, knowledge base, and RAG tools with other agents in the network.
129
130
 
130
131
 
131
132
  ### Agent formation
@@ -153,8 +154,22 @@ You can specify a desired formation or allow the agents to determine it autonomo
153
154
 
154
155
  (Python 3.11 or higher)
155
156
 
157
+ ### Generate agent networks and launch task execution:
156
158
 
157
- ### Case 1. Solo Agent:
159
+ ```
160
+ from versionhq import form_agent_network
161
+
162
+ network = form_agent_network(
163
+ task="YOUR AMAZING TASK OVERVIEW",
164
+ expected_outcome="YOUR OUTCOME EXPECTATION",
165
+ )
166
+ res = network.launch()
167
+ ```
168
+
169
+ This will form a network with multiple agents on `Formation` and return `TaskOutput` object with output in JSON, plane text, Pydantic model format with evaluation.
170
+
171
+
172
+ ### Solo Agent:
158
173
 
159
174
  #### Return a structured output with a summary in string.
160
175
 
@@ -197,7 +212,7 @@ This will return `TaskOutput` instance that stores a response in plane text, JSO
197
212
  )
198
213
  ```
199
214
 
200
- ### Case 2. Supervising:
215
+ ### Supervising:
201
216
 
202
217
  ```
203
218
  from versionhq import Agent, Task, ResponseField, Team, TeamMember
@@ -26,9 +26,10 @@ Agentic orchestration framework to deploy agent network and handle complex task
26
26
  - [Key Features](#key-features)
27
27
  - [Agent formation](#agent-formation)
28
28
  - [Quick Start](#quick-start)
29
- - [Case 1. Solo Agent:](#case-1-solo-agent)
29
+ - [Generate agent networks and launch task execution:](#generate-agent-networks-and-launch-task-execution)
30
+ - [Solo Agent:](#solo-agent)
30
31
  - [Return a structured output with a summary in string.](#return-a-structured-output-with-a-summary-in-string)
31
- - [Case 2. Supervising:](#case-2-supervising)
32
+ - [Supervising:](#supervising)
32
33
  - [Technologies Used](#technologies-used)
33
34
  - [Project Structure](#project-structure)
34
35
  - [Setup](#setup)
@@ -46,9 +47,9 @@ Agentic orchestration framework to deploy agent network and handle complex task
46
47
 
47
48
  ## Key Features
48
49
 
49
- Generate multi-agent systems based on the task complexity, execute tasks, and evaluate output based on the given criteria.
50
+ `versionhq` is a Python framework that can generate agent networks for complex task automation without human interaction.
50
51
 
51
- Agents are model-agnostic, and can handle and share RAG tools, knowledge, memory, and callbacks among other agents. (self-learn)
52
+ Agents are model-agnostic, and will improve task output, while oprimizing token cost and job latency, by sharing their memory, knowledge base, and RAG tools with other agents in the network.
52
53
 
53
54
 
54
55
  ### Agent formation
@@ -76,8 +77,22 @@ You can specify a desired formation or allow the agents to determine it autonomo
76
77
 
77
78
  (Python 3.11 or higher)
78
79
 
80
+ ### Generate agent networks and launch task execution:
79
81
 
80
- ### Case 1. Solo Agent:
82
+ ```
83
+ from versionhq import form_agent_network
84
+
85
+ network = form_agent_network(
86
+ task="YOUR AMAZING TASK OVERVIEW",
87
+ expected_outcome="YOUR OUTCOME EXPECTATION",
88
+ )
89
+ res = network.launch()
90
+ ```
91
+
92
+ This will form a network with multiple agents on `Formation` and return `TaskOutput` object with output in JSON, plane text, Pydantic model format with evaluation.
93
+
94
+
95
+ ### Solo Agent:
81
96
 
82
97
  #### Return a structured output with a summary in string.
83
98
 
@@ -120,7 +135,7 @@ This will return `TaskOutput` instance that stores a response in plane text, JSO
120
135
  )
121
136
  ```
122
137
 
123
- ### Case 2. Supervising:
138
+ ### Supervising:
124
139
 
125
140
  ```
126
141
  from versionhq import Agent, Task, ResponseField, Team, TeamMember
@@ -15,9 +15,9 @@ exclude = ["test*", "__pycache__", "*.egg-info"]
15
15
 
16
16
  [project]
17
17
  name = "versionhq"
18
- version = "1.1.12.2"
18
+ version = "1.1.12.3"
19
19
  authors = [{ name = "Kuriko Iwai", email = "kuriko@versi0n.io" }]
20
- description = "Agentic orchestration framework for task automation"
20
+ description = "An agentic orchestration framework for multi-agent system that shares memory, knowledge base, and RAG tools."
21
21
  readme = "README.md"
22
22
  requires-python = ">=3.11"
23
23
  license = { file = "LICENSE" }
@@ -91,6 +91,7 @@ dev-dependencies = [
91
91
  "bandit",
92
92
  "twine",
93
93
  "pytest>=8.3.4",
94
+ "mkdocs>=1.6.1",
94
95
  ]
95
96
 
96
97
  [tool.uv.workspace]
@@ -1,2 +1 @@
1
- python-3.13.1
2
1
  python-3.12.8
@@ -21,9 +21,10 @@ from versionhq.tool.composio_tool import ComposioHandler
21
21
  from versionhq.memory.contextual_memory import ContextualMemory
22
22
  from versionhq.memory.model import ShortTermMemory,LongTermMemory, UserMemory, MemoryItem
23
23
 
24
+ from versionhq.task.formation import form_agent_network
24
25
 
25
26
 
26
- __version__ = "1.1.12.2"
27
+ __version__ = "1.1.12.3"
27
28
  __all__ = [
28
29
  "Agent",
29
30
 
@@ -67,5 +68,7 @@ __all__ = [
67
68
  "ShortTermMemory",
68
69
  "LongTermMemory",
69
70
  "UserMemory",
70
- "MemoryItem"
71
+ "MemoryItem",
72
+
73
+ "form_agent_network"
71
74
  ]
@@ -11,7 +11,7 @@ from versionhq._utils import Logger
11
11
 
12
12
 
13
13
  def form_agent_network(
14
- task_overview: str,
14
+ task: str,
15
15
  expected_outcome: str,
16
16
  agents: List[Agent] = None,
17
17
  context: str = None,
@@ -21,7 +21,7 @@ def form_agent_network(
21
21
  Make a formation of agents from the given task description, agents (optional), context (optional), and expected outcome (optional).
22
22
  """
23
23
 
24
- if not task_overview:
24
+ if not task:
25
25
  Logger(verbose=True).log(level="error", message="Missing task description.", color="red")
26
26
  return None
27
27
 
@@ -40,7 +40,7 @@ def form_agent_network(
40
40
  vhq_task = Task(
41
41
  description=f"""
42
42
  Create a team of specialized agents designed to automate the following task and deliver the expected outcome. Consider the necessary roles for each agent with a clear task description. If you think we neeed a leader to handle the automation, return a leader_agent role as well, but if not, leave the a leader_agent role blank.
43
- Task: {str(task_overview)}
43
+ Task: {str(task)}
44
44
  Expected outcome: {str(expected_outcome)}
45
45
  """,
46
46
  pydantic_output=Outcome
@@ -112,12 +112,3 @@ def form_agent_network(
112
112
  except Exception as e:
113
113
  Logger(verbose=True).log(level="error", message=f"Failed to create an agent network - return None. You can try with solo agent. Error: {str(e)}", color="red")
114
114
  return None
115
-
116
-
117
-
118
- if __name__ == "__main__":
119
- res = form_agent_network(
120
- task_overview="Launch an outbound campaign to attract young audience.",
121
- expected_outcome="Best media mix of the campaign.",
122
- context="We are selling sports wear.",
123
- )
@@ -387,9 +387,9 @@ class Team(BaseModel):
387
387
  return self._create_team_output(task_outputs, lead_task_output)
388
388
 
389
389
 
390
- def kickoff(self, kwargs_before: Optional[Dict[str, str]] = None, kwargs_after: Optional[Dict[str, Any]] = None) -> TeamOutput:
390
+ def launch(self, kwargs_before: Optional[Dict[str, str]] = None, kwargs_after: Optional[Dict[str, Any]] = None) -> TeamOutput:
391
391
  """
392
- Kickoff the team:
392
+ Confirm and launch the formation - execute tasks and record outputs.
393
393
  0. Assign an agent to a task - using conditions (manager prioritizes team_tasks) and planning_llm.
394
394
  1. Address `before_kickoff_callbacks` if any.
395
395
  2. Handle team members' tasks in accordance with the process.
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: versionhq
3
- Version: 1.1.12.2
4
- Summary: Agentic orchestration framework for task automation
3
+ Version: 1.1.12.3
4
+ Summary: An agentic orchestration framework for multi-agent system that shares memory, knowledge base, and RAG tools.
5
5
  Author-email: Kuriko Iwai <kuriko@versi0n.io>
6
6
  License: MIT License
7
7
 
@@ -103,9 +103,10 @@ Agentic orchestration framework to deploy agent network and handle complex task
103
103
  - [Key Features](#key-features)
104
104
  - [Agent formation](#agent-formation)
105
105
  - [Quick Start](#quick-start)
106
- - [Case 1. Solo Agent:](#case-1-solo-agent)
106
+ - [Generate agent networks and launch task execution:](#generate-agent-networks-and-launch-task-execution)
107
+ - [Solo Agent:](#solo-agent)
107
108
  - [Return a structured output with a summary in string.](#return-a-structured-output-with-a-summary-in-string)
108
- - [Case 2. Supervising:](#case-2-supervising)
109
+ - [Supervising:](#supervising)
109
110
  - [Technologies Used](#technologies-used)
110
111
  - [Project Structure](#project-structure)
111
112
  - [Setup](#setup)
@@ -123,9 +124,9 @@ Agentic orchestration framework to deploy agent network and handle complex task
123
124
 
124
125
  ## Key Features
125
126
 
126
- Generate multi-agent systems based on the task complexity, execute tasks, and evaluate output based on the given criteria.
127
+ `versionhq` is a Python framework that can generate agent networks for complex task automation without human interaction.
127
128
 
128
- Agents are model-agnostic, and can handle and share RAG tools, knowledge, memory, and callbacks among other agents. (self-learn)
129
+ Agents are model-agnostic, and will improve task output, while oprimizing token cost and job latency, by sharing their memory, knowledge base, and RAG tools with other agents in the network.
129
130
 
130
131
 
131
132
  ### Agent formation
@@ -153,8 +154,22 @@ You can specify a desired formation or allow the agents to determine it autonomo
153
154
 
154
155
  (Python 3.11 or higher)
155
156
 
157
+ ### Generate agent networks and launch task execution:
156
158
 
157
- ### Case 1. Solo Agent:
159
+ ```
160
+ from versionhq import form_agent_network
161
+
162
+ network = form_agent_network(
163
+ task="YOUR AMAZING TASK OVERVIEW",
164
+ expected_outcome="YOUR OUTCOME EXPECTATION",
165
+ )
166
+ res = network.launch()
167
+ ```
168
+
169
+ This will form a network with multiple agents on `Formation` and return `TaskOutput` object with output in JSON, plane text, Pydantic model format with evaluation.
170
+
171
+
172
+ ### Solo Agent:
158
173
 
159
174
  #### Return a structured output with a summary in string.
160
175
 
@@ -197,7 +212,7 @@ This will return `TaskOutput` instance that stores a response in plane text, JSO
197
212
  )
198
213
  ```
199
214
 
200
- ### Case 2. Supervising:
215
+ ### Supervising:
201
216
 
202
217
  ```
203
218
  from versionhq import Agent, Task, ResponseField, Team, TeamMember
@@ -81,6 +81,7 @@ src/versionhq/tool/model.py
81
81
  src/versionhq/tool/tool_handler.py
82
82
  tests/__init__.py
83
83
  tests/conftest.py
84
+ tests/doc_test.py
84
85
  tests/agent/__init__.py
85
86
  tests/agent/agent_test.py
86
87
  tests/cli/__init__.py
@@ -0,0 +1,16 @@
1
+
2
+
3
+ """
4
+ Test for use cases in the documentation.
5
+ """
6
+
7
+ def test_quick_start():
8
+ from versionhq import form_agent_network
9
+
10
+ network = form_agent_network(
11
+ task="YOUR AMAZING TASK OVERVIEW",
12
+ expected_outcome="YOUR OUTCOME EXPECTATION",
13
+ )
14
+ res = network.launch()
15
+
16
+ assert res.raw is not None
@@ -367,7 +367,7 @@ def test_agent_formation():
367
367
  from versionhq.task.formation import form_agent_network
368
368
 
369
369
  created_team = form_agent_network(
370
- task_overview="Launch an outbound campaign to attract young male audience.",
370
+ task="Launch an outbound campaign to attract young male audience.",
371
371
  expected_outcome="Best social media mix plan and key communication lines",
372
372
  context="We sell luxuary sportswear targeting male in 30th, and are expanding our market to younger male.",
373
373
  )
@@ -98,7 +98,7 @@ def test_kickoff_without_leader():
98
98
  TeamMember(agent=agent_b, is_manager=False, task=task_2),
99
99
  ],
100
100
  )
101
- res = team.kickoff()
101
+ res = team.launch()
102
102
  res_all = res.return_all_task_outputs()
103
103
 
104
104
  assert isinstance(res, TeamOutput)
@@ -158,7 +158,7 @@ def team_kickoff_with_task_callback():
158
158
  TeamMember(agent=agent_b, is_manager=False, task=task_2),
159
159
  ],
160
160
  )
161
- res = team.kickoff()
161
+ res = team.launch()
162
162
 
163
163
  assert res.raw is not None
164
164
  assert res.json_dict is not None
@@ -191,7 +191,7 @@ def test_delegate_in_team():
191
191
  TeamMember(agent=agent_b, is_manager=False, task=task_2),
192
192
  ],
193
193
  )
194
- res = team.kickoff()
194
+ res = team.launch()
195
195
 
196
196
  assert res.raw is not None
197
197
  assert res.json_dict is not None
@@ -218,7 +218,7 @@ def test_kickoff_with_leader():
218
218
  TeamMember(agent=agent_b, is_manager=True, task=task_2),
219
219
  ],
220
220
  )
221
- res = team.kickoff()
221
+ res = team.launch()
222
222
 
223
223
  assert isinstance(res, TeamOutput)
224
224
  assert res.team_id is team.id
@@ -258,7 +258,7 @@ def test_hierarchial_process():
258
258
  ],
259
259
  process=TaskHandlingProcess.hierarchical
260
260
  )
261
- res = team.kickoff()
261
+ res = team.launch()
262
262
 
263
263
  assert isinstance(res, TeamOutput)
264
264
  assert res.team_id is team.id
@@ -334,7 +334,7 @@ def test_handle_team_task():
334
334
  teams = [team_solo, team_flat, team_leader, team_dual_leaders, team_leader_without_task]
335
335
 
336
336
  for team in teams:
337
- res = team.kickoff()
337
+ res = team.launch()
338
338
  assert team._get_responsible_agent(task=team_task) is not None
339
339
  assert isinstance(res, TeamOutput)
340
340
  assert res.team_id is team.id
@@ -938,6 +938,18 @@ wheels = [
938
938
  { url = "https://files.pythonhosted.org/packages/e2/94/758680531a00d06e471ef649e4ec2ed6bf185356a7f9fbfbb7368a40bd49/fsspec-2025.2.0-py3-none-any.whl", hash = "sha256:9de2ad9ce1f85e1931858535bc882543171d197001a0a5eb2ddc04f1781ab95b", size = 184484 },
939
939
  ]
940
940
 
941
+ [[package]]
942
+ name = "ghp-import"
943
+ version = "2.1.0"
944
+ source = { registry = "https://pypi.org/simple" }
945
+ dependencies = [
946
+ { name = "python-dateutil" },
947
+ ]
948
+ sdist = { url = "https://files.pythonhosted.org/packages/d9/29/d40217cbe2f6b1359e00c6c307bb3fc876ba74068cbab3dde77f03ca0dc4/ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343", size = 10943 }
949
+ wheels = [
950
+ { url = "https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034 },
951
+ ]
952
+
941
953
  [[package]]
942
954
  name = "google-auth"
943
955
  version = "2.38.0"
@@ -1721,6 +1733,15 @@ wheels = [
1721
1733
  { url = "https://files.pythonhosted.org/packages/7d/db/214290d58ad68c587bd5d6af3d34e56830438733d0d0856c0275fde43652/lxml-5.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:406246b96d552e0503e17a1006fd27edac678b3fcc9f1be71a2f94b4ff61528d", size = 3814417 },
1722
1734
  ]
1723
1735
 
1736
+ [[package]]
1737
+ name = "markdown"
1738
+ version = "3.7"
1739
+ source = { registry = "https://pypi.org/simple" }
1740
+ sdist = { url = "https://files.pythonhosted.org/packages/54/28/3af612670f82f4c056911fbbbb42760255801b3068c48de792d354ff4472/markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2", size = 357086 }
1741
+ wheels = [
1742
+ { url = "https://files.pythonhosted.org/packages/3f/08/83871f3c50fc983b88547c196d11cf8c3340e37c32d2e9d6152abe2c61f7/Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803", size = 106349 },
1743
+ ]
1744
+
1724
1745
  [[package]]
1725
1746
  name = "markdown-it-py"
1726
1747
  version = "3.0.0"
@@ -1816,6 +1837,53 @@ wheels = [
1816
1837
  { url = "https://files.pythonhosted.org/packages/39/7b/92d4a79f8cfec42ce1c2fda8435d4b8234e5d6d2d1968f7c92beaf00e034/mem0ai-0.1.48-py3-none-any.whl", hash = "sha256:23d1bd591c36da9e1f9f013d6f87a79ef9eb1495ac27b1e380af7f819b07fee0", size = 91338 },
1817
1838
  ]
1818
1839
 
1840
+ [[package]]
1841
+ name = "mergedeep"
1842
+ version = "1.3.4"
1843
+ source = { registry = "https://pypi.org/simple" }
1844
+ sdist = { url = "https://files.pythonhosted.org/packages/3a/41/580bb4006e3ed0361b8151a01d324fb03f420815446c7def45d02f74c270/mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8", size = 4661 }
1845
+ wheels = [
1846
+ { url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307", size = 6354 },
1847
+ ]
1848
+
1849
+ [[package]]
1850
+ name = "mkdocs"
1851
+ version = "1.6.1"
1852
+ source = { registry = "https://pypi.org/simple" }
1853
+ dependencies = [
1854
+ { name = "click" },
1855
+ { name = "colorama", marker = "sys_platform == 'win32'" },
1856
+ { name = "ghp-import" },
1857
+ { name = "jinja2" },
1858
+ { name = "markdown" },
1859
+ { name = "markupsafe" },
1860
+ { name = "mergedeep" },
1861
+ { name = "mkdocs-get-deps" },
1862
+ { name = "packaging" },
1863
+ { name = "pathspec" },
1864
+ { name = "pyyaml" },
1865
+ { name = "pyyaml-env-tag" },
1866
+ { name = "watchdog" },
1867
+ ]
1868
+ sdist = { url = "https://files.pythonhosted.org/packages/bc/c6/bbd4f061bd16b378247f12953ffcb04786a618ce5e904b8c5a01a0309061/mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2", size = 3889159 }
1869
+ wheels = [
1870
+ { url = "https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e", size = 3864451 },
1871
+ ]
1872
+
1873
+ [[package]]
1874
+ name = "mkdocs-get-deps"
1875
+ version = "0.2.0"
1876
+ source = { registry = "https://pypi.org/simple" }
1877
+ dependencies = [
1878
+ { name = "mergedeep" },
1879
+ { name = "platformdirs" },
1880
+ { name = "pyyaml" },
1881
+ ]
1882
+ sdist = { url = "https://files.pythonhosted.org/packages/98/f5/ed29cd50067784976f25ed0ed6fcd3c2ce9eb90650aa3b2796ddf7b6870b/mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c", size = 10239 }
1883
+ wheels = [
1884
+ { url = "https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134", size = 9521 },
1885
+ ]
1886
+
1819
1887
  [[package]]
1820
1888
  name = "mmh3"
1821
1889
  version = "5.1.0"
@@ -3302,6 +3370,18 @@ wheels = [
3302
3370
  { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 },
3303
3371
  ]
3304
3372
 
3373
+ [[package]]
3374
+ name = "pyyaml-env-tag"
3375
+ version = "0.1"
3376
+ source = { registry = "https://pypi.org/simple" }
3377
+ dependencies = [
3378
+ { name = "pyyaml" },
3379
+ ]
3380
+ sdist = { url = "https://files.pythonhosted.org/packages/fb/8e/da1c6c58f751b70f8ceb1eb25bc25d524e8f14fe16edcce3f4e3ba08629c/pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb", size = 5631 }
3381
+ wheels = [
3382
+ { url = "https://files.pythonhosted.org/packages/5a/66/bbb1dd374f5c870f59c5bb1db0e18cbe7fa739415a24cbd95b2d1f5ae0c4/pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069", size = 3911 },
3383
+ ]
3384
+
3305
3385
  [[package]]
3306
3386
  name = "qdrant-client"
3307
3387
  version = "1.12.1"
@@ -4459,7 +4539,7 @@ wheels = [
4459
4539
 
4460
4540
  [[package]]
4461
4541
  name = "versionhq"
4462
- version = "1.1.12.1"
4542
+ version = "1.1.12.2"
4463
4543
  source = { editable = "." }
4464
4544
  dependencies = [
4465
4545
  { name = "appdirs" },
@@ -4506,6 +4586,7 @@ pdfplumber = [
4506
4586
  dev = [
4507
4587
  { name = "bandit" },
4508
4588
  { name = "black" },
4589
+ { name = "mkdocs" },
4509
4590
  { name = "mypy" },
4510
4591
  { name = "pre-commit" },
4511
4592
  { name = "pytest" },
@@ -4546,6 +4627,7 @@ requires-dist = [
4546
4627
  dev = [
4547
4628
  { name = "bandit" },
4548
4629
  { name = "black" },
4630
+ { name = "mkdocs", specifier = ">=1.6.1" },
4549
4631
  { name = "mypy", specifier = ">=1.10.0" },
4550
4632
  { name = "pre-commit", specifier = ">=4.0.1" },
4551
4633
  { name = "pytest", specifier = ">=8.0.0" },
@@ -4568,6 +4650,33 @@ wheels = [
4568
4650
  { url = "https://files.pythonhosted.org/packages/89/9b/599bcfc7064fbe5740919e78c5df18e5dceb0887e676256a1061bb5ae232/virtualenv-20.29.1-py3-none-any.whl", hash = "sha256:4e4cb403c0b0da39e13b46b1b2476e505cb0046b25f242bee80f62bf990b2779", size = 4282379 },
4569
4651
  ]
4570
4652
 
4653
+ [[package]]
4654
+ name = "watchdog"
4655
+ version = "6.0.0"
4656
+ source = { registry = "https://pypi.org/simple" }
4657
+ sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220 }
4658
+ wheels = [
4659
+ { url = "https://files.pythonhosted.org/packages/e0/24/d9be5cd6642a6aa68352ded4b4b10fb0d7889cb7f45814fb92cecd35f101/watchdog-6.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c", size = 96393 },
4660
+ { url = "https://files.pythonhosted.org/packages/63/7a/6013b0d8dbc56adca7fdd4f0beed381c59f6752341b12fa0886fa7afc78b/watchdog-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2", size = 88392 },
4661
+ { url = "https://files.pythonhosted.org/packages/d1/40/b75381494851556de56281e053700e46bff5b37bf4c7267e858640af5a7f/watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c", size = 89019 },
4662
+ { url = "https://files.pythonhosted.org/packages/39/ea/3930d07dafc9e286ed356a679aa02d777c06e9bfd1164fa7c19c288a5483/watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", size = 96471 },
4663
+ { url = "https://files.pythonhosted.org/packages/12/87/48361531f70b1f87928b045df868a9fd4e253d9ae087fa4cf3f7113be363/watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", size = 88449 },
4664
+ { url = "https://files.pythonhosted.org/packages/5b/7e/8f322f5e600812e6f9a31b75d242631068ca8f4ef0582dd3ae6e72daecc8/watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", size = 89054 },
4665
+ { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480 },
4666
+ { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451 },
4667
+ { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057 },
4668
+ { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079 },
4669
+ { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078 },
4670
+ { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076 },
4671
+ { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077 },
4672
+ { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078 },
4673
+ { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077 },
4674
+ { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078 },
4675
+ { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065 },
4676
+ { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070 },
4677
+ { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067 },
4678
+ ]
4679
+
4571
4680
  [[package]]
4572
4681
  name = "watchfiles"
4573
4682
  version = "1.0.4"
File without changes
File without changes
File without changes