veadk-python 1.0.2__py3-none-any.whl → 1.0.4__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 (39) hide show
  1. veadk/a2a/registry_client.py +133 -12
  2. veadk/cli/_frontend_deploy_iam.py +122 -0
  3. veadk/cli/_frontend_deploy_policy.py +226 -0
  4. veadk/cli/cli.py +2 -1
  5. veadk/cli/cli_frontend.py +1011 -530
  6. veadk/cli/templates/rl/ark/plugins/test_utils.py +3 -1
  7. veadk/cloud/cloud_agent_engine.py +62 -22
  8. veadk/cloud/harness_app/app.py +36 -9
  9. veadk/cloud/harness_app/types.py +8 -1
  10. veadk/cloud/harness_app/utils.py +72 -9
  11. veadk/config.py +2 -0
  12. veadk/configs/database_configs.py +31 -0
  13. veadk/integrations/ve_apig/ve_apig.py +25 -0
  14. veadk/integrations/ve_faas/ve_faas.py +37 -0
  15. veadk/integrations/ve_identity/identity_client.py +5 -0
  16. veadk/knowledgebase/backends/milvus_backend.py +201 -0
  17. veadk/knowledgebase/backends/openviking_backend.py +295 -0
  18. veadk/knowledgebase/knowledgebase.py +32 -6
  19. veadk/memory/long_term_memory.py +211 -35
  20. veadk/memory/long_term_memory_backends/openviking_backend.py +322 -0
  21. veadk/runner.py +27 -6
  22. veadk/tools/builtin_tools/load_knowledgebase.py +2 -1
  23. veadk/tools/load_knowledgebase_tool.py +2 -1
  24. veadk/tracing/telemetry/telemetry.py +1 -1
  25. veadk/utils/logger.py +61 -23
  26. veadk/webui/assets/index-DnIcUmtL.css +10 -0
  27. veadk/webui/assets/index-zvlii4Vr.js +747 -0
  28. veadk/webui/index.html +2 -2
  29. {veadk_python-1.0.2.dist-info → veadk_python-1.0.4.dist-info}/METADATA +4 -3
  30. {veadk_python-1.0.2.dist-info → veadk_python-1.0.4.dist-info}/RECORD +36 -31
  31. {veadk_python-1.0.2.dist-info → veadk_python-1.0.4.dist-info}/scm_file_list.json +16 -4
  32. veadk_python-1.0.4.dist-info/scm_version.json +8 -0
  33. veadk/webui/assets/index-8o8Ic942.css +0 -10
  34. veadk/webui/assets/index-CELjG15D.js +0 -630
  35. veadk_python-1.0.2.dist-info/scm_version.json +0 -8
  36. {veadk_python-1.0.2.dist-info → veadk_python-1.0.4.dist-info}/WHEEL +0 -0
  37. {veadk_python-1.0.2.dist-info → veadk_python-1.0.4.dist-info}/entry_points.txt +0 -0
  38. {veadk_python-1.0.2.dist-info → veadk_python-1.0.4.dist-info}/licenses/LICENSE +0 -0
  39. {veadk_python-1.0.2.dist-info → veadk_python-1.0.4.dist-info}/top_level.txt +0 -0
@@ -22,6 +22,7 @@ import os
22
22
  import re
23
23
  import time
24
24
  import uuid
25
+ from collections.abc import Mapping
25
26
  from dataclasses import dataclass
26
27
  from datetime import datetime, timezone
27
28
  from typing import Any
@@ -30,6 +31,7 @@ from urllib.parse import quote, urlparse, urlunparse
30
31
  import requests
31
32
 
32
33
  from veadk.auth.veauth.utils import get_credential_from_vefaas_iam
34
+ from veadk.utils.auth import VE_TIP_TOKEN_HEADER
33
35
 
34
36
  DEFAULT_ENDPOINT = "http://volcengineapi.byted.org/"
35
37
  DEFAULT_VERSION = "2025-10-30"
@@ -66,6 +68,8 @@ class AgentKitA2ARegistryConfig:
66
68
  top_k: int = DEFAULT_TOP_K
67
69
  timeout_ms: int = DEFAULT_TIMEOUT_MS
68
70
  poll_interval_ms: int = DEFAULT_POLL_INTERVAL_MS
71
+ upstream_tip_token: str = ""
72
+ upstream_authorization: str = ""
69
73
 
70
74
 
71
75
  @dataclass(frozen=True)
@@ -97,9 +101,41 @@ def registry_config_from_env() -> AgentKitA2ARegistryConfig:
97
101
  poll_interval_ms=_int_env(
98
102
  "REGISTRY_POLL_INTERVAL_MS", DEFAULT_POLL_INTERVAL_MS, minimum=100
99
103
  ),
104
+ upstream_tip_token=_first_env(
105
+ [
106
+ "REGISTRY_UPSTREAM_TIP_TOKEN",
107
+ "AGENTKIT_UPSTREAM_TIP_TOKEN",
108
+ "A2A_REGISTRY_UPSTREAM_TIP_TOKEN",
109
+ "VE_TIP_TOKEN",
110
+ "X_VE_TIP_TOKEN",
111
+ "TIP_TOKEN",
112
+ ]
113
+ ),
100
114
  )
101
115
 
102
116
 
117
+ def registry_tip_token_from_headers(headers: Mapping[str, str]) -> str:
118
+ """Extract an inbound TIP token from HTTP headers."""
119
+
120
+ normalized = {str(key).lower(): str(value) for key, value in headers.items()}
121
+ return normalized.get(VE_TIP_TOKEN_HEADER.lower(), "").strip()
122
+
123
+
124
+ def registry_authorization_from_headers(headers: Mapping[str, str]) -> str:
125
+ """Extract a bearer Authorization header for downstream A2A calls."""
126
+
127
+ normalized = {str(key).lower(): str(value) for key, value in headers.items()}
128
+ for header_name in (
129
+ "authorization",
130
+ "x-forwarded-authorization",
131
+ "x-original-authorization",
132
+ ):
133
+ value = _normalize_bearer_authorization(normalized.get(header_name, ""))
134
+ if value:
135
+ return value
136
+ return ""
137
+
138
+
103
139
  def search_agent_cards(
104
140
  prompt: str,
105
141
  top_k: int | None = None,
@@ -250,6 +286,12 @@ def _resolve_config(
250
286
  or DEFAULT_POLL_INTERVAL_MS
251
287
  ),
252
288
  ),
289
+ upstream_tip_token=(
290
+ config.upstream_tip_token or env_config.upstream_tip_token
291
+ ).strip(),
292
+ upstream_authorization=_normalize_bearer_authorization(
293
+ config.upstream_authorization or env_config.upstream_authorization
294
+ ),
253
295
  )
254
296
 
255
297
 
@@ -534,15 +576,25 @@ def _send_message(
534
576
  if task_id:
535
577
  message["taskId"] = task_id
536
578
 
579
+ headers: dict[str, str] = {}
537
580
  try:
581
+ headers = _agent_auth_headers(card, config)
538
582
  return _a2a_jsonrpc(
539
583
  card["url"],
540
584
  "message/send",
541
585
  {"message": message, "configuration": {"blocking": False}},
542
- _agent_auth_headers(card, config),
586
+ headers,
543
587
  config,
544
588
  )
545
589
  except RegistryError as exc:
590
+ if _should_retry_with_m2m(exc, card, config, headers):
591
+ return _a2a_jsonrpc(
592
+ card["url"],
593
+ "message/send",
594
+ {"message": message, "configuration": {"blocking": False}},
595
+ _agent_auth_headers(card, config, force_m2m=True),
596
+ config,
597
+ )
546
598
  if exc.code in {
547
599
  "A2A_HTTP_FAILED",
548
600
  "A2A_RESPONSE_PARSE_FAILED",
@@ -563,13 +615,25 @@ def _poll_card(
563
615
  started: float | None = None,
564
616
  ) -> dict[str, Any]:
565
617
  started = started or time.monotonic()
566
- a2a_result = _a2a_jsonrpc(
567
- card["url"],
568
- "tasks/get",
569
- {"id": task_id.strip(), "historyLength": max(0, int(history_length))},
570
- _agent_auth_headers(card, config),
571
- config,
572
- )
618
+ headers = _agent_auth_headers(card, config)
619
+ try:
620
+ a2a_result = _a2a_jsonrpc(
621
+ card["url"],
622
+ "tasks/get",
623
+ {"id": task_id.strip(), "historyLength": max(0, int(history_length))},
624
+ headers,
625
+ config,
626
+ )
627
+ except RegistryError as exc:
628
+ if not _should_retry_with_m2m(exc, card, config, headers):
629
+ raise
630
+ a2a_result = _a2a_jsonrpc(
631
+ card["url"],
632
+ "tasks/get",
633
+ {"id": task_id.strip(), "historyLength": max(0, int(history_length))},
634
+ _agent_auth_headers(card, config, force_m2m=True),
635
+ config,
636
+ )
573
637
  state = _task_state(a2a_result)
574
638
  is_terminal = state in TERMINAL_STATES
575
639
  payload: dict[str, Any] = {
@@ -815,11 +879,18 @@ def _sanitize_get_agent_result(
815
879
 
816
880
 
817
881
  def _agent_auth_headers(
818
- card: dict[str, Any], config: AgentKitA2ARegistryConfig | None = None
882
+ card: dict[str, Any],
883
+ config: AgentKitA2ARegistryConfig | None = None,
884
+ *,
885
+ force_m2m: bool = False,
819
886
  ) -> dict[str, str]:
887
+ resolved_config = _resolve_config(config)
820
888
  security = card.get("security") or []
821
889
  schemes = card.get("securitySchemes") or {}
822
890
  headers: dict[str, str] = {}
891
+ upstream_authorization = _normalize_bearer_authorization(
892
+ resolved_config.upstream_authorization
893
+ )
823
894
 
824
895
  for requirement in security:
825
896
  if not isinstance(requirement, dict):
@@ -837,9 +908,17 @@ def _agent_auth_headers(
837
908
  if isinstance(token, str) and token:
838
909
  headers[header_name] = token
839
910
  elif scheme_type == "oauth2":
840
- headers["Authorization"] = "Bearer " + _oauth2_client_credentials_token(
841
- scheme, _resolve_config(config)
842
- )
911
+ if upstream_authorization and not force_m2m:
912
+ headers["Authorization"] = upstream_authorization
913
+ else:
914
+ headers["Authorization"] = (
915
+ "Bearer "
916
+ + _oauth2_client_credentials_token(scheme, resolved_config)
917
+ )
918
+
919
+ tip_token = resolved_config.upstream_tip_token
920
+ if tip_token:
921
+ headers[VE_TIP_TOKEN_HEADER] = tip_token
843
922
 
844
923
  if security and not headers:
845
924
  raise RegistryError(
@@ -849,6 +928,38 @@ def _agent_auth_headers(
849
928
  return headers
850
929
 
851
930
 
931
+ def _should_retry_with_m2m(
932
+ exc: RegistryError,
933
+ card: dict[str, Any],
934
+ config: AgentKitA2ARegistryConfig | None,
935
+ headers: dict[str, str],
936
+ ) -> bool:
937
+ if exc.code != "A2A_HTTP_FAILED" or exc.diagnostics.get("status_code") != 401:
938
+ return False
939
+
940
+ resolved_config = _resolve_config(config)
941
+ upstream_authorization = _normalize_bearer_authorization(
942
+ resolved_config.upstream_authorization
943
+ )
944
+ if not upstream_authorization:
945
+ return False
946
+ if headers.get("Authorization") != upstream_authorization:
947
+ return False
948
+ return _has_oauth2_security(card)
949
+
950
+
951
+ def _has_oauth2_security(card: dict[str, Any]) -> bool:
952
+ schemes = card.get("securitySchemes") or {}
953
+ for requirement in card.get("security") or []:
954
+ if not isinstance(requirement, dict):
955
+ continue
956
+ for scheme_name in requirement:
957
+ scheme = schemes.get(scheme_name) or {}
958
+ if str(scheme.get("type") or "").lower() == "oauth2":
959
+ return True
960
+ return False
961
+
962
+
852
963
  def _oauth2_client_credentials_token(
853
964
  scheme: dict[str, Any], config: AgentKitA2ARegistryConfig
854
965
  ) -> str:
@@ -957,6 +1068,16 @@ def _clean_config_url(value: Any) -> str:
957
1068
  return cleaned
958
1069
 
959
1070
 
1071
+ def _normalize_bearer_authorization(value: Any) -> str:
1072
+ cleaned = _clean_config_url(value)
1073
+ if not cleaned:
1074
+ return ""
1075
+ parts = cleaned.split(None, 1)
1076
+ if len(parts) == 2 and parts[0].lower() == "bearer" and parts[1].strip():
1077
+ return f"Bearer {parts[1].strip()}"
1078
+ return ""
1079
+
1080
+
960
1081
  def _user_pool_id_from_token_url(token_url: str) -> str:
961
1082
  host = urlparse(token_url).netloc
962
1083
  match = re.match(r"userpool-([^.]+)\.userpool\.auth\.id\.", host)
@@ -0,0 +1,122 @@
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
+ """Ensure the IAM role the VeFaaS-hosted frontend runs as.
16
+
17
+ Volcengine IAM has no inline role policy, so the role is built as: CreatePolicy
18
+ (custom) + CreateRole (trust ``vefaas``) + AttachRolePolicy. The whole thing is
19
+ idempotent — a fixed role/policy name is reused across re-deploys.
20
+ """
21
+
22
+ import json
23
+
24
+ from veadk.cli._frontend_deploy_policy import (
25
+ FRONTEND_DEPLOY_POLICY,
26
+ FRONTEND_DEPLOY_TRUST_POLICY,
27
+ )
28
+ from veadk.utils.logger import get_logger
29
+
30
+ logger = get_logger(__name__)
31
+
32
+ DEFAULT_ROLE_NAME = "VeADKFrontendServiceRole"
33
+ DEFAULT_POLICY_NAME = "VeADKFrontendPolicy"
34
+
35
+
36
+ def _result(resp: dict) -> dict:
37
+ """Extract ``Result`` from a Volcengine response, raising on an API error."""
38
+ meta = (resp or {}).get("ResponseMetadata", {}) or {}
39
+ if meta.get("Error"):
40
+ raise RuntimeError(meta["Error"].get("Message") or str(meta["Error"]))
41
+ return (resp or {}).get("Result", {}) or {}
42
+
43
+
44
+ def _role_trn(result: dict) -> str | None:
45
+ """Pull the role TRN out of a GetRole/CreateRole Result (shape varies)."""
46
+ role = result.get("Role") or result
47
+ return role.get("Trn") or role.get("trn")
48
+
49
+
50
+ def ensure_frontend_role(
51
+ access_key: str,
52
+ secret_key: str,
53
+ role_name: str = DEFAULT_ROLE_NAME,
54
+ policy_name: str = DEFAULT_POLICY_NAME,
55
+ ) -> str:
56
+ """Get-or-create the frontend's IAM role and return its TRN.
57
+
58
+ IAM is a global service, so region is irrelevant here. Safe to call
59
+ repeatedly: an existing role is reused, and create/attach errors for
60
+ already-existing resources are tolerated.
61
+ """
62
+ from volcengine.iam.IamService import IamService
63
+
64
+ svc = IamService()
65
+ svc.set_ak(access_key)
66
+ svc.set_sk(secret_key)
67
+
68
+ # Reuse an existing role if present.
69
+ try:
70
+ existing = _result(svc.get_role({"RoleName": role_name}))
71
+ trn = _role_trn(existing)
72
+ if trn:
73
+ logger.info(f"Reusing existing IAM role {role_name} ({trn})")
74
+ return trn
75
+ except Exception as e:
76
+ logger.info(f"Role {role_name} not found, creating it: {e}")
77
+
78
+ # Create the custom policy (tolerate "already exists").
79
+ try:
80
+ svc.create_policy(
81
+ {
82
+ "PolicyName": policy_name,
83
+ "PolicyDocument": json.dumps(FRONTEND_DEPLOY_POLICY),
84
+ "Description": "VeADK frontend deploy permissions",
85
+ }
86
+ )
87
+ logger.info(f"Created IAM policy {policy_name}")
88
+ except Exception as e:
89
+ logger.info(f"CreatePolicy {policy_name} skipped/failed (may exist): {e}")
90
+
91
+ # Create the role with the vefaas trust relationship.
92
+ created = _result(
93
+ svc.create_role(
94
+ {
95
+ "RoleName": role_name,
96
+ "TrustPolicyDocument": json.dumps(FRONTEND_DEPLOY_TRUST_POLICY),
97
+ "Description": "VeADK frontend VeFaaS runtime role",
98
+ }
99
+ )
100
+ )
101
+
102
+ # Attach the policy to the role (tolerate "already attached").
103
+ try:
104
+ svc.attach_role_policy(
105
+ {
106
+ "RoleName": role_name,
107
+ "PolicyName": policy_name,
108
+ "PolicyType": "Custom",
109
+ }
110
+ )
111
+ logger.info(f"Attached policy {policy_name} to role {role_name}")
112
+ except Exception as e:
113
+ logger.info(f"AttachRolePolicy skipped/failed (may be attached): {e}")
114
+
115
+ trn = _role_trn(created)
116
+ if not trn:
117
+ # CreateRole didn't echo the TRN — read it back.
118
+ trn = _role_trn(_result(svc.get_role({"RoleName": role_name})))
119
+ if not trn:
120
+ raise RuntimeError(f"Could not resolve TRN for role {role_name}")
121
+ logger.info(f"Ensured IAM role {role_name} ({trn})")
122
+ return trn
@@ -0,0 +1,226 @@
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
+ """IAM policy for the VeFaaS-hosted frontend (`veadk frontend deploy`).
16
+
17
+ The deployed function assumes this role (trust principal ``vefaas``) and reads
18
+ its STS credentials from the injected credential file, so the frontend's
19
+ ``/web/*`` endpoints can manage AgentKit runtimes on the user's behalf. The
20
+ document grants the union of permissions the frontend + AgentKit deploy/runtime
21
+ flows exercise (agentkit, vefaas, cr, cp, tos, iam, ark, identity, vikingdb, …).
22
+ """
23
+
24
+ # The trust relationship that lets a VeFaaS function assume the role.
25
+ FRONTEND_DEPLOY_TRUST_POLICY: dict = {
26
+ "Statement": [
27
+ {
28
+ "Effect": "Allow",
29
+ "Action": ["sts:AssumeRole"],
30
+ "Principal": {"Service": ["vefaas"]},
31
+ }
32
+ ]
33
+ }
34
+
35
+ # The permission policy attached to the role (provided by the platform team).
36
+ FRONTEND_DEPLOY_POLICY: dict = {
37
+ "Statement": [
38
+ {
39
+ "Effect": "Allow",
40
+ "Action": [
41
+ "agentkit:*",
42
+ "apmplus_server:Get*",
43
+ "apmplus_server:List*",
44
+ "Volc_Observe:Get*",
45
+ "Volc_Observe:*Describe*",
46
+ "Volc_Observe:*List*",
47
+ "cloudmonitor:Get*",
48
+ "cloudmonitor:*Describe*",
49
+ "cloudmonitor:*List*",
50
+ "tls:Get*",
51
+ "tls:Describe*",
52
+ "tls:List*",
53
+ "apig:ConvertMcpConfig",
54
+ "apmplus_server:CreateOrder",
55
+ "ark:CreateApiKey",
56
+ "ark:GetEndpoint",
57
+ "ark:GetRawApiKey",
58
+ "ark:InnerDescribeModelEndpoints",
59
+ "ark:ListApiKeys",
60
+ "ark:ListEndpoints",
61
+ "ark:ListFoundationModelVersions",
62
+ "ark:ListModelChargeItems",
63
+ "ark:OpenModelChargeItem",
64
+ "ark:ListFoundationModels",
65
+ "content_customization:GetQuickOpenSearchInfo",
66
+ "cp:CreatePipeline",
67
+ "cp:CreateWorkspace",
68
+ "cp:DeletePipeline",
69
+ "cp:GetDefaultWorkspaceInner",
70
+ "cp:GetInstance",
71
+ "cp:GetTaskRunLog",
72
+ "cp:GetTaskRunLogDownloadURI",
73
+ "cp:ListPipelineRuns",
74
+ "cp:ListPipelineRunStagesInner",
75
+ "cp:ListPipelines",
76
+ "cp:ListWorkspaces",
77
+ "cp:RunPipeline",
78
+ "cr:AddVpcEndpointLinkedVpc",
79
+ "cr:CreateEndpointAclPolicies",
80
+ "cr:CreateNamespace",
81
+ "cr:CreateRegistry",
82
+ "cr:CreateRepository",
83
+ "cr:DeleteEndpointAclPolicies",
84
+ "cr:DeleteNamespace",
85
+ "cr:DeleteRegistry",
86
+ "cr:DeleteTags",
87
+ "cr:GetAuthorizationToken",
88
+ "cr:GetPublicEndpoint",
89
+ "cr:GetVpcEndpoint",
90
+ "cr:ListDomains",
91
+ "cr:ListNamespaces",
92
+ "cr:ListRegistries",
93
+ "cr:ListRepositories",
94
+ "cr:ListTags",
95
+ "cr:RemoveVpcEndpointLinkedVpc",
96
+ "cr:StartRegistry",
97
+ "cr:UpdateNamespace",
98
+ "cr:UpdatePublicEndpoint",
99
+ "cr:UpdateVpcEndpoint",
100
+ "ESCloud:GetMLApiKey",
101
+ "ESCloud:GetScene",
102
+ "ESCloud:GetSceneInstance",
103
+ "ESCloud:ListMLApiKeys",
104
+ "iam:AttachRolePolicy",
105
+ "iam:CheckServiceLinkedRole",
106
+ "iam:CreateRole",
107
+ "iam:CreateServiceLinkedRole",
108
+ "iam:DeleteRole",
109
+ "iam:DetachRolePolicy",
110
+ "iam:GetPolicy",
111
+ "iam:GetRole",
112
+ "iam:GetServiceLinkedRoleTemplate",
113
+ "iam:GetUser",
114
+ "iam:ListProjects",
115
+ "iam:ListRoles",
116
+ "iam:ListUsers",
117
+ "iam:UpdateRole",
118
+ "iam:ListAttachedRolePolicies",
119
+ "id:CreateApiKey",
120
+ "id:CreateApiKeyCredentialProvider",
121
+ "id:CreateInboundAuthConfig",
122
+ "id:DeleteApiKey",
123
+ "id:DeleteInboundAuthConfig",
124
+ "id:GetCallerIdentity",
125
+ "id:GetInboundAuthConfig",
126
+ "id:GetResourceApiKey",
127
+ "id:GetTenantServiceStatus",
128
+ "id:GetUserPool",
129
+ "id:GetUserPoolClient",
130
+ "id:ListCredentialProviders",
131
+ "id:ListNamespaces",
132
+ "id:ListServices",
133
+ "id:ListUserPoolClients",
134
+ "id:ListUserPools",
135
+ "id:UpdateInboundAuthConfig",
136
+ "location:DescribeRegions",
137
+ "mem0:CreateMemoryProject",
138
+ "mem0:DeleteMemoryProject",
139
+ "mem0:DescribeAPIKeyDetail",
140
+ "mem0:DescribeMemoryProjectDetail",
141
+ "mem0:DescribeMemoryProjects",
142
+ "mem0:ModifyMemoryProjectLongTermStrategy",
143
+ "mem0:SearchMemory",
144
+ "mem0:SearchMemoryAllInfo",
145
+ "ml_platform:GetKnowledgeBaseServiceInfo",
146
+ "ml_platform:ListCollections",
147
+ "sts:AssumeRole",
148
+ "tls:ActiveTlsAccount",
149
+ "tls:SearchLogs",
150
+ "tos:CopyObject",
151
+ "tos:CreateBucket",
152
+ "tos:DeleteBucket",
153
+ "tos:DeleteObject",
154
+ "tos:GetAccountStatus",
155
+ "tos:GetBucketInfo",
156
+ "tos:HeadBucket",
157
+ "tos:HeadObject",
158
+ "tos:ListBuckets",
159
+ "tos:ListObjectsV2",
160
+ "tos:PostObject",
161
+ "tos:PutObject",
162
+ "vefaas:CreateFunction",
163
+ "vefaas:CreateSandbox",
164
+ "vefaas:DeleteFunction",
165
+ "vefaas:DescribeSandbox",
166
+ "vefaas:EnableUserCrVpcTunnel",
167
+ "vefaas:GetAvailabilityZones",
168
+ "vefaas:GetFunction",
169
+ "vefaas:GetImageConfig",
170
+ "vefaas:GetImageSyncStatus",
171
+ "vefaas:GetReleaseStatus",
172
+ "vefaas:KillSandbox",
173
+ "vefaas:ListFunctions",
174
+ "vefaas:ListRuntimes",
175
+ "vefaas:ListSandboxes",
176
+ "vefaas:QueryUserCrVpcTunnel",
177
+ "vefaas:Release",
178
+ "vefaas:SetSandboxTimeout",
179
+ "vefaas:UpdateFunction",
180
+ "vikingdb:GetKnowledgeBaseServiceInfo",
181
+ "vikingdb:GetMemorydbInstanceDetail",
182
+ "vikingdb:ListCollections",
183
+ "vikingdb:MemoryCollectionInfo",
184
+ "vikingdb:MemoryCollectionList",
185
+ "vikingdb:MemorySearch",
186
+ "vikingdb:MemorySearchUser",
187
+ "vikingdb:GetCollectionInfo",
188
+ "vikingdb:CreateCollection",
189
+ "vikingdb:CreateKnowledgedbInstance",
190
+ "vikingdb:GetKnowledgedbInstanceStatus",
191
+ "vikingdb:AddDocument",
192
+ "vikingdb:UpdateCollection",
193
+ "vikingdb:DeleteCollection",
194
+ "vikingdb:CreateMemorydbInstance",
195
+ "vpc:DescribeSecurityGroups",
196
+ "vpc:DescribeSubnets",
197
+ "vpc:DescribeVpcAttributes",
198
+ "vpc:DescribeVpcs",
199
+ "vke:ListClusters",
200
+ "vke:ForwardKubernetesApi",
201
+ "vke:ListServices",
202
+ "ecs:DescribeInstances",
203
+ "llmshield:ListInstances",
204
+ "llmshield:ListApps",
205
+ "llmshield:CreateOuterApp",
206
+ "ark:ListSubscribeTrade",
207
+ "ark:EstimateSubscribePrice",
208
+ "ark:CreateSubscribeTrade",
209
+ "ark:GetCodingPlanUsage",
210
+ "rds_mysql:DescribeDBInstances",
211
+ "rds_mysql:DescribeDBInstanceEndpoints",
212
+ "rds_mysql:DescribeDBAccounts",
213
+ "rds_mysql:DescribeDatabases",
214
+ "rds_postgresql:DescribeDBInstances",
215
+ "rds_postgresql:DescribeDBAccounts",
216
+ "rds_postgresql:DescribeDatabases",
217
+ "aidap:DescribeWorkspaces",
218
+ "aidap:DescribeBranches",
219
+ "aidap:DescribeComputes",
220
+ "aidap:DescribeDBAccounts",
221
+ "aidap:DescribeDatabases",
222
+ ],
223
+ "Resource": ["*"],
224
+ }
225
+ ]
226
+ }
veadk/cli/cli.py CHANGED
@@ -20,7 +20,7 @@ from veadk.cli.cli_clean import clean
20
20
  from veadk.cli.cli_create import create
21
21
  from veadk.cli.cli_deploy import deploy
22
22
  from veadk.cli.cli_eval import eval
23
- from veadk.cli.cli_frontend import frontend
23
+ from veadk.cli.cli_frontend import frontend, studio
24
24
  from veadk.cli.cli_harness import harness
25
25
  from veadk.cli.cli_init import init
26
26
  from veadk.cli.cli_kb import kb
@@ -52,6 +52,7 @@ veadk.add_command(create)
52
52
  veadk.add_command(prompt)
53
53
  veadk.add_command(web)
54
54
  veadk.add_command(frontend)
55
+ veadk.add_command(studio)
55
56
  veadk.add_command(pipeline)
56
57
  veadk.add_command(eval)
57
58
  veadk.add_command(kb)