Skip to content

Commit 1dbff4b

Browse files
liulei.88innsd
authored andcommitted
feat(client): 支持自定义服务端点和协议方案
为BaseServiceClient及其子类添加scheme配置支持 扩展全局配置以支持agentkit、iam和cr服务的host和schema配置 更新相关服务客户端以使用全局配置中的自定义设置 (cherry picked from commit 82a913b384b95f11358e07c1dce49fdf135986b4)
1 parent 5b33127 commit 1dbff4b

File tree

8 files changed

+104
-19
lines changed

8 files changed

+104
-19
lines changed

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,4 +180,6 @@ local_docs/
180180
local_test/
181181

182182
# deprecated files
183-
*deprecated*
183+
*deprecated*
184+
185+
.trae/

agentkit/client/base_agentkit_client.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
from agentkit.client.base_service_client import BaseServiceClient, ApiConfig
2323
from agentkit.utils.ve_sign import get_volc_agentkit_host_info
24+
from agentkit.toolkit.config.global_config import get_global_config
2425

2526

2627
class BaseAgentkitClient(BaseServiceClient):
@@ -77,10 +78,13 @@ def _get_service_config(self) -> Dict[str, str]:
7778
Dictionary with host, api_version, and service
7879
"""
7980
host, api_version, service = get_volc_agentkit_host_info()
81+
gc = get_global_config()
82+
scheme = gc.agentkit_schema or 'https'
8083
return {
81-
'host': host,
84+
'host': gc.agentkit_host or host,
8285
'api_version': api_version,
8386
'service': service,
87+
'scheme': scheme,
8488
}
8589

8690
def _get(self, api_action: str, params: Dict[str, Any] = None) -> str:

agentkit/client/base_iam_client.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from typing import Dict, Union
2121

2222
from agentkit.client.base_service_client import BaseServiceClient, ApiConfig
23+
from agentkit.toolkit.config.global_config import get_global_config
2324

2425

2526
class BaseIAMClient(BaseServiceClient):
@@ -42,7 +43,7 @@ class BaseIAMClient(BaseServiceClient):
4243
# IAM service specific configuration
4344
IAM_API_VERSION = "2018-01-01"
4445
IAM_SERVICE_CODE = "iam"
45-
IAM_HOST ="open.volcengineapi.com"
46+
IAM_HOST = "open.volcengineapi.com"
4647

4748
def __init__(
4849
self,
@@ -78,8 +79,12 @@ def _get_service_config(self) -> Dict[str, str]:
7879
Returns:
7980
Dictionary with host, api_version, and service
8081
"""
82+
gc = get_global_config()
83+
scheme = gc.iam_schema or 'https'
84+
host = gc.iam_host or self.IAM_HOST
8185
return {
82-
'host': self.IAM_HOST,
86+
'host': host,
8387
'api_version': self.IAM_API_VERSION,
8488
'service': self.IAM_SERVICE_CODE,
89+
'scheme': scheme,
8590
}

agentkit/client/base_service_client.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ def __init__(
107107
self.host = config['host']
108108
self.api_version = config['api_version']
109109
self.service = config['service']
110+
self.scheme = config.get('scheme', 'https')
110111

111112
# Create ServiceInfo
112113
self.service_info = ServiceInfo(
@@ -121,7 +122,7 @@ def __init__(
121122
),
122123
connection_timeout=30,
123124
socket_timeout=30,
124-
scheme="https",
125+
scheme=self.scheme,
125126
)
126127

127128
# Generate ApiInfo for all actions

agentkit/toolkit/cli/cli_config.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,20 @@ def _set_global_field(field_value: str):
424424
if not hasattr(config.tos, field):
425425
raise AttributeError(f"tos has no field: {field}")
426426
setattr(config.tos, field, value)
427+
elif section == 'agentkit':
428+
if field not in ['host', 'schema']:
429+
raise AttributeError(f"agentkit has no field: {field}")
430+
if field == 'host':
431+
config.agentkit_host = value
432+
elif field == 'schema':
433+
config.agentkit_schema = value
434+
elif section == 'iam':
435+
if field not in ['host', 'schema']:
436+
raise AttributeError(f"iam has no field: {field}")
437+
if field == 'host':
438+
config.iam_host = value
439+
elif field == 'schema':
440+
config.iam_schema = value
427441
else:
428442
console.print(f"[red]❌ Unknown config section: {section}[/red]")
429443
console.print("\nSupported sections: volcengine, cr, tos")

agentkit/toolkit/config/global_config.py

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
from dataclasses import dataclass, field
2525
from pathlib import Path
2626
from typing import Optional
27-
import yaml
2827
import logging
2928

3029
from .utils import is_valid_config
@@ -68,12 +67,16 @@ class CRGlobalConfig:
6867
instance_name: str = ""
6968
namespace_name: str = ""
7069
auto_create_instance_type: str = "Micro" # Instance type when auto-creating: "Micro" or "Enterprise"
70+
host: str = ""
71+
schema: str = "https"
7172

7273
def to_dict(self):
7374
return {
7475
"instance_name": self.instance_name,
7576
"namespace_name": self.namespace_name,
7677
"auto_create_instance_type": self.auto_create_instance_type,
78+
"host": self.host,
79+
"schema": self.schema,
7780
}
7881

7982
@classmethod
@@ -82,6 +85,8 @@ def from_dict(cls, data: dict):
8285
instance_name=data.get("instance_name", ""),
8386
namespace_name=data.get("namespace_name", ""),
8487
auto_create_instance_type=data.get("auto_create_instance_type", "Micro"),
88+
host=data.get("host", ""),
89+
schema=data.get("schema", "https"),
8590
)
8691

8792

@@ -120,12 +125,24 @@ class GlobalConfig:
120125
volcengine: VolcengineCredentials = field(default_factory=VolcengineCredentials)
121126
cr: CRGlobalConfig = field(default_factory=CRGlobalConfig)
122127
tos: TOSGlobalConfig = field(default_factory=TOSGlobalConfig)
128+
agentkit_host: str = ""
129+
agentkit_schema: str = "https"
130+
iam_host: str = ""
131+
iam_schema: str = "https"
123132

124133
def to_dict(self):
125134
return {
126135
"volcengine": self.volcengine.to_dict(),
127136
"cr": self.cr.to_dict(),
128137
"tos": self.tos.to_dict(),
138+
"agentkit": {
139+
"host": self.agentkit_host,
140+
"schema": self.agentkit_schema,
141+
},
142+
"iam": {
143+
"host": self.iam_host,
144+
"schema": self.iam_schema,
145+
},
129146
}
130147

131148
@classmethod
@@ -134,6 +151,10 @@ def from_dict(cls, data: dict):
134151
volcengine=VolcengineCredentials.from_dict(data.get("volcengine", {})),
135152
cr=CRGlobalConfig.from_dict(data.get("cr", {})),
136153
tos=TOSGlobalConfig.from_dict(data.get("tos", {})),
154+
agentkit_host=(data.get("agentkit", {}) or {}).get("host", ""),
155+
agentkit_schema=(data.get("agentkit", {}) or {}).get("schema", "https"),
156+
iam_host=(data.get("iam", {}) or {}).get("host", ""),
157+
iam_schema=(data.get("iam", {}) or {}).get("schema", "https"),
137158
)
138159

139160

@@ -169,6 +190,7 @@ def load(self) -> GlobalConfig:
169190
return GlobalConfig()
170191

171192
try:
193+
import yaml
172194
with open(self.config_path, 'r', encoding='utf-8') as f:
173195
data = yaml.safe_load(f) or {}
174196
logger.debug(f"Loaded global config from: {self.config_path}")
@@ -188,6 +210,7 @@ def save(self, config: GlobalConfig):
188210

189211
# Write YAML config
190212
with open(self.config_path, 'w', encoding='utf-8') as f:
213+
import yaml
191214
yaml.dump(
192215
config.to_dict(),
193216
f,

agentkit/toolkit/volcengine/cr.py

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,16 @@ def __init__(self, access_key: str, secret_key: str, region: str = "cn-beijing")
2828
self.ak = access_key
2929
self.sk = secret_key
3030
self.region = region
31-
assert region in ["cn-beijing", "cn-guangzhou", "cn-shanghai"]
3231
self.version = "2022-05-12"
32+
try:
33+
from agentkit.toolkit.config.global_config import get_global_config
34+
gc = get_global_config()
35+
default_host = f"cr.{self.region}.volcengineapi.com"
36+
self.host = gc.cr.host or default_host
37+
self.scheme = gc.cr.schema or "https"
38+
except Exception:
39+
self.host = f"cr.{self.region}.volcengineapi.com"
40+
self.scheme = "https"
3341

3442
def _create_instance(
3543
self,
@@ -70,7 +78,8 @@ def _create_instance(
7078
service="cr",
7179
version=self.version,
7280
region=self.region,
73-
host=f"cr.{self.region}.volcengineapi.com",
81+
host=self.host,
82+
scheme=self.scheme,
7483
)
7584
logger.debug(f"create cr instance {instance_name}: {response}")
7685

@@ -122,7 +131,8 @@ def _check_instance(self, instance_name: str) -> str:
122131
service="cr",
123132
version=self.version,
124133
region=self.region,
125-
host=f"cr.{self.region}.volcengineapi.com",
134+
host=self.host,
135+
scheme=self.scheme,
126136
)
127137
logger.debug(f"check cr instance {instance_name}: {response}")
128138

@@ -159,7 +169,8 @@ def _create_namespace(
159169
service="cr",
160170
version=self.version,
161171
region=self.region,
162-
host=f"cr.{self.region}.volcengineapi.com",
172+
host=self.host,
173+
scheme=self.scheme,
163174
)
164175
logger.debug(f"create cr namespace {namespace_name}: {response}")
165176

@@ -210,7 +221,8 @@ def _create_repo(
210221
service="cr",
211222
version=self.version,
212223
region=self.region,
213-
host=f"cr.{self.region}.volcengineapi.com",
224+
host=self.host,
225+
scheme=self.scheme,
214226
)
215227
logger.debug(f"create cr repo {repo_name}: {response}")
216228

@@ -243,7 +255,8 @@ def _get_authorization_token(self, instance_name: str):
243255
service="cr",
244256
version=self.version,
245257
region=self.region,
246-
host=f"cr.{self.region}.volcengineapi.com",
258+
host=self.host,
259+
scheme=self.scheme,
247260
)
248261
logger.debug(f"get cr authorization token: {response}")
249262

@@ -274,7 +287,8 @@ def _get_public_endpoint(self, instance_name: str = DEFAULT_CR_INSTANCE_NAME):
274287
service="cr",
275288
version=self.version,
276289
region=self.region,
277-
host=f"cr.{self.region}.volcengineapi.com",
290+
host=self.host,
291+
scheme=self.scheme,
278292
)
279293
logger.debug(f"get cr public endpoint: {response}")
280294
if "Error" in response["ResponseMetadata"]:
@@ -304,7 +318,8 @@ def _update_public_endpoint(self, instance_name: str, enabled: bool):
304318
service="cr",
305319
version=self.version,
306320
region=self.region,
307-
host=f"cr.{self.region}.volcengineapi.com",
321+
host=self.host,
322+
scheme=self.scheme,
308323
)
309324
logger.debug(f"update cr public endpoint: {response}")
310325
if "Error" in response["ResponseMetadata"]:
@@ -336,7 +351,8 @@ def _create_endpoint_acl_policies(self, instance_name: str = DEFAULT_CR_INSTANCE
336351
service="cr",
337352
version=self.version,
338353
region=self.region,
339-
host=f"cr.{self.region}.volcengineapi.com",
354+
host=self.host,
355+
scheme=self.scheme,
340356
)
341357
logger.debug(f"create endpoint acl policies: {response}")
342358

@@ -367,7 +383,8 @@ def _list_domains(self, instance_name: str = DEFAULT_CR_INSTANCE_NAME):
367383
service="cr",
368384
version=self.version,
369385
region=self.region,
370-
host=f"cr.{self.region}.volcengineapi.com",
386+
host=self.host,
387+
scheme=self.scheme,
371388
)
372389
logger.debug(f"list cr domains: {response}")
373390
if "Error" in response["ResponseMetadata"]:
@@ -386,6 +403,14 @@ def _get_default_domain(self, instance_name: str = DEFAULT_CR_INSTANCE_NAME):
386403
get default cr domain
387404
"""
388405
domains = self._list_domains(instance_name=instance_name)
406+
# 如果只有一个结果,直接返回该域名
407+
try:
408+
if isinstance(domains, list) and len(domains) == 1:
409+
single = domains[0]
410+
if isinstance(single, dict) and "Domain" in single:
411+
return single["Domain"]
412+
except Exception:
413+
pass
389414
for domain in domains:
390415
if domain["Default"] == True:
391416
return domain["Domain"]

agentkit/utils/ve_sign.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
Region = ""
2626
Host = ""
2727
ContentType = ""
28+
Scheme = "https"
2829

2930

3031
def norm_query(params):
@@ -149,7 +150,7 @@ def request(method, date, query, header, ak, sk, action, body):
149150
# 第六步:将 Signature 签名写入 HTTP Header 中,并发送 HTTP 请求。
150151
r = requests.request(
151152
method=method,
152-
url="https://{}{}".format(request_param["host"], request_param["path"]),
153+
url=f"{Scheme}://{request_param['host']}{request_param['path']}",
153154
headers=header,
154155
params=request_param["query"],
155156
data=request_param["body"],
@@ -168,6 +169,7 @@ def ve_request(
168169
host: str,
169170
header: dict = {},
170171
content_type: str = "application/json",
172+
scheme: str = "https",
171173
):
172174
# response_body = request("Get", datetime.datetime.utcnow(), {}, {}, AK, SK, "ListUsers", None)
173175
# print(response_body)
@@ -182,6 +184,8 @@ def ve_request(
182184
Host = host
183185
global ContentType
184186
ContentType = content_type
187+
global Scheme
188+
Scheme = scheme or "https"
185189

186190
AK = ak
187191
SK = sk
@@ -281,7 +285,15 @@ def get_volc_ak_sk_region(service: str = ""):
281285

282286

283287
def get_volc_agentkit_host_info():
284-
host = os.getenv("VOLCENGINE_AGENTKIT_HOST") or os.getenv("VOLC_AGENTKIT_HOST")
288+
try:
289+
from agentkit.toolkit.config.global_config import get_global_config
290+
gc = get_global_config()
291+
if gc.agentkit_host:
292+
host = gc.agentkit_host
293+
else:
294+
host = os.getenv("VOLCENGINE_AGENTKIT_HOST") or os.getenv("VOLC_AGENTKIT_HOST")
295+
except Exception:
296+
host = os.getenv("VOLCENGINE_AGENTKIT_HOST") or os.getenv("VOLC_AGENTKIT_HOST")
285297
api_version = os.getenv("VOLCENGINE_AGENTKIT_API_VERSION") or os.getenv("VOLC_AGENTKIT_API_VERSION")
286298
service_code = os.getenv("VOLCENGINE_AGENTKIT_SERVICE") or os.getenv("VOLC_AGENTKIT_SERVICE")
287299
return host if host else "open.volcengineapi.com", api_version if api_version else "2025-10-30", service_code if service_code else "agentkit"
@@ -294,4 +306,3 @@ def get_identity_host_info():
294306
service_code = os.getenv("VOLCENGINE_IDENTITY_SERVICE") or os.getenv("VOLC_IDENTITY_SERVICE")
295307
region = os.getenv("VOLCENGINE_IDENTITY_REGION") or os.getenv("VOLC_IDENTITY_REGION")
296308
return host if host else "open.volcengineapi.com", api_version if api_version else "2023-10-01", service_code if service_code else "cis_test", region if region else "cn-beijing"
297-

0 commit comments

Comments
 (0)