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.

Files changed (32) hide show
  1. veadk/agent.py +7 -3
  2. veadk/auth/veauth/ark_veauth.py +43 -51
  3. veadk/auth/veauth/utils.py +57 -0
  4. veadk/cli/cli.py +2 -0
  5. veadk/cli/cli_uploadevalset.py +125 -0
  6. veadk/cli/cli_web.py +15 -2
  7. veadk/configs/model_configs.py +3 -3
  8. veadk/consts.py +9 -0
  9. veadk/knowledgebase/knowledgebase.py +19 -32
  10. veadk/memory/long_term_memory.py +39 -92
  11. veadk/memory/long_term_memory_backends/base_backend.py +4 -2
  12. veadk/memory/long_term_memory_backends/in_memory_backend.py +8 -6
  13. veadk/memory/long_term_memory_backends/mem0_backend.py +8 -8
  14. veadk/memory/long_term_memory_backends/opensearch_backend.py +40 -36
  15. veadk/memory/long_term_memory_backends/redis_backend.py +59 -46
  16. veadk/memory/long_term_memory_backends/vikingdb_memory_backend.py +54 -29
  17. veadk/memory/short_term_memory.py +9 -11
  18. veadk/runner.py +19 -11
  19. veadk/tools/builtin_tools/generate_image.py +230 -189
  20. veadk/tools/builtin_tools/image_edit.py +24 -5
  21. veadk/tools/builtin_tools/image_generate.py +24 -5
  22. veadk/tools/builtin_tools/load_knowledgebase.py +97 -0
  23. veadk/tools/builtin_tools/video_generate.py +38 -11
  24. veadk/utils/misc.py +6 -10
  25. veadk/utils/volcengine_sign.py +2 -0
  26. veadk/version.py +1 -1
  27. {veadk_python-0.2.10.dist-info → veadk_python-0.2.12.dist-info}/METADATA +2 -1
  28. {veadk_python-0.2.10.dist-info → veadk_python-0.2.12.dist-info}/RECORD +32 -29
  29. {veadk_python-0.2.10.dist-info → veadk_python-0.2.12.dist-info}/WHEEL +0 -0
  30. {veadk_python-0.2.10.dist-info → veadk_python-0.2.12.dist-info}/entry_points.txt +0 -0
  31. {veadk_python-0.2.10.dist-info → veadk_python-0.2.12.dist-info}/licenses/LICENSE +0 -0
  32. {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.config import getenv
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._client.get_collection(collection_name=self.index)
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
- response = self._client.create_collection(
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
- response = self._client.add_messages(
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(self, query: str, top_k: int, **kwargs) -> list[str]:
118
- user_id = kwargs.get("user_id")
119
- if user_id is None:
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
- response = self._client.search_memory(
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
- if (
121
- await self._session_service.get_session(
122
- app_name=app_name, user_id=user_id, session_id=session_id
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
- is None
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, read_png_to_bytes
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
- assert messages.media.endswith(".png"), (
109
- "The MediaMessage only supports PNG format file for now."
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=read_png_to_bytes(messages.media),
120
- mime_type="image/png",
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 += event.content.parts[0].text
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 = ""