veadk-python 0.1.0__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/__init__.py +31 -0
- veadk/a2a/__init__.py +13 -0
- veadk/a2a/agent_card.py +45 -0
- veadk/a2a/remote_ve_agent.py +19 -0
- veadk/a2a/ve_a2a_server.py +77 -0
- veadk/a2a/ve_agent_executor.py +78 -0
- veadk/a2a/ve_task_store.py +37 -0
- veadk/agent.py +253 -0
- veadk/cli/__init__.py +13 -0
- veadk/cli/main.py +278 -0
- veadk/cli/services/agentpilot/__init__.py +17 -0
- veadk/cli/services/agentpilot/agentpilot.py +77 -0
- veadk/cli/services/veapig/__init__.py +17 -0
- veadk/cli/services/veapig/apig.py +224 -0
- veadk/cli/services/veapig/apig_utils.py +332 -0
- veadk/cli/services/vefaas/__init__.py +17 -0
- veadk/cli/services/vefaas/template/deploy.py +44 -0
- veadk/cli/services/vefaas/template/src/app.py +30 -0
- veadk/cli/services/vefaas/template/src/config.py +58 -0
- veadk/cli/services/vefaas/vefaas.py +346 -0
- veadk/cli/services/vefaas/vefaas_utils.py +408 -0
- veadk/cli/services/vetls/__init__.py +17 -0
- veadk/cli/services/vetls/vetls.py +87 -0
- veadk/cli/studio/__init__.py +13 -0
- veadk/cli/studio/agent_processor.py +247 -0
- veadk/cli/studio/fast_api.py +232 -0
- veadk/cli/studio/model.py +116 -0
- veadk/cloud/__init__.py +13 -0
- veadk/cloud/cloud_agent_engine.py +144 -0
- veadk/cloud/cloud_app.py +123 -0
- veadk/cloud/template/app.py +30 -0
- veadk/cloud/template/config.py +55 -0
- veadk/config.py +131 -0
- veadk/consts.py +17 -0
- veadk/database/__init__.py +17 -0
- veadk/database/base_database.py +45 -0
- veadk/database/database_factory.py +80 -0
- veadk/database/kv/__init__.py +13 -0
- veadk/database/kv/redis_database.py +109 -0
- veadk/database/local_database.py +43 -0
- veadk/database/relational/__init__.py +13 -0
- veadk/database/relational/mysql_database.py +114 -0
- veadk/database/vector/__init__.py +13 -0
- veadk/database/vector/opensearch_vector_database.py +205 -0
- veadk/database/vector/type.py +50 -0
- veadk/database/viking/__init__.py +13 -0
- veadk/database/viking/viking_database.py +378 -0
- veadk/database/viking/viking_memory_db.py +521 -0
- veadk/evaluation/__init__.py +17 -0
- veadk/evaluation/adk_evaluator/__init__.py +13 -0
- veadk/evaluation/adk_evaluator/adk_evaluator.py +291 -0
- veadk/evaluation/base_evaluator.py +242 -0
- veadk/evaluation/deepeval_evaluator/__init__.py +17 -0
- veadk/evaluation/deepeval_evaluator/deepeval_evaluator.py +223 -0
- veadk/evaluation/eval_set_file_loader.py +28 -0
- veadk/evaluation/eval_set_recorder.py +91 -0
- veadk/evaluation/utils/prometheus.py +142 -0
- veadk/knowledgebase/__init__.py +17 -0
- veadk/knowledgebase/knowledgebase.py +83 -0
- veadk/knowledgebase/knowledgebase_database_adapter.py +259 -0
- veadk/memory/__init__.py +13 -0
- veadk/memory/long_term_memory.py +119 -0
- veadk/memory/memory_database_adapter.py +235 -0
- veadk/memory/short_term_memory.py +124 -0
- veadk/memory/short_term_memory_processor.py +90 -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 +158 -0
- veadk/runner.py +252 -0
- veadk/tools/__init__.py +13 -0
- veadk/tools/builtin_tools/__init__.py +13 -0
- veadk/tools/builtin_tools/lark.py +67 -0
- veadk/tools/builtin_tools/las.py +23 -0
- veadk/tools/builtin_tools/vesearch.py +49 -0
- veadk/tools/builtin_tools/web_scraper.py +76 -0
- veadk/tools/builtin_tools/web_search.py +192 -0
- veadk/tools/demo_tools.py +58 -0
- veadk/tools/load_knowledgebase_tool.py +144 -0
- veadk/tools/sandbox/__init__.py +13 -0
- veadk/tools/sandbox/browser_sandbox.py +27 -0
- veadk/tools/sandbox/code_sandbox.py +30 -0
- veadk/tools/sandbox/computer_sandbox.py +27 -0
- veadk/tracing/__init__.py +13 -0
- veadk/tracing/base_tracer.py +172 -0
- veadk/tracing/telemetry/__init__.py +13 -0
- veadk/tracing/telemetry/exporters/__init__.py +13 -0
- veadk/tracing/telemetry/exporters/apiserver_exporter.py +60 -0
- veadk/tracing/telemetry/exporters/apmplus_exporter.py +101 -0
- veadk/tracing/telemetry/exporters/base_exporter.py +28 -0
- veadk/tracing/telemetry/exporters/cozeloop_exporter.py +69 -0
- veadk/tracing/telemetry/exporters/inmemory_exporter.py +88 -0
- veadk/tracing/telemetry/exporters/tls_exporter.py +78 -0
- veadk/tracing/telemetry/metrics/__init__.py +13 -0
- veadk/tracing/telemetry/metrics/opentelemetry_metrics.py +73 -0
- veadk/tracing/telemetry/opentelemetry_tracer.py +167 -0
- veadk/types.py +23 -0
- veadk/utils/__init__.py +13 -0
- veadk/utils/logger.py +59 -0
- veadk/utils/misc.py +33 -0
- veadk/utils/patches.py +85 -0
- veadk/utils/volcengine_sign.py +199 -0
- veadk/version.py +15 -0
- veadk_python-0.1.0.dist-info/METADATA +124 -0
- veadk_python-0.1.0.dist-info/RECORD +110 -0
- veadk_python-0.1.0.dist-info/WHEEL +5 -0
- veadk_python-0.1.0.dist-info/entry_points.txt +2 -0
- veadk_python-0.1.0.dist-info/licenses/LICENSE +201 -0
- veadk_python-0.1.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,346 @@
|
|
|
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 importlib.util
|
|
16
|
+
import json
|
|
17
|
+
import time
|
|
18
|
+
|
|
19
|
+
import requests
|
|
20
|
+
import typer
|
|
21
|
+
import volcenginesdkcore
|
|
22
|
+
import volcenginesdkvefaas
|
|
23
|
+
from volcenginesdkvefaas.models.env_for_create_function_input import (
|
|
24
|
+
EnvForCreateFunctionInput,
|
|
25
|
+
)
|
|
26
|
+
from volcenginesdkvefaas.models.tag_for_create_function_input import (
|
|
27
|
+
TagForCreateFunctionInput,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
from veadk.cli.services.veapig.apig import APIGateway
|
|
31
|
+
from veadk.config import veadk_environments
|
|
32
|
+
from veadk.utils.logger import get_logger
|
|
33
|
+
from veadk.utils.misc import formatted_timestamp
|
|
34
|
+
from veadk.utils.volcengine_sign import ve_request
|
|
35
|
+
|
|
36
|
+
from .vefaas_utils import signed_request, zip_and_encode_folder
|
|
37
|
+
|
|
38
|
+
logger = get_logger(__name__)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class VeFaaS:
|
|
42
|
+
def __init__(self, access_key: str, secret_key: str, region: str = "cn-beijing"):
|
|
43
|
+
self.ak = access_key
|
|
44
|
+
self.sk = secret_key
|
|
45
|
+
self.region = region
|
|
46
|
+
|
|
47
|
+
configuration = volcenginesdkcore.Configuration()
|
|
48
|
+
configuration.ak = self.ak
|
|
49
|
+
configuration.sk = self.sk
|
|
50
|
+
configuration.region = region
|
|
51
|
+
|
|
52
|
+
configuration.client_side_validation = True
|
|
53
|
+
volcenginesdkcore.Configuration.set_default(configuration)
|
|
54
|
+
|
|
55
|
+
self.client = volcenginesdkvefaas.VEFAASApi(
|
|
56
|
+
volcenginesdkcore.ApiClient(configuration)
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
self.apig_client = APIGateway(self.ak, self.sk, self.region)
|
|
60
|
+
|
|
61
|
+
self.template_id = "6874f3360bdbc40008ecf8c7"
|
|
62
|
+
|
|
63
|
+
def _pre_check(self, path: str):
|
|
64
|
+
if not path.exists():
|
|
65
|
+
raise ValueError(f"Path {path} does not exist.")
|
|
66
|
+
|
|
67
|
+
index_py_path = path / "index.py"
|
|
68
|
+
if not index_py_path.exists():
|
|
69
|
+
raise ValueError(
|
|
70
|
+
"The project directory must include the `index.py` file. See: https://www.volcengine.com/docs/6662/107432"
|
|
71
|
+
)
|
|
72
|
+
typer.echo(
|
|
73
|
+
typer.style(
|
|
74
|
+
"Check `index.py` file pass.",
|
|
75
|
+
fg=typer.colors.BRIGHT_BLACK,
|
|
76
|
+
),
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
spec = importlib.util.spec_from_file_location("index", index_py_path)
|
|
80
|
+
module = importlib.util.module_from_spec(spec)
|
|
81
|
+
spec.loader.exec_module(module)
|
|
82
|
+
if not (hasattr(module, "handler") and callable(module.handler)):
|
|
83
|
+
raise ValueError(
|
|
84
|
+
"The `index.py` file must include a `handler` function. See: https://www.volcengine.com/docs/6662/107432"
|
|
85
|
+
)
|
|
86
|
+
typer.echo(
|
|
87
|
+
typer.style(
|
|
88
|
+
"Check `handler` function pass.",
|
|
89
|
+
fg=typer.colors.BRIGHT_BLACK,
|
|
90
|
+
),
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
def _create_function(self, name: str, path: str):
|
|
94
|
+
function_name = f"{name}-fn-{formatted_timestamp()}"
|
|
95
|
+
|
|
96
|
+
# 1. Create a function instance in cloud
|
|
97
|
+
typer.echo(
|
|
98
|
+
typer.style("Runtime: native-python3.10/v1", fg=typer.colors.BRIGHT_BLACK)
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
envs = []
|
|
102
|
+
for key, value in veadk_environments.items():
|
|
103
|
+
envs.append(EnvForCreateFunctionInput(key=key, value=value))
|
|
104
|
+
typer.echo(
|
|
105
|
+
typer.style(
|
|
106
|
+
f"Fetch {len(envs)} environment variables.",
|
|
107
|
+
fg=typer.colors.BRIGHT_BLACK,
|
|
108
|
+
)
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
res = self.client.create_function(
|
|
112
|
+
volcenginesdkvefaas.CreateFunctionRequest(
|
|
113
|
+
command="./run.sh",
|
|
114
|
+
name=function_name,
|
|
115
|
+
description="Created by VeADK (Volcengine Agent Development Kit)",
|
|
116
|
+
tags=[TagForCreateFunctionInput(key="provider", value="veadk")],
|
|
117
|
+
runtime="native-python3.10/v1",
|
|
118
|
+
request_timeout=1800,
|
|
119
|
+
envs=envs,
|
|
120
|
+
# tls_config=TlsConfigForCreateFunctionInput(enable_log=True),
|
|
121
|
+
)
|
|
122
|
+
)
|
|
123
|
+
function_id = res.id
|
|
124
|
+
|
|
125
|
+
# 2. Get a temp bucket to store code
|
|
126
|
+
# proj_path = get_project_path()
|
|
127
|
+
code_zip_data, code_zip_size, error = zip_and_encode_folder(path)
|
|
128
|
+
typer.echo(
|
|
129
|
+
typer.style(
|
|
130
|
+
f"Zipped project size: {code_zip_size / 1024 / 1024:.2f} MB",
|
|
131
|
+
fg=typer.colors.BRIGHT_BLACK,
|
|
132
|
+
)
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
req = volcenginesdkvefaas.GetCodeUploadAddressRequest(
|
|
136
|
+
function_id=function_id, content_length=code_zip_size
|
|
137
|
+
)
|
|
138
|
+
response = self.client.get_code_upload_address(req)
|
|
139
|
+
upload_url = response.upload_address
|
|
140
|
+
|
|
141
|
+
headers = {
|
|
142
|
+
"Content-Type": "application/zip",
|
|
143
|
+
}
|
|
144
|
+
response = requests.put(url=upload_url, data=code_zip_data, headers=headers)
|
|
145
|
+
if 200 <= response.status_code < 300:
|
|
146
|
+
# print(f"Upload successful! Size: {code_zip_size / 1024 / 1024:.2f} MB")
|
|
147
|
+
pass
|
|
148
|
+
else:
|
|
149
|
+
error_message = f"Upload failed to {upload_url} with status code {response.status_code}: {response.text}"
|
|
150
|
+
raise ValueError(error_message)
|
|
151
|
+
|
|
152
|
+
# 3. Mount the TOS bucket to function instance
|
|
153
|
+
res = signed_request(
|
|
154
|
+
ak=self.ak,
|
|
155
|
+
sk=self.sk,
|
|
156
|
+
target="CodeUploadCallback",
|
|
157
|
+
body={"FunctionId": function_id},
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
typer.echo(
|
|
161
|
+
typer.style(
|
|
162
|
+
f"Function ID on VeFaaS service: {function_id}",
|
|
163
|
+
fg=typer.colors.BRIGHT_BLACK,
|
|
164
|
+
)
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
return function_name, function_id
|
|
168
|
+
|
|
169
|
+
def _get_template(self):
|
|
170
|
+
pass
|
|
171
|
+
|
|
172
|
+
def _create_application(
|
|
173
|
+
self,
|
|
174
|
+
application_name: str,
|
|
175
|
+
function_name: str,
|
|
176
|
+
gateway_name: str,
|
|
177
|
+
upstream_name: str,
|
|
178
|
+
service_name: str,
|
|
179
|
+
):
|
|
180
|
+
response = ve_request(
|
|
181
|
+
request_body={
|
|
182
|
+
"Name": application_name,
|
|
183
|
+
"Services": [],
|
|
184
|
+
"IAM": [],
|
|
185
|
+
"Config": {
|
|
186
|
+
"Region": self.region,
|
|
187
|
+
"FunctionName": function_name,
|
|
188
|
+
"GatewayName": gateway_name,
|
|
189
|
+
"ServiceName": service_name,
|
|
190
|
+
"UpstreamName": upstream_name,
|
|
191
|
+
},
|
|
192
|
+
"TemplateId": self.template_id,
|
|
193
|
+
},
|
|
194
|
+
action="CreateApplication",
|
|
195
|
+
ak=self.ak,
|
|
196
|
+
sk=self.sk,
|
|
197
|
+
service="vefaas",
|
|
198
|
+
version="2021-03-03",
|
|
199
|
+
region="cn-beijing",
|
|
200
|
+
host="open.volcengineapi.com",
|
|
201
|
+
)
|
|
202
|
+
assert response["Result"]["Status"] == "create_success"
|
|
203
|
+
|
|
204
|
+
return response["Result"]["Id"]
|
|
205
|
+
|
|
206
|
+
def _release_application(self, app_id: str):
|
|
207
|
+
_ = ve_request(
|
|
208
|
+
request_body={"Id": app_id},
|
|
209
|
+
action="ReleaseApplication",
|
|
210
|
+
ak=self.ak,
|
|
211
|
+
sk=self.sk,
|
|
212
|
+
service="vefaas",
|
|
213
|
+
version="2021-03-03",
|
|
214
|
+
region="cn-beijing",
|
|
215
|
+
host="open.volcengineapi.com",
|
|
216
|
+
)
|
|
217
|
+
|
|
218
|
+
status, full_response = self._get_application_status(app_id)
|
|
219
|
+
while status not in ["deploy_success", "deploy_fail"]:
|
|
220
|
+
time.sleep(10)
|
|
221
|
+
typer.echo(
|
|
222
|
+
typer.style(
|
|
223
|
+
f"Current status: {status}",
|
|
224
|
+
fg=typer.colors.BRIGHT_BLACK,
|
|
225
|
+
)
|
|
226
|
+
)
|
|
227
|
+
status, full_response = self._get_application_status(app_id)
|
|
228
|
+
|
|
229
|
+
assert status == "deploy_success", (
|
|
230
|
+
f"Release application failed. Response: {full_response}"
|
|
231
|
+
)
|
|
232
|
+
cloud_resource = full_response["Result"]["CloudResource"]
|
|
233
|
+
cloud_resource = json.loads(cloud_resource)
|
|
234
|
+
url = cloud_resource["framework"]["url"]["system_url"]
|
|
235
|
+
return url
|
|
236
|
+
|
|
237
|
+
def _get_application_status(self, app_id: str):
|
|
238
|
+
response = ve_request(
|
|
239
|
+
request_body={"Id": app_id},
|
|
240
|
+
action="GetApplication",
|
|
241
|
+
ak=self.ak,
|
|
242
|
+
sk=self.sk,
|
|
243
|
+
service="vefaas",
|
|
244
|
+
version="2021-03-03",
|
|
245
|
+
region="cn-beijing",
|
|
246
|
+
host="open.volcengineapi.com",
|
|
247
|
+
)
|
|
248
|
+
return response["Result"]["Status"], response
|
|
249
|
+
|
|
250
|
+
def _list_application(self):
|
|
251
|
+
response = ve_request(
|
|
252
|
+
request_body={},
|
|
253
|
+
action="ListApplications",
|
|
254
|
+
ak=self.ak,
|
|
255
|
+
sk=self.sk,
|
|
256
|
+
service="vefaas",
|
|
257
|
+
version="2021-03-03",
|
|
258
|
+
region="cn-beijing",
|
|
259
|
+
host="open.volcengineapi.com",
|
|
260
|
+
)
|
|
261
|
+
return response["Result"]["Items"]
|
|
262
|
+
|
|
263
|
+
def find_app_id_by_name(self, name: str):
|
|
264
|
+
apps = self._list_application()
|
|
265
|
+
for app in apps:
|
|
266
|
+
if app["Name"] == name:
|
|
267
|
+
return app["Id"]
|
|
268
|
+
return None
|
|
269
|
+
|
|
270
|
+
def delete(self, app_id: str):
|
|
271
|
+
try:
|
|
272
|
+
ve_request(
|
|
273
|
+
request_body={"Id": app_id},
|
|
274
|
+
action="DeleteApplication",
|
|
275
|
+
ak=self.ak,
|
|
276
|
+
sk=self.sk,
|
|
277
|
+
service="vefaas",
|
|
278
|
+
version="2021-03-03",
|
|
279
|
+
region="cn-beijing",
|
|
280
|
+
host="open.volcengineapi.com",
|
|
281
|
+
)
|
|
282
|
+
except Exception as e:
|
|
283
|
+
typer.echo(
|
|
284
|
+
typer.style(
|
|
285
|
+
f"Delete application failed. Response: {e}",
|
|
286
|
+
fg=typer.colors.BRIGHT_RED,
|
|
287
|
+
)
|
|
288
|
+
)
|
|
289
|
+
|
|
290
|
+
def deploy(
|
|
291
|
+
self,
|
|
292
|
+
name: str, # application name
|
|
293
|
+
path: str,
|
|
294
|
+
gateway_name: str = "",
|
|
295
|
+
gateway_service_name: str = "",
|
|
296
|
+
gateway_upstream_name: str = "",
|
|
297
|
+
) -> tuple[str, str, str]:
|
|
298
|
+
if "_" in name:
|
|
299
|
+
raise ValueError("Function or Application name cannot contain '_'.")
|
|
300
|
+
|
|
301
|
+
if not gateway_name:
|
|
302
|
+
gateway_name = f"{name}-gw-{formatted_timestamp()}"
|
|
303
|
+
|
|
304
|
+
existing_gateways = self.apig_client.list_gateways()
|
|
305
|
+
for gateway_instance in existing_gateways.items:
|
|
306
|
+
if (
|
|
307
|
+
gateway_instance.type == "serverless"
|
|
308
|
+
and gateway_instance.name != gateway_name
|
|
309
|
+
):
|
|
310
|
+
logger.warning(
|
|
311
|
+
f"You have at least one serverless gateway {gateway_instance.name}, but not {gateway_name}. Using {gateway_instance.name} instead."
|
|
312
|
+
)
|
|
313
|
+
gateway_name = gateway_instance.name
|
|
314
|
+
break
|
|
315
|
+
|
|
316
|
+
if not gateway_service_name:
|
|
317
|
+
gateway_service_name = f"{name}-gw-svr-{formatted_timestamp()}"
|
|
318
|
+
if not gateway_upstream_name:
|
|
319
|
+
gateway_upstream_name = f"{name}-gw-us-{formatted_timestamp()}"
|
|
320
|
+
|
|
321
|
+
typer.echo(
|
|
322
|
+
typer.style("[1/3] ", fg=typer.colors.GREEN)
|
|
323
|
+
+ "Create VeFaaS service on cloud."
|
|
324
|
+
)
|
|
325
|
+
typer.echo(typer.style(f"Project path: {path}", fg=typer.colors.BRIGHT_BLACK))
|
|
326
|
+
function_name, function_id = self._create_function(name, path)
|
|
327
|
+
|
|
328
|
+
typer.echo(typer.style("[2/3] ", fg=typer.colors.GREEN) + "Create application.")
|
|
329
|
+
app_id = self._create_application(
|
|
330
|
+
name,
|
|
331
|
+
function_name,
|
|
332
|
+
gateway_name,
|
|
333
|
+
gateway_upstream_name,
|
|
334
|
+
gateway_service_name,
|
|
335
|
+
)
|
|
336
|
+
|
|
337
|
+
typer.echo(
|
|
338
|
+
typer.style("[3/3] ", fg=typer.colors.GREEN) + "Release application."
|
|
339
|
+
)
|
|
340
|
+
url = self._release_application(app_id)
|
|
341
|
+
|
|
342
|
+
typer.echo(
|
|
343
|
+
typer.style(f"\nSuccessfully deployed on:\n\n{url}", fg=typer.colors.BLUE)
|
|
344
|
+
)
|
|
345
|
+
|
|
346
|
+
return url, app_id, function_id
|