versionhq 1.1.7.7__py3-none-any.whl → 1.1.7.8__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 +1 -1
- versionhq/_utils/process_config.py +2 -4
- versionhq/agent/model.py +4 -4
- versionhq/agent/parser.py +2 -2
- versionhq/clients/workflow/model.py +13 -9
- versionhq/llm/model.py +3 -3
- versionhq/task/model.py +4 -4
- versionhq/team/model.py +2 -6
- versionhq/tool/model.py +2 -9
- versionhq/tool/tool_handler.py +3 -2
- {versionhq-1.1.7.7.dist-info → versionhq-1.1.7.8.dist-info}/METADATA +1 -1
- {versionhq-1.1.7.7.dist-info → versionhq-1.1.7.8.dist-info}/RECORD +15 -15
- {versionhq-1.1.7.7.dist-info → versionhq-1.1.7.8.dist-info}/LICENSE +0 -0
- {versionhq-1.1.7.7.dist-info → versionhq-1.1.7.8.dist-info}/WHEEL +0 -0
- {versionhq-1.1.7.7.dist-info → versionhq-1.1.7.8.dist-info}/top_level.txt +0 -0
versionhq/__init__.py
CHANGED
@@ -2,9 +2,7 @@ from typing import Any, Dict, Type
|
|
2
2
|
from pydantic import BaseModel
|
3
3
|
|
4
4
|
|
5
|
-
def process_config(
|
6
|
-
values_to_update: Dict[str, Any], model_class: Type[BaseModel]
|
7
|
-
) -> Dict[str, Any]:
|
5
|
+
def process_config(values_to_update: Dict[str, Any], model_class: Type[BaseModel]) -> Dict[str, Any]:
|
8
6
|
"""
|
9
7
|
Process the config dictionary and update the values accordingly.
|
10
8
|
Refer to the Pydantic model class for field validation.
|
@@ -15,7 +13,7 @@ def process_config(
|
|
15
13
|
else:
|
16
14
|
return values_to_update
|
17
15
|
|
18
|
-
|
16
|
+
|
19
17
|
for key, value in config.items():
|
20
18
|
if key not in model_class.model_fields or values_to_update.get(key) is not None:
|
21
19
|
continue
|
versionhq/agent/model.py
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
import os
|
2
2
|
import uuid
|
3
3
|
from abc import ABC
|
4
|
-
from typing import Any, Dict, List, Optional, TypeVar
|
4
|
+
from typing import Any, Dict, List, Optional, TypeVar
|
5
5
|
from dotenv import load_dotenv
|
6
6
|
from pydantic import UUID4, BaseModel, Field, InstanceOf, PrivateAttr, model_validator, field_validator
|
7
7
|
from pydantic_core import PydanticCustomError
|
@@ -22,7 +22,7 @@ load_dotenv(override=True)
|
|
22
22
|
T = TypeVar("T", bound="Agent")
|
23
23
|
|
24
24
|
|
25
|
-
# def _format_answer(agent, answer: str) ->
|
25
|
+
# def _format_answer(agent, answer: str) -> AgentAction | AgentFinish:
|
26
26
|
# return AgentParser(agent=agent).parse(answer)
|
27
27
|
|
28
28
|
# def mock_agent_ops_provider():
|
@@ -111,8 +111,8 @@ class Agent(ABC, BaseModel):
|
|
111
111
|
step_callback: Optional[Any] = Field(default=None,description="Callback to be executed after each step of the agent execution")
|
112
112
|
|
113
113
|
# llm settings cascaded to the LLM model
|
114
|
-
llm:
|
115
|
-
function_calling_llm:
|
114
|
+
llm: str | InstanceOf[LLM] | Any = Field(default=None)
|
115
|
+
function_calling_llm: str | InstanceOf[LLM] | Any = Field(default=None)
|
116
116
|
respect_context_window: bool = Field(default=True,description="Keep messages under the context window size by summarizing content")
|
117
117
|
max_tokens: Optional[int] = Field(default=None, description="max. number of tokens for the agent's execution")
|
118
118
|
max_execution_time: Optional[int] = Field(default=None, description="max. execution time for an agent to execute a task")
|
versionhq/agent/parser.py
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
import re
|
2
|
-
from typing import Any
|
2
|
+
from typing import Any
|
3
3
|
from json_repair import repair_json
|
4
4
|
|
5
5
|
from versionhq._utils.i18n import I18N
|
@@ -70,7 +70,7 @@ class AgentParser:
|
|
70
70
|
def __init__(self, agent: Any):
|
71
71
|
self.agent = agent
|
72
72
|
|
73
|
-
def parse(self, text: str) ->
|
73
|
+
def parse(self, text: str) -> AgentAction | AgentFinish:
|
74
74
|
thought = self._extract_thought(text)
|
75
75
|
includes_answer = FINAL_ANSWER_ACTION in text
|
76
76
|
regex = (
|
@@ -1,8 +1,8 @@
|
|
1
1
|
import uuid
|
2
2
|
from abc import ABC
|
3
3
|
from datetime import date, datetime, time, timedelta
|
4
|
-
from typing import Any, Dict, List,
|
5
|
-
from pydantic import UUID4, InstanceOf, BaseModel, ConfigDict, Field,
|
4
|
+
from typing import Any, Dict, List, Callable, Type, Optional, get_args, get_origin
|
5
|
+
from pydantic import UUID4, InstanceOf, BaseModel, ConfigDict, Field, field_validator, model_validator
|
6
6
|
from pydantic_core import PydanticCustomError
|
7
7
|
|
8
8
|
from versionhq.clients.product.model import Product
|
@@ -12,7 +12,7 @@ from versionhq.team.model import Team
|
|
12
12
|
|
13
13
|
|
14
14
|
class ScoreFormat:
|
15
|
-
def __init__(self, rate:
|
15
|
+
def __init__(self, rate: float | int = 0, weight: int = 1):
|
16
16
|
self.rate = rate
|
17
17
|
self.weight = weight
|
18
18
|
self.aggregate = rate * weight
|
@@ -39,7 +39,7 @@ class Score:
|
|
39
39
|
|
40
40
|
|
41
41
|
def result(self) -> int:
|
42
|
-
aggregate_score = self.brand_tone.aggregate + self.audience.aggregate + self.track_record.aggregate
|
42
|
+
aggregate_score = int(self.brand_tone.aggregate) + int(self.audience.aggregate) + int(self.track_record.aggregate)
|
43
43
|
denominator = self.brand_tone.weight + self.audience.weight + self.track_record.weight
|
44
44
|
|
45
45
|
for k, v in self.kwargs.items():
|
@@ -57,11 +57,12 @@ class MessagingComponent(ABC, BaseModel):
|
|
57
57
|
layer_id: int = Field(default=0, description="add id of the layer: 0, 1, 2")
|
58
58
|
message: str = Field(default=None, max_length=1024, description="text message content to be sent")
|
59
59
|
interval: Optional[str] = Field(
|
60
|
-
default=None,description="interval to move on to the next layer. if this is the last layer, set as `None`"
|
61
|
-
|
60
|
+
default=None, description="interval to move on to the next layer. if this is the last layer, set as `None`"
|
61
|
+
)
|
62
|
+
score: float | InstanceOf[Score] = Field(default=None)
|
62
63
|
|
63
64
|
|
64
|
-
def store_scoring_result(self, scoring_subject: str, score_raw:
|
65
|
+
def store_scoring_result(self, scoring_subject: str, score_raw: int | Score | ScoreFormat = None):
|
65
66
|
"""
|
66
67
|
Set up the `score` field
|
67
68
|
"""
|
@@ -109,8 +110,11 @@ class MessagingWorkflow(ABC, BaseModel):
|
|
109
110
|
product: InstanceOf[Product] = Field(default=None)
|
110
111
|
customer: InstanceOf[Customer] = Field(default=None)
|
111
112
|
|
112
|
-
metrics:
|
113
|
-
default=None,
|
113
|
+
metrics: List[Dict[str, Any]] | List[str] = Field(
|
114
|
+
default=None,
|
115
|
+
max_length=256,
|
116
|
+
description="store metrics that used to predict and track the performance of this workflow."
|
117
|
+
)
|
114
118
|
|
115
119
|
|
116
120
|
@property
|
versionhq/llm/model.py
CHANGED
@@ -7,7 +7,7 @@ import litellm
|
|
7
7
|
from dotenv import load_dotenv
|
8
8
|
from litellm import get_supported_openai_params
|
9
9
|
from contextlib import contextmanager
|
10
|
-
from typing import Any, Dict, List, Optional
|
10
|
+
from typing import Any, Dict, List, Optional
|
11
11
|
|
12
12
|
from versionhq.llm.llm_vars import LLM_CONTEXT_WINDOW_SIZES
|
13
13
|
from versionhq.task import TaskOutputFormat
|
@@ -103,7 +103,7 @@ class LLM:
|
|
103
103
|
def __init__(
|
104
104
|
self,
|
105
105
|
model: str,
|
106
|
-
timeout: Optional[
|
106
|
+
timeout: Optional[float | int] = None,
|
107
107
|
max_tokens: Optional[int] = None,
|
108
108
|
max_completion_tokens: Optional[int] = None,
|
109
109
|
context_window_size: Optional[int] = DEFAULT_CONTEXT_WINDOW,
|
@@ -111,7 +111,7 @@ class LLM:
|
|
111
111
|
temperature: Optional[float] = None,
|
112
112
|
top_p: Optional[float] = None,
|
113
113
|
n: Optional[int] = None,
|
114
|
-
stop: Optional[
|
114
|
+
stop: Optional[str | List[str]] = None,
|
115
115
|
presence_penalty: Optional[float] = None,
|
116
116
|
frequency_penalty: Optional[float] = None,
|
117
117
|
logit_bias: Optional[Dict[int, float]] = None,
|
versionhq/task/model.py
CHANGED
@@ -3,10 +3,10 @@ import threading
|
|
3
3
|
import uuid
|
4
4
|
from concurrent.futures import Future
|
5
5
|
from hashlib import md5
|
6
|
-
from typing import Any, Dict, List, Set, Optional, Tuple, Callable,
|
6
|
+
from typing import Any, Dict, List, Set, Optional, Tuple, Callable, Type
|
7
7
|
from typing_extensions import Annotated
|
8
8
|
|
9
|
-
from pydantic import UUID4, BaseModel, Field, PrivateAttr, field_validator, model_validator, create_model
|
9
|
+
from pydantic import UUID4, BaseModel, Field, PrivateAttr, field_validator, model_validator, create_model, InstanceOf
|
10
10
|
from pydantic_core import PydanticCustomError
|
11
11
|
|
12
12
|
from versionhq._utils.process_config import process_config
|
@@ -49,7 +49,7 @@ class ResponseField(BaseModel):
|
|
49
49
|
return value
|
50
50
|
|
51
51
|
|
52
|
-
def create_pydantic_model(self, result: Dict, base_model:
|
52
|
+
def create_pydantic_model(self, result: Dict, base_model: InstanceOf[BaseModel] | Any) -> Any:
|
53
53
|
for k, v in result.items():
|
54
54
|
if k is not self.title:
|
55
55
|
pass
|
@@ -70,7 +70,7 @@ class TaskOutput(BaseModel):
|
|
70
70
|
|
71
71
|
task_id: UUID4 = Field(default_factory=uuid.uuid4, frozen=True, description="store Task ID")
|
72
72
|
raw: str = Field(default="", description="Raw output of the task")
|
73
|
-
json_dict:
|
73
|
+
json_dict: Dict[str, Any] = Field(default=None, description="`raw` converted to dictionary")
|
74
74
|
pydantic: Optional[Any] = Field(default=None, description="`raw` converted to the abs. pydantic model")
|
75
75
|
|
76
76
|
def __str__(self) -> str:
|
versionhq/team/model.py
CHANGED
@@ -6,7 +6,7 @@ from enum import Enum
|
|
6
6
|
from dotenv import load_dotenv
|
7
7
|
from concurrent.futures import Future
|
8
8
|
from hashlib import md5
|
9
|
-
from typing import Any, Dict, List, TYPE_CHECKING, Callable, Optional, Tuple
|
9
|
+
from typing import Any, Dict, List, TYPE_CHECKING, Callable, Optional, Tuple
|
10
10
|
from pydantic import UUID4, InstanceOf, Json, BaseModel, Field, PrivateAttr, field_validator, model_validator
|
11
11
|
from pydantic._internal._generate_schema import GenerateSchema
|
12
12
|
from pydantic_core import PydanticCustomError, core_schema
|
@@ -61,7 +61,7 @@ class TeamOutput(BaseModel):
|
|
61
61
|
team_id: UUID4 = Field(default_factory=uuid.uuid4, frozen=True, description="store the team ID that generate the TeamOutput")
|
62
62
|
raw: str = Field(default="", description="raw output of the team lead task handled by the team leader")
|
63
63
|
pydantic: Optional[Any] = Field(default=None, description="`raw` converted to the abs. pydantic model")
|
64
|
-
json_dict:
|
64
|
+
json_dict: Dict[str, Any] = Field(default=None, description="`raw` converted to dictionary")
|
65
65
|
task_output_list: list[TaskOutput] = Field(default=list, description="store output of all the tasks that the team has executed")
|
66
66
|
token_usage: UsageMetrics = Field(default=dict, description="processed token summary")
|
67
67
|
|
@@ -200,10 +200,6 @@ class Team(BaseModel):
|
|
200
200
|
if v:
|
201
201
|
raise PydanticCustomError("may_not_set_field", "The 'id' field cannot be set by the user.", {})
|
202
202
|
|
203
|
-
# @field_validator("config", mode="before")
|
204
|
-
# @classmethod
|
205
|
-
# def check_config_type(cls, v: Union[Json, Dict[str, Any]]) -> Union[Json, Dict[str, Any]]:
|
206
|
-
# return json.loads(v) if isinstance(v, Json) else v
|
207
203
|
|
208
204
|
@model_validator(mode="after")
|
209
205
|
def check_manager_llm(self):
|
versionhq/tool/model.py
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
from abc import ABC
|
2
2
|
from inspect import signature
|
3
3
|
from typing import Any, Dict, Callable, Type, Optional, get_args, get_origin
|
4
|
-
from pydantic import
|
5
|
-
InstanceOf,
|
6
|
-
BaseModel,
|
7
|
-
ConfigDict,
|
8
|
-
Field,
|
9
|
-
create_model,
|
10
|
-
field_validator,
|
11
|
-
model_validator,
|
12
|
-
)
|
4
|
+
from pydantic import InstanceOf, BaseModel, ConfigDict, Field, create_model, field_validator, model_validator
|
13
5
|
|
14
6
|
from versionhq._utils.cache_handler import CacheHandler
|
15
7
|
|
@@ -135,6 +127,7 @@ class Tool(ABC, BaseModel):
|
|
135
127
|
|
136
128
|
return cls(name=tool_name, func=func, args_schema=args_schema)
|
137
129
|
|
130
|
+
|
138
131
|
def run(self, *args, **kwargs) -> Any:
|
139
132
|
"""
|
140
133
|
Use the tool.
|
versionhq/tool/tool_handler.py
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
from typing import Any, Optional
|
1
|
+
from typing import Any, Optional
|
2
|
+
from pydantic import InstanceOf
|
2
3
|
from versionhq.tool.model import ToolCalled, InstructorToolCalled, CacheTool
|
3
4
|
from versionhq._utils.cache_handler import CacheHandler
|
4
5
|
|
@@ -23,7 +24,7 @@ class ToolHandler:
|
|
23
24
|
|
24
25
|
def record_last_tool_used(
|
25
26
|
self,
|
26
|
-
last_used_tool:
|
27
|
+
last_used_tool: InstanceOf[ToolCalled] | InstanceOf[InstructorToolCalled],
|
27
28
|
output: str,
|
28
29
|
should_cache: bool = True,
|
29
30
|
) -> Any:
|
@@ -1,14 +1,14 @@
|
|
1
|
-
versionhq/__init__.py,sha256=
|
1
|
+
versionhq/__init__.py,sha256=KTM1HF1lTl5AiAuFQuGwltg4LEZjHnac9mz8h12MtGg,871
|
2
2
|
versionhq/_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
3
3
|
versionhq/_utils/cache_handler.py,sha256=zDQKzIn7vp-M2-uepHFxgJstjfftZS5mzXKL_-4uVvI,370
|
4
4
|
versionhq/_utils/i18n.py,sha256=TwA_PnYfDLA6VqlUDPuybdV9lgi3Frh_ASsb_X8jJo8,1483
|
5
5
|
versionhq/_utils/logger.py,sha256=lqRYH45KHMQ4mwE1woa5xNmngYu4O749AYECsnWWpmA,1851
|
6
|
-
versionhq/_utils/process_config.py,sha256=
|
6
|
+
versionhq/_utils/process_config.py,sha256=UqoWD5IR4VLxEDGxIyVUylw_ppXwk8Wx1ynVuD-pUSg,822
|
7
7
|
versionhq/_utils/rpm_controller.py,sha256=T7waIGeblu5K58erY4lqVLcPsWM7W9UFdU3DG9Dsk0w,2214
|
8
8
|
versionhq/_utils/usage_metrics.py,sha256=c33a_28y8ECUgflsKN3mkNm0fNkWgZmXwybMwIqoKXA,1098
|
9
9
|
versionhq/agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
10
|
-
versionhq/agent/model.py,sha256=
|
11
|
-
versionhq/agent/parser.py,sha256=
|
10
|
+
versionhq/agent/model.py,sha256=tv14XkjrgsFsryFWzaw0w2h0X1T0ffipVK9l4kYbpIE,18598
|
11
|
+
versionhq/agent/parser.py,sha256=db5kfk-lR1Ph9-rsTvSeW1NjR6GJ00iaqTNYxJy3N8o,5487
|
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
|
@@ -18,25 +18,25 @@ versionhq/clients/customer/model.py,sha256=rQnCv_wdCdrYAsUjyB6X6ULiuWfqcBBoarXcQ
|
|
18
18
|
versionhq/clients/product/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
19
19
|
versionhq/clients/product/model.py,sha256=Us3UnzYlub6ipBislMN-JrvxZx0ocl9PtQJINJ8XtBA,2385
|
20
20
|
versionhq/clients/workflow/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
21
|
-
versionhq/clients/workflow/model.py,sha256=
|
21
|
+
versionhq/clients/workflow/model.py,sha256=GI-cSw-7zOFzLC2Xa4YfCowu3MI0JyH33qDFTqbJLmg,5725
|
22
22
|
versionhq/llm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
23
23
|
versionhq/llm/llm_vars.py,sha256=YZoXqFBW7XpclUZ14_AAz7WOjoyCXnGcI959GSpX2q0,5343
|
24
|
-
versionhq/llm/model.py,sha256=
|
24
|
+
versionhq/llm/model.py,sha256=mXzSuf1s6MebGT7_yqgNppde0NIlAF8bjIXAp2MZ9Uw,8247
|
25
25
|
versionhq/storage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
26
26
|
versionhq/storage/task_output_storage.py,sha256=RxvF_lSRUuo2Af3zMAuc1aOymx1e6e_5VJ2y757_Hu0,4910
|
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=
|
30
|
+
versionhq/task/model.py,sha256=bUmERE6AZfs8qh2Hb9LES5BLUlXrkrOUyWxCU27M1ic,19317
|
31
31
|
versionhq/team/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
32
|
-
versionhq/team/model.py,sha256=
|
32
|
+
versionhq/team/model.py,sha256=T_71FarXEzAxrTn_8yYVWMwLS9p-UxSovexZtHYnYn0,18066
|
33
33
|
versionhq/team/team_planner.py,sha256=B1UOn_DYVVterUn2CAd80jfO4sViJCCXPJA3abSSugg,2143
|
34
34
|
versionhq/tool/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
35
35
|
versionhq/tool/decorator.py,sha256=Y-j4jkoujD5LUvpe8uf3p5Zagk2XVaRKC9rkIE-2geo,1189
|
36
|
-
versionhq/tool/model.py,sha256=
|
37
|
-
versionhq/tool/tool_handler.py,sha256=
|
38
|
-
versionhq-1.1.7.
|
39
|
-
versionhq-1.1.7.
|
40
|
-
versionhq-1.1.7.
|
41
|
-
versionhq-1.1.7.
|
42
|
-
versionhq-1.1.7.
|
36
|
+
versionhq/tool/model.py,sha256=s-y8323ikd5m5U2HG59ATgFW6L7yIFiPLLdOpeXQ8RI,6874
|
37
|
+
versionhq/tool/tool_handler.py,sha256=esUqGp8HoREesai8fmh2klAf04Sjpsacmb03C7F6sNQ,1541
|
38
|
+
versionhq-1.1.7.8.dist-info/LICENSE,sha256=7CCXuMrAjPVsUvZrsBq9DsxI2rLDUSYXR_qj4yO_ZII,1077
|
39
|
+
versionhq-1.1.7.8.dist-info/METADATA,sha256=xsI-HWU0_Rb0OLH_tSDvIk7E8SWP0U-SjTQfoomW6zU,15919
|
40
|
+
versionhq-1.1.7.8.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
41
|
+
versionhq-1.1.7.8.dist-info/top_level.txt,sha256=DClQwxDWqIUGeRJkA8vBlgeNsYZs4_nJWMonzFt5Wj0,10
|
42
|
+
versionhq-1.1.7.8.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|