Spaces:
Build error
Build error
from typing import Callable | |
from openhands.core.config import OpenHandsConfig | |
from openhands.events.action import ( | |
FileReadAction, | |
FileWriteAction, | |
) | |
from openhands.events.observation import ( | |
ErrorObservation, | |
FileReadObservation, | |
FileWriteObservation, | |
Observation, | |
) | |
from openhands.events.stream import EventStream | |
from openhands.runtime.base import Runtime | |
from openhands.runtime.impl.e2b.filestore import E2BFileStore | |
from openhands.runtime.impl.e2b.sandbox import E2BSandbox | |
from openhands.runtime.plugins import PluginRequirement | |
from openhands.runtime.utils.files import insert_lines, read_lines | |
class E2BRuntime(Runtime): | |
def __init__( | |
self, | |
config: OpenHandsConfig, | |
event_stream: EventStream, | |
sid: str = 'default', | |
plugins: list[PluginRequirement] | None = None, | |
sandbox: E2BSandbox | None = None, | |
status_callback: Callable | None = None, | |
): | |
super().__init__( | |
config, | |
event_stream, | |
sid, | |
plugins, | |
status_callback=status_callback, | |
) | |
if sandbox is None: | |
self.sandbox = E2BSandbox() | |
if not isinstance(self.sandbox, E2BSandbox): | |
raise ValueError('E2BRuntime requires an E2BSandbox') | |
self.file_store = E2BFileStore(self.sandbox.filesystem) | |
def read(self, action: FileReadAction) -> Observation: | |
content = self.file_store.read(action.path) | |
lines = read_lines(content.split('\n'), action.start, action.end) | |
code_view = ''.join(lines) | |
return FileReadObservation(code_view, path=action.path) | |
def write(self, action: FileWriteAction) -> Observation: | |
if action.start == 0 and action.end == -1: | |
self.file_store.write(action.path, action.content) | |
return FileWriteObservation(content='', path=action.path) | |
files = self.file_store.list(action.path) | |
if action.path in files: | |
all_lines = self.file_store.read(action.path).split('\n') | |
new_file = insert_lines( | |
action.content.split('\n'), all_lines, action.start, action.end | |
) | |
self.file_store.write(action.path, ''.join(new_file)) | |
return FileWriteObservation('', path=action.path) | |
else: | |
# FIXME: we should create a new file here | |
return ErrorObservation(f'File not found: {action.path}') | |