versionhq 1.1.9.4__py3-none-any.whl → 1.1.9.9__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
@@ -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.9.4"
21
+ __version__ = "1.1.9.9"
22
22
  __all__ = [
23
23
  "Agent",
24
24
  "Customer",
versionhq/agent/model.py CHANGED
@@ -322,7 +322,7 @@ class Agent(BaseModel):
322
322
  When encountering errors, we try the task execution up to `self.max_retry_limit` times.
323
323
  """
324
324
 
325
- task_execution_counter = 0
325
+ task_execution_counter, raw_response = 0, None
326
326
 
327
327
  messages = []
328
328
  messages.append({"role": "user", "content": prompts}) #! REFINEME
@@ -331,31 +331,28 @@ class Agent(BaseModel):
331
331
 
332
332
  callbacks = kwargs.get("callbacks", None)
333
333
 
334
- response = self.llm.call(
335
- messages=messages,
336
- output_formats=output_formats,
337
- field_list=response_fields,
338
- callbacks=callbacks,
334
+ raw_response = self.llm.call(
335
+ messages=messages, output_formats=output_formats, field_list=response_fields, callbacks=callbacks
339
336
  )
340
337
  task_execution_counter += 1
341
- self._logger.log(level="info", message=f"Agent's first response: {response}", color="blue")
338
+ self._logger.log(level="info", message=f"Agent's first response in {type(raw_response).__name__}: {raw_response}", color="blue")
342
339
 
343
- if (response is None or response == "") and task_execution_counter < self.max_retry_limit:
340
+ if (raw_response is None or raw_response == "") and task_execution_counter < self.max_retry_limit:
344
341
  while task_execution_counter <= self.max_retry_limit:
345
- response = self.llm.call(
342
+ raw_response = self.llm.call(
346
343
  messages=messages,
347
344
  output_formats=output_formats,
348
345
  field_list=response_fields,
349
346
  callbacks=callbacks,
350
347
  )
351
348
  task_execution_counter += 1
352
- self._logger.log(level="info", message=f"Agent's next response: {response}", color="blue")
349
+ self._logger.log(level="info", message=f"Agent's next response in {type(raw_response).__name__}: {raw_response}", color="blue")
353
350
 
354
- elif response is None or response == "":
351
+ elif raw_response is None or raw_response == "":
355
352
  self._logger.log(level="error", message="Received None or empty response from the model", color="red")
356
353
  raise ValueError("Invalid response from LLM call - None or empty.")
357
354
 
358
- return {"output": response.output if hasattr(response, "output") else response}
355
+ return raw_response
359
356
 
360
357
 
361
358
  def execute_task(self, task, context: Optional[str] = None) -> str:
@@ -392,31 +389,25 @@ class Agent(BaseModel):
392
389
  if task.take_tool_res_as_final:
393
390
  return tool_results
394
391
 
395
-
396
-
397
392
  # if self.team and self.team._train:
398
393
  # task_prompt = self._training_handler(task_prompt=task_prompt)
399
394
  # else:
400
395
  # task_prompt = self._use_trained_data(task_prompt=task_prompt)
401
396
 
402
397
  try:
403
- result = self.invoke(
398
+ raw_response = self.invoke(
404
399
  prompts=task_prompt,
405
400
  output_formats=task.expected_output_formats,
406
401
  response_fields=task.output_field_list,
407
- )["output"]
402
+ )
408
403
 
409
404
  except Exception as e:
410
405
  self._times_executed += 1
411
406
  if self._times_executed > self.max_retry_limit:
412
407
  raise e
413
- result = self.execute_task(task, context)
408
+ raw_response = self.execute_task(task, context)
414
409
 
415
410
  if self.max_rpm and self._rpm_controller:
416
411
  self._rpm_controller.stop_rpm_counter()
417
412
 
418
- # for tool_result in self.tools_results:
419
- # if tool_result.get("result_as_answer", False):
420
- # result = tool_result["result"]
421
-
422
- return result
413
+ return raw_response
@@ -2,4 +2,9 @@ from enum import Enum
2
2
 
3
3
 
4
4
  class Status(str, Enum):
5
- ON_WORKFLOW = "on_workflow"
5
+ NOT_ASSIGNED = 0
6
+ READY_TO_DEPLOY = 1
7
+ ACTIVE_ON_WORKFLOW = 2
8
+ INACTIVE_ON_WORKFLOW = 3 # inactive customer
9
+ EXIT_WITH_CONVERSION = 4
10
+ SUSPENDED = 5
@@ -10,14 +10,32 @@ from versionhq.clients.customer import Status
10
10
 
11
11
  class BaseCustomer(ABC, BaseModel):
12
12
  """
13
- Abstract base class for the base customer
13
+ Abstract base class for the base customer storing current status on the workflow and deployment method.
14
+ """
15
+ status: Status = Field(default=Status.NOT_ASSIGNED)
16
+
17
+ @abstractmethod
18
+ def _deploy(self, *args, **kwargs) -> Any:
19
+ """Any method to deploy targeting the customer"""
20
+
21
+
22
+ def deploy(self, *args, **kwargs) -> Any:
23
+ if self.status is Status.READY_TO_DEPLOY:
24
+ return self._deploy(self, **args, **kwargs)
25
+
26
+
27
+
28
+ class Customer(BaseCustomer):
29
+ """
30
+ Customer class to store customer info and handle deployment methods.
14
31
  """
15
32
 
16
33
  id: UUID4 = Field(default_factory=uuid.uuid4, frozen=True)
17
34
  name: Optional[str] = Field(default=None, description="customer's name if any")
18
35
  products: Optional[List[Product]] = Field(default=list, description="store products that the customer is associated with")
19
36
  analysis: str = Field(default=None, description="store the latest analysis results on the customer")
20
- status: str = Field(default=Status.ON_WORKFLOW)
37
+ function: Optional[Callable] = Field(default=None, descripition="store deploy function")
38
+ config: Optional[Dict[str, Any]] = Field(default=None, description="config to the function")
21
39
 
22
40
 
23
41
  @field_validator("id", mode="before")
@@ -27,11 +45,10 @@ class BaseCustomer(ABC, BaseModel):
27
45
  raise PydanticCustomError("may_not_set_field", "This field is not to be set by the user.", {})
28
46
 
29
47
 
30
- def customer_to(self) -> List[ProductProvider]:
48
+ def fetch_product_providers(self) -> List[ProductProvider] | None:
31
49
  """
32
50
  Return list of ProductProvider if the customer has `product_list`
33
51
  """
34
-
35
52
  res = []
36
53
  if self.products:
37
54
  for item in self.products:
@@ -39,15 +56,14 @@ class BaseCustomer(ABC, BaseModel):
39
56
  res.appned(item.provider)
40
57
  return res
41
58
 
59
+ def _deploy(self, *args, **kwargs):
60
+ return self.deploy(self, *args, **kwargs)
42
61
 
43
- @abstractmethod
44
- def _deploy(self, *args, **kwargs) -> Any:
45
- """Any method to deploy targeting the customer"""
46
62
 
63
+ def deploy(self, *args, **kwargs):
64
+ self.status = Status.ACTIVE_ON_WORKFLOW
47
65
 
48
- class Customer(BaseCustomer):
49
- id: UUID4 = Field(default_factory=uuid.uuid4, frozen=True)
50
- name: Optional[str] = Field(default=None, description="customer's name if any")
51
- products: Optional[List[Product]] = Field(default=list, description="store products that the customer is associated with")
52
- analysis: str = Field(default=None, description="store the latest analysis results on the customer")
53
- status: str = Field(default=Status.ON_WORKFLOW)
66
+ if self.function:
67
+ return self.function(**self.config)
68
+
69
+ return super().deploy(*args, **kwargs)
@@ -16,7 +16,7 @@ class ProductProvider(ABC, BaseModel):
16
16
  id: UUID4 = Field(default_factory=uuid.uuid4, frozen=True)
17
17
  name: Optional[str] = Field(default=None)
18
18
  region: Optional[str] = Field(default=None, description="region of client's main business operation")
19
- data_pipelines: Optional[List[ComposioAppName | str]] = Field(default_factory=list)
19
+ data_pipelines: Optional[List[ComposioAppName | str]] = Field(default=None)
20
20
  destination_services: Optional[List[ComposioAppName | str]] = Field(default=None)
21
21
 
22
22
  @field_validator("id", mode="before")
@@ -26,12 +26,41 @@ class ProductProvider(ABC, BaseModel):
26
26
  raise PydanticCustomError("may_not_set_field", "This field is not to be set by the user.", {})
27
27
 
28
28
 
29
+ @model_validator(mode="after")
30
+ def set_up_destinations(self):
31
+ """
32
+ Set up the destination services and data pipeines using ComposioAppName class.
33
+ """
34
+ if self.destination_services is not None:
35
+ results = []
36
+ for item in self.destination_services:
37
+ if isinstance(item, ComposioAppName):
38
+ results.append(item)
39
+ elif isinstance(item, str) and item in ComposioAppName:
40
+ results.append(ComposioAppName(item))
41
+ else:
42
+ results.append(item)
43
+ self.destination_services = results
44
+
45
+ if self.data_pipelines is not None:
46
+ results = []
47
+ for item in self.data_pipelines:
48
+ if isinstance(item, ComposioAppName):
49
+ results.append(item)
50
+ elif isinstance(item, str) and item in ComposioAppName:
51
+ results.append(ComposioAppName(item))
52
+ else:
53
+ results.append(item)
54
+ self.data_pipelines = results
55
+
56
+ return self
57
+
58
+
29
59
 
30
60
  class Product(BaseModel):
31
61
  """
32
- Store the product information necessary to the outbound effrots and connect it to the `ProductProvider` instance.
62
+ A class to store product information used to create outbound
33
63
  """
34
-
35
64
  id: UUID4 = Field(default_factory=uuid.uuid4, frozen=True)
36
65
  name: Optional[str] = Field(default=None, description="product name")
37
66
  description: Optional[str] = Field(
@@ -44,6 +73,7 @@ class Product(BaseModel):
44
73
  usp: Optional[str] = Field(default=None)
45
74
  landing_url: Optional[str] = Field(default=None, description="marketing url of the product if any")
46
75
  cohort_timeframe: Optional[int] = Field(default=30, description="ideal cohort timeframe of the product in days")
76
+ notes: Optional[str] = Field(default=None, description="any notes from the client to consider. cascade to the agent")
47
77
 
48
78
 
49
79
  @field_validator("id", mode="before")
@@ -51,3 +81,10 @@ class Product(BaseModel):
51
81
  def _deny_user_set_id(cls, v: Optional[UUID4]) -> None:
52
82
  if v:
53
83
  raise PydanticCustomError("may_not_set_field", "This field is not to be set by the user.", {})
84
+
85
+
86
+ @field_validator("cohort_timeframe", mode="before")
87
+ @classmethod
88
+ def _deny_non_int_input(cls, v: Optional[UUID4]) -> None:
89
+ if not isinstance(v, int):
90
+ raise PydanticCustomError("invalid_input", "This field only accepts inputs in integer.", {})
@@ -121,15 +121,21 @@ class MessagingWorkflow(ABC, BaseModel):
121
121
  @model_validator(mode="after")
122
122
  def set_up_destination(self):
123
123
  """
124
- Set up the destination service when self.destination is None.
125
- Prioritize customer's destination to the product provider's destination list.
124
+ Set up the destination service using ComposioAppName class.
126
125
  """
127
- if self.destination is None:
126
+ if isinstance(self.destination, ComposioAppName):
127
+ pass
128
+
129
+ elif isinstance(self.destination, str) and self.destination in ComposioAppName:
130
+ self.destination = ComposioAppName(self.destination)
131
+
132
+ elif self.destination is None:
128
133
  # if self.customer is not None:
129
134
  # self.destination = self.customer.on
130
135
 
131
136
  if self.product.provider is not None and self.product.provider.destination_services:
132
- self.destination = self.product.provider.destination_services[0]
137
+ applied_service = self.product.provider.destination_services[0]
138
+ self.destination = ComposioAppName(applied_service) if applied_service in ComposioAppName else applied_service
133
139
 
134
140
  return self
135
141
 
versionhq/task/model.py CHANGED
@@ -78,20 +78,11 @@ class TaskOutput(BaseModel):
78
78
  return str(self.pydantic) if self.pydantic else str(self.json_dict) if self.json_dict else self.raw
79
79
 
80
80
 
81
- def to_dict(self) -> Dict[str, Any]:
81
+ def to_dict(self) -> Dict[str, Any] | None:
82
82
  """
83
83
  Convert pydantic / raw output into dict and return the dict.
84
- When we only have `raw` output, return `{ output: raw }` to avoid an error
85
84
  """
86
-
87
- output_dict = {}
88
- if self.json_dict:
89
- output_dict.update(self.json_dict)
90
- elif self.pydantic:
91
- output_dict.update(self.pydantic.model_dump())
92
- else:
93
- output_dict.upate({ "output": self.raw })
94
- return output_dict
85
+ return self.json_dict if self.json_dict is not None else self.pydantic.model_dump() if self.pydantic else None
95
86
 
96
87
 
97
88
  def context_prompting(self) -> str:
@@ -245,36 +236,28 @@ class Task(BaseModel):
245
236
  return "\n".join(task_slices)
246
237
 
247
238
 
248
- def create_json_output(self, raw_result: Any) -> Optional[Dict[str, Any]]:
239
+ def _create_json_output(self, raw_result: str) -> Dict[str, Any]:
249
240
  """
250
241
  Create json (dict) output from the raw result.
251
242
  """
243
+ import ast
252
244
 
253
- output_json_dict: Optional[Dict[str, Any]] = None
245
+ output_json_dict: Dict[str, Any] = dict()
254
246
 
255
- if isinstance(raw_result, BaseModel):
256
- output_json_dict = raw_result.model_dump()
247
+ try:
248
+ r = json.dumps(eval(str(raw_result)))
249
+ output_json_dict = json.loads(r)
257
250
 
258
- elif isinstance(raw_result, dict):
259
- output_json_dict = raw_result
251
+ if isinstance(output_json_dict, str):
252
+ output_json_dict = ast.literal_eval(r)
260
253
 
261
- elif isinstance(raw_result, str):
262
- try:
263
- output_json_dict = json.loads(raw_result)
264
- except json.JSONDecodeError:
265
- try:
266
- output_json_dict = eval(raw_result)
267
- except:
268
- try:
269
- import ast
270
- output_json_dict = ast.literal_eval(raw_result)
271
- except:
272
- output_json_dict = { "output": raw_result }
254
+ except:
255
+ output_json_dict = { "output": raw_result }
273
256
 
274
257
  return output_json_dict
275
258
 
276
259
 
277
- def create_pydantic_output(self, output_json_dict: Dict[str, Any], raw_result: Any = None) -> Optional[Any]:
260
+ def _create_pydantic_output(self, output_json_dict: Dict[str, Any], raw_result: Any = None) -> Optional[Any]:
278
261
  """
279
262
  Create pydantic output from the `raw` result.
280
263
  """
@@ -379,18 +362,18 @@ class Task(BaseModel):
379
362
  agent = agent_to_delegate
380
363
  self.delegations += 1
381
364
 
382
- if self.take_tool_res_as_final is True:
365
+ if self.take_tool_res_as_final == True:
383
366
  output = agent.execute_task(task=self, context=context)
384
367
  task_output = TaskOutput(task_id=self.id, tool_output=output)
385
368
 
386
369
  else:
387
370
  output_raw, output_json_dict, output_pydantic = agent.execute_task(task=self, context=context), None, None
388
371
 
389
- if self.expected_output_json:
390
- output_json_dict = self.create_json_output(raw_result=output_raw)
372
+ if self.expected_output_json == True:
373
+ output_json_dict = self._create_json_output(raw_result=output_raw)
391
374
 
392
- if self.expected_output_pydantic:
393
- output_pydantic = self.create_pydantic_output(output_json_dict=output_json_dict)
375
+ if self.expected_output_pydantic == True:
376
+ output_pydantic = self._create_pydantic_output(output_json_dict=output_json_dict)
394
377
 
395
378
  task_output = TaskOutput(
396
379
  task_id=self.id,
@@ -441,7 +424,7 @@ class Task(BaseModel):
441
424
  output_formats_to_follow[item.title] = f"<Return your answer in {item.type.__name__}>"
442
425
 
443
426
  output_prompt = f"""
444
- Your outputs MUST adhere to the following format and should NOT include any irrelevant elements:
427
+ Output only valid JSON conforming to the specified format. Use double quotes for keys and values:
445
428
  {output_formats_to_follow}
446
429
  """
447
430
  return output_prompt
versionhq/tool/model.py CHANGED
@@ -174,40 +174,6 @@ class Tool(BaseTool):
174
174
  return f"Tool Name: {self.name}\nTool Arguments: {args_schema}\nGoal: {self.goal}"
175
175
 
176
176
 
177
-
178
- # @classmethod
179
- # def from_composio(
180
- # cls, func: Callable = None, tool_name: str = "Composio tool"
181
- # ) -> "Tool":
182
- # """
183
- # Create Tool from the composio tool, ensuring the Tool instance has a func to be executed.
184
- # Refer to the `args_schema` from the func signature if any. Else, create an `args_schema`.
185
- # """
186
-
187
- # if not func:
188
- # raise ValueError("Params must have a callable 'function' attribute.")
189
-
190
- # # args_schema = getattr(tool, "args_schema", None)
191
- # args_fields = {}
192
- # func_signature = signature(func)
193
- # annotations = func_signature.parameters
194
- # for name, param in annotations.items():
195
- # if name != "self":
196
- # param_annotation = (
197
- # param.annotation if param.annotation != param.empty else Any
198
- # )
199
- # field_info = Field(default=..., description="")
200
- # args_fields[name] = (param_annotation, field_info)
201
-
202
- # args_schema = (
203
- # create_model(f"{tool_name}Input", **args_fields)
204
- # if args_fields
205
- # else create_model(f"{tool_name}Input", __base__=BaseModel)
206
- # )
207
-
208
- # return cls(name=tool_name, func=func, args_schema=args_schema)
209
-
210
-
211
177
  class ToolSet(BaseModel):
212
178
  """
213
179
  Store the tool called and any kwargs used.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: versionhq
3
- Version: 1.1.9.4
3
+ Version: 1.1.9.9
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
@@ -1,4 +1,4 @@
1
- versionhq/__init__.py,sha256=7fymmc9s7-Nxwq3vDvY5GA_EYpvpPWR5w9w5Vsv8THs,950
1
+ versionhq/__init__.py,sha256=ZGRS2YP5ul7Db6d_WTYEKb6dBigL2P8t7iodPVUipQ0,950
2
2
  versionhq/_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  versionhq/_utils/cache_handler.py,sha256=3-lw_5ZMWC8hnPAkSQULJ2V1FvZZ-wg9mQaUJGSOjI8,403
4
4
  versionhq/_utils/i18n.py,sha256=TwA_PnYfDLA6VqlUDPuybdV9lgi3Frh_ASsb_X8jJo8,1483
@@ -7,18 +7,18 @@ versionhq/_utils/process_config.py,sha256=UqoWD5IR4VLxEDGxIyVUylw_ppXwk8Wx1ynVuD
7
7
  versionhq/_utils/rpm_controller.py,sha256=dUgFd6JtdjiLLTRmrjsBHdTaLn73XFuKpLbJh7thf2A,2289
8
8
  versionhq/_utils/usage_metrics.py,sha256=hhq1OCW8Z4V93vwW2O2j528EyjOlF8wlTsX5IL-7asA,1106
9
9
  versionhq/agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
- versionhq/agent/model.py,sha256=c5beL2iGx7Zpxla59JJPQPUjpBa3hJdeVqspYGsHTm8,18731
10
+ versionhq/agent/model.py,sha256=LFkD00zIeIfntwvebomYX6zTqIMQVkQYFEKjxOtTaPQ,18598
11
11
  versionhq/agent/parser.py,sha256=Z_swUPO3piJQuYU8oVYwXWeR2zjmNb4PxbXZeR-GlIg,4694
12
12
  versionhq/agent/TEMPLATES/Backstory.py,sha256=cdngBx1GEv7nroR46FEhnysnBJ9mEVL763_9np6Skkc,395
13
13
  versionhq/agent/TEMPLATES/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
14
  versionhq/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
15
  versionhq/clients/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
- versionhq/clients/customer/__init__.py,sha256=rVcesoCFFl46job8Ppf8tRpEWy8A4ArRElfVjWykcRo,81
17
- versionhq/clients/customer/model.py,sha256=Dl2dzo2FUdzqPEgoymeImM18InOmIhytmxAkjTiK_M8,2119
16
+ versionhq/clients/customer/__init__.py,sha256=-YXh1FQfvpfLacK8SUC7bD7Wx_eIEi4yrkCC_cUasFg,217
17
+ versionhq/clients/customer/model.py,sha256=_AtaVVMm9MgCwrQ-HTRQ2oXUMKrSCEfZwE2JdRz3xTw,2508
18
18
  versionhq/clients/product/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
- versionhq/clients/product/model.py,sha256=N8_Oe7W20yYQuJ66owbLD_zNyiSSrYA7i7WI50UuKyQ,2228
19
+ versionhq/clients/product/model.py,sha256=c_watpIg-FzpJ2tMml6M1EbAckgGZOqTSc_GZ3Kb_r4,3676
20
20
  versionhq/clients/workflow/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
- versionhq/clients/workflow/model.py,sha256=SVpYXiq-YQ8Col9iOazKgEqs0VkR4hhSBEOa-myKQVU,5701
21
+ versionhq/clients/workflow/model.py,sha256=p7VFnLPWwb5b_rO9guvsz9JO4Ki2WsPm-lkHWBSsN0M,5971
22
22
  versionhq/llm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
23
  versionhq/llm/llm_vars.py,sha256=YZoXqFBW7XpclUZ14_AAz7WOjoyCXnGcI959GSpX2q0,5343
24
24
  versionhq/llm/model.py,sha256=mXzSuf1s6MebGT7_yqgNppde0NIlAF8bjIXAp2MZ9Uw,8247
@@ -27,17 +27,17 @@ versionhq/storage/task_output_storage.py,sha256=xoBJHeqUyQt6iJoR1WQTghP-fyxXL66q
27
27
  versionhq/task/__init__.py,sha256=g4mCATnn1mUXxsfQ5p6IpPawr8O421wVIT8kMKEcxQw,180
28
28
  versionhq/task/formatter.py,sha256=N8Kmk9vtrMtBdgJ8J7RmlKNMdZWSmV8O1bDexmCWgU0,643
29
29
  versionhq/task/log_handler.py,sha256=KJRrcNZgFSKhlNzvtYFnvtp6xukaF1s7ifX9u4zWrN8,1683
30
- versionhq/task/model.py,sha256=EbgYHLNq8l1zfRDnF-yEcuSZ0aNvzbRmHYgfVyJq84c,19910
30
+ versionhq/task/model.py,sha256=Y-OYJO3FWFqJ6MhHMJIaqU9sDG5BvQ7pyvHG6nwTB5c,19305
31
31
  versionhq/team/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
32
  versionhq/team/model.py,sha256=E52OUVzUtvR--51SFRJos3JdYKri1t2jbvvzoOvShQc,20181
33
33
  versionhq/team/team_planner.py,sha256=uzX2yed7A7gNSs6qH5jIq2zXMVF5BwQQ4HPATsB9DSQ,3675
34
34
  versionhq/tool/__init__.py,sha256=FvBuEXsOQUYnN7RTFxT20kAkiEYkxWKkiVtgpqOzKZQ,1843
35
35
  versionhq/tool/composio_tool.py,sha256=BJqaA1NhV0BT9AdY7OLCGpsAI3VEuCKnOS6D9vuU4zQ,8630
36
36
  versionhq/tool/decorator.py,sha256=W_WjzZy8y43AoiFjHLPUQfNipmpOPe-wQknCWloPwmY,1195
37
- versionhq/tool/model.py,sha256=cWfLQVjNkag5cYYqhABBK7-jcpl0UJQWuhDciG3MtPQ,8116
37
+ versionhq/tool/model.py,sha256=yrvog9wh-cuIXRngwXOzPlHwBO3UhUFxCH3vQ5qRKBA,6823
38
38
  versionhq/tool/tool_handler.py,sha256=A3zUkZkx4JEpFHI2uBkHDpzWfADw-bCYUQhgm6rpITM,1569
39
- versionhq-1.1.9.4.dist-info/LICENSE,sha256=7CCXuMrAjPVsUvZrsBq9DsxI2rLDUSYXR_qj4yO_ZII,1077
40
- versionhq-1.1.9.4.dist-info/METADATA,sha256=AzBZbuezjj_y0NOYyUrEy488UChQaoUTuSPoOajb_kk,16070
41
- versionhq-1.1.9.4.dist-info/WHEEL,sha256=A3WOREP4zgxI0fKrHUG8DC8013e3dK3n7a6HDbcEIwE,91
42
- versionhq-1.1.9.4.dist-info/top_level.txt,sha256=DClQwxDWqIUGeRJkA8vBlgeNsYZs4_nJWMonzFt5Wj0,10
43
- versionhq-1.1.9.4.dist-info/RECORD,,
39
+ versionhq-1.1.9.9.dist-info/LICENSE,sha256=7CCXuMrAjPVsUvZrsBq9DsxI2rLDUSYXR_qj4yO_ZII,1077
40
+ versionhq-1.1.9.9.dist-info/METADATA,sha256=Xy6nPEpAyuTu6UwbL3yH_TamXyVnDJN4pyBePvngnsA,16070
41
+ versionhq-1.1.9.9.dist-info/WHEEL,sha256=A3WOREP4zgxI0fKrHUG8DC8013e3dK3n7a6HDbcEIwE,91
42
+ versionhq-1.1.9.9.dist-info/top_level.txt,sha256=DClQwxDWqIUGeRJkA8vBlgeNsYZs4_nJWMonzFt5Wj0,10
43
+ versionhq-1.1.9.9.dist-info/RECORD,,