Skip to content

Commit b452553

Browse files
committed
Merge branch 'main' into feat/vanna
2 parents ab06d6a + c05c2d7 commit b452553

19 files changed

Lines changed: 2149 additions & 640 deletions

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "veadk-python"
3-
version = "0.5.19"
3+
version = "0.5.22"
44
description = "Volcengine agent development kit, integrations with Volcengine cloud services."
55
readme = "README.md"
66
requires-python = ">=3.10"

tests/tools/mcp_tool/test_trusted_mcp_components.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ async def aclose(self):
170170
connection_params=self.mock_http_params, errlog=sys.stderr
171171
)
172172
manager._sessions = {}
173-
manager._session_lock = asyncio.Lock()
173+
# manager._session_lock = asyncio.Lock()
174174

175175
# Call create_session
176176
headers = {"x-trusted-mcp": "true"}
@@ -207,7 +207,7 @@ async def run_test():
207207
connection_params=self.mock_http_params, errlog=sys.stderr
208208
)
209209
manager._sessions = {}
210-
manager._session_lock = asyncio.Lock()
210+
# manager._session_lock = asyncio.Lock()
211211

212212
# Set up an existing session
213213
existing_session = mock.MagicMock()

veadk/agent.py

Lines changed: 114 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ class Agent(LlmAgent):
8686
skills (list[str]): List of skills that equip the agent with specific capabilities.
8787
example_store (Optional[BaseExampleProvider]): Example store for providing example Q/A.
8888
enable_shadowchar (bool): Whether to enable shadow character for the agent.
89+
enable_dynamic_load_skills (bool): Whether to enable dynamic loading of skills.
8990
"""
9091

9192
model_config = ConfigDict(arbitrary_types_allowed=True, extra="allow")
@@ -154,6 +155,12 @@ class Agent(LlmAgent):
154155

155156
enable_ghostchar: bool = False
156157

158+
enable_dataset_gen: bool = False
159+
160+
enable_dynamic_load_skills: bool = False
161+
enable_skills_checklist: bool = False
162+
_skills_with_checklist: Dict[str, Any] = {}
163+
157164
def model_post_init(self, __context: Any) -> None:
158165
super().model_post_init(None) # for sub_agents init
159166

@@ -225,6 +232,8 @@ def model_post_init(self, __context: Any) -> None:
225232

226233
self._prepare_tracers()
227234

235+
self._validate_tool_dependencies()
236+
228237
if self.knowledgebase:
229238
from veadk.tools.builtin_tools.load_knowledgebase import (
230239
LoadKnowledgebaseTool,
@@ -298,6 +307,23 @@ def model_post_init(self, __context: Any) -> None:
298307

299308
if self.skills:
300309
self.load_skills()
310+
if self.enable_skills_checklist:
311+
logger.info("Skills checklist enabled")
312+
from veadk.skills.utils import create_init_skill_check_list_callback
313+
314+
init_callback = create_init_skill_check_list_callback(
315+
self._skills_with_checklist
316+
)
317+
if self.before_tool_callback:
318+
if isinstance(self.before_tool_callback, list):
319+
self.before_tool_callback.append(init_callback)
320+
else:
321+
self.before_tool_callback = [
322+
self.before_tool_callback,
323+
init_callback,
324+
]
325+
else:
326+
self.before_tool_callback = init_callback
301327

302328
if self.example_store:
303329
from google.adk.tools.example_tool import ExampleTool
@@ -312,6 +338,22 @@ def model_post_init(self, __context: Any) -> None:
312338

313339
self.instruction += "Please add a character `< at the beginning of you each text-based response."
314340

341+
if self.enable_dataset_gen:
342+
from veadk.toolkits.dataset_auto_gen_callback import (
343+
dataset_auto_gen_callback,
344+
)
345+
346+
if self.after_agent_callback:
347+
if isinstance(self.after_agent_callback, list):
348+
self.after_agent_callback.append(dataset_auto_gen_callback)
349+
else:
350+
self.after_agent_callback = [
351+
self.after_agent_callback,
352+
dataset_auto_gen_callback,
353+
]
354+
else:
355+
self.after_agent_callback = dataset_auto_gen_callback
356+
315357
logger.info(f"VeADK version: {VERSION}")
316358

317359
logger.info(f"{self.__class__.__name__} `{self.name}` init done.")
@@ -329,13 +371,14 @@ def load_skills(self):
329371
from pathlib import Path
330372

331373
from veadk.skills.skill import Skill
374+
from veadk.skills.check_skills_callback import check_skills
332375
from veadk.skills.utils import (
333376
load_skills_from_cloud,
334377
load_skills_from_directory,
335378
)
336379
from veadk.tools.skills_tools.skills_toolset import SkillsToolset
337380

338-
skills: Dict[str, Skill] = {}
381+
self.skills_dict: Dict[str, Skill] = {}
339382

340383
# Determine skills_mode if not set
341384
if not self.skills_mode:
@@ -361,9 +404,19 @@ def load_skills(self):
361404
else:
362405
logger.debug("Successfully get AK/SK from environment variables.")
363406

407+
provider = (os.getenv("CLOUD_PROVIDER") or "").lower()
408+
if provider == "byteplus":
409+
sld = "byteplusapi"
410+
default_region = "ap-southeast-1"
411+
else:
412+
sld = "volcengineapi"
413+
default_region = "cn-beijing"
414+
364415
service = os.getenv("AGENTKIT_TOOL_SERVICE_CODE", "agentkit")
365-
region = os.getenv("AGENTKIT_TOOL_REGION", "cn-beijing")
366-
host = service + "." + region + ".volcengineapi.com"
416+
region = os.getenv("AGENTKIT_TOOL_REGION", default_region)
417+
host = os.getenv(
418+
"AGENTKIT_SKILL_HOST", service + "." + region + f".{sld}.com"
419+
)
367420

368421
res = ve_request(
369422
request_body={"ToolId": tool_id},
@@ -400,17 +453,28 @@ def load_skills(self):
400453
path = Path(item)
401454
if path.exists() and path.is_dir():
402455
for skill in load_skills_from_directory(path):
403-
skills[skill.name] = skill
456+
self.skills_dict[skill.name] = skill
404457
else:
405458
for skill in load_skills_from_cloud(item):
406-
skills[skill.name] = skill
407-
if skills:
459+
self.skills_dict[skill.name] = skill
460+
if self.skills_dict:
408461
self.instruction += "\nYou have the following skills:\n"
409462

410-
for skill in skills.values():
463+
self._skills_with_checklist = self.skills_dict
464+
465+
has_checklist = False
466+
for skill in self.skills_dict.values():
411467
self.instruction += (
412468
f"- name: {skill.name}\n- description: {skill.description}\n\n"
413469
)
470+
if skill.checklist:
471+
has_checklist = True
472+
473+
if has_checklist:
474+
self.instruction += (
475+
"Some skills have a checklist that you must complete step by step. "
476+
"Use the `update_check_list` tool to mark each item as completed.\n\n"
477+
)
414478

415479
if self.skills_mode not in [
416480
"skills_sandbox",
@@ -431,10 +495,52 @@ def load_skills(self):
431495
"You can use the skills by calling the `skills_tool` tool.\n\n"
432496
)
433497

434-
self.tools.append(SkillsToolset(skills, self.skills_mode))
435498
else:
436499
logger.warning("No skills loaded.")
437500

501+
self.tools.append(SkillsToolset(self.skills_dict, self.skills_mode))
502+
503+
if self.enable_dynamic_load_skills:
504+
if self.before_agent_callback:
505+
if isinstance(self.before_agent_callback, list):
506+
self.before_agent_callback.append(check_skills)
507+
else:
508+
self.before_agent_callback = [
509+
self.before_agent_callback,
510+
check_skills,
511+
]
512+
else:
513+
self.before_agent_callback = check_skills
514+
515+
def _validate_tool_dependencies(self):
516+
tool_names = set()
517+
for tool in self.tools:
518+
if hasattr(tool, "__name__"):
519+
tool_names.add(tool.__name__)
520+
elif hasattr(tool, "name"):
521+
tool_names.add(tool.name)
522+
523+
has_video_generate = "video_generate" in tool_names
524+
has_video_task_query = "video_task_query" in tool_names
525+
526+
if has_video_generate and not has_video_task_query:
527+
from veadk.tools.builtin_tools.video_generate import video_task_query
528+
529+
logger.warning(
530+
"video_generate tool is mounted but video_task_query is not. "
531+
"video_task_query is required for querying video generation status. "
532+
"Automatically adding video_task_query to tools."
533+
)
534+
self.tools.append(video_task_query)
535+
elif has_video_task_query and not has_video_generate:
536+
from veadk.tools.builtin_tools.video_generate import video_generate
537+
538+
logger.warning(
539+
"video_task_query tool is mounted but video_generate is not. "
540+
"Automatically adding video_generate to tools."
541+
)
542+
self.tools.append(video_generate)
543+
438544
def _prepare_tracers(self):
439545
enable_apmplus_tracer = os.getenv("ENABLE_APMPLUS", "false").lower() == "true"
440546
enable_cozeloop_tracer = os.getenv("ENABLE_COZELOOP", "false").lower() == "true"

veadk/consts.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,10 @@
6565
DEFAULT_IMAGE_EDIT_MODEL_NAME = "doubao-seededit-3-0-i2i-250628"
6666
DEFAULT_IMAGE_EDIT_MODEL_API_BASE = "https://ark.cn-beijing.volces.com/api/v3/"
6767

68-
DEFAULT_VIDEO_MODEL_NAME = "doubao-seedance-1-5-pro-251215"
68+
DEFAULT_VIDEO_MODEL_NAME = "doubao-seedance-2-0-260128"
6969
DEFAULT_VIDEO_MODEL_API_BASE = "https://ark.cn-beijing.volces.com/api/v3/"
7070

71-
DEFAULT_IMAGE_GENERATE_MODEL_NAME = "doubao-seedream-4-5-251128"
71+
DEFAULT_IMAGE_GENERATE_MODEL_NAME = "doubao-seedream-5-0-260128"
7272
DEFAULT_IMAGE_GENERATE_MODEL_API_BASE = "https://ark.cn-beijing.volces.com/api/v3/"
7373

7474
VEFAAS_IAM_CRIDENTIAL_PATH = "/var/run/secrets/iam/credential"

veadk/memory/long_term_memory_backends/vikingdb_memory_backend.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,8 @@ def _get_client(self) -> VikingDBMemoryClient:
152152
ak, sk, sts_token = self._get_ak_sk_sts()
153153
if self.cloud_provider.lower() == "byteplus":
154154
host = f"api-knowledgebase.mlp.{self.region}.bytepluses.com"
155-
155+
else:
156+
host = f"api-knowledgebase.mlp.{self.region}.volces.com"
156157
logger.info(f"Cloud provider: {self.cloud_provider.lower()}")
157158
logger.info(f"VikingDBLTMBackend: region={self.region}, host={host}")
158159

@@ -168,7 +169,8 @@ def _get_sdk_client(self) -> VikingMem:
168169
ak, sk, sts_token = self._get_ak_sk_sts()
169170
if self.cloud_provider.lower() == "byteplus":
170171
host = f"api-knowledgebase.mlp.{self.region}.bytepluses.com"
171-
172+
else:
173+
host = f"api-knowledgebase.mlp.{self.region}.volces.com"
172174
logger.info(f"Cloud provider: {self.cloud_provider.lower()}")
173175
logger.info(f"VikingDBLTMBackend: region={self.region}, host={host}")
174176

0 commit comments

Comments
 (0)