versionhq 1.2.1.17__py3-none-any.whl → 1.2.1.19__py3-none-any.whl

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/__init__.py CHANGED
@@ -31,7 +31,7 @@ from versionhq.agent_network.formation import form_agent_network
31
31
  from versionhq.task_graph.draft import workflow
32
32
 
33
33
 
34
- __version__ = "1.2.1.17"
34
+ __version__ = "1.2.1.19"
35
35
  __all__ = [
36
36
  "Agent",
37
37
 
@@ -8,7 +8,7 @@ def process_config(values_to_update: Dict[str, Any], model_class: Type[BaseModel
8
8
  Refer to the Pydantic model class for field validation.
9
9
  """
10
10
 
11
- config = values_to_update.pop("config", {})
11
+ config = values_to_update.pop("config") if "config" in values_to_update else {}
12
12
 
13
13
  if config:
14
14
  for k, v in config.items():
versionhq/agent/model.py CHANGED
@@ -149,94 +149,6 @@ class Agent(BaseModel):
149
149
  return self
150
150
 
151
151
 
152
- def _convert_to_llm_object(self, llm: Any = None) -> LLM:
153
- """
154
- Convert the given value to LLM object.
155
- When `llm` is dict or self.llm_config is not None, add these values to the LLM object after validating them.
156
- """
157
- llm = llm if llm else self.llm if self.llm else DEFAULT_MODEL_NAME
158
-
159
- if not llm:
160
- pass
161
-
162
- match llm:
163
- case LLM():
164
- return self._set_llm_params(llm=llm, config=self.llm_config)
165
-
166
- case str():
167
- llm_obj = LLM(model=llm)
168
- return self._set_llm_params(llm=llm_obj, config=self.llm_config)
169
-
170
- case dict():
171
- model_name = llm.pop("model_name", llm.pop("deployment_name", str(llm)))
172
- llm_obj = LLM(model=model_name if model_name else DEFAULT_MODEL_NAME)
173
- config = llm.update(self.llm_config) if self.llm_config else llm
174
- return self._set_llm_params(llm_obj, config=config)
175
-
176
- case _:
177
- model_name = (getattr(self.llm, "model_name") or getattr(self.llm, "deployment_name") or str(self.llm))
178
- llm_obj = LLM(model=model_name if model_name else DEFAULT_MODEL_NAME)
179
- llm_params = {
180
- "max_tokens": (getattr(llm, "max_tokens") or 3000),
181
- "timeout": getattr(llm, "timeout", self.max_execution_time),
182
- "callbacks": getattr(llm, "callbacks", None),
183
- "temperature": getattr(llm, "temperature", None),
184
- "logprobs": getattr(llm, "logprobs", None),
185
- "api_key": getattr(llm, "api_key", os.environ.get("LITELLM_API_KEY", None)),
186
- "base_url": getattr(llm, "base_url", None),
187
- }
188
- config = llm_params.update(self.llm_config) if self.llm_config else llm_params
189
- return self._set_llm_params(llm=llm_obj, config=config)
190
-
191
-
192
- def _set_llm_params(self, llm: LLM, config: Dict[str, Any] = None) -> LLM:
193
- """
194
- Add valid params to the LLM object.
195
- """
196
-
197
- import litellm
198
- from versionhq.llm.llm_vars import PARAMS
199
-
200
- valid_config = {k: v for k, v in config.items() if v} if config else {}
201
-
202
- if valid_config:
203
- valid_keys = list()
204
- try:
205
- valid_keys = litellm.get_supported_openai_params(model=llm.model, custom_llm_provider=self.endpoint_provider, request_type="chat_completion")
206
- if not valid_keys:
207
- valid_keys = PARAMS.get("common")
208
- except:
209
- valid_keys = PARAMS.get("common")
210
-
211
- valid_keys += PARAMS.get("litellm")
212
-
213
- for key in valid_keys:
214
- if key in valid_config and valid_config[key]:
215
- val = valid_config[key]
216
- if [key == k for k, v in LLM.model_fields.items()]:
217
- setattr(llm, key, val)
218
- else:
219
- llm.other_valid_config.update({ key: val})
220
-
221
-
222
- llm.timeout = self.max_execution_time if llm.timeout is None else llm.timeout
223
- # llm.max_tokens = self.max_tokens if self.max_tokens else llm.max_tokens
224
-
225
- if llm.provider is None:
226
- provider_name = llm.model.split("/")[0]
227
- valid_provider = provider_name if provider_name in PROVIDERS else None
228
- llm.provider = valid_provider
229
-
230
- if self.callbacks:
231
- llm.callbacks = self.callbacks
232
- llm._set_callbacks(llm.callbacks)
233
-
234
- if self.respect_context_window == False:
235
- llm.context_window_size = DEFAULT_CONTEXT_WINDOW_SIZE
236
-
237
- return llm
238
-
239
-
240
152
  @model_validator(mode="after")
241
153
  def set_up_tools(self) -> Self:
242
154
  """
@@ -310,7 +222,7 @@ class Agent(BaseModel):
310
222
 
311
223
  if self.knowledge_sources:
312
224
  try:
313
- collection_name = f"{self.role.replace(' ', '_')}"
225
+ collection_name = f"{self.role.replace(' ', '_')}-{str(self.id)}"
314
226
  knowledge_sources = []
315
227
  docling_fp, txt_fp, json_fp, excel_fp, csv_fp, pdf_fp = [], [], [], [], [], []
316
228
  str_cont = ""
@@ -369,6 +281,94 @@ class Agent(BaseModel):
369
281
  return self
370
282
 
371
283
 
284
+ def _convert_to_llm_object(self, llm: Any = None) -> LLM:
285
+ """
286
+ Convert the given value to LLM object.
287
+ When `llm` is dict or self.llm_config is not None, add these values to the LLM object after validating them.
288
+ """
289
+ llm = llm if llm else self.llm if self.llm else DEFAULT_MODEL_NAME
290
+
291
+ if not llm:
292
+ pass
293
+
294
+ match llm:
295
+ case LLM():
296
+ return self._set_llm_params(llm=llm, config=self.llm_config)
297
+
298
+ case str():
299
+ llm_obj = LLM(model=llm)
300
+ return self._set_llm_params(llm=llm_obj, config=self.llm_config)
301
+
302
+ case dict():
303
+ model_name = llm.pop("model_name", llm.pop("deployment_name", str(llm)))
304
+ llm_obj = LLM(model=model_name if model_name else DEFAULT_MODEL_NAME)
305
+ config = llm.update(self.llm_config) if self.llm_config else llm
306
+ return self._set_llm_params(llm_obj, config=config)
307
+
308
+ case _:
309
+ model_name = (getattr(self.llm, "model_name") or getattr(self.llm, "deployment_name") or str(self.llm))
310
+ llm_obj = LLM(model=model_name if model_name else DEFAULT_MODEL_NAME)
311
+ llm_params = {
312
+ "max_tokens": (getattr(llm, "max_tokens") or 3000),
313
+ "timeout": getattr(llm, "timeout", self.max_execution_time),
314
+ "callbacks": getattr(llm, "callbacks", None),
315
+ "temperature": getattr(llm, "temperature", None),
316
+ "logprobs": getattr(llm, "logprobs", None),
317
+ "api_key": getattr(llm, "api_key", os.environ.get("LITELLM_API_KEY", None)),
318
+ "base_url": getattr(llm, "base_url", None),
319
+ }
320
+ config = llm_params.update(self.llm_config) if self.llm_config else llm_params
321
+ return self._set_llm_params(llm=llm_obj, config=config)
322
+
323
+
324
+ def _set_llm_params(self, llm: LLM, config: Dict[str, Any] = None) -> LLM:
325
+ """
326
+ Add valid params to the LLM object.
327
+ """
328
+
329
+ import litellm
330
+ from versionhq.llm.llm_vars import PARAMS
331
+
332
+ valid_config = {k: v for k, v in config.items() if v} if config else {}
333
+
334
+ if valid_config:
335
+ valid_keys = list()
336
+ try:
337
+ valid_keys = litellm.get_supported_openai_params(model=llm.model, custom_llm_provider=self.endpoint_provider, request_type="chat_completion")
338
+ if not valid_keys:
339
+ valid_keys = PARAMS.get("common")
340
+ except:
341
+ valid_keys = PARAMS.get("common")
342
+
343
+ valid_keys += PARAMS.get("litellm")
344
+
345
+ for key in valid_keys:
346
+ if key in valid_config and valid_config[key]:
347
+ val = valid_config[key]
348
+ if [key == k for k, v in LLM.model_fields.items()]:
349
+ setattr(llm, key, val)
350
+ else:
351
+ llm.other_valid_config.update({ key: val})
352
+
353
+
354
+ llm.timeout = self.max_execution_time if llm.timeout is None else llm.timeout
355
+ # llm.max_tokens = self.max_tokens if self.max_tokens else llm.max_tokens
356
+
357
+ if llm.provider is None:
358
+ provider_name = llm.model.split("/")[0]
359
+ valid_provider = provider_name if provider_name in PROVIDERS else None
360
+ llm.provider = valid_provider
361
+
362
+ if self.callbacks:
363
+ llm.callbacks = self.callbacks
364
+ llm._set_callbacks(llm.callbacks)
365
+
366
+ if self.respect_context_window == False:
367
+ llm.context_window_size = DEFAULT_CONTEXT_WINDOW_SIZE
368
+
369
+ return llm
370
+
371
+
372
372
  def _update_llm(self, llm: Any = None, llm_config: Optional[Dict[str, Any]] = None) -> Self:
373
373
  """
374
374
  Update llm and llm_config of the exsiting agent. (Other conditions will remain the same.)
@@ -599,3 +599,6 @@ class Agent(BaseModel):
599
599
 
600
600
  def __repr__(self):
601
601
  return f"Agent(role={self.role}, goal={self.goal}"
602
+
603
+ def __str__(self):
604
+ return super().__str__()
@@ -9,6 +9,9 @@ from versionhq.agent_network.model import AgentNetwork, Member, Formation
9
9
  from versionhq.agent.inhouse_agents import vhq_formation_planner
10
10
  from versionhq._utils import Logger
11
11
 
12
+ import chromadb
13
+ chromadb.api.client.SharedSystemClient.clear_system_cache()
14
+
12
15
 
13
16
  def form_agent_network(
14
17
  task: str,
@@ -85,7 +88,7 @@ def form_agent_network(
85
88
  members = []
86
89
  leader = str(res.pydantic.leader_agent) if res.pydantic else str(res.json_dict["leader_agent"])
87
90
 
88
- created_agents = [Agent(role=item, goal=item) for item in res.pydantic.agent_roles]
91
+ created_agents = [Agent(role=str(item), goal=str(item)) for item in res.pydantic.agent_roles]
89
92
  created_tasks = []
90
93
 
91
94
  if res.pydantic:
@@ -94,7 +97,7 @@ def form_agent_network(
94
97
  fields = {}
95
98
  for ob in item:
96
99
  try:
97
- field_name = str(ob).lower().replace(" ", "_").replace(":", "_")[0: 10]
100
+ field_name = str(ob).lower().split(":")[0].replace(" ", "_")[0: 16]
98
101
  fields[field_name] = (str, Field(default=None))
99
102
  except:
100
103
  pass
@@ -108,7 +111,7 @@ def form_agent_network(
108
111
  fields = {}
109
112
  for ob in item:
110
113
  try:
111
- field_name = str(ob).lower().replace(" ", "_").replace(":", "_")[0: 10]
114
+ field_name = str(ob).lower().split(":")[0].replace(" ", "_")[0: 16]
112
115
  fields[field_name] = (str, Field(default=None))
113
116
  except:
114
117
  pass
@@ -137,7 +140,7 @@ def form_agent_network(
137
140
  member = Member(agent=created_agents[i], is_manager=is_manager, tasks=[created_tasks[i]])
138
141
  members.append(member)
139
142
 
140
- network_tasks.append(created_tasks[len(created_agents):len(created_tasks)])
143
+ network_tasks.extend(created_tasks[len(created_agents):len(created_tasks)])
141
144
 
142
145
 
143
146
  if _formation == Formation.SUPERVISING and not [member for member in members if member.is_manager]:
@@ -9,6 +9,7 @@ class Knowledge(BaseModel):
9
9
  """
10
10
  Knowlede class for collection of sources and setup for the vector store to query relevant context.
11
11
  """
12
+
12
13
  collection_name: Optional[str] = None
13
14
  sources: List[BaseKnowledgeSource] = Field(default_factory=list)
14
15
  storage: KnowledgeStorage = Field(default_factory=KnowledgeStorage)
@@ -129,16 +129,16 @@ class RAGStorage(BaseRAGStorage):
129
129
  from chromadb.config import Settings
130
130
 
131
131
  self._set_embedder_config()
132
- chroma_client = chromadb.PersistentClient(
133
- path=self.path if self.path else self.storage_file_name,
134
- settings=Settings(allow_reset=self.allow_reset),
135
- )
136
- self.app = chroma_client
137
-
138
132
  try:
133
+ chroma_client = chromadb.PersistentClient(
134
+ path=self.path if self.path else self.storage_file_name,
135
+ settings=Settings(allow_reset=self.allow_reset),
136
+ )
137
+ self.app = chroma_client
139
138
  self.collection = self.app.get_collection(name=self.type, embedding_function=self.embedder_config)
140
139
  except Exception:
141
- self.collection = self.app.create_collection(name=self.type, embedding_function=self.embedder_config)
140
+ if self.app:
141
+ self.collection = self.app.create_collection(name=self.type, embedding_function=self.embedder_config)
142
142
 
143
143
 
144
144
  def _sanitize_role(self, role: str) -> str:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: versionhq
3
- Version: 1.2.1.17
3
+ Version: 1.2.1.19
4
4
  Summary: An agentic orchestration framework for building agent networks that handle task automation.
5
5
  Author-email: Kuriko Iwai <kuriko@versi0n.io>
6
6
  License: MIT License
@@ -1,19 +1,19 @@
1
- versionhq/__init__.py,sha256=nNrMhlfHaW9xgRJhnU9sHM4p9c5dL1n0UeAlVkTxwY4,2892
1
+ versionhq/__init__.py,sha256=JqLyg7MZmFVxc7nYDiyTxXAjX_SdHi_tiFXppndhi9M,2892
2
2
  versionhq/_utils/__init__.py,sha256=dzoZr4cBlh-2QZuPzTdehPUCe9lP1dmRtauD7qTjUaA,158
3
3
  versionhq/_utils/i18n.py,sha256=TwA_PnYfDLA6VqlUDPuybdV9lgi3Frh_ASsb_X8jJo8,1483
4
4
  versionhq/_utils/logger.py,sha256=zgogTwAY-ujDLrdryAKhdtoaNe1nOFajmEN0V8aMR34,3155
5
- versionhq/_utils/process_config.py,sha256=jbPGXK2Kb4iyCugJ3FwRJuU0wL5Trq2x4xFQz2uOyFY,746
5
+ versionhq/_utils/process_config.py,sha256=YTGY_erW335RfceQfzS18YAqq-AAb-iSvKSjN7noD2E,782
6
6
  versionhq/_utils/usage_metrics.py,sha256=NXF18dn5NNvGK7EsQ4AAghpR8ppYOjMx6ABenLLHnmM,1066
7
7
  versionhq/_utils/vars.py,sha256=bZ5Dx_bFKlt3hi4-NNGXqdk7B23If_WaTIju2fiTyPQ,57
8
8
  versionhq/agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
9
  versionhq/agent/inhouse_agents.py,sha256=vupO1viYqVb7sKohIE1zThu6JArhh5JLo5LBeSnh0kM,2534
10
- versionhq/agent/model.py,sha256=ixfYjUY8u6CAFGuaExV8cU1WFlBgNQPxr1UQuxPBSew,25604
10
+ versionhq/agent/model.py,sha256=VHwnckeyaGQ6i2Uf1DaH6z074yHU8jvtmc9bgQEvz2A,25676
11
11
  versionhq/agent/parser.py,sha256=riG0dkdQCxH7uJ0AbdVdg7WvL0BXhUgJht0VtQvxJBc,4082
12
12
  versionhq/agent/rpm_controller.py,sha256=grezIxyBci_lDlwAlgWFRyR5KOocXeOhYkgN02dNFNE,2360
13
13
  versionhq/agent/TEMPLATES/Backstory.py,sha256=IAhGnnt6VUMe3wO6IzeyZPDNu7XE7Uiu3VEXUreOcKs,532
14
14
  versionhq/agent/TEMPLATES/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
15
  versionhq/agent_network/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
- versionhq/agent_network/formation.py,sha256=nGUVX8Ljiq2mQ5BNXm17SP-kuCRCA87CucRy-QB-Zv0,7426
16
+ versionhq/agent_network/formation.py,sha256=7iGw20Dj2sFLAho6yfrdmonAwFcxINBDGFr2RU-Qz3s,7505
17
17
  versionhq/agent_network/model.py,sha256=hjtYIopAN52nStcM6TlV0b6ulRMrmzKH7jIkzNmZHDE,19265
18
18
  versionhq/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
19
  versionhq/clients/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -26,7 +26,7 @@ versionhq/clients/workflow/model.py,sha256=fqmTx8Y6P6i-sK045ENO88GDbf4WYY4hUA26R
26
26
  versionhq/knowledge/__init__.py,sha256=qW7IgssTA4_bFFV9ziOcYRfGjlq1c8bkb-HnfWknpuQ,567
27
27
  versionhq/knowledge/_utils.py,sha256=YWRF8U533cfZes_gZqUvdj-K24MD2ri1R0gjc_aPYyc,402
28
28
  versionhq/knowledge/embedding.py,sha256=KfHc__1THxb5jrg1EMrF-v944RDuIr2hE0l-MtM3Bp0,6826
29
- versionhq/knowledge/model.py,sha256=w29mrJv1kiznCh4P4yJMUQxIuyRw1Sk0XYtBXzCxaG4,1786
29
+ versionhq/knowledge/model.py,sha256=ixH8n5kLtJEp1nPAFYA0piYm-n0nnFDtWFp0r9YEVAs,1787
30
30
  versionhq/knowledge/source.py,sha256=-hEUPtJUHHMx4rUKtiHl19J8xAMw-WVBw34zwa2jZ08,13630
31
31
  versionhq/knowledge/source_docling.py,sha256=mg7bgvKePHn2LlA_XzSFCbS0zOo9xfu_aNOf5cEo6c4,5421
32
32
  versionhq/knowledge/storage.py,sha256=7oxCg3W9mFjYH1YmuH9kFtTbNxquzYFjuUjd_TlsB9E,8170
@@ -40,7 +40,7 @@ versionhq/storage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU
40
40
  versionhq/storage/base.py,sha256=p-Jas0fXQan_qotnRD6seQxrT2lj-uw9-SmHQhdppcs,355
41
41
  versionhq/storage/ltm_sqlite_storage.py,sha256=wdUiuwHfJocdk0UGqyrdU4S5Nae1rgsoRNu3LWmGFcI,3951
42
42
  versionhq/storage/mem0_storage.py,sha256=Nl0GlCNftZGTVxX-9DP5n_pN4QRxeHAhAPakCc0arBg,3819
43
- versionhq/storage/rag_storage.py,sha256=ScWC0vH327vnGw8UGscAOoIfqrq3mhvXT3vEKzHZJts,7441
43
+ versionhq/storage/rag_storage.py,sha256=I8EoXs-2XwhMveIwbUc9Y_tabBrZyRZconZy_-onsXE,7489
44
44
  versionhq/storage/task_output_storage.py,sha256=E1t_Fkt78dPYIOl3MP7LfQ8oGtjlzxBuSNq_8ZXKho8,4573
45
45
  versionhq/storage/utils.py,sha256=ByYXPoEIGJYLUqz-DWjbCAnneNrH1otiYbp12SCILpM,747
46
46
  versionhq/task/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -61,8 +61,8 @@ versionhq/tool/composio_tool_vars.py,sha256=FvBuEXsOQUYnN7RTFxT20kAkiEYkxWKkiVtg
61
61
  versionhq/tool/decorator.py,sha256=C4ZM7Xi2gwtEMaSeRo-geo_g_MAkY77WkSLkAuY0AyI,1205
62
62
  versionhq/tool/model.py,sha256=PO4zNWBZcJhYVur381YL1dy6zqurio2jWjtbxOxZMGI,12194
63
63
  versionhq/tool/tool_handler.py,sha256=2m41K8qo5bGCCbwMFferEjT-XZ-mE9F0mDUOBkgivOI,1416
64
- versionhq-1.2.1.17.dist-info/LICENSE,sha256=cRoGGdM73IiDs6nDWKqPlgSv7aR4n-qBXYnJlCMHCeE,1082
65
- versionhq-1.2.1.17.dist-info/METADATA,sha256=WenkpMZmDc-5XW_iq-8ksRqp3YTvXzAbr5sjEfw09BQ,22033
66
- versionhq-1.2.1.17.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
67
- versionhq-1.2.1.17.dist-info/top_level.txt,sha256=DClQwxDWqIUGeRJkA8vBlgeNsYZs4_nJWMonzFt5Wj0,10
68
- versionhq-1.2.1.17.dist-info/RECORD,,
64
+ versionhq-1.2.1.19.dist-info/LICENSE,sha256=cRoGGdM73IiDs6nDWKqPlgSv7aR4n-qBXYnJlCMHCeE,1082
65
+ versionhq-1.2.1.19.dist-info/METADATA,sha256=W2nc6kI26MsIRDxWejhdjG_jCSYXZ91LcRyc2TgWG2M,22033
66
+ versionhq-1.2.1.19.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
67
+ versionhq-1.2.1.19.dist-info/top_level.txt,sha256=DClQwxDWqIUGeRJkA8vBlgeNsYZs4_nJWMonzFt5Wj0,10
68
+ versionhq-1.2.1.19.dist-info/RECORD,,