Skip to content

Commit f26b818

Browse files
authored
Merge pull request #62 from Serverless-Devs/add-create-sandbox_id-define
Add create sandbox id define
2 parents a6c7e20 + 01faafe commit f26b818

23 files changed

+6995
-85
lines changed

agentrun/sandbox/__client_async_template.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,7 @@ async def create_sandbox_async(
276276
self,
277277
template_name: str,
278278
sandbox_idle_timeout_seconds: Optional[int] = 600,
279+
sandbox_id: Optional[str] = None,
279280
nas_config: Optional[NASConfig] = None,
280281
oss_mount_config: Optional[OSSMountConfig] = None,
281282
polar_fs_config: Optional[PolarFsConfig] = None,
@@ -286,6 +287,7 @@ async def create_sandbox_async(
286287
Args:
287288
template_name: 模板名称 / Template name
288289
sandbox_idle_timeout_seconds: 沙箱空闲超时时间(秒) / Sandbox idle timeout (seconds)
290+
sandbox_id: 沙箱 ID(可选,用户可指定) / Sandbox ID (optional, user can specify)
289291
nas_config: NAS 配置 / NAS configuration
290292
oss_mount_config: OSS 挂载配置 / OSS mount configuration
291293
polar_fs_config: PolarFS 配置 / PolarFS configuration
@@ -314,6 +316,7 @@ async def create_sandbox_async(
314316
result = await self.__sandbox_data_api.create_sandbox_async(
315317
template_name=template_name,
316318
sandbox_idle_timeout_seconds=sandbox_idle_timeout_seconds,
319+
sandbox_id=sandbox_id,
317320
nas_config=nas_config_dict,
318321
oss_mount_config=oss_mount_config_dict,
319322
polar_fs_config=polar_fs_config_dict,
@@ -353,7 +356,7 @@ async def stop_sandbox_async(
353356
"""
354357
try:
355358
result = await self.__sandbox_data_api.stop_sandbox_async(
356-
sandbox_id
359+
sandbox_id, config=config
357360
)
358361

359362
# 判断返回结果是否成功
@@ -393,7 +396,7 @@ async def delete_sandbox_async(
393396
"""
394397
try:
395398
result = await self.__sandbox_data_api.delete_sandbox_async(
396-
sandbox_id
399+
sandbox_id, config=config
397400
)
398401

399402
# 判断返回结果是否成功
@@ -434,7 +437,9 @@ async def get_sandbox_async(
434437
ServerError: 服务器错误
435438
"""
436439
try:
437-
result = await self.__sandbox_data_api.get_sandbox_async(sandbox_id)
440+
result = await self.__sandbox_data_api.get_sandbox_async(
441+
sandbox_id, config=config
442+
)
438443

439444
# 判断返回结果是否成功
440445
if result.get("code") != "SUCCESS":

agentrun/sandbox/__sandbox_async_template.py

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ async def create_async(
8787
template_type: Literal[TemplateType.CODE_INTERPRETER],
8888
template_name: Optional[str] = None,
8989
sandbox_idle_timeout_seconds: Optional[int] = 600,
90+
sandbox_id: Optional[str] = None,
9091
nas_config: Optional["NASConfig"] = None,
9192
oss_mount_config: Optional["OSSMountConfig"] = None,
9293
polar_fs_config: Optional["PolarFsConfig"] = None,
@@ -101,6 +102,7 @@ async def create_async(
101102
template_type: Literal[TemplateType.BROWSER],
102103
template_name: Optional[str] = None,
103104
sandbox_idle_timeout_seconds: Optional[int] = 600,
105+
sandbox_id: Optional[str] = None,
104106
nas_config: Optional["NASConfig"] = None,
105107
oss_mount_config: Optional["OSSMountConfig"] = None,
106108
polar_fs_config: Optional["PolarFsConfig"] = None,
@@ -115,6 +117,7 @@ async def create_async(
115117
template_type: Literal[TemplateType.AIO],
116118
template_name: Optional[str] = None,
117119
sandbox_idle_timeout_seconds: Optional[int] = 600,
120+
sandbox_id: Optional[str] = None,
118121
nas_config: Optional["NASConfig"] = None,
119122
oss_mount_config: Optional["OSSMountConfig"] = None,
120123
polar_fs_config: Optional["PolarFsConfig"] = None,
@@ -129,6 +132,7 @@ async def create_async(
129132
template_type: Literal[TemplateType.CUSTOM],
130133
template_name: Optional[str] = None,
131134
sandbox_idle_timeout_seconds: Optional[int] = 600,
135+
sandbox_id: Optional[str] = None,
132136
nas_config: Optional["NASConfig"] = None,
133137
oss_mount_config: Optional["OSSMountConfig"] = None,
134138
polar_fs_config: Optional["PolarFsConfig"] = None,
@@ -142,6 +146,7 @@ async def create_async(
142146
template_type: TemplateType,
143147
template_name: Optional[str] = None,
144148
sandbox_idle_timeout_seconds: Optional[int] = 600,
149+
sandbox_id: Optional[str] = None,
145150
nas_config: Optional["NASConfig"] = None,
146151
oss_mount_config: Optional["OSSMountConfig"] = None,
147152
polar_fs_config: Optional["PolarFsConfig"] = None,
@@ -178,6 +183,7 @@ async def create_async(
178183
base_sandbox = await cls.__get_client().create_sandbox_async(
179184
template_name=template_name,
180185
sandbox_idle_timeout_seconds=sandbox_idle_timeout_seconds,
186+
sandbox_id=sandbox_id,
181187
nas_config=nas_config,
182188
oss_mount_config=oss_mount_config,
183189
polar_fs_config=polar_fs_config,
@@ -308,7 +314,9 @@ async def connect_async(
308314
309315
Args:
310316
sandbox_id: Sandbox ID
311-
type: 可选的类型参数,用于类型提示和运行时验证
317+
template_type: 可选的类型参数,用于类型提示和运行时类型决定。
318+
提供时直接使用该类型决定返回的子类,不调用 get_template(无需 AKSK)。
319+
未提供时通过 get_template 获取类型(需要 AKSK)。
312320
config: 配置对象
313321
314322
Returns:
@@ -325,47 +333,38 @@ async def connect_async(
325333
sandbox_id, config=config
326334
)
327335

328-
# 根据 template_name 获取 template 类型
329-
if sandbox.template_name is None:
330-
raise ValueError(f"Sandbox {sandbox_id} has no template_name")
336+
resolved_type = template_type
337+
if resolved_type is None:
338+
if sandbox.template_name is None:
339+
raise ValueError(f"Sandbox {sandbox_id} has no template_name")
331340

332-
template = await cls.get_template_async(
333-
sandbox.template_name, config=config
334-
)
335-
336-
# 如果提供了 type 参数,验证类型是否匹配
337-
if (
338-
template_type is not None
339-
and template.template_type != template_type
340-
):
341-
raise ValueError(
342-
f"Sandbox {sandbox_id} has template type"
343-
f" {template.template_type}, but expected {template_type}"
341+
template = await cls.get_template_async(
342+
sandbox.template_name, config=config
344343
)
344+
resolved_type = template.template_type
345345

346-
# 根据 template 类型创建相应的 Sandbox 子类
347346
from agentrun.sandbox.aio_sandbox import AioSandbox
348347
from agentrun.sandbox.browser_sandbox import BrowserSandbox
349348
from agentrun.sandbox.code_interpreter_sandbox import (
350349
CodeInterpreterSandbox,
351350
)
352351

353352
result = None
354-
if template.template_type == TemplateType.CODE_INTERPRETER:
353+
if resolved_type == TemplateType.CODE_INTERPRETER:
355354
result = CodeInterpreterSandbox.model_validate(
356355
sandbox.model_dump(by_alias=False)
357356
)
358-
elif template.template_type == TemplateType.BROWSER:
357+
elif resolved_type == TemplateType.BROWSER:
359358
result = BrowserSandbox.model_validate(
360359
sandbox.model_dump(by_alias=False)
361360
)
362-
elif template.template_type == TemplateType.AIO:
361+
elif resolved_type == TemplateType.AIO:
363362
result = AioSandbox.model_validate(
364363
sandbox.model_dump(by_alias=False)
365364
)
366365
else:
367366
raise ValueError(
368-
f"Unsupported template type: {template.template_type}. "
367+
f"Unsupported template type: {resolved_type}. "
369368
"Expected 'code-interpreter', 'browser' or 'aio'"
370369
)
371370

agentrun/sandbox/api/__sandbox_data_async_template.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ async def create_sandbox_async(
7070
self,
7171
template_name: str,
7272
sandbox_idle_timeout_seconds: Optional[int] = 600,
73+
sandbox_id: Optional[str] = None,
7374
nas_config: Optional[Dict[str, Any]] = None,
7475
oss_mount_config: Optional[Dict[str, Any]] = None,
7576
polar_fs_config: Optional[Dict[str, Any]] = None,
@@ -80,28 +81,30 @@ async def create_sandbox_async(
8081
"templateName": template_name,
8182
"sandboxIdleTimeoutSeconds": sandbox_idle_timeout_seconds,
8283
}
84+
if sandbox_id is not None:
85+
data["sandboxId"] = sandbox_id
8386
if nas_config is not None:
8487
data["nasConfig"] = nas_config
8588
if oss_mount_config is not None:
8689
data["ossMountConfig"] = oss_mount_config
8790
if polar_fs_config is not None:
8891
data["polarFsConfig"] = polar_fs_config
89-
return await self.post_async("/", data=data)
92+
return await self.post_async("/", data=data, config=config)
9093

9194
async def delete_sandbox_async(
9295
self, sandbox_id: str, config: Optional[Config] = None
9396
):
9497
self.__refresh_access_token(sandbox_id=sandbox_id, config=config)
95-
return await self.delete_async("/")
98+
return await self.delete_async("/", config=config)
9699

97100
async def stop_sandbox_async(
98101
self, sandbox_id: str, config: Optional[Config] = None
99102
):
100103
self.__refresh_access_token(sandbox_id=sandbox_id, config=config)
101-
return await self.post_async("/stop")
104+
return await self.post_async("/stop", config=config)
102105

103106
async def get_sandbox_async(
104107
self, sandbox_id: str, config: Optional[Config] = None
105108
):
106109
self.__refresh_access_token(sandbox_id=sandbox_id, config=config)
107-
return await self.get_async("/")
110+
return await self.get_async("/", config=config)

agentrun/sandbox/api/sandbox_data.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ async def create_sandbox_async(
8383
self,
8484
template_name: str,
8585
sandbox_idle_timeout_seconds: Optional[int] = 600,
86+
sandbox_id: Optional[str] = None,
8687
nas_config: Optional[Dict[str, Any]] = None,
8788
oss_mount_config: Optional[Dict[str, Any]] = None,
8889
polar_fs_config: Optional[Dict[str, Any]] = None,
@@ -93,18 +94,21 @@ async def create_sandbox_async(
9394
"templateName": template_name,
9495
"sandboxIdleTimeoutSeconds": sandbox_idle_timeout_seconds,
9596
}
97+
if sandbox_id is not None:
98+
data["sandboxId"] = sandbox_id
9699
if nas_config is not None:
97100
data["nasConfig"] = nas_config
98101
if oss_mount_config is not None:
99102
data["ossMountConfig"] = oss_mount_config
100103
if polar_fs_config is not None:
101104
data["polarFsConfig"] = polar_fs_config
102-
return await self.post_async("/", data=data)
105+
return await self.post_async("/", data=data, config=config)
103106

104107
def create_sandbox(
105108
self,
106109
template_name: str,
107110
sandbox_idle_timeout_seconds: Optional[int] = 600,
111+
sandbox_id: Optional[str] = None,
108112
nas_config: Optional[Dict[str, Any]] = None,
109113
oss_mount_config: Optional[Dict[str, Any]] = None,
110114
polar_fs_config: Optional[Dict[str, Any]] = None,
@@ -115,40 +119,42 @@ def create_sandbox(
115119
"templateName": template_name,
116120
"sandboxIdleTimeoutSeconds": sandbox_idle_timeout_seconds,
117121
}
122+
if sandbox_id is not None:
123+
data["sandboxId"] = sandbox_id
118124
if nas_config is not None:
119125
data["nasConfig"] = nas_config
120126
if oss_mount_config is not None:
121127
data["ossMountConfig"] = oss_mount_config
122128
if polar_fs_config is not None:
123129
data["polarFsConfig"] = polar_fs_config
124-
return self.post("/", data=data)
130+
return self.post("/", data=data, config=config)
125131

126132
async def delete_sandbox_async(
127133
self, sandbox_id: str, config: Optional[Config] = None
128134
):
129135
self.__refresh_access_token(sandbox_id=sandbox_id, config=config)
130-
return await self.delete_async("/")
136+
return await self.delete_async("/", config=config)
131137

132138
def delete_sandbox(self, sandbox_id: str, config: Optional[Config] = None):
133139
self.__refresh_access_token(sandbox_id=sandbox_id, config=config)
134-
return self.delete("/")
140+
return self.delete("/", config=config)
135141

136142
async def stop_sandbox_async(
137143
self, sandbox_id: str, config: Optional[Config] = None
138144
):
139145
self.__refresh_access_token(sandbox_id=sandbox_id, config=config)
140-
return await self.post_async("/stop")
146+
return await self.post_async("/stop", config=config)
141147

142148
def stop_sandbox(self, sandbox_id: str, config: Optional[Config] = None):
143149
self.__refresh_access_token(sandbox_id=sandbox_id, config=config)
144-
return self.post("/stop")
150+
return self.post("/stop", config=config)
145151

146152
async def get_sandbox_async(
147153
self, sandbox_id: str, config: Optional[Config] = None
148154
):
149155
self.__refresh_access_token(sandbox_id=sandbox_id, config=config)
150-
return await self.get_async("/")
156+
return await self.get_async("/", config=config)
151157

152158
def get_sandbox(self, sandbox_id: str, config: Optional[Config] = None):
153159
self.__refresh_access_token(sandbox_id=sandbox_id, config=config)
154-
return self.get("/")
160+
return self.get("/", config=config)

0 commit comments

Comments
 (0)