veadk-python 0.2.27__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.
Files changed (218) hide show
  1. veadk/__init__.py +37 -0
  2. veadk/a2a/__init__.py +13 -0
  3. veadk/a2a/agent_card.py +45 -0
  4. veadk/a2a/remote_ve_agent.py +390 -0
  5. veadk/a2a/utils/__init__.py +13 -0
  6. veadk/a2a/utils/agent_to_a2a.py +170 -0
  7. veadk/a2a/ve_a2a_server.py +93 -0
  8. veadk/a2a/ve_agent_executor.py +78 -0
  9. veadk/a2a/ve_middlewares.py +313 -0
  10. veadk/a2a/ve_task_store.py +37 -0
  11. veadk/agent.py +402 -0
  12. veadk/agent_builder.py +93 -0
  13. veadk/agents/loop_agent.py +68 -0
  14. veadk/agents/parallel_agent.py +72 -0
  15. veadk/agents/sequential_agent.py +64 -0
  16. veadk/auth/__init__.py +13 -0
  17. veadk/auth/base_auth.py +22 -0
  18. veadk/auth/ve_credential_service.py +203 -0
  19. veadk/auth/veauth/__init__.py +13 -0
  20. veadk/auth/veauth/apmplus_veauth.py +58 -0
  21. veadk/auth/veauth/ark_veauth.py +75 -0
  22. veadk/auth/veauth/base_veauth.py +50 -0
  23. veadk/auth/veauth/cozeloop_veauth.py +13 -0
  24. veadk/auth/veauth/opensearch_veauth.py +75 -0
  25. veadk/auth/veauth/postgresql_veauth.py +75 -0
  26. veadk/auth/veauth/prompt_pilot_veauth.py +60 -0
  27. veadk/auth/veauth/speech_veauth.py +54 -0
  28. veadk/auth/veauth/utils.py +69 -0
  29. veadk/auth/veauth/vesearch_veauth.py +62 -0
  30. veadk/auth/veauth/viking_mem0_veauth.py +91 -0
  31. veadk/cli/__init__.py +13 -0
  32. veadk/cli/cli.py +58 -0
  33. veadk/cli/cli_clean.py +87 -0
  34. veadk/cli/cli_create.py +163 -0
  35. veadk/cli/cli_deploy.py +233 -0
  36. veadk/cli/cli_eval.py +215 -0
  37. veadk/cli/cli_init.py +214 -0
  38. veadk/cli/cli_kb.py +110 -0
  39. veadk/cli/cli_pipeline.py +285 -0
  40. veadk/cli/cli_prompt.py +86 -0
  41. veadk/cli/cli_update.py +106 -0
  42. veadk/cli/cli_uploadevalset.py +139 -0
  43. veadk/cli/cli_web.py +143 -0
  44. veadk/cloud/__init__.py +13 -0
  45. veadk/cloud/cloud_agent_engine.py +485 -0
  46. veadk/cloud/cloud_app.py +475 -0
  47. veadk/config.py +115 -0
  48. veadk/configs/__init__.py +13 -0
  49. veadk/configs/auth_configs.py +133 -0
  50. veadk/configs/database_configs.py +132 -0
  51. veadk/configs/model_configs.py +78 -0
  52. veadk/configs/tool_configs.py +54 -0
  53. veadk/configs/tracing_configs.py +110 -0
  54. veadk/consts.py +74 -0
  55. veadk/evaluation/__init__.py +17 -0
  56. veadk/evaluation/adk_evaluator/__init__.py +17 -0
  57. veadk/evaluation/adk_evaluator/adk_evaluator.py +302 -0
  58. veadk/evaluation/base_evaluator.py +642 -0
  59. veadk/evaluation/deepeval_evaluator/__init__.py +17 -0
  60. veadk/evaluation/deepeval_evaluator/deepeval_evaluator.py +339 -0
  61. veadk/evaluation/eval_set_file_loader.py +48 -0
  62. veadk/evaluation/eval_set_recorder.py +146 -0
  63. veadk/evaluation/types.py +65 -0
  64. veadk/evaluation/utils/prometheus.py +196 -0
  65. veadk/integrations/__init__.py +13 -0
  66. veadk/integrations/ve_apig/__init__.py +13 -0
  67. veadk/integrations/ve_apig/ve_apig.py +349 -0
  68. veadk/integrations/ve_apig/ve_apig_utils.py +332 -0
  69. veadk/integrations/ve_code_pipeline/__init__.py +13 -0
  70. veadk/integrations/ve_code_pipeline/ve_code_pipeline.py +431 -0
  71. veadk/integrations/ve_cozeloop/__init__.py +13 -0
  72. veadk/integrations/ve_cozeloop/ve_cozeloop.py +96 -0
  73. veadk/integrations/ve_cr/__init__.py +13 -0
  74. veadk/integrations/ve_cr/ve_cr.py +220 -0
  75. veadk/integrations/ve_faas/__init__.py +13 -0
  76. veadk/integrations/ve_faas/template/cookiecutter.json +15 -0
  77. veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/__init__.py +13 -0
  78. veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/clean.py +23 -0
  79. veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/config.yaml.example +6 -0
  80. veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/deploy.py +106 -0
  81. veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/__init__.py +13 -0
  82. veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/agent.py +25 -0
  83. veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/app.py +202 -0
  84. veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/requirements.txt +3 -0
  85. veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/run.sh +49 -0
  86. veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/{{ cookiecutter.app_name }}/__init__.py +14 -0
  87. veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/{{ cookiecutter.app_name }}/agent.py +27 -0
  88. veadk/integrations/ve_faas/ve_faas.py +754 -0
  89. veadk/integrations/ve_faas/ve_faas_utils.py +408 -0
  90. veadk/integrations/ve_faas/web_template/cookiecutter.json +20 -0
  91. veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/__init__.py +13 -0
  92. veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/clean.py +23 -0
  93. veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/config.yaml.example +2 -0
  94. veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/deploy.py +44 -0
  95. veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/Dockerfile +23 -0
  96. veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/app.py +123 -0
  97. veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/init_db.py +46 -0
  98. veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/models.py +36 -0
  99. veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/requirements.txt +4 -0
  100. veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/run.sh +21 -0
  101. veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/static/css/style.css +368 -0
  102. veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/static/js/admin.js +0 -0
  103. veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/admin/dashboard.html +21 -0
  104. veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/admin/edit_post.html +24 -0
  105. veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/admin/login.html +21 -0
  106. veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/admin/posts.html +53 -0
  107. veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/base.html +45 -0
  108. veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/index.html +29 -0
  109. veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/post.html +14 -0
  110. veadk/integrations/ve_identity/__init__.py +110 -0
  111. veadk/integrations/ve_identity/auth_config.py +261 -0
  112. veadk/integrations/ve_identity/auth_mixins.py +650 -0
  113. veadk/integrations/ve_identity/auth_processor.py +385 -0
  114. veadk/integrations/ve_identity/function_tool.py +158 -0
  115. veadk/integrations/ve_identity/identity_client.py +864 -0
  116. veadk/integrations/ve_identity/mcp_tool.py +181 -0
  117. veadk/integrations/ve_identity/mcp_toolset.py +431 -0
  118. veadk/integrations/ve_identity/models.py +228 -0
  119. veadk/integrations/ve_identity/token_manager.py +188 -0
  120. veadk/integrations/ve_identity/utils.py +151 -0
  121. veadk/integrations/ve_prompt_pilot/__init__.py +13 -0
  122. veadk/integrations/ve_prompt_pilot/ve_prompt_pilot.py +85 -0
  123. veadk/integrations/ve_tls/__init__.py +13 -0
  124. veadk/integrations/ve_tls/utils.py +116 -0
  125. veadk/integrations/ve_tls/ve_tls.py +212 -0
  126. veadk/integrations/ve_tos/ve_tos.py +710 -0
  127. veadk/integrations/ve_viking_db_memory/__init__.py +13 -0
  128. veadk/integrations/ve_viking_db_memory/ve_viking_db_memory.py +308 -0
  129. veadk/knowledgebase/__init__.py +17 -0
  130. veadk/knowledgebase/backends/__init__.py +13 -0
  131. veadk/knowledgebase/backends/base_backend.py +72 -0
  132. veadk/knowledgebase/backends/in_memory_backend.py +91 -0
  133. veadk/knowledgebase/backends/opensearch_backend.py +162 -0
  134. veadk/knowledgebase/backends/redis_backend.py +172 -0
  135. veadk/knowledgebase/backends/utils.py +92 -0
  136. veadk/knowledgebase/backends/vikingdb_knowledge_backend.py +608 -0
  137. veadk/knowledgebase/entry.py +25 -0
  138. veadk/knowledgebase/knowledgebase.py +307 -0
  139. veadk/memory/__init__.py +35 -0
  140. veadk/memory/long_term_memory.py +365 -0
  141. veadk/memory/long_term_memory_backends/__init__.py +13 -0
  142. veadk/memory/long_term_memory_backends/base_backend.py +35 -0
  143. veadk/memory/long_term_memory_backends/in_memory_backend.py +67 -0
  144. veadk/memory/long_term_memory_backends/mem0_backend.py +155 -0
  145. veadk/memory/long_term_memory_backends/opensearch_backend.py +124 -0
  146. veadk/memory/long_term_memory_backends/redis_backend.py +140 -0
  147. veadk/memory/long_term_memory_backends/vikingdb_memory_backend.py +189 -0
  148. veadk/memory/short_term_memory.py +252 -0
  149. veadk/memory/short_term_memory_backends/__init__.py +13 -0
  150. veadk/memory/short_term_memory_backends/base_backend.py +31 -0
  151. veadk/memory/short_term_memory_backends/mysql_backend.py +49 -0
  152. veadk/memory/short_term_memory_backends/postgresql_backend.py +49 -0
  153. veadk/memory/short_term_memory_backends/sqlite_backend.py +55 -0
  154. veadk/memory/short_term_memory_processor.py +100 -0
  155. veadk/processors/__init__.py +26 -0
  156. veadk/processors/base_run_processor.py +120 -0
  157. veadk/prompts/__init__.py +13 -0
  158. veadk/prompts/agent_default_prompt.py +30 -0
  159. veadk/prompts/prompt_evaluator.py +20 -0
  160. veadk/prompts/prompt_memory_processor.py +55 -0
  161. veadk/prompts/prompt_optimization.py +150 -0
  162. veadk/runner.py +732 -0
  163. veadk/tools/__init__.py +13 -0
  164. veadk/tools/builtin_tools/__init__.py +13 -0
  165. veadk/tools/builtin_tools/agent_authorization.py +94 -0
  166. veadk/tools/builtin_tools/generate_image.py +23 -0
  167. veadk/tools/builtin_tools/image_edit.py +300 -0
  168. veadk/tools/builtin_tools/image_generate.py +446 -0
  169. veadk/tools/builtin_tools/lark.py +67 -0
  170. veadk/tools/builtin_tools/las.py +24 -0
  171. veadk/tools/builtin_tools/link_reader.py +66 -0
  172. veadk/tools/builtin_tools/llm_shield.py +381 -0
  173. veadk/tools/builtin_tools/load_knowledgebase.py +97 -0
  174. veadk/tools/builtin_tools/mcp_router.py +29 -0
  175. veadk/tools/builtin_tools/run_code.py +113 -0
  176. veadk/tools/builtin_tools/tts.py +253 -0
  177. veadk/tools/builtin_tools/vesearch.py +49 -0
  178. veadk/tools/builtin_tools/video_generate.py +363 -0
  179. veadk/tools/builtin_tools/web_scraper.py +76 -0
  180. veadk/tools/builtin_tools/web_search.py +83 -0
  181. veadk/tools/demo_tools.py +58 -0
  182. veadk/tools/load_knowledgebase_tool.py +149 -0
  183. veadk/tools/sandbox/__init__.py +13 -0
  184. veadk/tools/sandbox/browser_sandbox.py +37 -0
  185. veadk/tools/sandbox/code_sandbox.py +40 -0
  186. veadk/tools/sandbox/computer_sandbox.py +34 -0
  187. veadk/tracing/__init__.py +13 -0
  188. veadk/tracing/base_tracer.py +58 -0
  189. veadk/tracing/telemetry/__init__.py +13 -0
  190. veadk/tracing/telemetry/attributes/attributes.py +29 -0
  191. veadk/tracing/telemetry/attributes/extractors/common_attributes_extractors.py +180 -0
  192. veadk/tracing/telemetry/attributes/extractors/llm_attributes_extractors.py +858 -0
  193. veadk/tracing/telemetry/attributes/extractors/tool_attributes_extractors.py +152 -0
  194. veadk/tracing/telemetry/attributes/extractors/types.py +164 -0
  195. veadk/tracing/telemetry/exporters/__init__.py +13 -0
  196. veadk/tracing/telemetry/exporters/apmplus_exporter.py +558 -0
  197. veadk/tracing/telemetry/exporters/base_exporter.py +39 -0
  198. veadk/tracing/telemetry/exporters/cozeloop_exporter.py +129 -0
  199. veadk/tracing/telemetry/exporters/inmemory_exporter.py +248 -0
  200. veadk/tracing/telemetry/exporters/tls_exporter.py +139 -0
  201. veadk/tracing/telemetry/opentelemetry_tracer.py +320 -0
  202. veadk/tracing/telemetry/telemetry.py +411 -0
  203. veadk/types.py +47 -0
  204. veadk/utils/__init__.py +13 -0
  205. veadk/utils/audio_manager.py +95 -0
  206. veadk/utils/auth.py +294 -0
  207. veadk/utils/logger.py +59 -0
  208. veadk/utils/mcp_utils.py +44 -0
  209. veadk/utils/misc.py +184 -0
  210. veadk/utils/patches.py +101 -0
  211. veadk/utils/volcengine_sign.py +205 -0
  212. veadk/version.py +15 -0
  213. veadk_python-0.2.27.dist-info/METADATA +373 -0
  214. veadk_python-0.2.27.dist-info/RECORD +218 -0
  215. veadk_python-0.2.27.dist-info/WHEEL +5 -0
  216. veadk_python-0.2.27.dist-info/entry_points.txt +2 -0
  217. veadk_python-0.2.27.dist-info/licenses/LICENSE +201 -0
  218. veadk_python-0.2.27.dist-info/top_level.txt +1 -0
@@ -0,0 +1,139 @@
1
+ # Copyright (c) 2025 Beijing Volcano Engine Technology Co., Ltd. and/or its affiliates.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ import click
16
+ import json
17
+ import requests
18
+ from veadk.utils.logger import get_logger
19
+ from veadk.config import getenv
20
+ from pathlib import Path
21
+
22
+ logger = get_logger(__name__)
23
+
24
+
25
+ @click.command()
26
+ @click.option("--file", required=True, help="JSON file path containing dataset items")
27
+ @click.option("--cozeloop-workspace-id", default=None, help="CozeLoop workspace ID")
28
+ @click.option("--cozeloop-evalset-id", default=None, help="CozeLoop evaluation set ID")
29
+ @click.option(
30
+ "--cozeloop-api-key",
31
+ default=None,
32
+ help="CozeLoop API key (or set COZELOOP_API_KEY env var)",
33
+ )
34
+ def uploadevalset(
35
+ file: str,
36
+ cozeloop_workspace_id: str,
37
+ cozeloop_evalset_id: str,
38
+ cozeloop_api_key: str,
39
+ ) -> None:
40
+ """Upload dataset items to CozeLoop evaluation set.
41
+
42
+ This command uploads evaluation dataset items from a JSON file to the CozeLoop
43
+ platform for agent evaluation and testing. It processes Google ADK formatted
44
+ evaluation cases and converts them to CozeLoop's expected format.
45
+
46
+ Args:
47
+ file: Path to the JSON file containing dataset items in Google ADK format.
48
+ cozeloop_workspace_id: CozeLoop workspace identifier for organizing evaluation sets.
49
+ If not provided, uses OBSERVABILITY_OPENTELEMETRY_COZELOOP_SERVICE_NAME environment variable.
50
+ cozeloop_evalset_id: Specific evaluation set ID where items will be uploaded.
51
+ If not provided, uses OBSERVABILITY_OPENTELEMETRY_COZELOOP_EVALSET_ID environment variable.
52
+ cozeloop_api_key: API key for authenticating with CozeLoop services.
53
+ If not provided, uses OBSERVABILITY_OPENTELEMETRY_COZELOOP_API_KEY environment variable.
54
+ """
55
+
56
+ if not cozeloop_workspace_id:
57
+ cozeloop_workspace_id = getenv(
58
+ "OBSERVABILITY_OPENTELEMETRY_COZELOOP_SERVICE_NAME"
59
+ )
60
+ if not cozeloop_evalset_id:
61
+ cozeloop_evalset_id = getenv("OBSERVABILITY_OPENTELEMETRY_COZELOOP_EVALSET_ID")
62
+ if not cozeloop_api_key:
63
+ cozeloop_api_key = getenv("OBSERVABILITY_OPENTELEMETRY_COZELOOP_API_KEY")
64
+
65
+ # Read JSON file
66
+ file_path = Path(file)
67
+ if not file_path.exists():
68
+ logger.error(f"File not found: {file}")
69
+ return
70
+
71
+ logger.info(f"Reading dataset from {file}")
72
+ with open(file_path, "r", encoding="utf-8") as f:
73
+ data = json.load(f)
74
+
75
+ # Prepare items
76
+ items = []
77
+ for case in data.get("eval_cases", []):
78
+ conversation = case.get("conversation", [])
79
+ for turn in conversation:
80
+ user_text = (
81
+ turn.get("user_content", {}).get("parts", [{}])[0].get("text", "")
82
+ )
83
+ output_text = (
84
+ turn.get("final_response", {}).get("parts", [{}])[0].get("text", "")
85
+ )
86
+
87
+ items.append(
88
+ {
89
+ "turns": [
90
+ {
91
+ "field_datas": [
92
+ {
93
+ "name": "input",
94
+ "content": {
95
+ "content_type": "Text",
96
+ "text": user_text,
97
+ },
98
+ },
99
+ {
100
+ "name": "output",
101
+ "content": {
102
+ "content_type": "Text",
103
+ "text": output_text,
104
+ },
105
+ },
106
+ ]
107
+ }
108
+ ]
109
+ }
110
+ )
111
+
112
+ # Upload to CozeLoop
113
+ url = f"https://api.coze.cn/v1/loop/evaluation/evaluation_sets/{cozeloop_evalset_id}/items"
114
+ logger.info(
115
+ f"Uploading {len(items)} items to workspace_id={cozeloop_workspace_id} evalset_id={cozeloop_evalset_id}"
116
+ )
117
+
118
+ response = requests.post(
119
+ url=url,
120
+ headers={
121
+ "Authorization": f"Bearer {cozeloop_api_key}",
122
+ "Content-Type": "application/json",
123
+ "X-TT-ENV": "ppe_eval_openapi",
124
+ "x-use-ppe": "1",
125
+ },
126
+ json={
127
+ "workspace_id": cozeloop_workspace_id,
128
+ "is_allow_partial_add": True,
129
+ "is_skip_invalid_items": True,
130
+ "items": items,
131
+ },
132
+ )
133
+
134
+ if response.status_code == 200:
135
+ logger.info(
136
+ f"Successfully uploaded dataset to CozeLoop evalset {cozeloop_evalset_id}"
137
+ )
138
+ else:
139
+ logger.error(f"Failed to upload dataset: {response.text}")
veadk/cli/cli_web.py ADDED
@@ -0,0 +1,143 @@
1
+ # Copyright (c) 2025 Beijing Volcano Engine Technology Co., Ltd. and/or its affiliates.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from functools import wraps
16
+
17
+ import click
18
+
19
+ from veadk.utils.logger import get_logger
20
+
21
+ logger = get_logger(__name__)
22
+
23
+
24
+ def patch_adkwebserver_disable_openapi():
25
+ """
26
+ Monkey patch AdkWebServer to disable OpenAPI documentation endpoints.
27
+
28
+ This function patches the AdkWebServer.get_fast_api_app method to remove
29
+ OpenAPI-related routes (/openapi.json, /docs, /redoc) from the FastAPI
30
+ application for security and simplicity purposes.
31
+
32
+ The patch is applied by replacing the original method with a wrapped version
33
+ that filters out the unwanted routes after the FastAPI app is created.
34
+ """
35
+ import google.adk.cli.adk_web_server
36
+ from fastapi.routing import APIRoute
37
+ from starlette.routing import Route
38
+
39
+ original_get_fast_api = google.adk.cli.adk_web_server.AdkWebServer.get_fast_api_app
40
+
41
+ def wrapped_get_fast_api(self, *args, **kwargs):
42
+ app = original_get_fast_api(self, *args, **kwargs)
43
+
44
+ paths = ["/openapi.json", "/docs", "/redoc"]
45
+ new_routes = []
46
+ for route in app.router.routes:
47
+ if isinstance(route, (APIRoute, Route)) and route.path in paths:
48
+ continue
49
+ new_routes.append(route)
50
+ app.router.routes = new_routes
51
+
52
+ return app
53
+
54
+ google.adk.cli.adk_web_server.AdkWebServer.get_fast_api_app = wrapped_get_fast_api
55
+
56
+
57
+ @click.command(
58
+ context_settings=dict(ignore_unknown_options=True, allow_extra_args=True)
59
+ )
60
+ @click.pass_context
61
+ def web(ctx, *args, **kwargs) -> None:
62
+ """
63
+ Launch a web server with VeADK agent support and memory integration.
64
+
65
+ This command starts a web server that can serve VeADK agents with both
66
+ short-term and long-term memory capabilities. It automatically detects
67
+ the type of agent being loaded and configures the appropriate memory
68
+ services accordingly.
69
+
70
+ The function patches the ADK web server to integrate VeADK-specific
71
+ functionality, including memory service configuration and workflow
72
+ agent detection.
73
+
74
+ Args:
75
+ ctx: Click context object containing command line arguments
76
+
77
+ Note:
78
+ For workflow agents (Sequential, Loop, Parallel), individual sub-agent
79
+ memory configurations are not utilized as warned in the logs.
80
+ """
81
+ from google.adk.cli import adk_web_server
82
+ from google.adk.runners import Runner as ADKRunner
83
+
84
+ from veadk import Agent
85
+ from veadk.agents.loop_agent import LoopAgent
86
+ from veadk.agents.parallel_agent import ParallelAgent
87
+ from veadk.agents.sequential_agent import SequentialAgent
88
+
89
+ def before_get_runner_async(func):
90
+ logger.info("Hook before `get_runner_async`")
91
+
92
+ @wraps(func)
93
+ async def wrapper(*args, **kwargs) -> ADKRunner:
94
+ self: adk_web_server.AdkWebServer = args[0]
95
+ app_name: str = args[1]
96
+ """Returns the cached runner for the given app."""
97
+ agent_or_app = self.agent_loader.load_agent(app_name)
98
+
99
+ if isinstance(agent_or_app, (SequentialAgent, LoopAgent, ParallelAgent)):
100
+ logger.warning(
101
+ "Detect VeADK workflow agent, the short-term memory and long-term memory of each sub agent are useless."
102
+ )
103
+
104
+ if isinstance(agent_or_app, Agent):
105
+ logger.info("Detect VeADK Agent.")
106
+
107
+ if agent_or_app.short_term_memory:
108
+ self.session_service = (
109
+ agent_or_app.short_term_memory.session_service
110
+ )
111
+
112
+ if agent_or_app.long_term_memory:
113
+ self.memory_service = agent_or_app.long_term_memory
114
+ logger.info(
115
+ f"Long term memory backend is {self.memory_service.backend}"
116
+ )
117
+
118
+ logger.info(
119
+ f"Current session_service={self.session_service.__class__.__name__}, memory_service={self.memory_service.__class__.__name__}"
120
+ )
121
+
122
+ runner = await func(*args, **kwargs)
123
+ return runner
124
+
125
+ return wrapper
126
+
127
+ adk_web_server.AdkWebServer.get_runner_async = before_get_runner_async(
128
+ adk_web_server.AdkWebServer.get_runner_async
129
+ )
130
+
131
+ patch_adkwebserver_disable_openapi()
132
+
133
+ from google.adk.cli.cli_tools_click import cli_web
134
+
135
+ extra_args: list = ctx.args
136
+ logger.debug(f"User args: {extra_args}")
137
+
138
+ # set a default log level to avoid unnecessary outputs
139
+ # from Google ADK and Litellm
140
+ if "--log_level" not in extra_args:
141
+ extra_args.extend(["--log_level", "ERROR"])
142
+
143
+ cli_web.main(args=extra_args, standalone_mode=False)
@@ -0,0 +1,13 @@
1
+ # Copyright (c) 2025 Beijing Volcano Engine Technology Co., Ltd. and/or its affiliates.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.