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.
- veadk/__init__.py +37 -0
- veadk/a2a/__init__.py +13 -0
- veadk/a2a/agent_card.py +45 -0
- veadk/a2a/remote_ve_agent.py +390 -0
- veadk/a2a/utils/__init__.py +13 -0
- veadk/a2a/utils/agent_to_a2a.py +170 -0
- veadk/a2a/ve_a2a_server.py +93 -0
- veadk/a2a/ve_agent_executor.py +78 -0
- veadk/a2a/ve_middlewares.py +313 -0
- veadk/a2a/ve_task_store.py +37 -0
- veadk/agent.py +402 -0
- veadk/agent_builder.py +93 -0
- veadk/agents/loop_agent.py +68 -0
- veadk/agents/parallel_agent.py +72 -0
- veadk/agents/sequential_agent.py +64 -0
- veadk/auth/__init__.py +13 -0
- veadk/auth/base_auth.py +22 -0
- veadk/auth/ve_credential_service.py +203 -0
- veadk/auth/veauth/__init__.py +13 -0
- veadk/auth/veauth/apmplus_veauth.py +58 -0
- veadk/auth/veauth/ark_veauth.py +75 -0
- veadk/auth/veauth/base_veauth.py +50 -0
- veadk/auth/veauth/cozeloop_veauth.py +13 -0
- veadk/auth/veauth/opensearch_veauth.py +75 -0
- veadk/auth/veauth/postgresql_veauth.py +75 -0
- veadk/auth/veauth/prompt_pilot_veauth.py +60 -0
- veadk/auth/veauth/speech_veauth.py +54 -0
- veadk/auth/veauth/utils.py +69 -0
- veadk/auth/veauth/vesearch_veauth.py +62 -0
- veadk/auth/veauth/viking_mem0_veauth.py +91 -0
- veadk/cli/__init__.py +13 -0
- veadk/cli/cli.py +58 -0
- veadk/cli/cli_clean.py +87 -0
- veadk/cli/cli_create.py +163 -0
- veadk/cli/cli_deploy.py +233 -0
- veadk/cli/cli_eval.py +215 -0
- veadk/cli/cli_init.py +214 -0
- veadk/cli/cli_kb.py +110 -0
- veadk/cli/cli_pipeline.py +285 -0
- veadk/cli/cli_prompt.py +86 -0
- veadk/cli/cli_update.py +106 -0
- veadk/cli/cli_uploadevalset.py +139 -0
- veadk/cli/cli_web.py +143 -0
- veadk/cloud/__init__.py +13 -0
- veadk/cloud/cloud_agent_engine.py +485 -0
- veadk/cloud/cloud_app.py +475 -0
- veadk/config.py +115 -0
- veadk/configs/__init__.py +13 -0
- veadk/configs/auth_configs.py +133 -0
- veadk/configs/database_configs.py +132 -0
- veadk/configs/model_configs.py +78 -0
- veadk/configs/tool_configs.py +54 -0
- veadk/configs/tracing_configs.py +110 -0
- veadk/consts.py +74 -0
- veadk/evaluation/__init__.py +17 -0
- veadk/evaluation/adk_evaluator/__init__.py +17 -0
- veadk/evaluation/adk_evaluator/adk_evaluator.py +302 -0
- veadk/evaluation/base_evaluator.py +642 -0
- veadk/evaluation/deepeval_evaluator/__init__.py +17 -0
- veadk/evaluation/deepeval_evaluator/deepeval_evaluator.py +339 -0
- veadk/evaluation/eval_set_file_loader.py +48 -0
- veadk/evaluation/eval_set_recorder.py +146 -0
- veadk/evaluation/types.py +65 -0
- veadk/evaluation/utils/prometheus.py +196 -0
- veadk/integrations/__init__.py +13 -0
- veadk/integrations/ve_apig/__init__.py +13 -0
- veadk/integrations/ve_apig/ve_apig.py +349 -0
- veadk/integrations/ve_apig/ve_apig_utils.py +332 -0
- veadk/integrations/ve_code_pipeline/__init__.py +13 -0
- veadk/integrations/ve_code_pipeline/ve_code_pipeline.py +431 -0
- veadk/integrations/ve_cozeloop/__init__.py +13 -0
- veadk/integrations/ve_cozeloop/ve_cozeloop.py +96 -0
- veadk/integrations/ve_cr/__init__.py +13 -0
- veadk/integrations/ve_cr/ve_cr.py +220 -0
- veadk/integrations/ve_faas/__init__.py +13 -0
- veadk/integrations/ve_faas/template/cookiecutter.json +15 -0
- veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/__init__.py +13 -0
- veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/clean.py +23 -0
- veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/config.yaml.example +6 -0
- veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/deploy.py +106 -0
- veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/__init__.py +13 -0
- veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/agent.py +25 -0
- veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/app.py +202 -0
- veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/requirements.txt +3 -0
- veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/run.sh +49 -0
- veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/{{ cookiecutter.app_name }}/__init__.py +14 -0
- veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/{{ cookiecutter.app_name }}/agent.py +27 -0
- veadk/integrations/ve_faas/ve_faas.py +754 -0
- veadk/integrations/ve_faas/ve_faas_utils.py +408 -0
- veadk/integrations/ve_faas/web_template/cookiecutter.json +20 -0
- veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/__init__.py +13 -0
- veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/clean.py +23 -0
- veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/config.yaml.example +2 -0
- veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/deploy.py +44 -0
- veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/Dockerfile +23 -0
- veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/app.py +123 -0
- veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/init_db.py +46 -0
- veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/models.py +36 -0
- veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/requirements.txt +4 -0
- veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/run.sh +21 -0
- veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/static/css/style.css +368 -0
- veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/static/js/admin.js +0 -0
- veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/admin/dashboard.html +21 -0
- veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/admin/edit_post.html +24 -0
- veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/admin/login.html +21 -0
- veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/admin/posts.html +53 -0
- veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/base.html +45 -0
- veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/index.html +29 -0
- veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/post.html +14 -0
- veadk/integrations/ve_identity/__init__.py +110 -0
- veadk/integrations/ve_identity/auth_config.py +261 -0
- veadk/integrations/ve_identity/auth_mixins.py +650 -0
- veadk/integrations/ve_identity/auth_processor.py +385 -0
- veadk/integrations/ve_identity/function_tool.py +158 -0
- veadk/integrations/ve_identity/identity_client.py +864 -0
- veadk/integrations/ve_identity/mcp_tool.py +181 -0
- veadk/integrations/ve_identity/mcp_toolset.py +431 -0
- veadk/integrations/ve_identity/models.py +228 -0
- veadk/integrations/ve_identity/token_manager.py +188 -0
- veadk/integrations/ve_identity/utils.py +151 -0
- veadk/integrations/ve_prompt_pilot/__init__.py +13 -0
- veadk/integrations/ve_prompt_pilot/ve_prompt_pilot.py +85 -0
- veadk/integrations/ve_tls/__init__.py +13 -0
- veadk/integrations/ve_tls/utils.py +116 -0
- veadk/integrations/ve_tls/ve_tls.py +212 -0
- veadk/integrations/ve_tos/ve_tos.py +710 -0
- veadk/integrations/ve_viking_db_memory/__init__.py +13 -0
- veadk/integrations/ve_viking_db_memory/ve_viking_db_memory.py +308 -0
- veadk/knowledgebase/__init__.py +17 -0
- veadk/knowledgebase/backends/__init__.py +13 -0
- veadk/knowledgebase/backends/base_backend.py +72 -0
- veadk/knowledgebase/backends/in_memory_backend.py +91 -0
- veadk/knowledgebase/backends/opensearch_backend.py +162 -0
- veadk/knowledgebase/backends/redis_backend.py +172 -0
- veadk/knowledgebase/backends/utils.py +92 -0
- veadk/knowledgebase/backends/vikingdb_knowledge_backend.py +608 -0
- veadk/knowledgebase/entry.py +25 -0
- veadk/knowledgebase/knowledgebase.py +307 -0
- veadk/memory/__init__.py +35 -0
- veadk/memory/long_term_memory.py +365 -0
- veadk/memory/long_term_memory_backends/__init__.py +13 -0
- veadk/memory/long_term_memory_backends/base_backend.py +35 -0
- veadk/memory/long_term_memory_backends/in_memory_backend.py +67 -0
- veadk/memory/long_term_memory_backends/mem0_backend.py +155 -0
- veadk/memory/long_term_memory_backends/opensearch_backend.py +124 -0
- veadk/memory/long_term_memory_backends/redis_backend.py +140 -0
- veadk/memory/long_term_memory_backends/vikingdb_memory_backend.py +189 -0
- veadk/memory/short_term_memory.py +252 -0
- veadk/memory/short_term_memory_backends/__init__.py +13 -0
- veadk/memory/short_term_memory_backends/base_backend.py +31 -0
- veadk/memory/short_term_memory_backends/mysql_backend.py +49 -0
- veadk/memory/short_term_memory_backends/postgresql_backend.py +49 -0
- veadk/memory/short_term_memory_backends/sqlite_backend.py +55 -0
- veadk/memory/short_term_memory_processor.py +100 -0
- veadk/processors/__init__.py +26 -0
- veadk/processors/base_run_processor.py +120 -0
- veadk/prompts/__init__.py +13 -0
- veadk/prompts/agent_default_prompt.py +30 -0
- veadk/prompts/prompt_evaluator.py +20 -0
- veadk/prompts/prompt_memory_processor.py +55 -0
- veadk/prompts/prompt_optimization.py +150 -0
- veadk/runner.py +732 -0
- veadk/tools/__init__.py +13 -0
- veadk/tools/builtin_tools/__init__.py +13 -0
- veadk/tools/builtin_tools/agent_authorization.py +94 -0
- veadk/tools/builtin_tools/generate_image.py +23 -0
- veadk/tools/builtin_tools/image_edit.py +300 -0
- veadk/tools/builtin_tools/image_generate.py +446 -0
- veadk/tools/builtin_tools/lark.py +67 -0
- veadk/tools/builtin_tools/las.py +24 -0
- veadk/tools/builtin_tools/link_reader.py +66 -0
- veadk/tools/builtin_tools/llm_shield.py +381 -0
- veadk/tools/builtin_tools/load_knowledgebase.py +97 -0
- veadk/tools/builtin_tools/mcp_router.py +29 -0
- veadk/tools/builtin_tools/run_code.py +113 -0
- veadk/tools/builtin_tools/tts.py +253 -0
- veadk/tools/builtin_tools/vesearch.py +49 -0
- veadk/tools/builtin_tools/video_generate.py +363 -0
- veadk/tools/builtin_tools/web_scraper.py +76 -0
- veadk/tools/builtin_tools/web_search.py +83 -0
- veadk/tools/demo_tools.py +58 -0
- veadk/tools/load_knowledgebase_tool.py +149 -0
- veadk/tools/sandbox/__init__.py +13 -0
- veadk/tools/sandbox/browser_sandbox.py +37 -0
- veadk/tools/sandbox/code_sandbox.py +40 -0
- veadk/tools/sandbox/computer_sandbox.py +34 -0
- veadk/tracing/__init__.py +13 -0
- veadk/tracing/base_tracer.py +58 -0
- veadk/tracing/telemetry/__init__.py +13 -0
- veadk/tracing/telemetry/attributes/attributes.py +29 -0
- veadk/tracing/telemetry/attributes/extractors/common_attributes_extractors.py +180 -0
- veadk/tracing/telemetry/attributes/extractors/llm_attributes_extractors.py +858 -0
- veadk/tracing/telemetry/attributes/extractors/tool_attributes_extractors.py +152 -0
- veadk/tracing/telemetry/attributes/extractors/types.py +164 -0
- veadk/tracing/telemetry/exporters/__init__.py +13 -0
- veadk/tracing/telemetry/exporters/apmplus_exporter.py +558 -0
- veadk/tracing/telemetry/exporters/base_exporter.py +39 -0
- veadk/tracing/telemetry/exporters/cozeloop_exporter.py +129 -0
- veadk/tracing/telemetry/exporters/inmemory_exporter.py +248 -0
- veadk/tracing/telemetry/exporters/tls_exporter.py +139 -0
- veadk/tracing/telemetry/opentelemetry_tracer.py +320 -0
- veadk/tracing/telemetry/telemetry.py +411 -0
- veadk/types.py +47 -0
- veadk/utils/__init__.py +13 -0
- veadk/utils/audio_manager.py +95 -0
- veadk/utils/auth.py +294 -0
- veadk/utils/logger.py +59 -0
- veadk/utils/mcp_utils.py +44 -0
- veadk/utils/misc.py +184 -0
- veadk/utils/patches.py +101 -0
- veadk/utils/volcengine_sign.py +205 -0
- veadk/version.py +15 -0
- veadk_python-0.2.27.dist-info/METADATA +373 -0
- veadk_python-0.2.27.dist-info/RECORD +218 -0
- veadk_python-0.2.27.dist-info/WHEEL +5 -0
- veadk_python-0.2.27.dist-info/entry_points.txt +2 -0
- veadk_python-0.2.27.dist-info/licenses/LICENSE +201 -0
- 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)
|
veadk/cloud/__init__.py
ADDED
|
@@ -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.
|