Skip to content

Commit 74e8214

Browse files
committed
fixes
1 parent 02d45a0 commit 74e8214

18 files changed

Lines changed: 489 additions & 42 deletions

hyperbrowser/client/managers/async_manager/sandbox.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,10 @@ def memory_mib(self):
172172
def disk_mib(self):
173173
return self._detail.disk_mib
174174

175+
@property
176+
def timeout_minutes(self):
177+
return self._detail.timeout_minutes
178+
175179
@property
176180
def exposed_ports(self):
177181
return self._detail.exposed_ports
@@ -351,7 +355,7 @@ def _clear_runtime_session(self, status: Optional[str] = None) -> None:
351355
)
352356

353357
def _assert_runtime_available(self) -> None:
354-
if self._detail.status in {"closed", "error"}:
358+
if self._detail.status in {"closed", "error", "close-error"}:
355359
raise HyperbrowserError(
356360
f"Sandbox {self.id} is not running",
357361
status_code=409,
@@ -399,7 +403,7 @@ async def start_from_snapshot(
399403
],
400404
) -> SandboxHandle:
401405
normalized = coerce_request(params, StartSandboxFromSnapshotParams)
402-
return await self.create(normalized)
406+
return await self.create(normalized.model_dump(exclude_none=True))
403407

404408
async def get(self, sandbox_id: str) -> SandboxHandle:
405409
return self.attach(await self.get_detail(sandbox_id))

hyperbrowser/client/managers/sandboxes/image_build.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
IMAGE_BUILD_INPUT_FORMAT: SandboxImageBuildInputFormat = "rootfs_export_tar_gz"
2323
IMAGE_BUILD_SOURCE_PLATFORM = "linux/amd64"
2424
TERMINAL_IMAGE_BUILD_STATUSES: FrozenSet[SandboxImageBuildStatus] = frozenset(
25-
{"completed", "failed", "canceled", "cancelled"}
25+
{"completed", "failed", "canceled"}
2626
)
2727
_IMAGE_INIT_ENV_KEY_PATTERN = re.compile(r"^[A-Za-z_][A-Za-z0-9_]*$")
2828
_RESERVED_IMAGE_INIT_ENV_KEYS = {

hyperbrowser/client/managers/sync_manager/sandbox.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,10 @@ def memory_mib(self):
164164
def disk_mib(self):
165165
return self._detail.disk_mib
166166

167+
@property
168+
def timeout_minutes(self):
169+
return self._detail.timeout_minutes
170+
167171
@property
168172
def exposed_ports(self):
169173
return self._detail.exposed_ports
@@ -343,7 +347,7 @@ def _clear_runtime_session(self, status: Optional[str] = None) -> None:
343347
)
344348

345349
def _assert_runtime_available(self) -> None:
346-
if self._detail.status in {"closed", "error"}:
350+
if self._detail.status in {"closed", "error", "close-error"}:
347351
raise HyperbrowserError(
348352
f"Sandbox {self.id} is not running",
349353
status_code=409,
@@ -391,7 +395,7 @@ def start_from_snapshot(
391395
],
392396
) -> SandboxHandle:
393397
normalized = coerce_request(params, StartSandboxFromSnapshotParams)
394-
return self.create(normalized)
398+
return self.create(normalized.model_dump(exclude_none=True))
395399

396400
def get(self, sandbox_id: str) -> SandboxHandle:
397401
return self.attach(self.get_detail(sandbox_id))

hyperbrowser/models/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,7 @@
317317
SandboxMemorySnapshotParams,
318318
SandboxMemorySnapshotResult,
319319
SandboxImageBuildInputFormat,
320+
SandboxImageBuildSourcePlatform,
320321
SandboxImageBuildStatus,
321322
SandboxImageInit,
322323
CreateSandboxImageBuildParams,
@@ -615,6 +616,7 @@
615616
"SandboxMemorySnapshotParams",
616617
"SandboxMemorySnapshotResult",
617618
"SandboxImageBuildInputFormat",
619+
"SandboxImageBuildSourcePlatform",
618620
"SandboxImageBuildStatus",
619621
"SandboxImageInit",
620622
"CreateSandboxImageBuildParams",

hyperbrowser/models/consts.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@
100100
"high",
101101
]
102102
SessionRegion = Literal[
103+
"us",
103104
"us-central",
104105
"asia-south",
105106
"us-dev",

hyperbrowser/models/sandbox.py

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,16 @@
3939
SandboxFileSystemEventType = Literal["chmod", "create", "remove", "rename", "write"]
4040
SandboxVolumeMountType = Literal["rw", "ro"]
4141
SandboxImageBuildInputFormat = Literal["rootfs_export_tar_gz"]
42+
SandboxImageBuildSourcePlatform = Literal["linux/amd64"]
4243
SandboxImageBuildStatus = Literal[
4344
"awaiting_upload",
4445
"upload_verified",
46+
"dispatching",
4547
"building",
48+
"verifying",
4649
"completed",
4750
"failed",
4851
"canceled",
49-
"cancelled",
5052
]
5153

5254

@@ -147,6 +149,7 @@ class Sandbox(SandboxBaseModel):
147149
cpu: Optional[int] = Field(default=None, alias="vcpus")
148150
memory_mib: Optional[int] = Field(default=None, alias="memMiB")
149151
disk_mib: Optional[int] = Field(default=None, alias="diskSizeMiB")
152+
timeout_minutes: Optional[int] = Field(default=None, alias="timeoutMinutes")
150153
runtime: SandboxRuntimeTarget
151154
exposed_ports: List[SandboxExposeResult] = Field(
152155
default_factory=list,
@@ -163,6 +166,7 @@ class Sandbox(SandboxBaseModel):
163166
"cpu",
164167
"memory_mib",
165168
"disk_mib",
169+
"timeout_minutes",
166170
mode="before",
167171
)
168172
@classmethod
@@ -194,13 +198,7 @@ def parse_token_expires_at(cls, value):
194198
return _parse_optional_datetime(value)
195199

196200

197-
class CreateSandboxParams(SandboxBaseModel):
198-
snapshot_name: Optional[str] = Field(
199-
default=None, serialization_alias="snapshotName"
200-
)
201-
snapshot_id: Optional[str] = Field(default=None, serialization_alias="snapshotId")
202-
image_name: Optional[str] = Field(default=None, serialization_alias="imageName")
203-
image_id: Optional[str] = Field(default=None, serialization_alias="imageId")
201+
class _SandboxLaunchCommonParams(SandboxBaseModel):
204202
region: Optional[SandboxRegion] = None
205203
enable_recording: Optional[bool] = Field(
206204
default=None, serialization_alias="enableRecording"
@@ -216,18 +214,27 @@ class CreateSandboxParams(SandboxBaseModel):
216214
timeout_minutes: Optional[int] = Field(
217215
default=None, serialization_alias="timeoutMinutes"
218216
)
219-
cpu: Optional[int] = Field(default=None, ge=1, serialization_alias="vcpus")
220-
memory_mib: Optional[int] = Field(default=None, ge=1, serialization_alias="memMiB")
221-
disk_mib: Optional[int] = Field(
222-
default=None, ge=1, serialization_alias="diskSizeMiB"
223-
)
224217
allow_internet_access: Optional[bool] = Field(
225218
default=None,
226219
serialization_alias="allowInternetAccess",
227220
)
228221
allow_out: Optional[List[str]] = Field(default=None, serialization_alias="allowOut")
229222
deny_out: Optional[List[str]] = Field(default=None, serialization_alias="denyOut")
230223

224+
225+
class CreateSandboxParams(_SandboxLaunchCommonParams):
226+
snapshot_name: Optional[str] = Field(
227+
default=None, serialization_alias="snapshotName"
228+
)
229+
snapshot_id: Optional[str] = Field(default=None, serialization_alias="snapshotId")
230+
image_name: Optional[str] = Field(default=None, serialization_alias="imageName")
231+
image_id: Optional[str] = Field(default=None, serialization_alias="imageId")
232+
cpu: Optional[int] = Field(default=None, ge=1, serialization_alias="vcpus")
233+
memory_mib: Optional[int] = Field(default=None, ge=1, serialization_alias="memMiB")
234+
disk_mib: Optional[int] = Field(
235+
default=None, ge=1, serialization_alias="diskSizeMiB"
236+
)
237+
231238
@model_validator(mode="after")
232239
def validate_launch_source(self):
233240
if self.snapshot_id and not self.snapshot_name:
@@ -250,8 +257,11 @@ def validate_launch_source(self):
250257
return self
251258

252259

253-
class StartSandboxFromSnapshotParams(CreateSandboxParams):
254-
pass
260+
class StartSandboxFromSnapshotParams(_SandboxLaunchCommonParams):
261+
model_config = ConfigDict(populate_by_name=True, extra="forbid")
262+
263+
snapshot_name: str = Field(min_length=1, serialization_alias="snapshotName")
264+
snapshot_id: Optional[str] = Field(default=None, serialization_alias="snapshotId")
255265

256266

257267
class SandboxListParams(SandboxBaseModel):
@@ -365,7 +375,7 @@ class CreateSandboxImageBuildParams(SandboxBaseModel):
365375
default="rootfs_export_tar_gz",
366376
serialization_alias="inputFormat",
367377
)
368-
source_platform: str = Field(
378+
source_platform: SandboxImageBuildSourcePlatform = Field(
369379
default="linux/amd64",
370380
serialization_alias="sourcePlatform",
371381
)
@@ -378,7 +388,6 @@ class CreateSandboxImageBuildParams(SandboxBaseModel):
378388
serialization_alias="imageInit",
379389
)
380390

381-
382391
class CompleteSandboxImageBuildParams(SandboxBaseModel):
383392
input_sha256: str = Field(serialization_alias="inputSha256")
384393
input_size_bytes: int = Field(serialization_alias="inputSizeBytes")
@@ -387,7 +396,6 @@ class CompleteSandboxImageBuildParams(SandboxBaseModel):
387396
serialization_alias="inputFormat",
388397
)
389398

390-
391399
class SandboxImageBuildUpload(SandboxBaseModel):
392400
url: str
393401
method: str
@@ -431,8 +439,8 @@ class SandboxImageBuildCreateResult(SandboxBaseModel):
431439

432440

433441
class SandboxImageBuildListParams(SandboxBaseModel):
434-
status: Optional[str] = None
435-
limit: Optional[int] = Field(default=None, ge=1)
442+
status: Optional[SandboxImageBuildStatus] = None
443+
limit: Optional[int] = None
436444

437445

438446
class SandboxImageBuildListResponse(SandboxBaseModel):

hyperbrowser/models/session.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
SessionEventLogType,
1616
)
1717

18-
SessionStatus = Literal["active", "closed", "error"]
18+
SessionStatus = Literal["active", "closed", "error", "close-error"]
1919
BrowserMemorySize = Literal["small", "medium", "large"]
2020
CaptchaSolverType = Literal["visual"]
2121
CaptchaEvaluationType = Literal[

hyperbrowser/models/volume.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ class CreateVolumeParams(VolumeBaseModel):
1414

1515

1616
class VolumeListParams(VolumeBaseModel):
17-
page: Optional[int] = Field(default=None, ge=1)
18-
limit: Optional[int] = Field(default=None, ge=1)
17+
page: Optional[int] = None
18+
limit: Optional[int] = None
1919
search: Optional[str] = None
2020

2121

hyperbrowser/types/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@
8282
SandboxFileWriteTextParams,
8383
SandboxImageBuildInputFormat,
8484
SandboxImageBuildListParams,
85+
SandboxImageBuildSourcePlatform,
86+
SandboxImageBuildStatus,
8587
SandboxImageInit,
8688
SandboxImageListParams,
8789
SandboxListParams,
@@ -237,6 +239,8 @@
237239
"SandboxFileWriteTextParams",
238240
"SandboxImageBuildInputFormat",
239241
"SandboxImageBuildListParams",
242+
"SandboxImageBuildSourcePlatform",
243+
"SandboxImageBuildStatus",
240244
"SandboxImageInit",
241245
"SandboxImageListParams",
242246
"SandboxListParams",

hyperbrowser/types/sandbox.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from typing_extensions import Required, TypeAlias, TypedDict
44

55

6-
SandboxStatus: TypeAlias = Literal["active", "closed", "error"]
6+
SandboxStatus: TypeAlias = Literal["active", "closed", "error", "close-error"]
77
SandboxRegion: TypeAlias = Literal[
88
"us-central",
99
"asia-south",
@@ -27,6 +27,17 @@
2727
SandboxFileWatchRoute: TypeAlias = Literal["ws", "stream"]
2828
SandboxVolumeMountType: TypeAlias = Literal["rw", "ro"]
2929
SandboxImageBuildInputFormat: TypeAlias = Literal["rootfs_export_tar_gz"]
30+
SandboxImageBuildSourcePlatform: TypeAlias = Literal["linux/amd64"]
31+
SandboxImageBuildStatus: TypeAlias = Literal[
32+
"awaiting_upload",
33+
"upload_verified",
34+
"dispatching",
35+
"building",
36+
"verifying",
37+
"completed",
38+
"failed",
39+
"canceled",
40+
]
3041
SandboxFileWriteData: TypeAlias = Union[str, bytes]
3142

3243

@@ -131,7 +142,7 @@ class SandboxSnapshotListParams(TypedDict, total=False):
131142
class SandboxImageBuildListParams(TypedDict, total=False):
132143
"""Filters for listing sandbox image builds."""
133144

134-
status: Optional[str]
145+
status: Optional[SandboxImageBuildStatus]
135146
limit: Optional[int]
136147

137148

@@ -148,7 +159,7 @@ class CreateSandboxImageBuildParams(TypedDict, total=False):
148159
input_sha256: Required[str]
149160
input_size_bytes: Required[int]
150161
input_format: SandboxImageBuildInputFormat
151-
source_platform: str
162+
source_platform: SandboxImageBuildSourcePlatform
152163
image_config_user: Optional[str]
153164
image_init: Optional[SandboxImageInit]
154165

@@ -423,6 +434,8 @@ class SandboxTerminalKillParams(TypedDict, total=False):
423434
"SandboxFileWriteTextParams",
424435
"SandboxImageBuildInputFormat",
425436
"SandboxImageBuildListParams",
437+
"SandboxImageBuildSourcePlatform",
438+
"SandboxImageBuildStatus",
426439
"SandboxImageInit",
427440
"SandboxImageListParams",
428441
"SandboxListParams",

0 commit comments

Comments
 (0)