Этот репозиторий — приложение из статьи на Хабре «От идей к коду: проверяю теорию внимания на практике». Ссылка: https://habr.com/ru/articles/995070/
Mindstream — персональный инструмент чтения и ориентации в потоке публикаций. Он агрегирует корпус публикаций, формирует аннотацию и обзор и строит персональную ленту как локальную проекцию корпуса с учётом внимания пользователя и агрегированной статистики. Mindstream не является рекомендательным сервисом и не управляет вниманием пользователя.
- Один общий корпус публикаций для всех пользователей.
- Лента формируется в браузере как персональная проекция корпуса.
- Смысловые представления публикации: аннотация и обзор.
- Сигналы внимания только положительные.
- Два режима доступа: демо-режим и полный доступ через UUID профиля.
- Регистрация аккаунтов и социальные функции.
- Отрицательные сигналы внимания и дизлайки.
- Объяснимость формирования ленты и глобальная персонализация.
- Перенос профиля между устройствами.
src/— backend (ingest, processing, API, storage).web/— клиентская PWA и интерфейс ленты.ctx/— когнитивный контекст и нормативная документация проекта.
- Node.js LTS 20.x.
- PostgreSQL 16+ с расширением
pgvector. - Доступ к LLM API для генерации аннотаций, обзоров и эмбеддингов.
SERVER_PORTSERVER_TYPEDB_CLIENTDB_HOSTDB_PORTDB_DATABASEDB_USERDB_PASSWORDLLM_API_KEYLLM_BASE_URLLLM_GENERATION_MODELLLM_EMBEDDING_MODEL
- Установите зависимости:
npm install. - Подготовьте PostgreSQL и включите
pgvector:
CREATE EXTENSION vector;- Создайте схему в пустой базе:
node ./bin/app.mjs db:schema:create. - При необходимости пересоздать схему с переносом данных используйте:
node ./bin/app.mjs db:schema:renew(операция разрушительная). - Обнаружьте публикации из RSS Хабра:
node ./bin/app.mjs ingest:discover:habr. - Извлеките тексты публикаций:
node ./bin/app.mjs ingest:extract:habr. - Сформируйте обзор и аннотацию:
node ./bin/app.mjs process:generate:summaries. - Сформируйте эмбеддинги:
node ./bin/app.mjs process:generate:embeddings. - Запустите сервер:
npm start.
Шаги 7–8 используют внешний LLM API и требуют заполненных LLM_* переменных.
После запуска откройте http://localhost:3000.
POST /api/attention принимает write-события сигналов внимания.
Payload:
{
"identity": "uuid-string",
"publication_id": 123,
"attention_type": "overview_view | link_click | link_click_after_overview"
}Успех: 204 No Content.
Ошибки: 400 (некорректный payload), 422 (identity или публикация не найдены).
POST /api/identity регистрирует anonymous identity.
Payload:
{ "identity": "uuid-string" }Ответ всегда 204 No Content.
npm run test:unit