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.
Files changed (81) hide show
  1. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/PKG-INFO +51 -57
  2. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/README.md +50 -56
  3. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/pyproject.toml +1 -1
  4. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/__init__.py +1 -1
  5. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq.egg-info/PKG-INFO +51 -57
  6. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/tests/task/task_test.py +5 -5
  7. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/.github/workflows/publish.yml +0 -0
  8. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/.github/workflows/publish_testpypi.yml +0 -0
  9. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/.github/workflows/run_tests.yml +0 -0
  10. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/.github/workflows/security_check.yml +0 -0
  11. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/.gitignore +0 -0
  12. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/.pre-commit-config.yaml +0 -0
  13. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/.python-version +0 -0
  14. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/LICENSE +0 -0
  15. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/SECURITY.md +0 -0
  16. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/db/preprocess.py +0 -0
  17. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/requirements-dev.txt +0 -0
  18. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/requirements.txt +0 -0
  19. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/runtime.txt +0 -0
  20. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/setup.cfg +0 -0
  21. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/_utils/__init__.py +0 -0
  22. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/_utils/i18n.py +0 -0
  23. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/_utils/logger.py +0 -0
  24. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/_utils/process_config.py +0 -0
  25. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/_utils/rpm_controller.py +0 -0
  26. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/_utils/usage_metrics.py +0 -0
  27. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/agent/TEMPLATES/Backstory.py +0 -0
  28. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/agent/TEMPLATES/__init__.py +0 -0
  29. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/agent/__init__.py +0 -0
  30. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/agent/model.py +0 -0
  31. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/agent/parser.py +0 -0
  32. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/cli/__init__.py +0 -0
  33. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/clients/__init__.py +0 -0
  34. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/clients/customer/__init__.py +0 -0
  35. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/clients/customer/model.py +0 -0
  36. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/clients/product/__init__.py +0 -0
  37. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/clients/product/model.py +0 -0
  38. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/clients/workflow/__init__.py +0 -0
  39. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/clients/workflow/model.py +0 -0
  40. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/llm/__init__.py +0 -0
  41. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/llm/llm_vars.py +0 -0
  42. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/llm/model.py +0 -0
  43. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/storage/__init__.py +0 -0
  44. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/storage/task_output_storage.py +0 -0
  45. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/task/__init__.py +0 -0
  46. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/task/formatter.py +0 -0
  47. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/task/log_handler.py +0 -0
  48. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/task/model.py +0 -0
  49. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/task/structured_response.py +0 -0
  50. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/team/__init__.py +0 -0
  51. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/team/model.py +0 -0
  52. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/team/team_planner.py +0 -0
  53. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/tool/__init__.py +0 -0
  54. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/tool/cache_handler.py +0 -0
  55. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/tool/composio_tool.py +0 -0
  56. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/tool/composio_tool_vars.py +0 -0
  57. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/tool/decorator.py +0 -0
  58. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/tool/model.py +0 -0
  59. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq/tool/tool_handler.py +0 -0
  60. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq.egg-info/SOURCES.txt +0 -0
  61. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq.egg-info/dependency_links.txt +0 -0
  62. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq.egg-info/requires.txt +0 -0
  63. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/src/versionhq.egg-info/top_level.txt +0 -0
  64. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/tests/__init__.py +0 -0
  65. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/tests/agent/__init__.py +0 -0
  66. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/tests/agent/agent_test.py +0 -0
  67. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/tests/cli/__init__.py +0 -0
  68. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/tests/clients/customer_test.py +0 -0
  69. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/tests/clients/product_test.py +0 -0
  70. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/tests/clients/workflow_test.py +0 -0
  71. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/tests/conftest.py +0 -0
  72. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/tests/llm/__init__.py +0 -0
  73. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/tests/llm/llm_test.py +0 -0
  74. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/tests/task/__init__.py +0 -0
  75. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/tests/team/Prompts/Demo_test.py +0 -0
  76. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/tests/team/__init__.py +0 -0
  77. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/tests/team/team_test.py +0 -0
  78. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/tests/tool/__init__.py +0 -0
  79. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/tests/tool/composio_test.py +0 -0
  80. {versionhq-1.1.10.5 → versionhq-1.1.10.7}/tests/tool/tool_test.py +0 -0
  81. {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.5
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
  ![pyenv ver](https://img.shields.io/badge/pyenv-2.5.0-orange)
67
67
 
68
68
 
69
- An LLM orchestration frameworks for multi-agent systems with RAG to autopilot outbound workflows.
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
- - [Doc](https://chief-oxygen-8a2.notion.site/Documentation-17e923685cf98001a5fad5c4b2acd79b?pvs=4)
81
- <!-- - [Github (Test client app)](https://github.com/versionHQ/test-client-app) -->
82
- - [Use case](https://versi0n.io/): Client web app for the outbound messaging automation
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
- - [Usage](#usage)
103
- - [Case 1. Build an AI agent on LLM of your choice and execute a task:](#case-1-build-an-ai-agent-on-llm-of-your-choice-and-execute-a-task)
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
- A mulit-agent systems with Rag that tailors messaging workflow, predicts its performance, and deploys it on third-party tools.
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
- Multiple `agents` can form a `team` to complete complex tasks together.
114
+ ### Agent formation
115
+ Depending on the task complexity, agents can make a different formation.
127
116
 
128
- **1. Analysis**
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
- **3. Autopiloting**
137
- - Responsible `agents` or `teams` autopilot executing and refining the messaging workflow.
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
- ## Usage
128
+ ## Quick Start
129
+
130
+ **Install `versionhq` package:**
142
131
 
143
- 1. Install `versionhq` package:
144
132
  ```
145
- uv pip install versionhq
133
+ pip install versionhq
146
134
  ```
147
135
 
148
- 2. You can use the `versionhq` module in your Python app.
136
+ (Python >= 3.13)
137
+
149
138
 
139
+ ### Case 1. Single agent network:
150
140
 
151
- ### Case 1. Build an AI agent on LLM of your choice and execute a task:
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, ResponseField
146
+ from versionhq.task.model import Task
156
147
 
157
- def my_callback_func():
158
- """callback func"""
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
- agent = Agent(
161
- role="demo",
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
- response_fields=[
171
- ResponseField(title="test1", data_type=str, required=True),
172
- ResponseField(title="test2", data_type=list, items=str, required=True),
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
- return res.to_dict()
166
+ print(res)
178
167
  ```
179
168
 
180
- This will return a dictionary with keys defined in the `ResponseField`.
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
- { test1: "answer1", "test2": ["answer2-1", "answer2-2", "answer2-3",] }
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
  ![pyenv ver](https://img.shields.io/badge/pyenv-2.5.0-orange)
8
8
 
9
9
 
10
- An LLM orchestration frameworks for multi-agent systems with RAG to autopilot outbound workflows.
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
- - [Doc](https://chief-oxygen-8a2.notion.site/Documentation-17e923685cf98001a5fad5c4b2acd79b?pvs=4)
22
- <!-- - [Github (Test client app)](https://github.com/versionHQ/test-client-app) -->
23
- - [Use case](https://versi0n.io/): Client web app for the outbound messaging automation
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
- - [Usage](#usage)
44
- - [Case 1. Build an AI agent on LLM of your choice and execute a task:](#case-1-build-an-ai-agent-on-llm-of-your-choice-and-execute-a-task)
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
- A mulit-agent systems with Rag that tailors messaging workflow, predicts its performance, and deploys it on third-party tools.
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
- Multiple `agents` can form a `team` to complete complex tasks together.
55
+ ### Agent formation
56
+ Depending on the task complexity, agents can make a different formation.
68
57
 
69
- **1. Analysis**
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
- **3. Autopiloting**
78
- - Responsible `agents` or `teams` autopilot executing and refining the messaging workflow.
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
- ## Usage
69
+ ## Quick Start
70
+
71
+ **Install `versionhq` package:**
83
72
 
84
- 1. Install `versionhq` package:
85
73
  ```
86
- uv pip install versionhq
74
+ pip install versionhq
87
75
  ```
88
76
 
89
- 2. You can use the `versionhq` module in your Python app.
77
+ (Python >= 3.13)
78
+
90
79
 
80
+ ### Case 1. Single agent network:
91
81
 
92
- ### Case 1. Build an AI agent on LLM of your choice and execute a task:
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, ResponseField
87
+ from versionhq.task.model import Task
97
88
 
98
- def my_callback_func():
99
- """callback func"""
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
- agent = Agent(
102
- role="demo",
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
- response_fields=[
112
- ResponseField(title="test1", data_type=str, required=True),
113
- ResponseField(title="test2", data_type=list, items=str, required=True),
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
- return res.to_dict()
107
+ print(res)
119
108
  ```
120
109
 
121
- This will return a dictionary with keys defined in the `ResponseField`.
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
- { test1: "answer1", "test2": ["answer2-1", "answer2-2", "answer2-3",] }
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.5"
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"
@@ -18,7 +18,7 @@ from versionhq.tool.model import Tool
18
18
  from versionhq.tool.composio_tool import ComposioHandler
19
19
 
20
20
 
21
- __version__ = "1.1.10.5"
21
+ __version__ = "1.1.10.7"
22
22
  __all__ = [
23
23
  "Agent",
24
24
  "Customer",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: versionhq
3
- Version: 1.1.10.5
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
  ![pyenv ver](https://img.shields.io/badge/pyenv-2.5.0-orange)
67
67
 
68
68
 
69
- An LLM orchestration frameworks for multi-agent systems with RAG to autopilot outbound workflows.
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
- - [Doc](https://chief-oxygen-8a2.notion.site/Documentation-17e923685cf98001a5fad5c4b2acd79b?pvs=4)
81
- <!-- - [Github (Test client app)](https://github.com/versionHQ/test-client-app) -->
82
- - [Use case](https://versi0n.io/): Client web app for the outbound messaging automation
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
- - [Usage](#usage)
103
- - [Case 1. Build an AI agent on LLM of your choice and execute a task:](#case-1-build-an-ai-agent-on-llm-of-your-choice-and-execute-a-task)
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
- A mulit-agent systems with Rag that tailors messaging workflow, predicts its performance, and deploys it on third-party tools.
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
- Multiple `agents` can form a `team` to complete complex tasks together.
114
+ ### Agent formation
115
+ Depending on the task complexity, agents can make a different formation.
127
116
 
128
- **1. Analysis**
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
- **3. Autopiloting**
137
- - Responsible `agents` or `teams` autopilot executing and refining the messaging workflow.
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
- ## Usage
128
+ ## Quick Start
129
+
130
+ **Install `versionhq` package:**
142
131
 
143
- 1. Install `versionhq` package:
144
132
  ```
145
- uv pip install versionhq
133
+ pip install versionhq
146
134
  ```
147
135
 
148
- 2. You can use the `versionhq` module in your Python app.
136
+ (Python >= 3.13)
137
+
149
138
 
139
+ ### Case 1. Single agent network:
150
140
 
151
- ### Case 1. Build an AI agent on LLM of your choice and execute a task:
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, ResponseField
146
+ from versionhq.task.model import Task
156
147
 
157
- def my_callback_func():
158
- """callback func"""
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
- agent = Agent(
161
- role="demo",
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
- response_fields=[
171
- ResponseField(title="test1", data_type=str, required=True),
172
- ResponseField(title="test2", data_type=list, items=str, required=True),
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
- return res.to_dict()
166
+ print(res)
178
167
  ```
179
168
 
180
- This will return a dictionary with keys defined in the `ResponseField`.
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
- { test1: "answer1", "test2": ["answer2-1", "answer2-2", "answer2-3",] }
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 is not None
144
- assert isinstance(res, TaskOutput)
141
+ assert res and isinstance(res, TaskOutput)
145
142
  assert res.task_id is task.id
146
- assert res.raw is not None
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