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.
- veadk/a2a/registry_client.py +133 -12
- veadk/cli/_frontend_deploy_iam.py +122 -0
- veadk/cli/_frontend_deploy_policy.py +226 -0
- veadk/cli/cli.py +2 -1
- veadk/cli/cli_frontend.py +1011 -530
- veadk/cli/templates/rl/ark/plugins/test_utils.py +3 -1
- veadk/cloud/cloud_agent_engine.py +62 -22
- veadk/cloud/harness_app/app.py +36 -9
- veadk/cloud/harness_app/types.py +8 -1
- veadk/cloud/harness_app/utils.py +72 -9
- veadk/config.py +2 -0
- veadk/configs/database_configs.py +31 -0
- veadk/integrations/ve_apig/ve_apig.py +25 -0
- veadk/integrations/ve_faas/ve_faas.py +37 -0
- veadk/integrations/ve_identity/identity_client.py +5 -0
- veadk/knowledgebase/backends/milvus_backend.py +201 -0
- veadk/knowledgebase/backends/openviking_backend.py +295 -0
- veadk/knowledgebase/knowledgebase.py +32 -6
- veadk/memory/long_term_memory.py +211 -35
- veadk/memory/long_term_memory_backends/openviking_backend.py +322 -0
- veadk/runner.py +27 -6
- veadk/tools/builtin_tools/load_knowledgebase.py +2 -1
- veadk/tools/load_knowledgebase_tool.py +2 -1
- veadk/tracing/telemetry/telemetry.py +1 -1
- veadk/utils/logger.py +61 -23
- veadk/webui/assets/index-DnIcUmtL.css +10 -0
- veadk/webui/assets/index-zvlii4Vr.js +747 -0
- veadk/webui/index.html +2 -2
- {veadk_python-1.0.2.dist-info → veadk_python-1.0.4.dist-info}/METADATA +4 -3
- {veadk_python-1.0.2.dist-info → veadk_python-1.0.4.dist-info}/RECORD +36 -31
- {veadk_python-1.0.2.dist-info → veadk_python-1.0.4.dist-info}/scm_file_list.json +16 -4
- veadk_python-1.0.4.dist-info/scm_version.json +8 -0
- veadk/webui/assets/index-8o8Ic942.css +0 -10
- veadk/webui/assets/index-CELjG15D.js +0 -630
- veadk_python-1.0.2.dist-info/scm_version.json +0 -8
- {veadk_python-1.0.2.dist-info → veadk_python-1.0.4.dist-info}/WHEEL +0 -0
- {veadk_python-1.0.2.dist-info → veadk_python-1.0.4.dist-info}/entry_points.txt +0 -0
- {veadk_python-1.0.2.dist-info → veadk_python-1.0.4.dist-info}/licenses/LICENSE +0 -0
- {veadk_python-1.0.2.dist-info → veadk_python-1.0.4.dist-info}/top_level.txt +0 -0
veadk/a2a/registry_client.py
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
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],
|
|
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
|
-
|
|
841
|
-
|
|
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)
|