docs: update core design and api-contract with platform container architecture
This commit is contained in:
parent
8e955045b2
commit
53685747f6
2 changed files with 92 additions and 79 deletions
|
|
@ -12,6 +12,18 @@
|
|||
Цель — написать логику один раз, легко добавлять новые поверхности и новый функционал
|
||||
без правки центральных файлов.
|
||||
|
||||
### Архитектура платформы (важно для дизайна)
|
||||
|
||||
Lambda Lab 3.0 выделяет каждому пользователю **один LXC-контейнер** с workspace 10 ГБ.
|
||||
Workspace содержит директории чатов: `C1/`, `C2/`, `C3/` — каждый чат хранит свои файлы и `history.db`.
|
||||
|
||||
**Master** — управляющий процесс платформы — сам решает когда поднять, заморозить или разбудить контейнер.
|
||||
Бот не управляет lifecycle контейнера — он только передаёт сообщение (`user_id`, `chat_id`, `text`).
|
||||
|
||||
Следствие: **"сессия" и "чат" — разные понятия.**
|
||||
- Чат (C1/C2/C3) — наша забота, храним метаданные в `StateStore`
|
||||
- Контейнер (сессия платформы) — забота Master'а, бот об этом не знает
|
||||
|
||||
---
|
||||
|
||||
## Структура файлов
|
||||
|
|
@ -25,7 +37,7 @@ core/
|
|||
SettingsAction, PaymentRequired
|
||||
handler.py — EventDispatcher (только маршрутизация, без бизнес-логики)
|
||||
store.py — StateStore Protocol + InMemoryStore + SQLiteStore
|
||||
session.py — SessionManager
|
||||
chat.py — ChatManager (бывший SessionManager — управляет чатами, не контейнерами)
|
||||
auth.py — AuthManager
|
||||
settings.py — SettingsManager
|
||||
handlers/
|
||||
|
|
@ -155,20 +167,20 @@ class User(BaseModel):
|
|||
created_at: datetime
|
||||
is_new: bool = False
|
||||
|
||||
class Session(BaseModel):
|
||||
session_id: str
|
||||
agent_id: str
|
||||
created_at: datetime
|
||||
expires_at: datetime
|
||||
|
||||
class PlatformClient(Protocol):
|
||||
async def get_or_create_user(self, external_id: str, platform: str, display_name: str | None) -> User: ...
|
||||
async def create_session(self, user_id: str, platform: str, context: dict | None) -> Session: ...
|
||||
async def send_message(self, session_id: str, text: str, attachments: list) -> MessageResponse: ...
|
||||
async def close_session(self, session_id: str) -> bool: ...
|
||||
async def get_message_history(self, session_id: str, limit: int, offset: int) -> list[dict]: ...
|
||||
|
||||
# Master сам решает: поднять контейнер, разбудить, смонтировать нужный чат.
|
||||
# Бот передаёт только user_id + chat_id — платформа делает остальное.
|
||||
async def send_message(self, user_id: str, chat_id: str, text: str, attachments: list) -> MessageResponse: ...
|
||||
|
||||
async def get_settings(self, user_id: str) -> UserSettings: ...
|
||||
async def update_settings(self, user_id: str, action: SettingsAction) -> None: ...
|
||||
```
|
||||
|
||||
**Нет явных create/close session** — lifecycle контейнера управляется Master'ом, не ботом.
|
||||
Когда будет готов реальный SDK Азамата — контракт уточняется, меняется только `platform/mock.py`.
|
||||
|
||||
---
|
||||
|
||||
## Managers
|
||||
|
|
@ -186,16 +198,22 @@ class StateStore(Protocol):
|
|||
|
||||
Реализации: `InMemoryStore` (тесты), `SQLiteStore` (прод).
|
||||
|
||||
### SessionManager (`core/session.py`)
|
||||
### ChatManager (`core/chat.py`)
|
||||
|
||||
Управляет метаданными чатов (C1/C2/C3). НЕ управляет lifecycle контейнера — это дело Master'а.
|
||||
|
||||
```python
|
||||
class SessionManager:
|
||||
class ChatManager:
|
||||
def __init__(self, platform: PlatformClient, store: StateStore): ...
|
||||
async def get_or_create(self, user_id: str, chat_id: str) -> ChatContext: ...
|
||||
async def close(self, chat_id: str) -> None: ...
|
||||
async def get_or_create(self, user_id: str, chat_id: str, name: str | None) -> ChatContext: ...
|
||||
async def rename(self, chat_id: str, name: str) -> ChatContext: ...
|
||||
async def archive(self, chat_id: str) -> None: ...
|
||||
async def list_active(self, user_id: str) -> list[ChatContext]: ...
|
||||
```
|
||||
|
||||
Метаданные (display_name, platform, surface_ref, is_archived) хранятся в `StateStore`.
|
||||
Файлы чата и history.db живут в workspace контейнера на стороне платформы — бот их не хранит.
|
||||
|
||||
### AuthManager (`core/auth.py`)
|
||||
|
||||
```python
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue