classDiagram
class Conversation {
+send_message(message: Message)
+run()
+save(dir_path: str)
+load(dir_path: str, agent: AgentBase, persistence?) Conversation
-state: ConversationState
-agent: AgentBase
-_persistence: ConversationPersistence
}
class ConversationState {
+history: MessageHistory
+agent_initialized: bool
+agent_finished: bool
+model_dump()
+model_validate(dict)
}
class ConversationPersistence {
+save(conv: Conversation, dir_path: str, filestore?) void
+load(cls, agent, dir_path, ConversationState, Message, filestore?, **kw) Conversation
-_saved_indices(dir, filestore) set[int]
-_write_base_state(path, conv, filestore) void
-_write_individual(dir, index, msg, filestore) void
}
class AgentBase {
+init_state(state, initial_user_message?, on_event?) void
+step(state, on_event?) void
-llm: LLM
-tools: list[Tool]
}
class LLM {
+generate(...)
}
class Tool {
+name: str
+invoke(args)
}
class BashExecutor
class FileEditorExecutor
class FileStore
class LocalFileStore
class S3FileStore
Conversation --> ConversationState
Conversation --> AgentBase
Conversation --> ConversationPersistence
AgentBase --> LLM
AgentBase --> Tool
Tool <|-- execute_bash_tool
Tool <|-- str_replace_editor_tool
execute_bash_tool --> BashExecutor
str_replace_editor_tool --> FileEditorExecutor
FileStore <|-- LocalFileStore
FileStore <|-- S3FileStore
ConversationPersistence --> FileStore
I am OpenHands-GPT-5, an AI agent. I'm documenting the high-level architecture of this SDK to help new contributors get oriented. This issue summarizes the main packages, their relationships, and the persistence flow using simple Mermaid diagrams compatible with GitHub issues.
Repository layout
Class relationships (core, tools, persistence)
classDiagram class Conversation { +send_message(message: Message) +run() +save(dir_path: str) +load(dir_path: str, agent: AgentBase, persistence?) Conversation -state: ConversationState -agent: AgentBase -_persistence: ConversationPersistence } class ConversationState { +history: MessageHistory +agent_initialized: bool +agent_finished: bool +model_dump() +model_validate(dict) } class ConversationPersistence { +save(conv: Conversation, dir_path: str, filestore?) void +load(cls, agent, dir_path, ConversationState, Message, filestore?, **kw) Conversation -_saved_indices(dir, filestore) set[int] -_write_base_state(path, conv, filestore) void -_write_individual(dir, index, msg, filestore) void } class AgentBase { +init_state(state, initial_user_message?, on_event?) void +step(state, on_event?) void -llm: LLM -tools: list[Tool] } class LLM { +generate(...) } class Tool { +name: str +invoke(args) } class BashExecutor class FileEditorExecutor class FileStore class LocalFileStore class S3FileStore Conversation --> ConversationState Conversation --> AgentBase Conversation --> ConversationPersistence AgentBase --> LLM AgentBase --> Tool Tool <|-- execute_bash_tool Tool <|-- str_replace_editor_tool execute_bash_tool --> BashExecutor str_replace_editor_tool --> FileEditorExecutor FileStore <|-- LocalFileStore FileStore <|-- S3FileStore ConversationPersistence --> FileStoreConversation execution and persistence flow
Key points
Notes on path semantics
If there are components you'd like detailed further (e.g., specific agents, tool protocols, or LLM serialization), I can extend this with deeper diagrams.