- Surface Protocol: unified IncomingMessage/OutgoingUI/ChatContext - Telegram: Forum Topics (group + topics per chat) - Matrix: Space + rooms per chat - MockPlatformClient with PlatformClient Protocol - docs: surface-protocol, telegram/matrix specs, api-contract, claude-code-guide - project scaffold: src/, tests/, pyproject.toml Co-Authored-By: Claude Sonnet 4-6 <noreply@anthropic.com>
11 KiB
Matrix — описание прототипа
Концепция
Один бот, каждый чат — отдельная комната, все комнаты собраны в Space.
При первом входе бот создаёт для пользователя личное пространство (Space) — это как папка в Element. Внутри Space бот создаёт комнату для каждого нового чата с агентом. Пользователь видит аккуратную структуру: одно пространство, внутри — список чатов. История хранится нативно в Matrix — это часть протокола, ничего дополнительно делать не нужно.
Matrix выбран как внутренняя поверхность: команды лаборатории, тестировщики, разработчики скиллов. Поэтому UX здесь — про удобство работы, а не онбординг.
Аутентификация
Флоу
- Пользователь приглашает бота в личные сообщения или пишет в общей комнате
- Бот проверяет
@user:matrix.org— есть ли аккаунт на платформе - Если нет — бот отправляет одноразовый код или ссылку
- Пользователь подтверждает, платформа возвращает токен
- Бот сохраняет привязку
matrix_user_id → platform_user_id
В моке
- Любой пользователь проходит аутентификацию автоматически
- Бот отвечает: «Добро пожаловать, {display_name}. Создаю ваше пространство...»
- Демонстрирует флоу без реальной платформы
Чаты через Space + комнаты (вариант Б)
Структура
Space: «Lambda — {display_name}»
├── 📌 Настройки ← специальная комната для команд управления
├── 💬 Чат 1 ← первый чат, создаётся автоматически
├── 💬 Чат 2
└── 💬 Исследование рынка ← пользователь сам называет
Создание Space
При первом входе бот:
- Создаёт Space
Lambda — {display_name} - Создаёт комнату
Настройки(закреплена вверху) - Создаёт первую комнату-чат
Чат 1 - Приглашает пользователя во все комнаты
- Пишет в
Чат 1приветствие
Управление чатами
Команды работают в любой комнате Space:
| Команда | Действие |
|---|---|
!new |
Создать новый чат (новую комнату в Space) |
!new Название |
Создать чат с именем |
!rename Название |
Переименовать текущую комнату |
!archive |
Вывести комнату из Space (не удалять) |
!chats |
Показать список чатов |
Создание нового чата
- Пользователь пишет
!newили!new Анализ конкурентов - Бот создаёт новую комнату в Space
- Приглашает пользователя
- Пишет приветствие и создаёт сессию на платформе
- Пользователь переходит в новую комнату — начинает диалог
В моке
- Space и комнаты создаются реально через matrix-nio
- Сессии — через MockPlatformClient
- История хранится в Matrix нативно
Основной диалог
Флоу сообщения
- Пользователь пишет текст в комнату-чат
- Бот показывает typing (m.typing event)
- Запрос уходит в платформу (MockPlatformClient)
- Бот отвечает в той же комнате
Вложения
- Файлы, изображения отправляются как Matrix media events
- Бот принимает
m.file,m.image,m.audio - Передаёт в платформу как
attachmentsчерезIncomingMessage - В моке: подтверждение получения + заглушка-ответ
Реакции как действия
Matrix поддерживает реакции на сообщения (m.reaction).
Используем это для подтверждения действий агента:
Агент: Хочу отправить письмо на vasya@mail.ru
Тема: «Отчёт за неделю»
👍 — подтвердить ❌ — отменить
Пользователь ставит реакцию — бот обрабатывает. Нативно и удобно.
Треды для длинных задач
Если агент выполняет долгую задачу (deep research, генерация документа), бот создаёт тред от своего первого ответа и пишет промежуточные статусы туда. Основной чат не засоряется.
Бот: Начинаю исследование по теме «AI агенты 2025» [→ в треде]
└── Ищу источники... (1/4)
└── Анализирую статьи... (2/4)
└── Формирую отчёт... (3/4)
└── Готово. Отчёт: [...]
Комната «Настройки»
Специальная комната для управления агентом. Закреплена вверху Space. Команды работают только здесь — не мешают диалогу в чатах.
Коннекторы
!connectors — показать список
!connect gmail — подключить Gmail (OAuth ссылка)
!connect github — подключить GitHub
!connect calendar — подключить Google Calendar
!connect notion — подключить Notion
!disconnect gmail — отключить
Статус:
Коннекторы:
✅ Gmail — подключён (user@gmail.com)
❌ GitHub — не подключён → !connect github
❌ Google Calendar — не подключён
❌ Notion — не подключён
В моке: OAuth ссылка-заглушка → «Подключено ✓»
Скиллы
!skills — показать список
!skill on browser — включить Browser Use
!skill off browser — выключить
Статус:
Скиллы:
✅ web-search — поиск в интернете
✅ fetch-url — чтение веб-страниц
✅ email — чтение почты (требует Gmail)
❌ browser — управление браузером
❌ image-gen — генерация изображений
❌ video-gen — генерация видео
✅ files — работа с файлами
❌ calendar — календарь (требует Google Calendar)
В моке: состояние хранится локально.
Личность агента
!soul — показать текущий SOUL.md
!soul name Лямбда — задать имя агента
!soul style brief — стиль: brief | friendly | formal
!soul priority «разбирать почту утром» — приоритетная задача
!soul reset — сбросить к дефолту
В моке: SOUL.md генерируется и хранится локально, агент обращается по имени.
Безопасность
!safety — показать настройки
!safety on email-send — требовать подтверждение перед отправкой письма
!safety off calendar-create — не спрашивать для создания событий
Статус:
Подтверждение требуется для:
✅ отправка письма
✅ удаление файлов
✅ публикация в соцсетях
❌ создание события в календаре
❌ поиск в интернете
Подписка
!plan — показать текущий план
Подписка: Beta (бесплатно)
Токены этот месяц: 800 / 1000
━━━━━━━━░░ 80%
Заглушка, реализует другая команда.
Статус и диагностика
!status — состояние агента и платформы
!sessions — список активных сессий
!whoami — текущий аккаунт платформы
Статус:
Платформа: ✅ доступна
Агент: ✅ активен (сессия #abc123)
Аккаунт: user@lambda.lab
Активных чатов: 3
FSM состояния
[Invite] → AuthPending → AuthConfirmed
↓
SpaceSetup → Idle (в комнате Настройки)
↓
[новая комната] → SessionCreated → Idle (в чате)
↓
ReceivingMessage → WaitingResponse → Idle
↓
WaitingReaction (confirm) → [✅/❌] → Idle
↓
LongTask → [тред со статусами] → Done → Idle
Стек
- Python 3.11+
- matrix-nio (async) — Matrix клиент
- MockPlatformClient →
platform/interface.py - structlog для логирования
- SQLite для хранения
matrix_user_id → platform_user_id, состояния скиллов, маппингаchat_id → room_id