[platform] Реализовать PlatformClient Protocol и MockPlatformClient #2

Closed
opened 2026-03-26 22:02:23 +00:00 by putilovskiy_mikhail · 2 comments

Задача

Создать контракт к SDK платформы и его mock-реализацию.

Файлы

platform/interface.py — PlatformClient Protocol

class PlatformClient(Protocol):
    async def get_or_create_user(self, user_id: str, platform: str, display_name: str | None) -> User: ...
    async def create_session(self, user_id: str, chat_id: str) -> Session: ...
    async def send_message(self, session_id: str, text: str, attachments: list) -> AgentResponse: ...
    async def close_session(self, session_id: str) -> None: ...
    async def get_chat_history(self, user_id: str, chat_id: str) -> list[Message]: ...
    async def get_settings(self, user_id: str) -> UserSettings: ...
    async def update_settings(self, user_id: str, action: SettingsAction) -> None: ...

platform/mock.py — MockPlatformClient

  • Хранит состояние в памяти (dict)
  • Симулирует задержку через asyncio.sleep
  • Возвращает осмысленные mock-ответы
  • При send_message возвращает заглушку ответа агента

Требования

  • Покрыть тестами в tests/platform/
  • Задержка 100–500ms для реалистичности

Ссылки

  • docs/api-contract.md
  • docs/surface-protocol.md
## Задача Создать контракт к SDK платформы и его mock-реализацию. ## Файлы ### `platform/interface.py` — PlatformClient Protocol ```python class PlatformClient(Protocol): async def get_or_create_user(self, user_id: str, platform: str, display_name: str | None) -> User: ... async def create_session(self, user_id: str, chat_id: str) -> Session: ... async def send_message(self, session_id: str, text: str, attachments: list) -> AgentResponse: ... async def close_session(self, session_id: str) -> None: ... async def get_chat_history(self, user_id: str, chat_id: str) -> list[Message]: ... async def get_settings(self, user_id: str) -> UserSettings: ... async def update_settings(self, user_id: str, action: SettingsAction) -> None: ... ``` ### `platform/mock.py` — MockPlatformClient - Хранит состояние в памяти (dict) - Симулирует задержку через `asyncio.sleep` - Возвращает осмысленные mock-ответы - При `send_message` возвращает заглушку ответа агента ## Требования - Покрыть тестами в `tests/platform/` - Задержка 100–500ms для реалистичности ## Ссылки - `docs/api-contract.md` - `docs/surface-protocol.md`
Author
Owner

Реализовано — с обновлённым контрактом.

platform/interface.py и platform/mock.py созданы. Но контракт существенно изменился по сравнению с описанием issue — это важно зафиксировать.

Что было в issue (устаревший контракт):

async def create_session(self, user_id: str, chat_id: str) -> Session: ...
async def send_message(self, session_id: str, text: str, ...) -> AgentResponse: ...
async def close_session(self, session_id: str) -> None: ...
async def get_chat_history(self, user_id: str, chat_id: str) -> list[Message]: ...

Что реализовано (актуальный контракт):

async def get_or_create_user(self, external_id: str, platform: str, ...) -> User: ...
async def send_message(self, user_id: str, chat_id: str, text: str, ...) -> MessageResponse: ...
async def get_settings(self, user_id: str) -> UserSettings: ...
async def update_settings(self, user_id: str, action: Any) -> None: ...

Причина изменения: Архитектурное решение — бот не управляет lifecycle контейнеров. Master (платформа) сам поднимает/размораживает контейнер при получении send_message. Методы create_session / close_session / get_chat_history убраны как ненужные.

Покрыто тестами в tests/platform/test_mock.py.

Закрываю как реализованное. Актуальный контракт зафиксирован в docs/api-contract.md.

✅ Реализовано — с обновлённым контрактом. `platform/interface.py` и `platform/mock.py` созданы. Но контракт **существенно изменился** по сравнению с описанием issue — это важно зафиксировать. **Что было в issue (устаревший контракт):** ```python async def create_session(self, user_id: str, chat_id: str) -> Session: ... async def send_message(self, session_id: str, text: str, ...) -> AgentResponse: ... async def close_session(self, session_id: str) -> None: ... async def get_chat_history(self, user_id: str, chat_id: str) -> list[Message]: ... ``` **Что реализовано (актуальный контракт):** ```python async def get_or_create_user(self, external_id: str, platform: str, ...) -> User: ... async def send_message(self, user_id: str, chat_id: str, text: str, ...) -> MessageResponse: ... async def get_settings(self, user_id: str) -> UserSettings: ... async def update_settings(self, user_id: str, action: Any) -> None: ... ``` **Причина изменения:** Архитектурное решение — бот не управляет lifecycle контейнеров. Master (платформа) сам поднимает/размораживает контейнер при получении `send_message`. Методы `create_session` / `close_session` / `get_chat_history` убраны как ненужные. Покрыто тестами в `tests/platform/test_mock.py`. Закрываю как реализованное. Актуальный контракт зафиксирован в `docs/api-contract.md`.
Author
Owner

Реализовано в коммите 36730ae716 (2026-03-29). platform/interface.py — PlatformClient Protocol + Pydantic-модели (User, MessageResponse, UserSettings). platform/mock.py — MockPlatformClient с симуляцией задержки. Сессиями управляет Master автоматически. 46 тестов проходит.

✅ Реализовано в коммите `36730ae716` (2026-03-29). `platform/interface.py` — PlatformClient Protocol + Pydantic-модели (User, MessageResponse, UserSettings). `platform/mock.py` — MockPlatformClient с симуляцией задержки. Сессиями управляет Master автоматически. 46 тестов проходит.
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: Surfaces_team/surfaces#2
No description provided.