veadk-python 0.2.10__py3-none-any.whl → 0.2.12__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.
Potentially problematic release.
This version of veadk-python might be problematic. Click here for more details.
- veadk/agent.py +7 -3
- veadk/auth/veauth/ark_veauth.py +43 -51
- veadk/auth/veauth/utils.py +57 -0
- veadk/cli/cli.py +2 -0
- veadk/cli/cli_uploadevalset.py +125 -0
- veadk/cli/cli_web.py +15 -2
- veadk/configs/model_configs.py +3 -3
- veadk/consts.py +9 -0
- veadk/knowledgebase/knowledgebase.py +19 -32
- veadk/memory/long_term_memory.py +39 -92
- veadk/memory/long_term_memory_backends/base_backend.py +4 -2
- veadk/memory/long_term_memory_backends/in_memory_backend.py +8 -6
- veadk/memory/long_term_memory_backends/mem0_backend.py +8 -8
- veadk/memory/long_term_memory_backends/opensearch_backend.py +40 -36
- veadk/memory/long_term_memory_backends/redis_backend.py +59 -46
- veadk/memory/long_term_memory_backends/vikingdb_memory_backend.py +54 -29
- veadk/memory/short_term_memory.py +9 -11
- veadk/runner.py +19 -11
- veadk/tools/builtin_tools/generate_image.py +230 -189
- veadk/tools/builtin_tools/image_edit.py +24 -5
- veadk/tools/builtin_tools/image_generate.py +24 -5
- veadk/tools/builtin_tools/load_knowledgebase.py +97 -0
- veadk/tools/builtin_tools/video_generate.py +38 -11
- veadk/utils/misc.py +6 -10
- veadk/utils/volcengine_sign.py +2 -0
- veadk/version.py +1 -1
- {veadk_python-0.2.10.dist-info → veadk_python-0.2.12.dist-info}/METADATA +2 -1
- {veadk_python-0.2.10.dist-info → veadk_python-0.2.12.dist-info}/RECORD +32 -29
- {veadk_python-0.2.10.dist-info → veadk_python-0.2.12.dist-info}/WHEEL +0 -0
- {veadk_python-0.2.10.dist-info → veadk_python-0.2.12.dist-info}/entry_points.txt +0 -0
- {veadk_python-0.2.10.dist-info → veadk_python-0.2.12.dist-info}/licenses/LICENSE +0 -0
- {veadk_python-0.2.10.dist-info → veadk_python-0.2.12.dist-info}/top_level.txt +0 -0
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
15
|
import json
|
|
16
|
+
import os
|
|
16
17
|
import re
|
|
17
18
|
import time
|
|
18
19
|
import uuid
|
|
@@ -22,7 +23,7 @@ from pydantic import Field
|
|
|
22
23
|
from typing_extensions import override
|
|
23
24
|
|
|
24
25
|
import veadk.config # noqa E401
|
|
25
|
-
from veadk.
|
|
26
|
+
from veadk.auth.veauth.utils import get_credential_from_vefaas_iam
|
|
26
27
|
from veadk.integrations.ve_viking_db_memory.ve_viking_db_memory import (
|
|
27
28
|
VikingDBMemoryClient,
|
|
28
29
|
)
|
|
@@ -35,17 +36,24 @@ logger = get_logger(__name__)
|
|
|
35
36
|
|
|
36
37
|
|
|
37
38
|
class VikingDBLTMBackend(BaseLongTermMemoryBackend):
|
|
38
|
-
volcengine_access_key: str = Field(
|
|
39
|
-
default_factory=lambda: getenv("VOLCENGINE_ACCESS_KEY")
|
|
39
|
+
volcengine_access_key: str | None = Field(
|
|
40
|
+
default_factory=lambda: os.getenv("VOLCENGINE_ACCESS_KEY")
|
|
40
41
|
)
|
|
41
42
|
|
|
42
|
-
volcengine_secret_key: str = Field(
|
|
43
|
-
default_factory=lambda: getenv("VOLCENGINE_SECRET_KEY")
|
|
43
|
+
volcengine_secret_key: str | None = Field(
|
|
44
|
+
default_factory=lambda: os.getenv("VOLCENGINE_SECRET_KEY")
|
|
44
45
|
)
|
|
45
46
|
|
|
47
|
+
session_token: str = ""
|
|
48
|
+
|
|
46
49
|
region: str = "cn-beijing"
|
|
47
50
|
"""VikingDB memory region"""
|
|
48
51
|
|
|
52
|
+
def model_post_init(self, __context: Any) -> None:
|
|
53
|
+
# check whether collection exist, if not, create it
|
|
54
|
+
if not self._collection_exist():
|
|
55
|
+
self._create_collection()
|
|
56
|
+
|
|
49
57
|
def precheck_index_naming(self):
|
|
50
58
|
if not (
|
|
51
59
|
isinstance(self.index, str)
|
|
@@ -56,37 +64,39 @@ class VikingDBLTMBackend(BaseLongTermMemoryBackend):
|
|
|
56
64
|
"The index name does not conform to the rules: it must start with an English letter, contain only letters, numbers, and underscores, and have a length of 1-128."
|
|
57
65
|
)
|
|
58
66
|
|
|
59
|
-
def model_post_init(self, __context: Any) -> None:
|
|
60
|
-
self._client = VikingDBMemoryClient(
|
|
61
|
-
ak=self.volcengine_access_key,
|
|
62
|
-
sk=self.volcengine_secret_key,
|
|
63
|
-
region=self.region,
|
|
64
|
-
)
|
|
65
|
-
|
|
66
|
-
# check whether collection exist, if not, create it
|
|
67
|
-
if not self._collection_exist():
|
|
68
|
-
self._create_collection()
|
|
69
|
-
|
|
70
67
|
def _collection_exist(self) -> bool:
|
|
71
68
|
try:
|
|
72
|
-
self.
|
|
69
|
+
client = self._get_client()
|
|
70
|
+
client.get_collection(collection_name=self.index)
|
|
73
71
|
return True
|
|
74
72
|
except Exception:
|
|
75
73
|
return False
|
|
76
74
|
|
|
77
75
|
def _create_collection(self) -> None:
|
|
78
|
-
|
|
76
|
+
client = self._get_client()
|
|
77
|
+
response = client.create_collection(
|
|
79
78
|
collection_name=self.index,
|
|
80
79
|
description="Created by Volcengine Agent Development Kit VeADK",
|
|
81
80
|
builtin_event_types=["sys_event_v1"],
|
|
82
81
|
)
|
|
83
82
|
return response
|
|
84
83
|
|
|
84
|
+
def _get_client(self) -> VikingDBMemoryClient:
|
|
85
|
+
if not (self.volcengine_access_key and self.volcengine_secret_key):
|
|
86
|
+
cred = get_credential_from_vefaas_iam()
|
|
87
|
+
self.volcengine_access_key = cred.access_key_id
|
|
88
|
+
self.volcengine_secret_key = cred.secret_access_key
|
|
89
|
+
self.session_token = cred.session_token
|
|
90
|
+
|
|
91
|
+
return VikingDBMemoryClient(
|
|
92
|
+
ak=self.volcengine_access_key,
|
|
93
|
+
sk=self.volcengine_secret_key,
|
|
94
|
+
sts_token=self.session_token,
|
|
95
|
+
region=self.region,
|
|
96
|
+
)
|
|
97
|
+
|
|
85
98
|
@override
|
|
86
|
-
def save_memory(self, event_strings: list[str], **kwargs) -> bool:
|
|
87
|
-
user_id = kwargs.get("user_id")
|
|
88
|
-
if user_id is None:
|
|
89
|
-
raise ValueError("user_id is required")
|
|
99
|
+
def save_memory(self, user_id: str, event_strings: list[str], **kwargs) -> bool:
|
|
90
100
|
session_id = str(uuid.uuid1())
|
|
91
101
|
messages = []
|
|
92
102
|
for raw_events in event_strings:
|
|
@@ -101,31 +111,46 @@ class VikingDBLTMBackend(BaseLongTermMemoryBackend):
|
|
|
101
111
|
"default_assistant_id": "assistant",
|
|
102
112
|
"time": int(time.time() * 1000),
|
|
103
113
|
}
|
|
104
|
-
|
|
114
|
+
|
|
115
|
+
logger.debug(
|
|
116
|
+
f"Request for add {len(messages)} memory to VikingDB: collection_name={self.index}, metadata={metadata}, session_id={session_id}"
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
client = self._get_client()
|
|
120
|
+
response = client.add_messages(
|
|
105
121
|
collection_name=self.index,
|
|
106
122
|
messages=messages,
|
|
107
123
|
metadata=metadata,
|
|
108
124
|
session_id=session_id,
|
|
109
125
|
)
|
|
110
126
|
|
|
127
|
+
logger.debug(f"Response from add memory to VikingDB: {response}")
|
|
128
|
+
|
|
111
129
|
if not response.get("code") == 0:
|
|
112
130
|
raise ValueError(f"Save VikingDB memory error: {response}")
|
|
113
131
|
|
|
114
132
|
return True
|
|
115
133
|
|
|
116
134
|
@override
|
|
117
|
-
def search_memory(
|
|
118
|
-
user_id
|
|
119
|
-
|
|
120
|
-
raise ValueError("user_id is required")
|
|
135
|
+
def search_memory(
|
|
136
|
+
self, user_id: str, query: str, top_k: int, **kwargs
|
|
137
|
+
) -> list[str]:
|
|
121
138
|
filter = {
|
|
122
139
|
"user_id": user_id,
|
|
123
|
-
"memory_type": ["sys_event_v1"],
|
|
140
|
+
"memory_type": ["sys_event_v1", "event_v1"],
|
|
124
141
|
}
|
|
125
|
-
|
|
142
|
+
|
|
143
|
+
logger.debug(
|
|
144
|
+
f"Request for search memory in VikingDB: filter={filter}, collection_name={self.index}, query={query}, limit={top_k}"
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
client = self._get_client()
|
|
148
|
+
response = client.search_memory(
|
|
126
149
|
collection_name=self.index, query=query, filter=filter, limit=top_k
|
|
127
150
|
)
|
|
128
151
|
|
|
152
|
+
logger.debug(f"Response from search memory in VikingDB: {response}")
|
|
153
|
+
|
|
129
154
|
if not response.get("code") == 0:
|
|
130
155
|
raise ValueError(f"Search VikingDB memory error: {response}")
|
|
131
156
|
|
|
@@ -117,18 +117,16 @@ class ShortTermMemory(BaseModel):
|
|
|
117
117
|
f"Loaded {len(list_sessions_response.sessions)} sessions from db {self.db_url}."
|
|
118
118
|
)
|
|
119
119
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
120
|
+
session = await self._session_service.get_session(
|
|
121
|
+
app_name=app_name, user_id=user_id, session_id=session_id
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
if session:
|
|
125
|
+
logger.info(
|
|
126
|
+
f"Session {session_id} already exists with app_name={app_name} user_id={user_id}."
|
|
123
127
|
)
|
|
124
|
-
|
|
125
|
-
|
|
128
|
+
return session
|
|
129
|
+
else:
|
|
126
130
|
return await self._session_service.create_session(
|
|
127
131
|
app_name=app_name, user_id=user_id, session_id=session_id
|
|
128
132
|
)
|
|
129
|
-
else:
|
|
130
|
-
logger.info(
|
|
131
|
-
f"Session {session_id} already exists with app_name={app_name} user_id={user_id}."
|
|
132
|
-
)
|
|
133
|
-
|
|
134
|
-
return None
|
veadk/runner.py
CHANGED
|
@@ -34,7 +34,7 @@ from veadk.evaluation import EvalSetRecorder
|
|
|
34
34
|
from veadk.memory.short_term_memory import ShortTermMemory
|
|
35
35
|
from veadk.types import MediaMessage
|
|
36
36
|
from veadk.utils.logger import get_logger
|
|
37
|
-
from veadk.utils.misc import formatted_timestamp,
|
|
37
|
+
from veadk.utils.misc import formatted_timestamp, read_file_to_bytes
|
|
38
38
|
|
|
39
39
|
logger = get_logger(__name__)
|
|
40
40
|
|
|
@@ -50,11 +50,7 @@ RunnerMessage = Union[
|
|
|
50
50
|
async def pre_run_process(self, process_func, new_message, user_id, session_id):
|
|
51
51
|
if new_message.parts:
|
|
52
52
|
for part in new_message.parts:
|
|
53
|
-
if
|
|
54
|
-
part.inline_data
|
|
55
|
-
and part.inline_data.mime_type == "image/png"
|
|
56
|
-
and self.upload_inline_data_to_tos
|
|
57
|
-
):
|
|
53
|
+
if part.inline_data and self.upload_inline_data_to_tos:
|
|
58
54
|
await process_func(
|
|
59
55
|
part,
|
|
60
56
|
self.app_name,
|
|
@@ -105,9 +101,20 @@ def _convert_messages(
|
|
|
105
101
|
if isinstance(messages, str):
|
|
106
102
|
_messages = [types.Content(role="user", parts=[types.Part(text=messages)])]
|
|
107
103
|
elif isinstance(messages, MediaMessage):
|
|
108
|
-
|
|
109
|
-
|
|
104
|
+
import filetype
|
|
105
|
+
|
|
106
|
+
file_data = read_file_to_bytes(messages.media)
|
|
107
|
+
|
|
108
|
+
kind = filetype.guess(file_data)
|
|
109
|
+
if kind is None:
|
|
110
|
+
raise ValueError("Unsupported or unknown file type.")
|
|
111
|
+
|
|
112
|
+
mime_type = kind.mime
|
|
113
|
+
|
|
114
|
+
assert mime_type.startswith(("image/", "video/")), (
|
|
115
|
+
f"Unsupported media type: {mime_type}"
|
|
110
116
|
)
|
|
117
|
+
|
|
111
118
|
_messages = [
|
|
112
119
|
types.Content(
|
|
113
120
|
role="user",
|
|
@@ -116,8 +123,8 @@ def _convert_messages(
|
|
|
116
123
|
types.Part(
|
|
117
124
|
inline_data=Blob(
|
|
118
125
|
display_name=messages.media,
|
|
119
|
-
data=
|
|
120
|
-
mime_type=
|
|
126
|
+
data=file_data,
|
|
127
|
+
mime_type=mime_type,
|
|
121
128
|
)
|
|
122
129
|
),
|
|
123
130
|
],
|
|
@@ -277,7 +284,8 @@ class Runner(ADKRunner):
|
|
|
277
284
|
and event.content.parts[0].text is not None
|
|
278
285
|
and len(event.content.parts[0].text.strip()) > 0
|
|
279
286
|
):
|
|
280
|
-
final_output
|
|
287
|
+
final_output = event.content.parts[0].text
|
|
288
|
+
logger.debug(f"Event output: {final_output}")
|
|
281
289
|
except LlmCallsLimitExceededError as e:
|
|
282
290
|
logger.warning(f"Max number of llm calls limit exceeded: {e}")
|
|
283
291
|
final_output = ""
|