versionhq 1.1.10.5__tar.gz → 1.1.10.7__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.1.10.5 → versionhq-1.1.10.7}/PKG-INFO +51 -57
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/README.md +50 -56
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/pyproject.toml +1 -1
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/__init__.py +1 -1
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq.egg-info/PKG-INFO +51 -57
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/tests/task/task_test.py +5 -5
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/.github/workflows/publish.yml +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/.github/workflows/publish_testpypi.yml +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/.github/workflows/run_tests.yml +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/.github/workflows/security_check.yml +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/.gitignore +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/.pre-commit-config.yaml +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/.python-version +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/LICENSE +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/SECURITY.md +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/db/preprocess.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/requirements-dev.txt +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/requirements.txt +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/runtime.txt +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/setup.cfg +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/_utils/__init__.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/_utils/i18n.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/_utils/logger.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/_utils/process_config.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/_utils/rpm_controller.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/_utils/usage_metrics.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/agent/TEMPLATES/Backstory.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/agent/TEMPLATES/__init__.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/agent/__init__.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/agent/model.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/agent/parser.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/cli/__init__.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/clients/__init__.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/clients/customer/__init__.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/clients/customer/model.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/clients/product/__init__.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/clients/product/model.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/clients/workflow/__init__.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/clients/workflow/model.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/llm/__init__.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/llm/llm_vars.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/llm/model.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/storage/__init__.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/storage/task_output_storage.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/task/__init__.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/task/formatter.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/task/log_handler.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/task/model.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/task/structured_response.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/team/__init__.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/team/model.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/team/team_planner.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/tool/__init__.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/tool/cache_handler.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/tool/composio_tool.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/tool/composio_tool_vars.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/tool/decorator.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/tool/model.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/tool/tool_handler.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq.egg-info/SOURCES.txt +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq.egg-info/dependency_links.txt +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq.egg-info/requires.txt +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq.egg-info/top_level.txt +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/tests/__init__.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/tests/agent/__init__.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/tests/agent/agent_test.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/tests/cli/__init__.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/tests/clients/customer_test.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/tests/clients/product_test.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/tests/clients/workflow_test.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/tests/conftest.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/tests/llm/__init__.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/tests/llm/llm_test.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/tests/task/__init__.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/tests/team/Prompts/Demo_test.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/tests/team/__init__.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/tests/team/team_test.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/tests/tool/__init__.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/tests/tool/composio_test.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/tests/tool/tool_test.py +0 -0
- {versionhq-1.1.10.5 → versionhq-1.1.10.7}/uv.lock +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: versionhq
|
3
|
-
Version: 1.1.10.
|
3
|
+
Version: 1.1.10.7
|
4
4
|
Summary: LLM orchestration frameworks for model-agnostic AI agents that handle complex outbound workflows
|
5
5
|
Author-email: Kuriko Iwai <kuriko@versi0n.io>
|
6
6
|
License: MIT License
|
@@ -66,32 +66,17 @@ Requires-Dist: composio-langchain>=0.6.12
|
|
66
66
|

|
67
67
|
|
68
68
|
|
69
|
-
|
70
|
-
|
71
|
-
Agents are model agnostic.
|
72
|
-
|
73
|
-
Messaging workflows are created at individual level, and will be deployed on third-party services via `Composio`.
|
74
|
-
|
69
|
+
LLM orchestration frameworks to deploy multi-agent systems focusing on complex outbound tasks.
|
75
70
|
|
76
71
|
**Visit:**
|
77
72
|
|
78
73
|
- [PyPI](https://pypi.org/project/versionhq/)
|
79
|
-
- [Github (LLM orchestration)](https://github.com/versionHQ/multi-agent-system)
|
80
|
-
- [
|
81
|
-
|
82
|
-
- [
|
74
|
+
- [Github (LLM orchestration framework)](https://github.com/versionHQ/multi-agent-system)
|
75
|
+
- [Github (Test client app)](https://github.com/versionHQ/test-client-app)
|
76
|
+
- [Use case](https://versi0n.io/playground) / [Quick demo](https://res.cloudinary.com/dfeirxlea/video/upload/v1737732977/pj_m_home/pnsyh5mfvmilwgt0eusa.mov)
|
77
|
+
- [Documentation](https://chief-oxygen-8a2.notion.site/Documentation-17e923685cf98001a5fad5c4b2acd79b?pvs=4) *Some components are under review.
|
83
78
|
|
84
79
|
|
85
|
-
<hr />
|
86
|
-
|
87
|
-
## Mindmap
|
88
|
-
|
89
|
-
LLM-powered `agent`s and `team`s use `tool`s and their own knowledge to complete the `task` given by the client or the system.
|
90
|
-
|
91
|
-
<p align="center">
|
92
|
-
<img src="https://res.cloudinary.com/dfeirxlea/image/upload/v1733556715/pj_m_home/urwte15at3h0dr8mdlyo.png" alt="mindmap" width="400">
|
93
|
-
</p>
|
94
|
-
|
95
80
|
<hr />
|
96
81
|
|
97
82
|
## Table of Content
|
@@ -99,8 +84,10 @@ LLM-powered `agent`s and `team`s use `tool`s and their own knowledge to complete
|
|
99
84
|
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
|
100
85
|
|
101
86
|
- [Key Features](#key-features)
|
102
|
-
- [
|
103
|
-
|
87
|
+
- [Agent formation](#agent-formation)
|
88
|
+
- [Quick Start](#quick-start)
|
89
|
+
- [Case 1. Single agent network:](#case-1-single-agent-network)
|
90
|
+
- [Return a structured output with a summary in string.](#return-a-structured-output-with-a-summary-in-string)
|
104
91
|
- [Case 2. Form a team to handle multiple tasks:](#case-2-form-a-team-to-handle-multiple-tasks)
|
105
92
|
- [Technologies Used](#technologies-used)
|
106
93
|
- [Project Structure](#project-structure)
|
@@ -119,68 +106,75 @@ LLM-powered `agent`s and `team`s use `tool`s and their own knowledge to complete
|
|
119
106
|
|
120
107
|
## Key Features
|
121
108
|
|
122
|
-
|
109
|
+
Generate mulit-agent systems depending on the complexity of the task, and execute the task with agents of choice.
|
110
|
+
|
111
|
+
Model-agnostic agents can handle RAG tools, tools, callbacks, and knowledge sharing among other agents.
|
123
112
|
|
124
|
-
The `agent` is model agnostic. The default model is set Chat GTP 4o. We ask the client their preference and switch it accordingly using llm variable stored in the `BaseAgent` class.
|
125
113
|
|
126
|
-
|
114
|
+
### Agent formation
|
115
|
+
Depending on the task complexity, agents can make a different formation.
|
127
116
|
|
128
|
-
|
129
|
-
- Professional `agents` handle the analysis `tasks` on each client, customer, and product.
|
117
|
+
You can specify which formation you want them to generate, or let the agent decide if you don’t have a clear plan.
|
130
118
|
|
131
|
-
**2. Messaging Workflow Creation**
|
132
|
-
- Several `teams` receive the analysis and design initial messaging workflow with several layers.
|
133
|
-
- Ask the client for their inputs
|
134
|
-
- Deploy the workflow on the third party tools using `composio`.
|
135
119
|
|
136
|
-
**
|
137
|
-
|
120
|
+
| | **Solo Agent** | **Supervising** | **Network** | **Random** |
|
121
|
+
| :--- | :--- | :--- | :--- | :--- |
|
122
|
+
| **Formation** | <img src="https://res.cloudinary.com/dfeirxlea/image/upload/v1737893140/pj_m_agents/tglrxoiuv7kk7nzvpe1z.jpg" alt="solo" width="200"> | <img src="https://res.cloudinary.com/dfeirxlea/image/upload/v1737893141/pj_m_agents/hxngdvnn5b5qdxo0ayl5.jpg" alt="solo" width="200"> | <img src="https://res.cloudinary.com/dfeirxlea/image/upload/v1737893142/pj_m_agents/kyc6neg8m6keyizszcpi.jpg" alt="solo" width="200"> | <img src="https://res.cloudinary.com/dfeirxlea/image/upload/v1737893139/pj_m_agents/hzpchlcpnpwxwaapu1hr.jpg" alt="solo" width="200"> |
|
123
|
+
| **Usage** | <ul><li>A single agent with tools, knowledge, and memory.</li><li>When self-learning mode is on - it will turn into **Random** formation.</li></ul> | <ul><li>Leader agent gives directions, while sharing its knowledge and memory.</li><li>Subordinates can be solo agents or networks.</li></ul> | <ul><li>Share tasks, knowledge, and memory among network members.</li></ul> | <ul><li>A single agent handles tasks, asking help from other agents without sharing its memory or knowledge.</li></ul> |
|
124
|
+
| **Use case** | An email agent drafts promo message for the given audience. | The leader agent strategizes an outbound campaign plan and assigns components such as media mix or message creation to subordinate agents. | An email agent and social media agent share the product knowledge and deploy multi-channel outbound campaign. | 1. An email agent drafts promo message for the given audience, asking insights on tones from other email agents which oversee other clusters. 2. An agent calls the external agent to deploy the campaign. |
|
138
125
|
|
139
126
|
<hr />
|
140
127
|
|
141
|
-
##
|
128
|
+
## Quick Start
|
129
|
+
|
130
|
+
**Install `versionhq` package:**
|
142
131
|
|
143
|
-
1. Install `versionhq` package:
|
144
132
|
```
|
145
|
-
|
133
|
+
pip install versionhq
|
146
134
|
```
|
147
135
|
|
148
|
-
|
136
|
+
(Python >= 3.13)
|
137
|
+
|
149
138
|
|
139
|
+
### Case 1. Single agent network:
|
150
140
|
|
151
|
-
|
141
|
+
#### Return a structured output with a summary in string.
|
152
142
|
|
153
143
|
```
|
144
|
+
from pydantic import BaseModel
|
154
145
|
from versionhq.agent.model import Agent
|
155
|
-
from versionhq.task.model import Task
|
146
|
+
from versionhq.task.model import Task
|
156
147
|
|
157
|
-
|
158
|
-
|
148
|
+
class CustomOutput(BaseModel):
|
149
|
+
test1: str
|
150
|
+
test2: list[str]
|
151
|
+
|
152
|
+
def dummy_func(message: str, test1: str, test2: list[str]) -> str:
|
153
|
+
return f"{message}: {test1}, {", ".join(test2)}"
|
159
154
|
|
160
|
-
|
161
|
-
|
162
|
-
goal="amazing project goal",
|
163
|
-
skillsets=["skill_1", "skill_2", ],
|
164
|
-
tools=["amazing RAG tool",]
|
165
|
-
llm="llm-of-your-choice"
|
166
|
-
)
|
155
|
+
|
156
|
+
agent = Agent(role="demo", goal="amazing project goal")
|
167
157
|
|
168
158
|
task = Task(
|
169
159
|
description="Amazing task",
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
],
|
174
|
-
callbacks=[my_callback_func]
|
160
|
+
pydantic_custom_output=CustomOutput,
|
161
|
+
callback=dummy_func,
|
162
|
+
callback_kwargs=dict(message="Hi! Here is the result: ")
|
175
163
|
)
|
164
|
+
|
176
165
|
res = task.execute_sync(agent=agent, context="amazing context to consider.")
|
177
|
-
|
166
|
+
print(res)
|
178
167
|
```
|
179
168
|
|
180
|
-
This will return
|
169
|
+
This will return `TaskOutput` that stores a response in string, JSON dict, and Pydantic model: `CustomOutput` formats with a callback result.
|
181
170
|
|
182
171
|
```
|
183
|
-
|
172
|
+
res == TaskOutput(
|
173
|
+
raw="{\\"test1\\": \\"random str\\", \\"test2\\": [\\"item1\\", \\"item2\\"]}",
|
174
|
+
json_dict={"test1": "random str", "test2": ["item1", "item2"]},
|
175
|
+
pydantic=CustomOutput(test1="random str", test2=["item 1", "item 2"]),
|
176
|
+
callback_output="Hi! Here is the result: random str, item 1, item 2",
|
177
|
+
)
|
184
178
|
```
|
185
179
|
|
186
180
|
### Case 2. Form a team to handle multiple tasks:
|
@@ -7,32 +7,17 @@
|
|
7
7
|

|
8
8
|
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
Agents are model agnostic.
|
13
|
-
|
14
|
-
Messaging workflows are created at individual level, and will be deployed on third-party services via `Composio`.
|
15
|
-
|
10
|
+
LLM orchestration frameworks to deploy multi-agent systems focusing on complex outbound tasks.
|
16
11
|
|
17
12
|
**Visit:**
|
18
13
|
|
19
14
|
- [PyPI](https://pypi.org/project/versionhq/)
|
20
|
-
- [Github (LLM orchestration)](https://github.com/versionHQ/multi-agent-system)
|
21
|
-
- [
|
22
|
-
|
23
|
-
- [
|
15
|
+
- [Github (LLM orchestration framework)](https://github.com/versionHQ/multi-agent-system)
|
16
|
+
- [Github (Test client app)](https://github.com/versionHQ/test-client-app)
|
17
|
+
- [Use case](https://versi0n.io/playground) / [Quick demo](https://res.cloudinary.com/dfeirxlea/video/upload/v1737732977/pj_m_home/pnsyh5mfvmilwgt0eusa.mov)
|
18
|
+
- [Documentation](https://chief-oxygen-8a2.notion.site/Documentation-17e923685cf98001a5fad5c4b2acd79b?pvs=4) *Some components are under review.
|
24
19
|
|
25
20
|
|
26
|
-
<hr />
|
27
|
-
|
28
|
-
## Mindmap
|
29
|
-
|
30
|
-
LLM-powered `agent`s and `team`s use `tool`s and their own knowledge to complete the `task` given by the client or the system.
|
31
|
-
|
32
|
-
<p align="center">
|
33
|
-
<img src="https://res.cloudinary.com/dfeirxlea/image/upload/v1733556715/pj_m_home/urwte15at3h0dr8mdlyo.png" alt="mindmap" width="400">
|
34
|
-
</p>
|
35
|
-
|
36
21
|
<hr />
|
37
22
|
|
38
23
|
## Table of Content
|
@@ -40,8 +25,10 @@ LLM-powered `agent`s and `team`s use `tool`s and their own knowledge to complete
|
|
40
25
|
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
|
41
26
|
|
42
27
|
- [Key Features](#key-features)
|
43
|
-
- [
|
44
|
-
|
28
|
+
- [Agent formation](#agent-formation)
|
29
|
+
- [Quick Start](#quick-start)
|
30
|
+
- [Case 1. Single agent network:](#case-1-single-agent-network)
|
31
|
+
- [Return a structured output with a summary in string.](#return-a-structured-output-with-a-summary-in-string)
|
45
32
|
- [Case 2. Form a team to handle multiple tasks:](#case-2-form-a-team-to-handle-multiple-tasks)
|
46
33
|
- [Technologies Used](#technologies-used)
|
47
34
|
- [Project Structure](#project-structure)
|
@@ -60,68 +47,75 @@ LLM-powered `agent`s and `team`s use `tool`s and their own knowledge to complete
|
|
60
47
|
|
61
48
|
## Key Features
|
62
49
|
|
63
|
-
|
50
|
+
Generate mulit-agent systems depending on the complexity of the task, and execute the task with agents of choice.
|
51
|
+
|
52
|
+
Model-agnostic agents can handle RAG tools, tools, callbacks, and knowledge sharing among other agents.
|
64
53
|
|
65
|
-
The `agent` is model agnostic. The default model is set Chat GTP 4o. We ask the client their preference and switch it accordingly using llm variable stored in the `BaseAgent` class.
|
66
54
|
|
67
|
-
|
55
|
+
### Agent formation
|
56
|
+
Depending on the task complexity, agents can make a different formation.
|
68
57
|
|
69
|
-
|
70
|
-
- Professional `agents` handle the analysis `tasks` on each client, customer, and product.
|
58
|
+
You can specify which formation you want them to generate, or let the agent decide if you don’t have a clear plan.
|
71
59
|
|
72
|
-
**2. Messaging Workflow Creation**
|
73
|
-
- Several `teams` receive the analysis and design initial messaging workflow with several layers.
|
74
|
-
- Ask the client for their inputs
|
75
|
-
- Deploy the workflow on the third party tools using `composio`.
|
76
60
|
|
77
|
-
**
|
78
|
-
|
61
|
+
| | **Solo Agent** | **Supervising** | **Network** | **Random** |
|
62
|
+
| :--- | :--- | :--- | :--- | :--- |
|
63
|
+
| **Formation** | <img src="https://res.cloudinary.com/dfeirxlea/image/upload/v1737893140/pj_m_agents/tglrxoiuv7kk7nzvpe1z.jpg" alt="solo" width="200"> | <img src="https://res.cloudinary.com/dfeirxlea/image/upload/v1737893141/pj_m_agents/hxngdvnn5b5qdxo0ayl5.jpg" alt="solo" width="200"> | <img src="https://res.cloudinary.com/dfeirxlea/image/upload/v1737893142/pj_m_agents/kyc6neg8m6keyizszcpi.jpg" alt="solo" width="200"> | <img src="https://res.cloudinary.com/dfeirxlea/image/upload/v1737893139/pj_m_agents/hzpchlcpnpwxwaapu1hr.jpg" alt="solo" width="200"> |
|
64
|
+
| **Usage** | <ul><li>A single agent with tools, knowledge, and memory.</li><li>When self-learning mode is on - it will turn into **Random** formation.</li></ul> | <ul><li>Leader agent gives directions, while sharing its knowledge and memory.</li><li>Subordinates can be solo agents or networks.</li></ul> | <ul><li>Share tasks, knowledge, and memory among network members.</li></ul> | <ul><li>A single agent handles tasks, asking help from other agents without sharing its memory or knowledge.</li></ul> |
|
65
|
+
| **Use case** | An email agent drafts promo message for the given audience. | The leader agent strategizes an outbound campaign plan and assigns components such as media mix or message creation to subordinate agents. | An email agent and social media agent share the product knowledge and deploy multi-channel outbound campaign. | 1. An email agent drafts promo message for the given audience, asking insights on tones from other email agents which oversee other clusters. 2. An agent calls the external agent to deploy the campaign. |
|
79
66
|
|
80
67
|
<hr />
|
81
68
|
|
82
|
-
##
|
69
|
+
## Quick Start
|
70
|
+
|
71
|
+
**Install `versionhq` package:**
|
83
72
|
|
84
|
-
1. Install `versionhq` package:
|
85
73
|
```
|
86
|
-
|
74
|
+
pip install versionhq
|
87
75
|
```
|
88
76
|
|
89
|
-
|
77
|
+
(Python >= 3.13)
|
78
|
+
|
90
79
|
|
80
|
+
### Case 1. Single agent network:
|
91
81
|
|
92
|
-
|
82
|
+
#### Return a structured output with a summary in string.
|
93
83
|
|
94
84
|
```
|
85
|
+
from pydantic import BaseModel
|
95
86
|
from versionhq.agent.model import Agent
|
96
|
-
from versionhq.task.model import Task
|
87
|
+
from versionhq.task.model import Task
|
97
88
|
|
98
|
-
|
99
|
-
|
89
|
+
class CustomOutput(BaseModel):
|
90
|
+
test1: str
|
91
|
+
test2: list[str]
|
92
|
+
|
93
|
+
def dummy_func(message: str, test1: str, test2: list[str]) -> str:
|
94
|
+
return f"{message}: {test1}, {", ".join(test2)}"
|
100
95
|
|
101
|
-
|
102
|
-
|
103
|
-
goal="amazing project goal",
|
104
|
-
skillsets=["skill_1", "skill_2", ],
|
105
|
-
tools=["amazing RAG tool",]
|
106
|
-
llm="llm-of-your-choice"
|
107
|
-
)
|
96
|
+
|
97
|
+
agent = Agent(role="demo", goal="amazing project goal")
|
108
98
|
|
109
99
|
task = Task(
|
110
100
|
description="Amazing task",
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
],
|
115
|
-
callbacks=[my_callback_func]
|
101
|
+
pydantic_custom_output=CustomOutput,
|
102
|
+
callback=dummy_func,
|
103
|
+
callback_kwargs=dict(message="Hi! Here is the result: ")
|
116
104
|
)
|
105
|
+
|
117
106
|
res = task.execute_sync(agent=agent, context="amazing context to consider.")
|
118
|
-
|
107
|
+
print(res)
|
119
108
|
```
|
120
109
|
|
121
|
-
This will return
|
110
|
+
This will return `TaskOutput` that stores a response in string, JSON dict, and Pydantic model: `CustomOutput` formats with a callback result.
|
122
111
|
|
123
112
|
```
|
124
|
-
|
113
|
+
res == TaskOutput(
|
114
|
+
raw="{\\"test1\\": \\"random str\\", \\"test2\\": [\\"item1\\", \\"item2\\"]}",
|
115
|
+
json_dict={"test1": "random str", "test2": ["item1", "item2"]},
|
116
|
+
pydantic=CustomOutput(test1="random str", test2=["item 1", "item 2"]),
|
117
|
+
callback_output="Hi! Here is the result: random str, item 1, item 2",
|
118
|
+
)
|
125
119
|
```
|
126
120
|
|
127
121
|
### Case 2. Form a team to handle multiple tasks:
|
@@ -15,7 +15,7 @@ exclude = ["test*", "__pycache__"]
|
|
15
15
|
|
16
16
|
[project]
|
17
17
|
name = "versionhq"
|
18
|
-
version = "1.1.10.
|
18
|
+
version = "1.1.10.7"
|
19
19
|
authors = [{ name = "Kuriko Iwai", email = "kuriko@versi0n.io" }]
|
20
20
|
description = "LLM orchestration frameworks for model-agnostic AI agents that handle complex outbound workflows"
|
21
21
|
readme = "README.md"
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: versionhq
|
3
|
-
Version: 1.1.10.
|
3
|
+
Version: 1.1.10.7
|
4
4
|
Summary: LLM orchestration frameworks for model-agnostic AI agents that handle complex outbound workflows
|
5
5
|
Author-email: Kuriko Iwai <kuriko@versi0n.io>
|
6
6
|
License: MIT License
|
@@ -66,32 +66,17 @@ Requires-Dist: composio-langchain>=0.6.12
|
|
66
66
|

|
67
67
|
|
68
68
|
|
69
|
-
|
70
|
-
|
71
|
-
Agents are model agnostic.
|
72
|
-
|
73
|
-
Messaging workflows are created at individual level, and will be deployed on third-party services via `Composio`.
|
74
|
-
|
69
|
+
LLM orchestration frameworks to deploy multi-agent systems focusing on complex outbound tasks.
|
75
70
|
|
76
71
|
**Visit:**
|
77
72
|
|
78
73
|
- [PyPI](https://pypi.org/project/versionhq/)
|
79
|
-
- [Github (LLM orchestration)](https://github.com/versionHQ/multi-agent-system)
|
80
|
-
- [
|
81
|
-
|
82
|
-
- [
|
74
|
+
- [Github (LLM orchestration framework)](https://github.com/versionHQ/multi-agent-system)
|
75
|
+
- [Github (Test client app)](https://github.com/versionHQ/test-client-app)
|
76
|
+
- [Use case](https://versi0n.io/playground) / [Quick demo](https://res.cloudinary.com/dfeirxlea/video/upload/v1737732977/pj_m_home/pnsyh5mfvmilwgt0eusa.mov)
|
77
|
+
- [Documentation](https://chief-oxygen-8a2.notion.site/Documentation-17e923685cf98001a5fad5c4b2acd79b?pvs=4) *Some components are under review.
|
83
78
|
|
84
79
|
|
85
|
-
<hr />
|
86
|
-
|
87
|
-
## Mindmap
|
88
|
-
|
89
|
-
LLM-powered `agent`s and `team`s use `tool`s and their own knowledge to complete the `task` given by the client or the system.
|
90
|
-
|
91
|
-
<p align="center">
|
92
|
-
<img src="https://res.cloudinary.com/dfeirxlea/image/upload/v1733556715/pj_m_home/urwte15at3h0dr8mdlyo.png" alt="mindmap" width="400">
|
93
|
-
</p>
|
94
|
-
|
95
80
|
<hr />
|
96
81
|
|
97
82
|
## Table of Content
|
@@ -99,8 +84,10 @@ LLM-powered `agent`s and `team`s use `tool`s and their own knowledge to complete
|
|
99
84
|
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
|
100
85
|
|
101
86
|
- [Key Features](#key-features)
|
102
|
-
- [
|
103
|
-
|
87
|
+
- [Agent formation](#agent-formation)
|
88
|
+
- [Quick Start](#quick-start)
|
89
|
+
- [Case 1. Single agent network:](#case-1-single-agent-network)
|
90
|
+
- [Return a structured output with a summary in string.](#return-a-structured-output-with-a-summary-in-string)
|
104
91
|
- [Case 2. Form a team to handle multiple tasks:](#case-2-form-a-team-to-handle-multiple-tasks)
|
105
92
|
- [Technologies Used](#technologies-used)
|
106
93
|
- [Project Structure](#project-structure)
|
@@ -119,68 +106,75 @@ LLM-powered `agent`s and `team`s use `tool`s and their own knowledge to complete
|
|
119
106
|
|
120
107
|
## Key Features
|
121
108
|
|
122
|
-
|
109
|
+
Generate mulit-agent systems depending on the complexity of the task, and execute the task with agents of choice.
|
110
|
+
|
111
|
+
Model-agnostic agents can handle RAG tools, tools, callbacks, and knowledge sharing among other agents.
|
123
112
|
|
124
|
-
The `agent` is model agnostic. The default model is set Chat GTP 4o. We ask the client their preference and switch it accordingly using llm variable stored in the `BaseAgent` class.
|
125
113
|
|
126
|
-
|
114
|
+
### Agent formation
|
115
|
+
Depending on the task complexity, agents can make a different formation.
|
127
116
|
|
128
|
-
|
129
|
-
- Professional `agents` handle the analysis `tasks` on each client, customer, and product.
|
117
|
+
You can specify which formation you want them to generate, or let the agent decide if you don’t have a clear plan.
|
130
118
|
|
131
|
-
**2. Messaging Workflow Creation**
|
132
|
-
- Several `teams` receive the analysis and design initial messaging workflow with several layers.
|
133
|
-
- Ask the client for their inputs
|
134
|
-
- Deploy the workflow on the third party tools using `composio`.
|
135
119
|
|
136
|
-
**
|
137
|
-
|
120
|
+
| | **Solo Agent** | **Supervising** | **Network** | **Random** |
|
121
|
+
| :--- | :--- | :--- | :--- | :--- |
|
122
|
+
| **Formation** | <img src="https://res.cloudinary.com/dfeirxlea/image/upload/v1737893140/pj_m_agents/tglrxoiuv7kk7nzvpe1z.jpg" alt="solo" width="200"> | <img src="https://res.cloudinary.com/dfeirxlea/image/upload/v1737893141/pj_m_agents/hxngdvnn5b5qdxo0ayl5.jpg" alt="solo" width="200"> | <img src="https://res.cloudinary.com/dfeirxlea/image/upload/v1737893142/pj_m_agents/kyc6neg8m6keyizszcpi.jpg" alt="solo" width="200"> | <img src="https://res.cloudinary.com/dfeirxlea/image/upload/v1737893139/pj_m_agents/hzpchlcpnpwxwaapu1hr.jpg" alt="solo" width="200"> |
|
123
|
+
| **Usage** | <ul><li>A single agent with tools, knowledge, and memory.</li><li>When self-learning mode is on - it will turn into **Random** formation.</li></ul> | <ul><li>Leader agent gives directions, while sharing its knowledge and memory.</li><li>Subordinates can be solo agents or networks.</li></ul> | <ul><li>Share tasks, knowledge, and memory among network members.</li></ul> | <ul><li>A single agent handles tasks, asking help from other agents without sharing its memory or knowledge.</li></ul> |
|
124
|
+
| **Use case** | An email agent drafts promo message for the given audience. | The leader agent strategizes an outbound campaign plan and assigns components such as media mix or message creation to subordinate agents. | An email agent and social media agent share the product knowledge and deploy multi-channel outbound campaign. | 1. An email agent drafts promo message for the given audience, asking insights on tones from other email agents which oversee other clusters. 2. An agent calls the external agent to deploy the campaign. |
|
138
125
|
|
139
126
|
<hr />
|
140
127
|
|
141
|
-
##
|
128
|
+
## Quick Start
|
129
|
+
|
130
|
+
**Install `versionhq` package:**
|
142
131
|
|
143
|
-
1. Install `versionhq` package:
|
144
132
|
```
|
145
|
-
|
133
|
+
pip install versionhq
|
146
134
|
```
|
147
135
|
|
148
|
-
|
136
|
+
(Python >= 3.13)
|
137
|
+
|
149
138
|
|
139
|
+
### Case 1. Single agent network:
|
150
140
|
|
151
|
-
|
141
|
+
#### Return a structured output with a summary in string.
|
152
142
|
|
153
143
|
```
|
144
|
+
from pydantic import BaseModel
|
154
145
|
from versionhq.agent.model import Agent
|
155
|
-
from versionhq.task.model import Task
|
146
|
+
from versionhq.task.model import Task
|
156
147
|
|
157
|
-
|
158
|
-
|
148
|
+
class CustomOutput(BaseModel):
|
149
|
+
test1: str
|
150
|
+
test2: list[str]
|
151
|
+
|
152
|
+
def dummy_func(message: str, test1: str, test2: list[str]) -> str:
|
153
|
+
return f"{message}: {test1}, {", ".join(test2)}"
|
159
154
|
|
160
|
-
|
161
|
-
|
162
|
-
goal="amazing project goal",
|
163
|
-
skillsets=["skill_1", "skill_2", ],
|
164
|
-
tools=["amazing RAG tool",]
|
165
|
-
llm="llm-of-your-choice"
|
166
|
-
)
|
155
|
+
|
156
|
+
agent = Agent(role="demo", goal="amazing project goal")
|
167
157
|
|
168
158
|
task = Task(
|
169
159
|
description="Amazing task",
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
],
|
174
|
-
callbacks=[my_callback_func]
|
160
|
+
pydantic_custom_output=CustomOutput,
|
161
|
+
callback=dummy_func,
|
162
|
+
callback_kwargs=dict(message="Hi! Here is the result: ")
|
175
163
|
)
|
164
|
+
|
176
165
|
res = task.execute_sync(agent=agent, context="amazing context to consider.")
|
177
|
-
|
166
|
+
print(res)
|
178
167
|
```
|
179
168
|
|
180
|
-
This will return
|
169
|
+
This will return `TaskOutput` that stores a response in string, JSON dict, and Pydantic model: `CustomOutput` formats with a callback result.
|
181
170
|
|
182
171
|
```
|
183
|
-
|
172
|
+
res == TaskOutput(
|
173
|
+
raw="{\\"test1\\": \\"random str\\", \\"test2\\": [\\"item1\\", \\"item2\\"]}",
|
174
|
+
json_dict={"test1": "random str", "test2": ["item1", "item2"]},
|
175
|
+
pydantic=CustomOutput(test1="random str", test2=["item 1", "item 2"]),
|
176
|
+
callback_output="Hi! Here is the result: random str, item 1, item 2",
|
177
|
+
)
|
184
178
|
```
|
185
179
|
|
186
180
|
### Case 2. Form a team to handle multiple tasks:
|
@@ -126,8 +126,6 @@ def test_callback():
|
|
126
126
|
def callback_func(kwargs: Dict[str, Any]):
|
127
127
|
task_id = kwargs.get("task_id", None)
|
128
128
|
added_condition = kwargs.get("added_condition", None)
|
129
|
-
assert task_id is not None
|
130
|
-
assert added_condition is not None
|
131
129
|
return f"Result: {task_id}, condition added: {added_condition}"
|
132
130
|
|
133
131
|
task = Task(
|
@@ -140,10 +138,9 @@ def test_callback():
|
|
140
138
|
)
|
141
139
|
res = task.execute_sync(agent=base_agent)
|
142
140
|
|
143
|
-
assert res
|
144
|
-
assert isinstance(res, TaskOutput)
|
141
|
+
assert res and isinstance(res, TaskOutput)
|
145
142
|
assert res.task_id is task.id
|
146
|
-
assert
|
143
|
+
assert "demo for pytest" in res.callback_output
|
147
144
|
|
148
145
|
|
149
146
|
def test_delegate():
|
@@ -303,6 +300,8 @@ def test_callback():
|
|
303
300
|
|
304
301
|
|
305
302
|
def test_task_with_agent_callback():
|
303
|
+
import litellm
|
304
|
+
|
306
305
|
def dummy_func(*args, **kwargs) -> str:
|
307
306
|
return "Demo func"
|
308
307
|
|
@@ -311,6 +310,7 @@ def test_task_with_agent_callback():
|
|
311
310
|
res = task.execute_sync(agent=agent)
|
312
311
|
|
313
312
|
assert res.raw and res.task_id == task.id
|
313
|
+
assert litellm.callbacks == [dummy_func]
|
314
314
|
|
315
315
|
# task - maxit, loop, rpm
|
316
316
|
|
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
|