|
import asyncio
|
|
|
|
from openhands.core.config import AppConfig
|
|
from openhands.events.stream import EventStream
|
|
from openhands.runtime import get_runtime_cls
|
|
from openhands.runtime.base import Runtime
|
|
from openhands.security import SecurityAnalyzer, options
|
|
from openhands.storage.files import FileStore
|
|
from openhands.utils.async_utils import call_sync_from_async
|
|
|
|
|
|
class Conversation:
|
|
sid: str
|
|
file_store: FileStore
|
|
event_stream: EventStream
|
|
runtime: Runtime
|
|
|
|
def __init__(
|
|
self,
|
|
sid: str,
|
|
file_store: FileStore,
|
|
config: AppConfig,
|
|
):
|
|
self.sid = sid
|
|
self.config = config
|
|
self.file_store = file_store
|
|
self.event_stream = EventStream(sid, file_store)
|
|
if config.security.security_analyzer:
|
|
self.security_analyzer = options.SecurityAnalyzers.get(
|
|
config.security.security_analyzer, SecurityAnalyzer
|
|
)(self.event_stream)
|
|
|
|
runtime_cls = get_runtime_cls(self.config.runtime)
|
|
self.runtime = runtime_cls(
|
|
config=config,
|
|
event_stream=self.event_stream,
|
|
sid=self.sid,
|
|
attach_to_existing=True,
|
|
headless_mode=False,
|
|
)
|
|
|
|
async def connect(self):
|
|
await self.runtime.connect()
|
|
|
|
async def disconnect(self):
|
|
if self.event_stream:
|
|
self.event_stream.close()
|
|
asyncio.create_task(call_sync_from_async(self.runtime.close))
|
|
|