AI-инфраструктура для НедоNews Chat: первый комментарий под постом, память контекста, статистика, голосовые и агентный помощник по истории чата.
Rust · teloxide · PostgreSQL · LLM/Vision/ASR
Канал · Чат · Docs · Changelog · Deployment · Prompt · Tech RAG · MIT
НедоBot — внутренний AI-помощник для экосистемы НедоNews и НедоNews Chat.
Он не пытается заменить людей, модерировать всё подряд или быть универсальным ботом «для любого чата». Его задача проще и полезнее: помогать живому обсуждению появляться быстрее, не терять контекст и понимать, что реально происходит в комьюнити.
Пост вышел → бот понял контекст → написал первый комментарий → чат подхватил тему → данные не потерялись.
В Telegram-чатах много жизни, но мало памяти. Хорошие мысли тонут, одинаковые заходы повторяются, статистика размазывается, а первый комментарий под постом часто решает, будет обсуждение или тишина.
НедоBot закрывает этот слой: он стоит рядом с чатом, не шумит громче людей и помогает новостям превращаться в разговор.
|
Видит новый пост из канала, учитывает текст и картинку, убирает служебные хвосты и пишет нормальный первый комментарий в стиле чата. |
Сохраняет каждый полезный пост отдельной карточкой и через RuBERT + pgvector находит похожую историю, чтобы не повторять известные факты и ракурсы. |
|
Подстраховывает техно-новости от очевидной устаревшей дичи: релизы, платформы, железо, версии и повторяющиеся сюжеты. |
Считает активность, реплаи, медиа, реакции, топ пишущих и топ сообщений. Карточки пользователей могут показывать кэшированную аватарку по публичному HTTPS-домену проекта. |
|
Расшифровывает voice, audio и кружки через Groq ASR, чистит текст через LLM и отвечает коротким текстом, главами или файлом. |
Импортирует Telegram export, чтобы статистика и карточки пользователей не начинались с пустого места. |
|
Показывает этапы исследования прямо в чате, ищет по истории и reply-веткам, понимает участников и фото в reply, при необходимости подключает web и GitHub и отвечает через semantic Rich Text: локализованное время, trusted link aliases и custom emoji bindings. |
Модель не получает SQL или shell: только ограниченные read-only операции чата, профилей и внешнего поиска. |
В личных чатах 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 и формат глав.
- первый комментарий под постом канала;
- атомарная память новых постов через RuBERT Tiny 2 и pgvector;
- статистика дня, недели и месяца;
- пользовательская статистика;
- импорт Telegram export для исторической статистики;
- топ пользователей и сообщений по реакциям;
- базовая расшифровка voice/audio/кружков через Groq ASR;
- агентный
/askс ограниченными read-only инструментами чата, web и GitHub; - аудит
/ask: запросы, инструменты, задержки и безопасные статусы ошибок; - semantic Rich Text
/ask: LLM Markdown time markers, trustedchat/message_<id>/source_Naliases, provenance-checked literal URLs и настроенные custom emoji bindings; - deterministic time rendering
/askс capturednow, timezone, renderer revision и compiled-payload audit; - delivery certainty для final/segment lifecycle и запрет fallback при
Unknown; - публичная HTTPS-раздача кэшированных аватарок Telegram;
- timestamp в заголовках глав голосовых;
- ручная команда
/transcribereply на 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 не должен быть громче людей.
Он нужен, чтобы чату было проще начать разговор, проще не потерять контекст и проще понять, что реально происходит с сообществом.