runtime.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. from opendevin.core.config import AppConfig
  2. from opendevin.events.action import (
  3. FileReadAction,
  4. FileWriteAction,
  5. )
  6. from opendevin.events.observation import (
  7. ErrorObservation,
  8. FileReadObservation,
  9. FileWriteObservation,
  10. Observation,
  11. )
  12. from opendevin.events.stream import EventStream
  13. from opendevin.runtime import Sandbox
  14. from opendevin.runtime.plugins import PluginRequirement
  15. from opendevin.runtime.server.files import insert_lines, read_lines
  16. from opendevin.runtime.server.runtime import ServerRuntime
  17. from .filestore import E2BFileStore
  18. from .sandbox import E2BSandbox
  19. class E2BRuntime(ServerRuntime):
  20. def __init__(
  21. self,
  22. config: AppConfig,
  23. event_stream: EventStream,
  24. sid: str = 'default',
  25. plugins: list[PluginRequirement] | None = None,
  26. sandbox: Sandbox | None = None,
  27. ):
  28. super().__init__(config, event_stream, sid, plugins, sandbox)
  29. if not isinstance(self.sandbox, E2BSandbox):
  30. raise ValueError('E2BRuntime requires an E2BSandbox')
  31. self.file_store = E2BFileStore(self.sandbox.filesystem)
  32. async def read(self, action: FileReadAction) -> Observation:
  33. content = self.file_store.read(action.path)
  34. lines = read_lines(content.split('\n'), action.start, action.end)
  35. code_view = ''.join(lines)
  36. return FileReadObservation(code_view, path=action.path)
  37. async def write(self, action: FileWriteAction) -> Observation:
  38. if action.start == 0 and action.end == -1:
  39. self.file_store.write(action.path, action.content)
  40. return FileWriteObservation(content='', path=action.path)
  41. files = self.file_store.list(action.path)
  42. if action.path in files:
  43. all_lines = self.file_store.read(action.path).split('\n')
  44. new_file = insert_lines(
  45. action.content.split('\n'), all_lines, action.start, action.end
  46. )
  47. self.file_store.write(action.path, ''.join(new_file))
  48. return FileWriteObservation('', path=action.path)
  49. else:
  50. # FIXME: we should create a new file here
  51. return ErrorObservation(f'File not found: {action.path}')