feat: ad os field to virtual enviroment

This commit is contained in:
Harry 2026-01-12 01:26:55 +08:00
parent 2d8acf92f0
commit ce0a59b60d
5 changed files with 70 additions and 10 deletions

View File

@ -14,6 +14,15 @@ class Arch(StrEnum):
AMD64 = "amd64" AMD64 = "amd64"
class OperatingSystem(StrEnum):
"""
Operating system types for virtual environments.
"""
LINUX = "linux"
DARWIN = "darwin"
class Metadata(BaseModel): class Metadata(BaseModel):
""" """
Returned metadata about a virtual environment. Returned metadata about a virtual environment.
@ -21,6 +30,7 @@ class Metadata(BaseModel):
id: str = Field(description="The unique identifier of the virtual environment.") id: str = Field(description="The unique identifier of the virtual environment.")
arch: Arch = Field(description="Which architecture was used to create the virtual environment.") arch: Arch = Field(description="Which architecture was used to create the virtual environment.")
os: OperatingSystem = Field(description="The operating system of the virtual environment.")
store: Mapping[str, Any] = Field( store: Mapping[str, Any] = Field(
default_factory=dict, description="The store information of the virtual environment., Additional data." default_factory=dict, description="The store information of the virtual environment., Additional data."
) )

View File

@ -29,7 +29,14 @@ class _CommandRecord(TypedDict):
exit_code: int | None exit_code: int | None
from core.virtual_environment.__base.entities import Arch, CommandStatus, ConnectionHandle, FileState, Metadata from core.virtual_environment.__base.entities import (
Arch,
CommandStatus,
ConnectionHandle,
FileState,
Metadata,
OperatingSystem,
)
from core.virtual_environment.__base.virtual_environment import VirtualEnvironment from core.virtual_environment.__base.virtual_environment import VirtualEnvironment
from core.virtual_environment.channel.queue_transport import QueueTransportReadCloser from core.virtual_environment.channel.queue_transport import QueueTransportReadCloser
from core.virtual_environment.channel.transport import ( from core.virtual_environment.channel.transport import (
@ -117,6 +124,7 @@ class DaytonaEnvironment(VirtualEnvironment):
return Metadata( return Metadata(
id=sandbox.id, id=sandbox.id,
arch=Arch.AMD64, arch=Arch.AMD64,
os=OperatingSystem.LINUX,
store={ store={
self.StoreKey.DAYTONA: daytona, self.StoreKey.DAYTONA: daytona,
self.StoreKey.SANDBOX: sandbox, self.StoreKey.SANDBOX: sandbox,

View File

@ -15,7 +15,14 @@ import docker.errors
from docker.models.containers import Container from docker.models.containers import Container
import docker import docker
from core.virtual_environment.__base.entities import Arch, CommandStatus, ConnectionHandle, FileState, Metadata from core.virtual_environment.__base.entities import (
Arch,
CommandStatus,
ConnectionHandle,
FileState,
Metadata,
OperatingSystem,
)
from core.virtual_environment.__base.exec import SandboxConfigValidationError, VirtualEnvironmentLaunchFailedError from core.virtual_environment.__base.exec import SandboxConfigValidationError, VirtualEnvironmentLaunchFailedError
from core.virtual_environment.__base.virtual_environment import VirtualEnvironment from core.virtual_environment.__base.virtual_environment import VirtualEnvironment
from core.virtual_environment.channel.exec import TransportEOFError from core.virtual_environment.channel.exec import TransportEOFError
@ -288,6 +295,7 @@ class DockerDaemonEnvironment(VirtualEnvironment):
return Metadata( return Metadata(
id=container.id, id=container.id,
arch=self._get_container_architecture(container), arch=self._get_container_architecture(container),
os=OperatingSystem.LINUX,
) )
@classmethod @classmethod

View File

@ -10,7 +10,14 @@ from uuid import uuid4
from e2b_code_interpreter import Sandbox # type: ignore[import-untyped] from e2b_code_interpreter import Sandbox # type: ignore[import-untyped]
from core.virtual_environment.__base.entities import Arch, CommandStatus, ConnectionHandle, FileState, Metadata from core.virtual_environment.__base.entities import (
Arch,
CommandStatus,
ConnectionHandle,
FileState,
Metadata,
OperatingSystem,
)
from core.virtual_environment.__base.exec import ( from core.virtual_environment.__base.exec import (
ArchNotSupportedError, ArchNotSupportedError,
NotSupportedOperationError, NotSupportedOperationError,
@ -116,11 +123,13 @@ class E2BEnvironment(VirtualEnvironment):
envs=dict(environments), envs=dict(environments),
) )
info = sandbox.get_info(api_key=options.get(self.OptionsKey.API_KEY, "")) info = sandbox.get_info(api_key=options.get(self.OptionsKey.API_KEY, ""))
output = sandbox.commands.run("uname -m").stdout.strip() arch_output = sandbox.commands.run("uname -m").stdout.strip()
os_output = sandbox.commands.run("uname -s").stdout.strip()
return Metadata( return Metadata(
id=info.sandbox_id, id=info.sandbox_id,
arch=self._convert_architecture(output), arch=self._convert_architecture(arch_output),
os=self._convert_operating_system(os_output),
store={ store={
self.StoreKey.SANDBOX: sandbox, self.StoreKey.SANDBOX: sandbox,
}, },
@ -254,9 +263,6 @@ class E2BEnvironment(VirtualEnvironment):
return self.options.get(self.OptionsKey.API_KEY, "") return self.options.get(self.OptionsKey.API_KEY, "")
def _convert_architecture(self, arch_str: str) -> Arch: def _convert_architecture(self, arch_str: str) -> Arch:
"""
Convert architecture string to standard format.
"""
arch_map = { arch_map = {
"x86_64": Arch.AMD64, "x86_64": Arch.AMD64,
"aarch64": Arch.ARM64, "aarch64": Arch.ARM64,
@ -270,3 +276,13 @@ class E2BEnvironment(VirtualEnvironment):
return arch_map[arch_str] return arch_map[arch_str]
raise ArchNotSupportedError(f"Unsupported architecture: {arch_str}") raise ArchNotSupportedError(f"Unsupported architecture: {arch_str}")
def _convert_operating_system(self, os_str: str) -> OperatingSystem:
os_map = {
"Linux": OperatingSystem.LINUX,
"Darwin": OperatingSystem.DARWIN,
}
if os_str in os_map:
return os_map[os_str]
raise ArchNotSupportedError(f"Unsupported operating system: {os_str}")

View File

@ -4,11 +4,18 @@ import subprocess
from collections.abc import Mapping, Sequence from collections.abc import Mapping, Sequence
from functools import cached_property from functools import cached_property
from io import BytesIO from io import BytesIO
from platform import machine from platform import machine, system
from typing import Any from typing import Any
from uuid import uuid4 from uuid import uuid4
from core.virtual_environment.__base.entities import Arch, CommandStatus, ConnectionHandle, FileState, Metadata from core.virtual_environment.__base.entities import (
Arch,
CommandStatus,
ConnectionHandle,
FileState,
Metadata,
OperatingSystem,
)
from core.virtual_environment.__base.exec import ArchNotSupportedError from core.virtual_environment.__base.exec import ArchNotSupportedError
from core.virtual_environment.__base.virtual_environment import VirtualEnvironment from core.virtual_environment.__base.virtual_environment import VirtualEnvironment
from core.virtual_environment.channel.pipe_transport import PipeReadCloser, PipeWriteCloser from core.virtual_environment.channel.pipe_transport import PipeReadCloser, PipeWriteCloser
@ -81,6 +88,7 @@ class LocalVirtualEnvironment(VirtualEnvironment):
return Metadata( return Metadata(
id=id, id=id,
arch=self._get_os_architecture(), arch=self._get_os_architecture(),
os=self._get_operating_system(),
) )
def release_environment(self) -> None: def release_environment(self) -> None:
@ -250,6 +258,16 @@ class LocalVirtualEnvironment(VirtualEnvironment):
case _: case _:
raise ArchNotSupportedError(f"Unsupported architecture: {arch}") raise ArchNotSupportedError(f"Unsupported architecture: {arch}")
def _get_operating_system(self) -> OperatingSystem:
os_name = system().lower()
match os_name:
case "linux":
return OperatingSystem.LINUX
case "darwin":
return OperatingSystem.DARWIN
case _:
raise ArchNotSupportedError(f"Unsupported operating system: {os_name}")
@cached_property @cached_property
def _base_working_path(self) -> str: def _base_working_path(self) -> str:
""" """