Skip to content
nyxandroPublic

About

AI агент, который живёт в Telegram чатах (личный, семейный, публичный)

Resources

Stars

28 stars

Watchers

0 watching

Forks

Latest commit

 

History

948 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Osinara

Личный и семейный Telegram-агент: помнит контекст, ведёт дела, работает с файлами и сервисами — и держит строгие границы между личным, семейным и групповым.

CI Release Node.js TypeScript AI SDK PostgreSQL


Что это

Osinara — self-hosted агент, который живёт в Telegram и работает как личный ассистент одной семьи. Он говорит по-русски, понимает голосовые, помнит договорённости между сессиями, сам напоминает о делах и умеет доводить задачи до результата через инструменты: документы, Google Workspace, браузер, брокерский счёт, файлы, sandbox.

Ключевое отличие от обычного бота: права не живут в промте. Кто ты, из какой ты семьи, что тебе доступно в этом чате — определяется проверенным Telegram-апдейтом и базой, а не текстом от модели. Личная память никогда не попадает в групповой чат, внешняя группа никогда не получает доступ к личным данным и сервисам.

Рассчитан на: одну семью на своём сервере. Один владелец, приглашённые участники, закрытые семейные группы и отдельно — внешние группы (рабочие, дружеские), где агент работает в урезанном режиме.

Блок Что умеет
Telegram Durable webhook ingress, быстрый ACK Telegram, FIFO-drain по chat/topic, обычные и rich replies, HITL callbacks с ограниченным окном подтверждения.
Семья и группы Bootstrap владельца, приглашения, подтверждение участников, owner-only операции, семейные и внешние группы.
Память Root-agent source-backed writes, semantic integrity для изменений, versioned mutations, soft delete, atomic memory threads, локальный hybrid retrieval, экспорт и отдельные scopes.
Расписания Напоминания и автономные agent schedules: личные и семейные сценарии, а также owner-approved отчёты во внешние группы с отдельной fresh session, минимальным capability allowlist и bounded snapshot истории.
Голос Groq Whisper transcription перед основным agent turn с повторной проверкой authorization; по явной просьбе root-agent озвучивает ответ через ElevenLabs eleven_v4 и отправляет голосовым без скрытых повторов, а при сбое озвучки отвечает текстом.
Workspaces Изолированные personal, family и group файловые области, attachment persistence, безопасная отправка файлов.
Google Workspace Native gws skills для Gmail, Calendar, Drive, Docs, Sheets и People через workspace-bound OAuth credentials.
Sandbox Долгоживущие Docker sandbox sessions с scoped mounts, isolated tools volume, egress proxy и fail-closed policy.
Оркестрация В trusted private/family режимах root-agent делегирует большие задачи подагенту agent со свежим контекстом и теми же разрешёнными tools, skills, connections, sandbox и workspace; во внешних группах child delegation запрещена.
Production Immutable GitHub releases, GHCR digest images, Telegram approval перед deploy, systemd timer на сервере.

Функционал

🧠 Долговременная память

  • Помнит факты и договорённости; каждая запись привязана к источнику — можно спросить «откуда ты это взяла».
  • Треды — незакрытые сюжеты (поиск квартиры, ремонт, лечение): агент сам поднимает их, когда тема возвращается.
  • Гибридный поиск по памяти (pgvector + локальные эмбеддинги multilingual-e5-small), без отправки памяти во внешние сервисы.
  • Конфликты («раньше говорил одно, теперь другое») выносятся на ваше решение, а не переписываются молча.
  • Отдельные области: personal, family, group. Экспорт всей личной памяти в JSON + Markdown одной командой.

⏰ Напоминания и автономные сценарии

  • Напоминания: разовые, ежедневные, еженедельные; личные и семейные. Напоминание может прийти с кнопками («✅ Оплатил / ⏰ Через час»): нажатие уходит агенту, и он отмечает или переносит дело.
  • Агентные сценарии по расписанию — не просто текст в срок, а полноценный запуск с инструментами («каждое утро собери погоду, календарь и почту», «в пятницу — сводка по портфелю»).
  • Пробуждения в разговоре: агент сам ставит себе проверку по текущей задаче («скажу, когда привезут») и продолжает её со всей историей чата. Монитор — такое пробуждение со скриптом проверки: скрипт без модели раз в несколько минут смотрит, не случилось ли событие, и будит агента только тогда.
  • Часовой пояс и тихие часы: ночью не разбудит.
  • Для внешних групп — отчёты по расписанию, которые владелец настраивает в личном чате.

🔘 Кнопки-ответы

  • На вопрос с короткими вариантами («Оформляем?») агент ставит кнопки прямо в своём сообщении, под его текстом: зелёную для «да», красную для отмены, синюю для альтернативы, с эмодзи. Нажатие уходит агенту как ваш ответ. Кнопки показывают клиенты Telegram с августа 2026 года.
  • Нажатие отмечается сразу, даже если агент ещё занят: на месте кнопок появляется «Выбрано: …», а ответ агента приходит своим чередом. Если вы пишете что-то своё, кнопки сменяются на «Ничего не выбрано». В семейной группе нажать может только тот, кому агент отвечал.
  • Нажатие — это ответ, а не подтверждение: серьёзные действия по-прежнему подтверждаются отдельной карточкой. Во внешних группах кнопок нет.

🎙 Голос, файлы и вложения

  • Голосовые и видеосообщения расшифровываются через Groq Whisper до основного хода агента: в личке и семейной группе — все, во внешней группе — только обращённые к агенту.
  • Место, геопозицию, контакт, опрос, кубик, список дел, стикер, GIF, видео и пересылку агент получает описанием от сервера; стикер, GIF и видео он может рассмотреть по кадру-превью.
  • Агент сам отправляет в чат карточку места или точку на карте и запускает опрос Telegram.
  • По просьбе «ответь голосом» агент присылает голосовое сообщение, озвученное через ElevenLabs.
  • Присланные файлы и фото сохраняются в рабочую область чата и доступны инструментам.
  • Агент может прислать файл из рабочей области обратно в Telegram и посмотреть картинку.
  • Изолированные области: personal, family, group — файлы одной области не видны в другой.

📄 Документы

  • pdf, docx, xlsx — чтение, правка, сборка: договор, таблица, отчёт, презентационный документ.
  • Работа идёт в sandbox-контейнере, результат приходит файлом в чат.

📬 Google Workspace

  • Нативный gws-доступ к Gmail, Calendar, Drive, Docs, Sheets, People.
  • OAuth-подключение владельца; токены шифруются и не попадают в текст модели.
  • Пример: «что у меня в календаре на среду», «найди письмо от подрядчика и вытащи сумму».

🌐 Веб

  • agent-browser — автоматизация браузера: открыть, заполнить, нажать, забрать данные.
  • find-docs — актуальная документация библиотек и API вместо памяти модели.
  • Во внешних группах веб-доступ идёт только через контролируемую обёртку и отдельное разрешение.

👨‍👩‍👧 Семья, приглашения, роли

  • Bootstrap владельца по одноразовому коду при установке.
  • Приглашение участника: владелец создаёт одноразовую ссылку → человек переходит → владелец подтверждает.
  • Административные операции возможны только в личном чате владельца — и перепроверяются в базе перед выполнением.

💬 Группы

  • Семейная группа (family_private): только подтверждённые участники семьи, доступна семейная память.
  • Внешняя группа (external): своя изолированная область, без личных и семейных данных, без Bash и произвольной сети.
  • Режимы реакции: только по обращению, на все сообщения, либо только на сообщения владельца.
  • Для внешней группы владелец точечно выдаёт allowlist инструментов и skills; смена типа группы пересоздаёт зону доверия и удаляет данные прежней области.

🎛 Стиль и подтверждения

  • Пожелания к стилю общения сохраняются на чат: короче, без смайлов, другой язык, свой формат.
  • Действия с последствиями подтверждаются кнопкой в Telegram (HITL), включая деплой обновлений.
  • Ручная ротация контекста, когда тема сменилась и старый диалог мешает.

💬 Живая переписка

  • Ответ может прийти не одним сообщением: сначала по делу, а через пару секунд отдельная мысль вдогонку, как пишут люди. Реплаем помечено только первое сообщение.
  • Пока идёт долгая работа, агент присылает короткую отбивку о том, что делает прямо сейчас, вместо молчания до готового результата.
  • Вместо ответа на короткое «спасибо» или упоминание без вопроса агент ставит реакцию. Набор реакций берётся из настроек самого чата: сузили список или отключили реакции, агент это учтёт.

Границы доступа

Где Память Файлы Инструменты
Личный чат personal и family /workspace/personal, /workspace/family Полный trusted sandbox и personal tools environment; по явной просьбе root-agent отвечает голосовым через ElevenLabs.
Семейная группа Только family /workspace/family Trusted sandbox и family tools environment; по явной просьбе root-agent отвечает голосовым через ElevenLabs.
Внешняя группа Только group /workspace/group Без Bash, произвольного сетевого доступа и persistent credentials; web_fetch и send_voice_message доступны только через отдельные owner grants; безопасные file tools и импорт присланного в Telegram файла любого формата в папку группы.
Native child Та же проверенная identity и scopes, что у parent turn Тот же разрешённый workspace и sandbox Тот же trust-zone surface, кроме root-owned remember и send_voice_message; отдельные history и state.

Как пользоваться

1. Поставить на сервер. Нужен GNU/Linux x86_64 (glibc) с systemd, Docker Engine + Compose v2, jq, curl и flock (пакет util-linux), свободный порт 8082; если Osinara ставит свой Traefik, ещё и свободные 80 и 443. Чего-то не хватает — установщик назовёт, что поставить, до любых изменений на сервере. Скачайте install.sh из последнего релиза и передайте ему URL CLI-ассета и его SHA-256 из того же релиза:

sudo ./install.sh \
  https://github.com/nyxandro/osinara/releases/download/vX.Y.Z/osinara-linux-x64 \
  <SHA-256 из osinara-linux-x64.sha256>

Установщик спросит домен (или предложит sslip.io) и способ публикации HTTPS: поставить свой Traefik или использовать уже работающий на сервере прокси. Затем проверит Telegram-бота и модель, поднимет digest-pinned образы, HTTPS и webhook, включит автообновление и выдаст ссылку владельца.

2. Стать владельцем. Перейдите по ссылке из установщика и напишите боту. Если ссылка не появилась — sudo osinara owner-bootstrap выдаст новый код на 15 минут (прежний отзывается).

3. Позвать своих. В личном чате: «пригласи Анну» → отправьте ссылку → после её перехода подтвердите кандидата.

4. Подключить группы. Добавьте бота в группу и в личном чате владельца скажите, чем эта группа является: семейной или внешней. Для внешней сразу задайте режим реакции и что ей разрешено.

5. Дальше — обычным языком. «Напомни в четверг про садик», «расшифруй голосовое и вынеси задачи», «собери из этих чеков таблицу», «что по портфелю», «каждое утро в 8 присылай сводку», «запомни, что мы выбрали клинику».

Обслуживание:

osinara status     # состояние сервисов
osinara doctor     # диагностика установки, включая таймер автообновления
osinara logs       # логи
osinara restart    # перезапуск
osinara config     # конфигурация модели и провайдера

Обновления. Агент сам предлагает новую версию в Telegram. После нажатия «Обновить» не позже чем через минуту сервер ставит её сам: снимает резервную копию, заменяет контейнеры, проверяет, что бот жив, и пишет итог в чат. Скрипт обновления едет внутри каждого релиза и обновляет себя вместе с ним, так что ручных шагов на сервере нет. Пока идёт обновление, osinara restart и osinara config не запускаются и просят повторить позже. Журнал обновлений: journalctl -u osinara-deploy.service. Сама программа osinara остаётся версии установки.


Локальная разработка

npm ci
cp .env.example .env        # заполнить обязательные секреты
docker compose up --build   # edge: http://localhost:8080

Полный список переменных — в .env.example: только секреты, доступы и привязки к инфраструктуре. Поведение агента (таймауты, лимиты, расписания, настройки модели) живёт в конфигурации в репозитории, а не в окружении. Отсутствующий обязательный секрет — ошибка на старте, а не подставленное значение по умолчанию. Блок Google Workspace нужен только при включённой интеграции.

Проверки:

npm run typecheck && npm test && npm run build

# production-equivalent прогон
docker compose -f compose.test.yaml up --build --abort-on-container-exit --exit-code-from tests

Миграции запускаются только внутри backend/test-контейнера: npm run migrate.


Стек

TypeScript на Node 24 · собственное ядро агента на AI SDK 7.0.60 · PostgreSQL 17 + pgvector · Docker Compose · Groq Whisper · локальные эмбеддинги E5 · Telegram как единственный канал.

Архитектурные заметки и рантбуки — в docs/, правила разработки — в AGENTS.md, деплой — в docs/production-deployment.md.

Безопасность

  • Авторизация принадлежит приложению: identity, семья, роль и область доступа никогда не берутся из текста модели.
  • Память, документы, сайты и результаты инструментов — это данные, а не инструкции для агента.
  • Отсутствие обязательного конфига — быстрая ошибка со стабильным кодом, а не догадка со значением по умолчанию.
  • Внешние группы не получают личную и семейную память, учётные данные, Bash и произвольную сеть.
  • Production-образы собирает только CI из канонического main; деплой требует подтверждения владельца и точной проверки манифеста релиза.

Skills

Highlighted skill groups:

Skill group Examples
Google Workspace gws-gmail, gws-calendar, gws-drive, gws-docs, gws-sheets, gws-people.
Documents pdf, docx, xlsx.
Browser and research agent-browser, find-docs.
Personalization behavior-preferences.

Release Badges

PostgreSQL Docker Compose Telegram Google Workspace Groq

About

AI агент, который живёт в Telegram чатах (личный, семейный, публичный)

Resources

Stars

28 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages