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.

Files changed (110) hide show
  1. veadk/__init__.py +31 -0
  2. veadk/a2a/__init__.py +13 -0
  3. veadk/a2a/agent_card.py +45 -0
  4. veadk/a2a/remote_ve_agent.py +19 -0
  5. veadk/a2a/ve_a2a_server.py +77 -0
  6. veadk/a2a/ve_agent_executor.py +78 -0
  7. veadk/a2a/ve_task_store.py +37 -0
  8. veadk/agent.py +253 -0
  9. veadk/cli/__init__.py +13 -0
  10. veadk/cli/main.py +278 -0
  11. veadk/cli/services/agentpilot/__init__.py +17 -0
  12. veadk/cli/services/agentpilot/agentpilot.py +77 -0
  13. veadk/cli/services/veapig/__init__.py +17 -0
  14. veadk/cli/services/veapig/apig.py +224 -0
  15. veadk/cli/services/veapig/apig_utils.py +332 -0
  16. veadk/cli/services/vefaas/__init__.py +17 -0
  17. veadk/cli/services/vefaas/template/deploy.py +44 -0
  18. veadk/cli/services/vefaas/template/src/app.py +30 -0
  19. veadk/cli/services/vefaas/template/src/config.py +58 -0
  20. veadk/cli/services/vefaas/vefaas.py +346 -0
  21. veadk/cli/services/vefaas/vefaas_utils.py +408 -0
  22. veadk/cli/services/vetls/__init__.py +17 -0
  23. veadk/cli/services/vetls/vetls.py +87 -0
  24. veadk/cli/studio/__init__.py +13 -0
  25. veadk/cli/studio/agent_processor.py +247 -0
  26. veadk/cli/studio/fast_api.py +232 -0
  27. veadk/cli/studio/model.py +116 -0
  28. veadk/cloud/__init__.py +13 -0
  29. veadk/cloud/cloud_agent_engine.py +144 -0
  30. veadk/cloud/cloud_app.py +123 -0
  31. veadk/cloud/template/app.py +30 -0
  32. veadk/cloud/template/config.py +55 -0
  33. veadk/config.py +131 -0
  34. veadk/consts.py +17 -0
  35. veadk/database/__init__.py +17 -0
  36. veadk/database/base_database.py +45 -0
  37. veadk/database/database_factory.py +80 -0
  38. veadk/database/kv/__init__.py +13 -0
  39. veadk/database/kv/redis_database.py +109 -0
  40. veadk/database/local_database.py +43 -0
  41. veadk/database/relational/__init__.py +13 -0
  42. veadk/database/relational/mysql_database.py +114 -0
  43. veadk/database/vector/__init__.py +13 -0
  44. veadk/database/vector/opensearch_vector_database.py +205 -0
  45. veadk/database/vector/type.py +50 -0
  46. veadk/database/viking/__init__.py +13 -0
  47. veadk/database/viking/viking_database.py +378 -0
  48. veadk/database/viking/viking_memory_db.py +521 -0
  49. veadk/evaluation/__init__.py +17 -0
  50. veadk/evaluation/adk_evaluator/__init__.py +13 -0
  51. veadk/evaluation/adk_evaluator/adk_evaluator.py +291 -0
  52. veadk/evaluation/base_evaluator.py +242 -0
  53. veadk/evaluation/deepeval_evaluator/__init__.py +17 -0
  54. veadk/evaluation/deepeval_evaluator/deepeval_evaluator.py +223 -0
  55. veadk/evaluation/eval_set_file_loader.py +28 -0
  56. veadk/evaluation/eval_set_recorder.py +91 -0
  57. veadk/evaluation/utils/prometheus.py +142 -0
  58. veadk/knowledgebase/__init__.py +17 -0
  59. veadk/knowledgebase/knowledgebase.py +83 -0
  60. veadk/knowledgebase/knowledgebase_database_adapter.py +259 -0
  61. veadk/memory/__init__.py +13 -0
  62. veadk/memory/long_term_memory.py +119 -0
  63. veadk/memory/memory_database_adapter.py +235 -0
  64. veadk/memory/short_term_memory.py +124 -0
  65. veadk/memory/short_term_memory_processor.py +90 -0
  66. veadk/prompts/__init__.py +13 -0
  67. veadk/prompts/agent_default_prompt.py +30 -0
  68. veadk/prompts/prompt_evaluator.py +20 -0
  69. veadk/prompts/prompt_memory_processor.py +55 -0
  70. veadk/prompts/prompt_optimization.py +158 -0
  71. veadk/runner.py +252 -0
  72. veadk/tools/__init__.py +13 -0
  73. veadk/tools/builtin_tools/__init__.py +13 -0
  74. veadk/tools/builtin_tools/lark.py +67 -0
  75. veadk/tools/builtin_tools/las.py +23 -0
  76. veadk/tools/builtin_tools/vesearch.py +49 -0
  77. veadk/tools/builtin_tools/web_scraper.py +76 -0
  78. veadk/tools/builtin_tools/web_search.py +192 -0
  79. veadk/tools/demo_tools.py +58 -0
  80. veadk/tools/load_knowledgebase_tool.py +144 -0
  81. veadk/tools/sandbox/__init__.py +13 -0
  82. veadk/tools/sandbox/browser_sandbox.py +27 -0
  83. veadk/tools/sandbox/code_sandbox.py +30 -0
  84. veadk/tools/sandbox/computer_sandbox.py +27 -0
  85. veadk/tracing/__init__.py +13 -0
  86. veadk/tracing/base_tracer.py +172 -0
  87. veadk/tracing/telemetry/__init__.py +13 -0
  88. veadk/tracing/telemetry/exporters/__init__.py +13 -0
  89. veadk/tracing/telemetry/exporters/apiserver_exporter.py +60 -0
  90. veadk/tracing/telemetry/exporters/apmplus_exporter.py +101 -0
  91. veadk/tracing/telemetry/exporters/base_exporter.py +28 -0
  92. veadk/tracing/telemetry/exporters/cozeloop_exporter.py +69 -0
  93. veadk/tracing/telemetry/exporters/inmemory_exporter.py +88 -0
  94. veadk/tracing/telemetry/exporters/tls_exporter.py +78 -0
  95. veadk/tracing/telemetry/metrics/__init__.py +13 -0
  96. veadk/tracing/telemetry/metrics/opentelemetry_metrics.py +73 -0
  97. veadk/tracing/telemetry/opentelemetry_tracer.py +167 -0
  98. veadk/types.py +23 -0
  99. veadk/utils/__init__.py +13 -0
  100. veadk/utils/logger.py +59 -0
  101. veadk/utils/misc.py +33 -0
  102. veadk/utils/patches.py +85 -0
  103. veadk/utils/volcengine_sign.py +199 -0
  104. veadk/version.py +15 -0
  105. veadk_python-0.1.0.dist-info/METADATA +124 -0
  106. veadk_python-0.1.0.dist-info/RECORD +110 -0
  107. veadk_python-0.1.0.dist-info/WHEEL +5 -0
  108. veadk_python-0.1.0.dist-info/entry_points.txt +2 -0
  109. veadk_python-0.1.0.dist-info/licenses/LICENSE +201 -0
  110. 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