@startuml opendevin
!pragma useIntermediatePackages false

class opendevin.action.agent.AgentEchoAction {
  content: str
  runnable: bool
  action: str
}
class opendevin.action.agent.AgentFinishAction {
  runnable: bool
  action: str
}
class opendevin.observation.AgentMessageObservation {
  role: str
  observation: str
}
class opendevin.action.agent.AgentRecallAction {
  query: str
  action: str
}
class opendevin.observation.AgentRecallObservation {
  memories: List[str]
  role: str
  observation: str
}
class opendevin.action.agent.AgentSummarizeAction {
  summary: str
  action: str
}
class opendevin.action.agent.AgentThinkAction {
  thought: str
  runnable: bool
  action: str
}
class opendevin.action.base.ExecutableAction {
}
class opendevin.action.base.NotExecutableAction {
}
class opendevin.observation.Observation {
  content: str
}
class opendevin.action.base.Action {
}
class opendevin.action.base.NullAction {
  action: str
}
class opendevin.action.bash.CmdKillAction {
  id: int
  action: str
}
class opendevin.action.bash.CmdRunAction {
  command: str
  background: bool
  action: str
}
class opendevin.action.browse.BrowseURLAction {
  url: str
  action: str
}
class opendevin.observation.BrowserOutputObservation {
  url: str
  status_code: int
  error: bool
  observation: str
}
class opendevin.action.fileop.FileReadAction {
  path: str
  action: str
}
class opendevin.observation.FileReadObservation {
  path: str
  observation: str
}
class opendevin.action.fileop.FileWriteAction {
  path: str
  contents: str
  action: str
}
class opendevin.observation.FileWriteObservation {
  path: str
  observation: str
}
class opendevin.action.tasks.AddTaskAction {
  parent: str
  goal: str
  subtasks: list
  action: str
}
class opendevin.action.tasks.ModifyTaskAction {
  id: str
  state: str
  action: str
}
abstract class opendevin.agent.Agent {
  _registry: Dict[str, Type[Agent]] {static}
  llm: LLM
  _complete: None
}
class opendevin.llm.llm.LLM {
  model: None
  api_key: None
  base_url: None
  _debug_dir: None
  _debug_idx: None
  _debug_id: None
  _completion: None
}
class opendevin.controller.agent_controller.AgentController {
  agent: Agent
  max_iterations: int
  workdir: str
  command_manager: CommandManager
  state: State
  plan: Plan
  callbacks: List[Callable]
}
class opendevin.observation.AgentErrorObservation {
  observation: str
}
class opendevin.controller.command_manager.CommandManager {
  directory: None
  shell: None
}
class opendevin.observation.NullObservation {
  observation: str
}
class opendevin.plan.Plan {
  main_goal: str {static}
  task: Task {static}
  main_goal: str
  task: None
}
class opendevin.state.State {
  plan: Plan
  iteration: int
  background_commands_obs: List[CmdOutputObservation]
  history: List[Tuple[Action, Observation]]
  updated_info: List[Tuple[Action, Observation]]
}
class opendevin.observation.CmdOutputObservation {
  command_id: int
  command: str
  exit_code: int
  observation: str
}
class opendevin.sandbox.sandbox.DockerInteractive {
  background_commands: Dict[int, BackgroundCommand] {static}
  instance_id: None
  instance_id: None
  workspace_dir: None
  workspace_dir: None
  workspace_dir: None
  timeout: int
  container_image: None
  container_name: None
}
class opendevin.observation.UserMessageObservation {
  role: str
  observation: str
}
class opendevin.plan.Task {
  id: str {static}
  goal: str {static}
  parent: Task | None {static}
  subtasks: List[Task] {static}
  id: None
  id: None
  parent: None
  goal: str
  subtasks: None
}

class opendevin.server.session.Session {
  websocket: None
  controller: Optional[AgentController]
  agent: Optional[Agent]
  agent_task: None
}

opendevin.action.base.ExecutableAction <|-- opendevin.action.agent.AgentEchoAction
opendevin.action.base.NotExecutableAction <|-- opendevin.action.agent.AgentFinishAction
opendevin.observation.Observation <|-- opendevin.observation.AgentMessageObservation
opendevin.action.base.ExecutableAction <|-- opendevin.action.agent.AgentRecallAction
opendevin.observation.Observation <|-- opendevin.observation.AgentRecallObservation
opendevin.action.base.NotExecutableAction <|-- opendevin.action.agent.AgentSummarizeAction
opendevin.action.base.NotExecutableAction <|-- opendevin.action.agent.AgentThinkAction
opendevin.action.base.Action <|-- opendevin.action.base.ExecutableAction
opendevin.action.base.Action <|-- opendevin.action.base.NotExecutableAction
opendevin.action.base.NotExecutableAction <|-- opendevin.action.base.NullAction
opendevin.action.base.ExecutableAction <|-- opendevin.action.bash.CmdKillAction
opendevin.action.base.ExecutableAction <|-- opendevin.action.bash.CmdRunAction
opendevin.action.base.ExecutableAction <|-- opendevin.action.browse.BrowseURLAction
opendevin.observation.Observation <|-- opendevin.observation.BrowserOutputObservation
opendevin.action.base.ExecutableAction <|-- opendevin.action.fileop.FileReadAction
opendevin.observation.Observation <|-- opendevin.observation.FileReadObservation
opendevin.action.base.ExecutableAction <|-- opendevin.action.fileop.FileWriteAction
opendevin.observation.Observation <|-- opendevin.observation.FileWriteObservation
opendevin.action.base.NotExecutableAction <|-- opendevin.action.tasks.AddTaskAction
opendevin.action.base.NotExecutableAction <|-- opendevin.action.tasks.ModifyTaskAction
opendevin.agent.Agent *-- opendevin.agent.Agent
opendevin.agent.Agent *-- opendevin.llm.llm.LLM
opendevin.controller.agent_controller.AgentController *-- opendevin.agent.Agent
opendevin.observation.Observation <|-- opendevin.observation.AgentErrorObservation
opendevin.observation.Observation <|-- opendevin.observation.NullObservation
opendevin.plan.Plan *-- opendevin.plan.Task
opendevin.state.State *-- opendevin.plan.Plan
opendevin.state.State *-- opendevin.observation.CmdOutputObservation
opendevin.state.State *-- opendevin.action.base.Action
opendevin.state.State *-- opendevin.observation.Observation
opendevin.observation.Observation <|-- opendevin.observation.CmdOutputObservation
opendevin.sandbox.sandbox.DockerInteractive *-- opendevin.sandbox.sandbox.BackgroundCommand
opendevin.observation.Observation <|-- opendevin.observation.UserMessageObservation
opendevin.plan.Task *-- opendevin.plan.Task
opendevin.server.session.Session *-- opendevin.controller.agent_controller.AgentController
opendevin.server.session.Session *-- opendevin.agent.Agent
opendevin.controller.agent_controller.AgentController -> opendevin.state.State
opendevin.controller.agent_controller.AgentController -> opendevin.plan.Plan
opendevin.controller.agent_controller.AgentController -> opendevin.controller.command_manager.CommandManager
opendevin.controller.command_manager.CommandManager -> opendevin.sandbox.sandbox.DockerInteractive

footer Based on f3fda42; Generated by //py2puml//
@enduml
