veadk-python 0.2.7__py3-none-any.whl → 0.2.9__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 +3 -2
- veadk/auth/veauth/opensearch_veauth.py +75 -0
- veadk/auth/veauth/postgresql_veauth.py +75 -0
- veadk/cli/cli.py +3 -1
- veadk/cli/cli_eval.py +160 -0
- veadk/cli/cli_prompt.py +9 -2
- veadk/cli/cli_web.py +6 -1
- veadk/configs/database_configs.py +43 -0
- veadk/configs/model_configs.py +32 -0
- veadk/consts.py +11 -4
- veadk/evaluation/adk_evaluator/adk_evaluator.py +5 -2
- veadk/evaluation/base_evaluator.py +95 -68
- veadk/evaluation/deepeval_evaluator/deepeval_evaluator.py +23 -15
- veadk/evaluation/eval_set_recorder.py +2 -2
- veadk/integrations/ve_prompt_pilot/ve_prompt_pilot.py +9 -3
- veadk/integrations/ve_tls/utils.py +1 -2
- veadk/integrations/ve_tls/ve_tls.py +9 -5
- veadk/integrations/ve_tos/ve_tos.py +542 -68
- veadk/knowledgebase/backends/base_backend.py +59 -0
- veadk/knowledgebase/backends/in_memory_backend.py +82 -0
- veadk/knowledgebase/backends/opensearch_backend.py +136 -0
- veadk/knowledgebase/backends/redis_backend.py +144 -0
- veadk/knowledgebase/backends/utils.py +91 -0
- veadk/knowledgebase/backends/vikingdb_knowledge_backend.py +524 -0
- veadk/{database/__init__.py → knowledgebase/entry.py} +10 -2
- veadk/knowledgebase/knowledgebase.py +120 -139
- veadk/memory/__init__.py +22 -0
- veadk/memory/long_term_memory.py +124 -41
- veadk/{database/base_database.py → memory/long_term_memory_backends/base_backend.py} +10 -22
- veadk/memory/long_term_memory_backends/in_memory_backend.py +65 -0
- veadk/memory/long_term_memory_backends/mem0_backend.py +129 -0
- veadk/memory/long_term_memory_backends/opensearch_backend.py +120 -0
- veadk/memory/long_term_memory_backends/redis_backend.py +127 -0
- veadk/memory/long_term_memory_backends/vikingdb_memory_backend.py +148 -0
- veadk/memory/short_term_memory.py +80 -72
- veadk/memory/short_term_memory_backends/base_backend.py +31 -0
- veadk/memory/short_term_memory_backends/mysql_backend.py +41 -0
- veadk/memory/short_term_memory_backends/postgresql_backend.py +41 -0
- veadk/memory/short_term_memory_backends/sqlite_backend.py +48 -0
- veadk/runner.py +12 -19
- veadk/tools/builtin_tools/generate_image.py +355 -0
- veadk/tools/builtin_tools/image_edit.py +56 -16
- veadk/tools/builtin_tools/image_generate.py +51 -15
- veadk/tools/builtin_tools/video_generate.py +41 -41
- veadk/tools/builtin_tools/web_scraper.py +1 -1
- veadk/tools/builtin_tools/web_search.py +7 -7
- veadk/tools/load_knowledgebase_tool.py +2 -8
- veadk/tracing/telemetry/attributes/extractors/llm_attributes_extractors.py +21 -3
- veadk/tracing/telemetry/exporters/apmplus_exporter.py +24 -6
- veadk/tracing/telemetry/exporters/cozeloop_exporter.py +2 -0
- veadk/tracing/telemetry/exporters/inmemory_exporter.py +22 -8
- veadk/tracing/telemetry/exporters/tls_exporter.py +2 -0
- veadk/tracing/telemetry/opentelemetry_tracer.py +13 -10
- veadk/tracing/telemetry/telemetry.py +66 -63
- veadk/utils/misc.py +15 -0
- veadk/version.py +1 -1
- {veadk_python-0.2.7.dist-info → veadk_python-0.2.9.dist-info}/METADATA +28 -5
- {veadk_python-0.2.7.dist-info → veadk_python-0.2.9.dist-info}/RECORD +65 -56
- veadk/database/database_adapter.py +0 -533
- veadk/database/database_factory.py +0 -80
- veadk/database/kv/redis_database.py +0 -159
- veadk/database/local_database.py +0 -62
- veadk/database/relational/mysql_database.py +0 -173
- veadk/database/vector/opensearch_vector_database.py +0 -263
- veadk/database/vector/type.py +0 -50
- veadk/database/viking/__init__.py +0 -13
- veadk/database/viking/viking_database.py +0 -638
- veadk/database/viking/viking_memory_db.py +0 -525
- /veadk/{database/kv → knowledgebase/backends}/__init__.py +0 -0
- /veadk/{database/relational → memory/long_term_memory_backends}/__init__.py +0 -0
- /veadk/{database/vector → memory/short_term_memory_backends}/__init__.py +0 -0
- {veadk_python-0.2.7.dist-info → veadk_python-0.2.9.dist-info}/WHEEL +0 -0
- {veadk_python-0.2.7.dist-info → veadk_python-0.2.9.dist-info}/entry_points.txt +0 -0
- {veadk_python-0.2.7.dist-info → veadk_python-0.2.9.dist-info}/licenses/LICENSE +0 -0
- {veadk_python-0.2.7.dist-info → veadk_python-0.2.9.dist-info}/top_level.txt +0 -0
veadk/agent.py
CHANGED
|
@@ -84,6 +84,9 @@ class Agent(LlmAgent):
|
|
|
84
84
|
knowledgebase: Optional[KnowledgeBase] = None
|
|
85
85
|
"""The knowledgebase provided to agent."""
|
|
86
86
|
|
|
87
|
+
short_term_memory: Optional[ShortTermMemory] = None
|
|
88
|
+
"""The short term memory provided to agent."""
|
|
89
|
+
|
|
87
90
|
long_term_memory: Optional[LongTermMemory] = None
|
|
88
91
|
"""The long term memory provided to agent.
|
|
89
92
|
|
|
@@ -196,7 +199,6 @@ class Agent(LlmAgent):
|
|
|
196
199
|
collect_runtime_data: bool = False,
|
|
197
200
|
eval_set_id: str = "",
|
|
198
201
|
save_session_to_memory: bool = False,
|
|
199
|
-
enable_memory_optimization: bool = False,
|
|
200
202
|
):
|
|
201
203
|
"""Running the agent. The runner and session service will be created automatically.
|
|
202
204
|
|
|
@@ -226,7 +228,6 @@ class Agent(LlmAgent):
|
|
|
226
228
|
# memory service
|
|
227
229
|
short_term_memory = ShortTermMemory(
|
|
228
230
|
backend="database" if load_history_sessions_from_db else "local",
|
|
229
|
-
enable_memory_optimization=enable_memory_optimization,
|
|
230
231
|
db_url=db_url,
|
|
231
232
|
)
|
|
232
233
|
session_service = short_term_memory.session_service
|
|
@@ -0,0 +1,75 @@
|
|
|
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
|
+
# Copyright (c) 2025 Beijing Volcano Engine Technology Co., Ltd. and/or its affiliates.
|
|
16
|
+
#
|
|
17
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
18
|
+
# you may not use this file except in compliance with the License.
|
|
19
|
+
# You may obtain a copy of the License at
|
|
20
|
+
#
|
|
21
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
22
|
+
#
|
|
23
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
24
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
25
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
26
|
+
# See the License for the specific language governing permissions and
|
|
27
|
+
# limitations under the License.
|
|
28
|
+
|
|
29
|
+
import os
|
|
30
|
+
|
|
31
|
+
from typing_extensions import override
|
|
32
|
+
|
|
33
|
+
from veadk.auth.veauth.base_veauth import BaseVeAuth
|
|
34
|
+
from veadk.utils.logger import get_logger
|
|
35
|
+
|
|
36
|
+
# from veadk.utils.volcengine_sign import ve_request
|
|
37
|
+
|
|
38
|
+
logger = get_logger(__name__)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class OpensearchVeAuth(BaseVeAuth):
|
|
42
|
+
def __init__(
|
|
43
|
+
self,
|
|
44
|
+
access_key: str = os.getenv("VOLCENGINE_ACCESS_KEY", ""),
|
|
45
|
+
secret_key: str = os.getenv("VOLCENGINE_SECRET_KEY", ""),
|
|
46
|
+
) -> None:
|
|
47
|
+
super().__init__(access_key, secret_key)
|
|
48
|
+
|
|
49
|
+
self._token: str = ""
|
|
50
|
+
|
|
51
|
+
@override
|
|
52
|
+
def _fetch_token(self) -> None:
|
|
53
|
+
logger.info("Fetching Opensearch STS token...")
|
|
54
|
+
|
|
55
|
+
# res = ve_request(
|
|
56
|
+
# request_body={},
|
|
57
|
+
# action="GetOrCreatePromptPilotAPIKeys",
|
|
58
|
+
# ak=self.access_key,
|
|
59
|
+
# sk=self.secret_key,
|
|
60
|
+
# service="ark",
|
|
61
|
+
# version="2024-01-01",
|
|
62
|
+
# region="cn-beijing",
|
|
63
|
+
# host="open.volcengineapi.com",
|
|
64
|
+
# )
|
|
65
|
+
# try:
|
|
66
|
+
# self._token = res["Result"]["APIKeys"][0]["APIKey"]
|
|
67
|
+
# except KeyError:
|
|
68
|
+
# raise ValueError(f"Failed to get Prompt Pilot token: {res}")
|
|
69
|
+
|
|
70
|
+
@property
|
|
71
|
+
def token(self) -> str:
|
|
72
|
+
if self._token:
|
|
73
|
+
return self._token
|
|
74
|
+
self._fetch_token()
|
|
75
|
+
return self._token
|
|
@@ -0,0 +1,75 @@
|
|
|
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
|
+
# Copyright (c) 2025 Beijing Volcano Engine Technology Co., Ltd. and/or its affiliates.
|
|
16
|
+
#
|
|
17
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
18
|
+
# you may not use this file except in compliance with the License.
|
|
19
|
+
# You may obtain a copy of the License at
|
|
20
|
+
#
|
|
21
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
22
|
+
#
|
|
23
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
24
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
25
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
26
|
+
# See the License for the specific language governing permissions and
|
|
27
|
+
# limitations under the License.
|
|
28
|
+
|
|
29
|
+
import os
|
|
30
|
+
|
|
31
|
+
from typing_extensions import override
|
|
32
|
+
|
|
33
|
+
from veadk.auth.veauth.base_veauth import BaseVeAuth
|
|
34
|
+
from veadk.utils.logger import get_logger
|
|
35
|
+
|
|
36
|
+
# from veadk.utils.volcengine_sign import ve_request
|
|
37
|
+
|
|
38
|
+
logger = get_logger(__name__)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class PostgreSqlVeAuth(BaseVeAuth):
|
|
42
|
+
def __init__(
|
|
43
|
+
self,
|
|
44
|
+
access_key: str = os.getenv("VOLCENGINE_ACCESS_KEY", ""),
|
|
45
|
+
secret_key: str = os.getenv("VOLCENGINE_SECRET_KEY", ""),
|
|
46
|
+
) -> None:
|
|
47
|
+
super().__init__(access_key, secret_key)
|
|
48
|
+
|
|
49
|
+
self._token: str = ""
|
|
50
|
+
|
|
51
|
+
@override
|
|
52
|
+
def _fetch_token(self) -> None:
|
|
53
|
+
logger.info("Fetching PostgreSQL STS token...")
|
|
54
|
+
|
|
55
|
+
# res = ve_request(
|
|
56
|
+
# request_body={},
|
|
57
|
+
# action="GetOrCreatePromptPilotAPIKeys",
|
|
58
|
+
# ak=self.access_key,
|
|
59
|
+
# sk=self.secret_key,
|
|
60
|
+
# service="ark",
|
|
61
|
+
# version="2024-01-01",
|
|
62
|
+
# region="cn-beijing",
|
|
63
|
+
# host="open.volcengineapi.com",
|
|
64
|
+
# )
|
|
65
|
+
# try:
|
|
66
|
+
# self._token = res["Result"]["APIKeys"][0]["APIKey"]
|
|
67
|
+
# except KeyError:
|
|
68
|
+
# raise ValueError(f"Failed to get Prompt Pilot token: {res}")
|
|
69
|
+
|
|
70
|
+
@property
|
|
71
|
+
def token(self) -> str:
|
|
72
|
+
if self._token:
|
|
73
|
+
return self._token
|
|
74
|
+
self._fetch_token()
|
|
75
|
+
return self._token
|
veadk/cli/cli.py
CHANGED
|
@@ -16,10 +16,11 @@
|
|
|
16
16
|
import click
|
|
17
17
|
|
|
18
18
|
from veadk.cli.cli_deploy import deploy
|
|
19
|
+
from veadk.cli.cli_eval import eval
|
|
19
20
|
from veadk.cli.cli_init import init
|
|
21
|
+
from veadk.cli.cli_pipeline import pipeline
|
|
20
22
|
from veadk.cli.cli_prompt import prompt
|
|
21
23
|
from veadk.cli.cli_web import web
|
|
22
|
-
from veadk.cli.cli_pipeline import pipeline
|
|
23
24
|
from veadk.version import VERSION
|
|
24
25
|
|
|
25
26
|
|
|
@@ -37,6 +38,7 @@ veadk.add_command(init)
|
|
|
37
38
|
veadk.add_command(prompt)
|
|
38
39
|
veadk.add_command(web)
|
|
39
40
|
veadk.add_command(pipeline)
|
|
41
|
+
veadk.add_command(eval)
|
|
40
42
|
|
|
41
43
|
if __name__ == "__main__":
|
|
42
44
|
veadk()
|
veadk/cli/cli_eval.py
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
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
|
+
|
|
17
|
+
from veadk.utils.logger import get_logger
|
|
18
|
+
|
|
19
|
+
logger = get_logger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@click.command()
|
|
23
|
+
@click.option(
|
|
24
|
+
"--agent-dir",
|
|
25
|
+
default=".",
|
|
26
|
+
help="To-be-evaluated agent directory. Must export `root_agent` in `agent.py`",
|
|
27
|
+
)
|
|
28
|
+
@click.option(
|
|
29
|
+
"--agent-a2a-url",
|
|
30
|
+
default=None,
|
|
31
|
+
help="To-be-evaluated agent URL. The agent should be deployed as A2A mode.",
|
|
32
|
+
)
|
|
33
|
+
@click.option(
|
|
34
|
+
"--evalset-file",
|
|
35
|
+
required=True,
|
|
36
|
+
help="Google ADK formatted evalset file path",
|
|
37
|
+
)
|
|
38
|
+
@click.option(
|
|
39
|
+
"--evaluator",
|
|
40
|
+
type=click.Choice(["adk", "deepeval"], case_sensitive=False),
|
|
41
|
+
help="Evaluator type, choose `adk` or `deepeval`",
|
|
42
|
+
)
|
|
43
|
+
@click.option(
|
|
44
|
+
"--judge-model-name",
|
|
45
|
+
default="doubao-1-5-pro-256k-250115",
|
|
46
|
+
help="Judge model name, default is `doubao-1-5-pro-256k-250115`. Useless under `adk` evaluator.",
|
|
47
|
+
)
|
|
48
|
+
@click.option(
|
|
49
|
+
"--volcengine-access-key",
|
|
50
|
+
default=None,
|
|
51
|
+
help="Volcengine access key for using Volcengine models",
|
|
52
|
+
)
|
|
53
|
+
@click.option(
|
|
54
|
+
"--volcengine-secret-key",
|
|
55
|
+
default=None,
|
|
56
|
+
help="Volcengine secret key for using Volcengine models",
|
|
57
|
+
)
|
|
58
|
+
def eval(
|
|
59
|
+
agent_dir: str,
|
|
60
|
+
agent_a2a_url: str,
|
|
61
|
+
evalset_file: str,
|
|
62
|
+
evaluator: str,
|
|
63
|
+
judge_model_name: str,
|
|
64
|
+
volcengine_access_key: str,
|
|
65
|
+
volcengine_secret_key: str,
|
|
66
|
+
) -> None:
|
|
67
|
+
import asyncio
|
|
68
|
+
import os
|
|
69
|
+
from pathlib import Path
|
|
70
|
+
|
|
71
|
+
from google.adk.cli.utils.agent_loader import AgentLoader
|
|
72
|
+
|
|
73
|
+
from veadk.a2a.remote_ve_agent import RemoteVeAgent
|
|
74
|
+
from veadk.config import getenv, settings
|
|
75
|
+
from veadk.prompts.prompt_evaluator import eval_principle_prompt
|
|
76
|
+
|
|
77
|
+
try:
|
|
78
|
+
from deepeval.metrics import GEval, ToolCorrectnessMetric
|
|
79
|
+
from deepeval.test_case import LLMTestCaseParams
|
|
80
|
+
|
|
81
|
+
from veadk.evaluation.adk_evaluator import ADKEvaluator
|
|
82
|
+
from veadk.evaluation.deepeval_evaluator import DeepevalEvaluator
|
|
83
|
+
except ImportError:
|
|
84
|
+
raise ImportError(
|
|
85
|
+
"Please install veadk with `[evaluation]` extras, e.g., `pip install veadk-python[eval]`"
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
# ====== prepare agent instance ======
|
|
89
|
+
if not agent_dir and not agent_a2a_url:
|
|
90
|
+
raise ValueError(
|
|
91
|
+
"Option `--agent-dir` or `--agent-a2a-url` should be provided one of them."
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
if agent_dir and agent_a2a_url:
|
|
95
|
+
logger.warning(
|
|
96
|
+
"`--agent-dir` and `--agent-a2a-url` are both provided, will use `--agent-a2a-url`."
|
|
97
|
+
)
|
|
98
|
+
agent_instance = RemoteVeAgent(name="a2a_agent", url=agent_a2a_url)
|
|
99
|
+
logger.info(f"Loaded agent from {agent_a2a_url}")
|
|
100
|
+
|
|
101
|
+
if not agent_dir and agent_a2a_url:
|
|
102
|
+
agent_instance = RemoteVeAgent(name="a2a_agent", url=agent_a2a_url)
|
|
103
|
+
logger.info(f"Loaded agent from {agent_a2a_url}")
|
|
104
|
+
|
|
105
|
+
if agent_dir and not agent_a2a_url:
|
|
106
|
+
agent_instance = AgentLoader(str(Path(agent_dir).parent.resolve())).load_agent(
|
|
107
|
+
str(Path(agent_dir).name)
|
|
108
|
+
)
|
|
109
|
+
logger.info(f"Loaded agent from {agent_dir}, agent name: {agent_instance.name}")
|
|
110
|
+
|
|
111
|
+
# ====== prepare envs ======
|
|
112
|
+
if volcengine_access_key and "VOLCENGINE_ACCESS_KEY" not in os.environ:
|
|
113
|
+
os.environ["VOLCENGINE_ACCESS_KEY"] = volcengine_access_key
|
|
114
|
+
if volcengine_secret_key and "VOLCENGINE_SECRET_KEY" not in os.environ:
|
|
115
|
+
os.environ["VOLCENGINE_SECRET_KEY"] = volcengine_secret_key
|
|
116
|
+
|
|
117
|
+
# ====== prepare evaluator instance ======
|
|
118
|
+
evaluator_instance = None
|
|
119
|
+
if evaluator == "adk" and judge_model_name:
|
|
120
|
+
logger.warning(
|
|
121
|
+
"Using Google ADK evaluator, `--judge-model-name` will be ignored."
|
|
122
|
+
)
|
|
123
|
+
evaluator_instance = ADKEvaluator(agent=agent_instance)
|
|
124
|
+
|
|
125
|
+
asyncio.run(evaluator_instance.evaluate(eval_set_file_path=evalset_file))
|
|
126
|
+
|
|
127
|
+
if evaluator == "deepeval":
|
|
128
|
+
if not volcengine_access_key:
|
|
129
|
+
volcengine_access_key = getenv("VOLCENGINE_ACCESS_KEY")
|
|
130
|
+
if not volcengine_secret_key:
|
|
131
|
+
volcengine_secret_key = getenv("VOLCENGINE_SECRET_KEY")
|
|
132
|
+
|
|
133
|
+
evaluator_instance = DeepevalEvaluator(
|
|
134
|
+
agent=agent_instance,
|
|
135
|
+
judge_model_api_key=settings.model.api_key,
|
|
136
|
+
judge_model_name=judge_model_name,
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
judge_model = evaluator_instance.judge_model
|
|
140
|
+
|
|
141
|
+
metrics = [
|
|
142
|
+
GEval(
|
|
143
|
+
threshold=0.8,
|
|
144
|
+
name="Base Evaluation",
|
|
145
|
+
criteria=eval_principle_prompt,
|
|
146
|
+
evaluation_params=[
|
|
147
|
+
LLMTestCaseParams.INPUT,
|
|
148
|
+
LLMTestCaseParams.ACTUAL_OUTPUT,
|
|
149
|
+
LLMTestCaseParams.EXPECTED_OUTPUT,
|
|
150
|
+
],
|
|
151
|
+
model=judge_model,
|
|
152
|
+
),
|
|
153
|
+
ToolCorrectnessMetric(threshold=0.5),
|
|
154
|
+
]
|
|
155
|
+
|
|
156
|
+
asyncio.run(
|
|
157
|
+
evaluator_instance.evaluate(
|
|
158
|
+
eval_set_file_path=evalset_file, metrics=metrics
|
|
159
|
+
)
|
|
160
|
+
)
|
veadk/cli/cli_prompt.py
CHANGED
|
@@ -21,12 +21,15 @@ import click
|
|
|
21
21
|
)
|
|
22
22
|
@click.option("--feedback", default="", help="Suggestions for prompt optimization")
|
|
23
23
|
@click.option("--api-key", default="", help="API Key of PromptPilot")
|
|
24
|
+
@click.option("--workspace-id", default="", help="Workspace ID of PromptPilot")
|
|
24
25
|
@click.option(
|
|
25
26
|
"--model-name",
|
|
26
27
|
default="doubao-1.5-pro-32k-250115",
|
|
27
28
|
help="Model name for prompt optimization",
|
|
28
29
|
)
|
|
29
|
-
def prompt(
|
|
30
|
+
def prompt(
|
|
31
|
+
path: str, feedback: str, api_key: str, workspace_id: str, model_name: str
|
|
32
|
+
) -> None:
|
|
30
33
|
"""Optimize agent system prompt from a local file."""
|
|
31
34
|
from pathlib import Path
|
|
32
35
|
|
|
@@ -56,7 +59,11 @@ def prompt(path: str, feedback: str, api_key: str, model_name: str) -> None:
|
|
|
56
59
|
|
|
57
60
|
if not api_key:
|
|
58
61
|
api_key = settings.prompt_pilot.api_key
|
|
59
|
-
|
|
62
|
+
|
|
63
|
+
if not workspace_id:
|
|
64
|
+
raise ValueError("Please provide workspace_id for PromptPilot service.")
|
|
65
|
+
|
|
66
|
+
ve_prompt_pilot = VePromptPilot(api_key=api_key, workspace_id=workspace_id)
|
|
60
67
|
ve_prompt_pilot.optimize(
|
|
61
68
|
agents=agents, feedback=feedback, model_name=model_name
|
|
62
69
|
)
|
veadk/cli/cli_web.py
CHANGED
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from typing import Optional
|
|
15
16
|
|
|
16
17
|
import click
|
|
17
18
|
|
|
@@ -152,6 +153,7 @@ def web(host: str) -> None:
|
|
|
152
153
|
eval_sets_manager: Any,
|
|
153
154
|
eval_set_results_manager: Any,
|
|
154
155
|
agents_dir: str,
|
|
156
|
+
extra_plugins: Optional[list[str]] = None,
|
|
155
157
|
):
|
|
156
158
|
self.agent_loader = agent_loader
|
|
157
159
|
self.artifact_service = artifact_service
|
|
@@ -162,6 +164,7 @@ def web(host: str) -> None:
|
|
|
162
164
|
self.runners_to_clean = set()
|
|
163
165
|
self.current_app_name_ref = SharedValue(value="")
|
|
164
166
|
self.runner_dict = {}
|
|
167
|
+
self.extra_plugins = extra_plugins or []
|
|
165
168
|
|
|
166
169
|
# parse VeADK memories
|
|
167
170
|
short_term_memory, long_term_memory = _get_memory(module_path=agents_dir)
|
|
@@ -178,4 +181,6 @@ def web(host: str) -> None:
|
|
|
178
181
|
agents_dir = os.getcwd()
|
|
179
182
|
logger.info(f"Load agents from {agents_dir}")
|
|
180
183
|
|
|
181
|
-
cli_tools_click.cli_web.main(
|
|
184
|
+
cli_tools_click.cli_web.main(
|
|
185
|
+
args=[agents_dir, "--host", host, "--log_level", "ERROR"]
|
|
186
|
+
)
|
|
@@ -32,6 +32,8 @@ class OpensearchConfig(BaseSettings):
|
|
|
32
32
|
|
|
33
33
|
password: str = ""
|
|
34
34
|
|
|
35
|
+
secret_token: str = ""
|
|
36
|
+
|
|
35
37
|
|
|
36
38
|
class MysqlConfig(BaseSettings):
|
|
37
39
|
model_config = SettingsConfigDict(env_prefix="DATABASE_MYSQL_")
|
|
@@ -46,6 +48,25 @@ class MysqlConfig(BaseSettings):
|
|
|
46
48
|
|
|
47
49
|
charset: str = "utf8"
|
|
48
50
|
|
|
51
|
+
secret_token: str = ""
|
|
52
|
+
"""STS token for MySQL auth, not supported yet."""
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class PostgreSqlConfig(BaseSettings):
|
|
56
|
+
model_config = SettingsConfigDict(env_prefix="DATABASE_POSTGRESQL_")
|
|
57
|
+
|
|
58
|
+
host: str = ""
|
|
59
|
+
|
|
60
|
+
port: int = 5432
|
|
61
|
+
|
|
62
|
+
user: str = ""
|
|
63
|
+
|
|
64
|
+
password: str = ""
|
|
65
|
+
|
|
66
|
+
database: str = ""
|
|
67
|
+
|
|
68
|
+
secret_token: str = ""
|
|
69
|
+
|
|
49
70
|
|
|
50
71
|
class RedisConfig(BaseSettings):
|
|
51
72
|
model_config = SettingsConfigDict(env_prefix="DATABASE_REDIS_")
|
|
@@ -58,6 +79,18 @@ class RedisConfig(BaseSettings):
|
|
|
58
79
|
|
|
59
80
|
db: int = 0
|
|
60
81
|
|
|
82
|
+
secret_token: str = ""
|
|
83
|
+
"""STS token for Redis auth, not supported yet."""
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
class Mem0Config(BaseSettings):
|
|
87
|
+
model_config = SettingsConfigDict(env_prefix="DATABASE_MEM0_")
|
|
88
|
+
|
|
89
|
+
api_key: str = ""
|
|
90
|
+
"""Mem0 API key"""
|
|
91
|
+
|
|
92
|
+
base_url: str = "" # "https://api.mem0.ai/v1"
|
|
93
|
+
|
|
61
94
|
|
|
62
95
|
class VikingKnowledgebaseConfig(BaseSettings):
|
|
63
96
|
model_config = SettingsConfigDict(env_prefix="DATABASE_VIKING_")
|
|
@@ -81,3 +114,13 @@ class TOSConfig(BaseSettings):
|
|
|
81
114
|
|
|
82
115
|
VeTOS(bucket_name=_bucket).create_bucket()
|
|
83
116
|
return _bucket
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
class NormalTOSConfig(BaseSettings):
|
|
120
|
+
model_config = SettingsConfigDict(env_prefix="DATABASE_TOS_")
|
|
121
|
+
|
|
122
|
+
endpoint: str = "tos-cn-beijing.volces.com"
|
|
123
|
+
|
|
124
|
+
region: str = "cn-beijing"
|
|
125
|
+
|
|
126
|
+
bucket: str
|
veadk/configs/model_configs.py
CHANGED
|
@@ -40,3 +40,35 @@ class ModelConfig(BaseSettings):
|
|
|
40
40
|
@cached_property
|
|
41
41
|
def api_key(self) -> str:
|
|
42
42
|
return os.getenv("MODEL_AGENT_API_KEY") or ARKVeAuth().token
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class EmbeddingModelConfig(BaseSettings):
|
|
46
|
+
model_config = SettingsConfigDict(env_prefix="MODEL_EMBEDDING_")
|
|
47
|
+
|
|
48
|
+
name: str = "doubao-embedding-text-240715"
|
|
49
|
+
"""Model name for embedding."""
|
|
50
|
+
|
|
51
|
+
dim: int = 2560
|
|
52
|
+
"""Embedding dim is different from different models."""
|
|
53
|
+
|
|
54
|
+
api_base: str = "https://ark.cn-beijing.volces.com/api/v3/"
|
|
55
|
+
"""The api base of the model for embedding."""
|
|
56
|
+
|
|
57
|
+
@cached_property
|
|
58
|
+
def api_key(self) -> str:
|
|
59
|
+
return os.getenv("MODEL_EMBEDDING_API_KEY") or ARKVeAuth().token
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class NormalEmbeddingModelConfig(BaseSettings):
|
|
63
|
+
model_config = SettingsConfigDict(env_prefix="MODEL_EMBEDDING_")
|
|
64
|
+
|
|
65
|
+
name: str = "doubao-embedding-text-240715"
|
|
66
|
+
"""Model name for embedding."""
|
|
67
|
+
|
|
68
|
+
dim: int = 2560
|
|
69
|
+
"""Embedding dim is different from different models."""
|
|
70
|
+
|
|
71
|
+
api_base: str = "https://ark.cn-beijing.volces.com/api/v3/"
|
|
72
|
+
"""The api base of the model for embedding."""
|
|
73
|
+
|
|
74
|
+
api_key: str
|
veadk/consts.py
CHANGED
|
@@ -27,14 +27,16 @@ DEFAULT_MODEL_EXTRA_CONFIG = {
|
|
|
27
27
|
"x-is-encrypted": getenv("MODEL_AGENT_ENCRYPTED", "true"),
|
|
28
28
|
"veadk-source": "veadk",
|
|
29
29
|
"veadk-version": VERSION,
|
|
30
|
+
"User-Agent": f"VeADK/{VERSION}",
|
|
31
|
+
"X-Client-Request-Id": f"veadk/{VERSION}",
|
|
30
32
|
},
|
|
31
33
|
"extra_body": {
|
|
32
34
|
"caching": {
|
|
33
35
|
"type": getenv("MODEL_AGENT_CACHING", "enabled"),
|
|
34
36
|
},
|
|
35
|
-
"thinking": {
|
|
36
|
-
|
|
37
|
-
},
|
|
37
|
+
# "thinking": {
|
|
38
|
+
# "type": "disabled"
|
|
39
|
+
# },
|
|
38
40
|
"expire_at": int(time.time()) + 3600, # expire after 1 hour
|
|
39
41
|
},
|
|
40
42
|
}
|
|
@@ -56,6 +58,11 @@ DEFAULT_CR_REPO_NAME = "veadk-user-repo"
|
|
|
56
58
|
DEFAULT_TLS_LOG_PROJECT_NAME = "veadk-logs"
|
|
57
59
|
DEFAULT_TLS_TRACING_INSTANCE_NAME = "veadk-tracing"
|
|
58
60
|
|
|
59
|
-
DEFAULT_TOS_BUCKET_NAME = "
|
|
61
|
+
DEFAULT_TOS_BUCKET_NAME = "ark-tutorial"
|
|
60
62
|
|
|
61
63
|
DEFAULT_COZELOOP_SPACE_NAME = "VeADK Space"
|
|
64
|
+
|
|
65
|
+
DEFAULT_TEXT_TO_IMAGE_MODEL_NAME = "doubao-seedream-3-0-t2i-250415"
|
|
66
|
+
DEFAULT_IMAGE_EDIT_MODEL_NAME = "doubao-seededit-3-0-i2i-250628"
|
|
67
|
+
DEFAULT_VIDEO_MODEL_NAME = "doubao-seedance-1-0-pro-250528"
|
|
68
|
+
DEFAULT_IMAGE_GENERATE_MODEL_NAME = "doubao-seedream-4-0-250828"
|
|
@@ -24,6 +24,8 @@ from google.adk.evaluation.agent_evaluator import (
|
|
|
24
24
|
)
|
|
25
25
|
from google.adk.evaluation.eval_case import IntermediateData, Invocation
|
|
26
26
|
from google.adk.evaluation.evaluator import EvalStatus
|
|
27
|
+
from google.adk.evaluation.eval_set import EvalSet
|
|
28
|
+
from typing import Optional
|
|
27
29
|
from typing_extensions import override
|
|
28
30
|
from veadk.evaluation.base_evaluator import BaseEvaluator
|
|
29
31
|
from types import SimpleNamespace
|
|
@@ -52,7 +54,8 @@ class ADKEvaluator(BaseEvaluator):
|
|
|
52
54
|
@override
|
|
53
55
|
async def evaluate(
|
|
54
56
|
self,
|
|
55
|
-
|
|
57
|
+
eval_set: Optional[EvalSet] = None,
|
|
58
|
+
eval_set_file_path: Optional[str] = None,
|
|
56
59
|
eval_id: str = f"test_{formatted_timestamp()}",
|
|
57
60
|
tool_score_threshold: float = 1.0,
|
|
58
61
|
response_match_score_threshold: float = 0.8,
|
|
@@ -104,7 +107,7 @@ class ADKEvaluator(BaseEvaluator):
|
|
|
104
107
|
# Iterate each test file and evaluate per-case, per-metric
|
|
105
108
|
for test_file in test_files:
|
|
106
109
|
# Build in-memory evaluation cases via BaseEvaluator from the provided file
|
|
107
|
-
self.build_eval_set(test_file)
|
|
110
|
+
self.build_eval_set(eval_set, test_file)
|
|
108
111
|
|
|
109
112
|
evaluation_result_list = []
|
|
110
113
|
|