Skip to content

Repository files navigation

НедоBot

AI-инфраструктура для НедоNews Chat: первый комментарий под постом, память контекста, статистика, голосовые и агентный помощник по истории чата.

Rust · teloxide · PostgreSQL · LLM/Vision/ASR

CI

Канал · Чат · Docs · Changelog · Deployment · Prompt · Tech RAG · MIT


Что это

НедоBot — внутренний AI-помощник для экосистемы НедоNews и НедоNews Chat.

Он не пытается заменить людей, модерировать всё подряд или быть универсальным ботом «для любого чата». Его задача проще и полезнее: помогать живому обсуждению появляться быстрее, не терять контекст и понимать, что реально происходит в комьюнити.

Пост вышел → бот понял контекст → написал первый комментарий → чат подхватил тему → данные не потерялись.

Зачем

В Telegram-чатах много жизни, но мало памяти. Хорошие мысли тонут, одинаковые заходы повторяются, статистика размазывается, а первый комментарий под постом часто решает, будет обсуждение или тишина.

НедоBot закрывает этот слой: он стоит рядом с чатом, не шумит громче людей и помогает новостям превращаться в разговор.

Что умеет

Первый комментарий

Видит новый пост из канала, учитывает текст и картинку, убирает служебные хвосты и пишет нормальный первый комментарий в стиле чата.

Память контекста

Сохраняет каждый полезный пост отдельной карточкой и через RuBERT + pgvector находит похожую историю, чтобы не повторять известные факты и ракурсы.

Tech RAG

Подстраховывает техно-новости от очевидной устаревшей дичи: релизы, платформы, железо, версии и повторяющиеся сюжеты.

Статистика чата

Считает активность, реплаи, медиа, реакции, топ пишущих и топ сообщений. Карточки пользователей могут показывать кэшированную аватарку по публичному HTTPS-домену проекта.

Голосовые

Расшифровывает voice, audio и кружки через Groq ASR, чистит текст через LLM и отвечает коротким текстом, главами или файлом.

История чата

Импортирует Telegram export, чтобы статистика и карточки пользователей не начинались с пустого места.

Универсальный /ask

Показывает этапы исследования прямо в чате, ищет по истории и reply-веткам, понимает участников и фото в reply, при необходимости подключает web и GitHub и отвечает через semantic Rich Text: локализованное время, trusted link aliases и custom emoji bindings.

Безопасные инструменты

Модель не получает SQL или shell: только ограниченные read-only операции чата, профилей и внешнего поиска.

Lifecycle /ask

В личных чатах progress идёт в Telegram native draft, а в группах — в одном rich-сообщении, которое редактируется до финала. Progress preview формируется отдельно от ответа модели. Финальный LLM Markdown компилируется один раз с фиксированным captured_now, валидируется до доставки и повторно используется только для final request и его внутренних retry. При подтверждённом отказе допускается fallback с best-effort очисткой progress; при неизвестной доставке второе сообщение не отправляется.

Публичная база для исследования

Для внешних MCP-клиентов доступен публичный read-only endpoint v2: https://nedobot.chickenkiller.com/mcp/nedonews/v2. Это сознательно широкий curated read model публичного чата, а не privacy-minimized projection: фактический состав данных и отсутствие application authentication описаны в контракте публичной экспозиции. SQL, запись и приватные чаты через endpoint недоступны. URL v2 намеренно отделён от удалённого legacy JSON-RPC-контракта: клиенты должны выполнить новое MCP discovery через tools/list. Точный опубликованный data surface зафиксирован в MCP public data inventory.

Локальный /ask и внешний MCP используют общий chat.search_messages/chat.search_messages_batch read-model. Поиск по умолчанию hybrid, возвращает total_count, has_more, next_offset и scan_limit_reached; для следующей страницы передаётся offset, а chat.count_messages даёт точное число matching-сообщений для явных вопросов вроде «сколько сообщений» или «в скольких сообщениях». Он не считает события и число вхождений слова внутри одного сообщения. По умолчанию исключаются боты, сообщения без автора и автоматические пересылки; include_forwards=true нужен явно для вопросов о forwarded content, включая пересылки без сохранённого автора. Поддерживаются режимы hybrid, full_text, any_terms, literal и whole_word; подробные схемы и ограничения — в docs/TECHNICAL.md.

Вайб

НедоBot не должен звучать как корпоративный SMM-отдел.

Он может позвать в чат, подкинуть вопрос, заметить странность новости, аккуратно подтолкнуть спор или дать повод для мемов. Главное — не ломать стиль НедоNews и не превращать комментарии в пластик.

Не «присоединяйтесь к нашему сообществу», а «опять у AMD драйверы отвалились, залетайте обсудим».

Сейчас в фокусе

  • первый комментарий под постом;
  • память новостей и анти-повтор CTA;
  • статистика активности чата и исторического экспорта;
  • агентный /ask: качество разрешения участников, поиск фактов и наблюдаемость вызовов;
  • аккуратная работа с LLM/Vision и кэшированными аватарками;
  • production-расшифровка голосовых, audio и кружков, cleanup ASR и формат глав.

Roadmap

  • первый комментарий под постом канала;
  • атомарная память новых постов через RuBERT Tiny 2 и pgvector;
  • статистика дня, недели и месяца;
  • пользовательская статистика;
  • импорт Telegram export для исторической статистики;
  • топ пользователей и сообщений по реакциям;
  • базовая расшифровка voice/audio/кружков через Groq ASR;
  • агентный /ask с ограниченными read-only инструментами чата, web и GitHub;
  • аудит /ask: запросы, инструменты, задержки и безопасные статусы ошибок;
  • semantic Rich Text /ask: LLM Markdown time markers, trusted chat/message_<id>/source_N aliases, provenance-checked literal URLs и настроенные custom emoji bindings;
  • deterministic time rendering /ask с captured now, timezone, renderer revision и compiled-payload audit;
  • delivery certainty для final/segment lifecycle и запрет fallback при Unknown;
  • публичная HTTPS-раздача кэшированных аватарок Telegram;
  • timestamp в заголовках глав голосовых;
  • ручная команда /transcribe reply на voice/audio/кружок;
  • semantic retrieval с временным коэффициентом свежести;
  • админка без ручного ковыряния .env;
  • более сильный модерационный слой без превращения чата в участок.

Команды

Показать команды
Команда Что делает
/help Показывает меню доступных команд.
/ping Быстро проверяет, что бот жив.
/db Проверяет подключение к PostgreSQL.
/emojiids Показывает custom_emoji_id из сообщения.
/format_test <текст> Проверяет рендер первого комментария на произвольном тексте.
/memory Показывает последние атомарные карточки истории и статус их обработки.
/transcribe Reply на voice, audio или кружок: запускает расшифровку. Работает при включённом voice-контуре, даже если автоматическая расшифровка выключена.
/ask <вопрос> Универсальный Rich Markdown-помощник. По ходу ответа обновляет отдельный progress preview, использует read-only историю чата, профили, reply-ветки, web и GitHub; в reply учитывает исходное сообщение и его фото. Наблюдённые сообщения доступны как message_<id>, внешние результаты поиска — как source_N, а custom emoji — как :alias:. Literal URL принимаются только из вопроса/reply, trusted search evidence или application allowlist. Финальная доставка и fallback проходят через shared Drafter. Доступен всем участникам основного чата; в личке — только private allowlist.
/chat_note <текст> Сохраняет общую заметку чата; доступно владельцу и администраторам.
/user_note <текст> Сохраняет заметку об авторе сообщения в reply; доступно владельцу и администраторам.
/stats_day [-r|-p] Статистика за текущий день чата, где день начинается в 05:00 по Москве.
/stats_week [-r|-p] Статистика за текущую неделю с понедельника 05:00 по Москве.
/stats_month [-r|-p] Статистика за текущий месяц с 1 числа 05:00 по Москве.
/topmsg [-r|-p] Топ 20 пользователей по сообщениям за всё время.
/topreact [-r|-p] Топ 20 сообщений по реакциям со ссылками на сообщения.
/status day|week|month [-r|-p] Alias статистики по периоду.
/userstats <id|username> [-r|-p] Карточка пользователя: статус, первые/последние сообщения, активные дни, реплаи, ссылки, медиа и реакции. Без аргумента показывает отправителя команды; reply выбирает автора сообщения.
/userstatus <id|username> [-r|-p] Alias /userstats.

Статистические отчёты показывают пользователей человекочитаемо: имя кликабельно через Telegram-ссылку, а сырой ID не торчит в тексте. Рядом выводятся короткие бейджи вроде админ, в чате, не в чате, бот или статус неизвестен.

Служебные команды настройки и диагностики не вынесены в лендинг; они описаны в технической документации.

Локальный запуск

Для разработки используются отдельные PostgreSQL-контейнер и runtime-профиль:

cp .env.example .env
./scripts/dev_db.sh start
DATABASE_URL=postgres://tg_ai_bot_dev:tg_ai_bot_dev@127.0.0.1:5433/tg_ai_bot_dev \
  cargo run --bin migrate
cargo run

Секреты остаются в .env, а несекретные flags, маршруты моделей и лимиты хранятся в [runtime] файла config/llm_profiles.toml.example. Для production используется отдельная копия профиля через абсолютный LLM_PROFILES_PATH; инструкции выкладки находятся в docs/DEPLOYMENT.md.

Данные и публичные файлы

/ask не получает произвольный SQL или shell-доступ: модель видит только ограниченные read-only инструменты для сообщений, профилей, заметок и внешнего поиска. Выполнение сохраняет безопасный аудит: запрос, выбранные provider/model, имена и аргументы инструментов, задержки, render metadata и delivery certainty — без тел ответов инструментов и секретов. Unknown delivery фиксируется отдельно и не вызывает второй пользовательский ответ.

Кэшированные аватарки для rich-карточек раздаются только по HTTPS с nedobot.chickenkiller.com/tg-ai-bot-static/avatars/. Это отдельный узкий статический путь, а не публичный доступ к базе или рабочему каталогу бота.

Под капотом

Rust, teloxide, PostgreSQL, LLM/Vision/ASR, prompt-файлы, память, RAG, импорт Telegram export и деплой на VPS.

README остаётся витриной проекта. Все эксплуатационные детали, SQL, конфиги, деплой, нюансы Telegram privacy mode, импорт истории и ограничения Bot API лежат в docs/TECHNICAL.md. Пошаговый production runbook находится в docs/DEPLOYMENT.md. Контракт и приёмочные сценарии /ask собраны в docs/ASK_MVP_PLAN.md. Активный инженерный план лежит в docs/REFACTOR_NEXT.md, а уже закрытый рефактор заархивирован в docs/REFACTOR_DONE.md.

Лицензия

MIT. См. LICENSE.

Принцип

НедоBot не должен быть громче людей.

Он нужен, чтобы чату было проще начать разговор, проще не потерять контекст и проще понять, что реально происходит с сообществом.

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages