sovena
Цзиюнь Вэньцай Sovena
English | 简体中文
Zotero → Markdown семантический пакет документов → векторный поиск: локальная система обработки потока документов для академических исследований в различных дисциплинах (особенно полезна в областях с большим количеством сканированных/факсимильных материалов — гуманитарные, социальные, естественные и технические науки, медицина), предоставляемая любому локальному/удалённому AI-клиенту в виде сервиса MCP (Model Context Protocol).
«Цзиюнь» — от горы Цзиюньшань в Бэйбэе, где расположен Юго-Западный университет; «Вэньцай» имеет два значения: и собирание (采撷) сути документов, и литературный блеск (华采). «Срывая цветы древности, чтобы сотворить мёд наш.» — У Ми (преподавал в Юго-Западном университете двадцать восемь лет)
Сценарии применения
Литературные обзоры и написание: массовое преобразование документов из Zotero (включая факсимильные издания древних книг, сканированные PDF) в Markdown с номерами страниц книг; AI-клиент может точно ссылаться на страницы при цитировании
Семантический поиск по нескольким базам: задавайте вопросы на естественном языке по сотням документов (например, «какие существуют методы акустического измерения тембра»), вместо поиска по ключевым словам в каждом документе
Оцифровка древних книг/факсимильных изданий: сканированные PDF автоматически проходят через OCR-канал, восстанавливая заголовки, таблицы, двухколоночную вёрстку в структурированный текст
Материалы вне Zotero: электронные библиотеки, разрозненные PDF, учебные материалы и любые другие папки — создаются как временные семантические пакеты (adhoc) с возможностью поиска
Внешний мозг для глубокого чтения AI: клиенты Claude Desktop / Cherry Studio / Trae и др. напрямую обращаются к вашей библиотеке через MCP, ответы с указанием источников
Удалённая совместная работа: сервер разворачивается на любом подходящем компьютере (дома/в лаборатории/в облаке), другие компьютеры указывают URL сервера в AI-клиенте
Related MCP server: zotero-mcp-lite
Ключевые возможности
Возможность | Описание |
Глубокая интеграция с Zotero | Чтение коллекций/записей/аннотаций (локальный API, без Web API key); в комплекте плагин Zotero (.xpi, прямой доступ через правый клик по коллекции/записи) |
Конвертация полного текста документов | Массовое преобразование вложений в AI-дружественный Markdown с пометками 【номер страницы книги】(двойной источник: PDF Page Labels и номера страниц OCR) |
OCR сканированных/факсимильных документов | Структурированное распознавание Unlimited-OCR, двойной бэкенд MLX / GGUF (llama-server), все платформы, удалённо |
Векторный семантический поиск | LanceDB + любой OpenAI-совместимый сервис embedding (локальный или удалённая коммерческая платформа) |
Инкрементальная обработка | Двойная проверка version записи + отпечаток вложения (mtime), обрабатывается только новое/изменённое содержимое |
Запуск одной командой |
|
Материалы вне Zotero | Электронные библиотеки, разрозненные PDF, учебные материалы и любые файлы/папки — создаются как временные семантические пакеты (adhoc) с возможностью поиска |
Удалённое развёртывание | Сервис запускается один раз, другие компьютеры указывают URL (например, через Tailscale) |
Планировщик задач/защита ресурсов | OCR-параллелизм=1, защита памяти, модели загружаются/выгружаются по требованию — компьютер не зависнет |
Архитектура
Zotero(本地API) ─┐
├─ Pipeline.prepare ─┬─ L1 文本路(pymupdf) ─┐
任意文件/文件夹 ─┘ (增量) ├─ L2 OCR路(MLX/GGUF) ├─ 语义包(content.md+meta.json)
└─ anydoc(非PDF) ┘ │
LanceDB 向量索引
(embedding: 本地/远程 OpenAI 兼容服务)
│
┌──────────────────────────────────────┤
│ │
Web 监管台(:8765) MCP 端点(/mcp)
(HTMX/原生JS) (本地 & Tailscale 远程 AI 客户端)Путь L1 (текст): PDF с текстовым слоем → извлечение через pymupdf, приоритет номеров страниц — PDF Page Labels (номера страниц книги, не физический порядок)
Путь L2 (OCR): сканированные/факсимильные документы → структурированное распознавание Unlimited-OCR (двойной бэкенд MLX / GGUF), приоритет номеров страниц: распознанный OCR page_number > PDF Page Label > физический порядок
Не PDF: docx / epub / html / txt / md / xlsx / pptx и др. → anydoc / trafilatura
Поиск: любой OpenAI-совместимый сервис embedding (локальный mlx-lm / Ollama, или удалённые платформы Bailian / OpenRouter и др.) + локальная векторная база LanceDB
OCR-движок и развёртывание моделей
OCR-канал sovena использует Unlimited-OCR (открытый исходный код Baidu, лицензия MIT, веса моделей на HuggingFace baidu/Unlimited-OCR): документная OCR-модель с декодером DeepSeek-V2 MoE + двойной визуальной башней SAM/CLIP, способная распознавать многостраничные сканы целиком и восстанавливать заголовки/таблицы/вёрстку.
Поддерживаются два бэкенда, вывод в обоих — структурированный формат, нижестоящая конвертация не замечает разницы:
Бэкенд | Способ запуска | Поддерживаемые платформы |
|
| Apple Silicon Mac |
| OpenAI-совместимый интерфейс: llama-server / vLLM обслуживает GGUF-квантованную версию | Любая платформа (Windows / Linux / Intel Mac, даже чистый CPU) |
Бэкенд 1: MLX (Apple Silicon, по умолчанию)
Скачайте MLX-веса с HuggingFace (LoJexLLM/Unlimited-OCR-MLX):
huggingface-cli download LoJexLLM/Unlimited-OCR-MLX \
--local-dir ~/models/Unlimited-OCR-MLXПо умолчанию они попадают в стандартный путь sovena (~/models/Unlimited-OCR-MLX), никакой настройки не требуется. Если разместить в другом месте — укажите в .env:
SOVENA_OCR_MODEL=/path/to/Unlimited-OCR-MLXБэкенд 2: GGUF (любой компьютер, включая Windows/Linux без GPU)
У Unlimited-OCR есть GGUF-квантованная версия сообщества (HuggingFace sahilchachra/Unlimited-OCR-GGUF, нужно скачать основную модель, например Unlimited-OCR-Q4_K_M.gguf (около 3,2 ГБ) + визуальный проектор mmproj-Unlimited-OCR-F16.gguf), запустите локальный сервис через llama-server из llama.cpp:
# 1. 下载模型(二选一)
huggingface-cli download sahilchachra/Unlimited-OCR-GGUF \
Unlimited-OCR-Q4_K_M.gguf mmproj-Unlimited-OCR-F16.gguf --local-dir ./ocr-models
# 国内可用 ModelScope 或镜像加速
# 2. 启动 OpenAI 兼容服务(8080 端口,任意平台;含 GPU 加速则加对应参数)
llama-server -m ocr-models/Unlimited-OCR-Q4_K_M.gguf \
--mmproj ocr-models/mmproj-Unlimited-OCR-F16.gguf \
--host 127.0.0.1 --port 8080
# 3. sovena 侧启用 http 后端(项目根目录 .env)
echo 'SOVENA_OCR_API=http://127.0.0.1:8080/v1' >> .envМожно также использовать vLLM или любой другой OpenAI-совместимый сервис, способный запустить этот GGUF (при другом имени модели добавьте SOVENA_OCR_MODEL_NAME=...; при наличии аутентификации — SOVENA_OCR_API_KEY=...). OCR-сервис можно даже развернуть на другой машине с GPU, sovena просто укажет её адрес.
Подсказка: Q4-квантование около 3 ГБ, обычный компьютер с 16 ГБ памяти справится. sovena вызывает по требованию (запрос постранично), не занимает память внутри процесса sovena.
Сервис Embedding (для поиска, обязателен) — любой OpenAI-совместимый интерфейс /embeddings, на выбор:
Локальный (рекомендуется, бесплатно и приватно): используйте mlx-lm (инференс-сервис из официальной экосистемы MLX от Apple, MIT):
uv tool install mlx-lm # 或 pip install mlx-lm
huggingface-cli download Qwen/Qwen3-Embedding-4B --local-dir ~/models/Qwen3-Embedding-4B
mlx_lm.server --model ~/models/Qwen3-Embedding-4B --port 8080
# 起一个 OpenAI 兼容 /v1/embeddings 服务,即 sovena 的默认地址 http://localhost:8080/v1Ollama / vLLM и другие локальные OpenAI-совместимые решения аналогично (при другом адресе задайте SOVENA_EMBED_API)
Удалённая коммерческая платформа (не хотите запускать модели локально): Alibaba Cloud Bailian / OpenRouter / SiliconFlow и др., достаточно заполнить адрес API и ключ в
.env:
# 示例:阿里云百炼(OpenAI 兼容端点)
SOVENA_EMBED_API=https://dashscope.aliyuncs.com/compatible-mode/v1
SOVENA_EMBED_API_KEY=sk-你的密钥
SOVENA_EMBED_MODEL=text-embedding-v4Внимание: после смены сервиса/модели embedding изменятся размерность векторов и семантическое пространство, существующий индекс нужно перестроить (sovena при несовпадении размерности явно предупредит; удалите каталог
_lancedbи заново «подготовьте» коллекции, или отметьте «полная перестройка»).
Быстрый старт
Требования: развёртывание на любом компьютере, основной процесс требует только Python ≥ 3.12 (Windows / macOS / Linux). OCR-канал — один из двух: на Apple Silicon — бэкенд MLX по умолчанию (нулевая настройка); на других платформах (или если хотите запускать OCR на GPU-сервере) — бэкенд GGUF (см. выше раздел «Бэкенд 2»). Весь процесс — только копирование и вставка команд.
Шаг 1: установите uv (менеджер пакетов Python, однократно)
Откройте «Терминал» (поиск «Терминал» в Launchpad или Terminal), вставьте:
curl -LsSf https://astral.sh/uv/install.sh | shПосле установки закройте терминал и откройте заново (чтобы команда заработала). Проверка: uv --version должен вывести номер версии.
Шаг 2: установите Zotero и держите его запущенным
Скачайте и установите Zotero 7+ с zotero.org, импортируйте свои документы
sovena читает через локальный API Zotero (автоматически доступен, пока Zotero открыт, никаких настроек не нужно)
Вложения могут быть «импортированными вложениями» или «связанными вложениями», поддерживаются оба типа
Шаг 3: подготовьте сервисы моделей (embedding обязателен + OCR по желанию)
Сервис embedding (обязателен для поиска), на выбор:
Локальный (рекомендуется): mlx-lm (официальная экосистема MLX от Apple, MIT) —
uv tool install mlx-lm, скачайте модель и запуститеmlx_lm.server --model <каталог модели> --port 8080(полные команды см. выше в разделе «Сервис Embedding»). Ollama / vLLM и другие OpenAI-совместимые решения аналогичноУдалённая платформа (без запуска моделей локально): Alibaba Cloud Bailian / OpenRouter и др., создайте
.envв корне проекта и заполните адрес и ключ (см. пример в разделе «Сервис Embedding» выше)
OCR-модель (только для сканов, Apple Silicon): скачайте Unlimited-OCR-MLX с HuggingFace в ~/models/Unlimited-OCR-MLX (команды см. выше в разделе «Бэкенд 1», sovena загрузит/выгрузит её по мере необходимости)
На компьютерах не с Apple Silicon для OCR: используйте «бэкенд GGUF» — скачайте Unlimited-OCR-GGUF + запустите llama-server, настройка см. выше в разделе «Бэкенд 2». Хотите быстро попробовать, поиск пока не нужен? Сервис моделей можно добавить позже, сначала выполните шаги 4–5.
Шаг 4: получите sovena и установите зависимости
git clone https://github.com/<you>/sovena.git
cd sovena
uv sync # 自动下载全部依赖(首次约 1.3GB,需要几分钟)На компьютерах не с Apple Silicon (Windows / Linux / Intel Mac): зависимости, связанные с MLX, используются только в MLX OCR-бэкенде;
uv syncна этих платформах автоматически пропустит их или установит CPU-совместимые версии; текстовые PDF, конвертация не-PDF документов, поиск и другие ключевые функции, а также OCR через бэкенд GGUF — всё работает нормально.
Шаг 5: запуск одной командой
uv run sovenaУвидели Uvicorn running on http://0.0.0.0:8765 — значит, успех. Откройте в браузере **http://localhost:8765**:
Точка на странице «Мониторинг производительности» зелёная → сервис работает
В выпадающем списке «Поток документов Zotero» видны ваши коллекции → связь с Zotero установлена
Для остановки нажмите Control + C в терминале. Сервис не работает постоянно, не запускается при загрузке, тяжёлые операции планируются последовательно внутри (OCR-параллелизм=1, защита памяти) — компьютер не зависнет.
Шаг 6 (необязательно): настройка личного пути
Данные по умолчанию хранятся в ~/sovena_data. Чтобы разместить в другом месте (например, на внешнем диске), создайте файл .env в корне проекта:
echo 'SOVENA_ROOT=/Volumes/你的盘/sovena_data' > .env.env игнорируется git, личные пути не попадут в репозиторий.
Шаг 7: запустите первую задачу
В Web-консоли «Поток документов Zotero» → выберите небольшую коллекцию (например, 5 записей) → «Запустить подготовку» → переключитесь на «Мониторинг производительности» и следите за прогрессом. После завершения перейдите в «Семантический поиск» и задайте вопрос.
Частые вопросы
Симптом | Решение |
Ошибка | uv из шага 1 не установлен или терминал не перезапущен |
Ошибка «порт занят» | Старый сервис не остановлен: |
«Ошибка подключения к Zotero» | Zotero не открыт или установлена старая версия (нужна 7.0+) |
Ошибка поиска/нет результатов | Сервис embedding не запущен/неверный ключ (локальный mlx-lm или удалённая платформа), или коллекция ещё не «подготовлена»; после смены модели embedding нужно перестроить индекс |
Ошибка модели OCR | Бэкенд MLX: не скачан |
Вентилятор компьютера ревёт | Нормально: OCR-задача тяжёлая; после завершения модель автоматически выгрузится |
Шаг 8 (необязательно): подключение AI-клиента (работает и с других компьютеров)
В любом клиенте, поддерживающем MCP streamable-http (Claude Desktop, Cherry Studio, Trae и др.), укажите:
{
"mcpServers": {
"sovena": { "url": "http://localhost:8765/mcp" }
}
}Удалённое (с других компьютеров) развёртывание: сервер запускается с SOVENA_HOST=0.0.0.0 (по умолчанию), клиент меняет URL на http://<IP сервера или имя хоста Tailscale>:8765/mcp. На странице «Настройки» Web-консоли можно одним кликом скопировать/скачать конфигурационный JSON текущего развёртывания.
Плагин Zotero (необязательно)
dist/sovena-plugin-<version>.xpi — клиентский плагин, устанавливаемый в Zotero 7+ (включая 9/10), обеспечивающий прямой доступ к sovena из Zotero:
Правый клик по коллекции → «sovena: подготовить/обновить семантический пакет (инкрементально)»
Правый клик по записи → «sovena: добавить вложения в временный семантический пакет» (локальные файловые вложения выбранных записей проходят через adhoc-процесс)
Меню «Инструменты» → sovena → открыть консоль / настройка адреса сервера / копировать конфигурацию MCP-клиента / проверка подключения
Установка: Zotero → Инструменты → Плагины → шестерёнка в правом верхнем углу → Install Plugin From File… → выберите dist/sovena-plugin-0.1.0.xpi. По умолчанию подключается к http://localhost:8765; с других компьютеров укажите адрес сервера sovena в «Инструменты → sovena → Адрес сервера…».
Пересборка плагина (после изменения zotero-plugin/):
bash zotero-plugin/build.sh # 产出 dist/sovena-plugin-<version>.xpiПеременные окружения
Все настройки можно задать через переменные окружения; рекомендуется создать файл .env в корне проекта (игнорируется .gitignore, подходит для личных путей), он автоматически загружается при запуске сервиса:
SOVENA_ROOT=/Volumes/your-disk/zotero_AI
SOVENA_ZOTERO_API=http://localhost:23119/apiПеременная | Значение по умолчанию | Описание |
|
| Корневой каталог семантических пакетов (при личном развёртывании рекомендуется задать в |
|
| Локальный API Zotero |
|
| Адрес прослушивания сервиса |
|
| Порт сервиса |
|
| Адрес сервиса embedding (локальный mlx-lm/Ollama или удалённая платформа) |
| (пусто) | Ключ сервиса embedding (обязателен для удалённых коммерческих платформ) |
|
| Имя модели embedding |
|
| Каталог векторной базы |
|
| OCR-бэкенд: |
|
| Каталог модели бэкенда MLX |
| (пусто) | Адрес сервиса бэкенда http (например, |
|
| Имя модели бэкенда http |
| (пусто) | Ключ аутентификации бэкенда http (если есть) |
|
| Порог защиты памяти (МБ), при снижении ниже — новые задачи откладываются |
Использование
Поток документов Zotero (инкрементальный)
В Web-консоли выберите коллекцию → «Запустить подготовку»; или вызовите MCP-инструмент sovena_prepare из AI-клиента. Повторное выполнение автоматически инкрементально: обрабатываются только новые/изменённые записи (изменение version в Zotero или изменение mtime вложения), индекс обновляется на уровне записей. Отметка «полная перестройка» принудительно перезапускает всё.
Временные материалы adhoc (любые файлы/папки)
Превратите электронную библиотеку, разрозненные PDF, учебные материалы и т.п. в семантические пакеты с возможностью поиска:
Web-консоль: в карточке «Временные семантические пакеты» укажите пути (несколько — через перевод строки или
;) → отправьте, после чего они будут доступны для семантического поиска вместе с коллекциями ZoteroMCP:
sovena_adhoc_process(paths=["/path/to/E_book/某子目录"], name="我的书库")REST:
POST /api/adhoc/submit{"paths": [...], "name": "..."}
Поддерживаются pdf/epub/docx/html/txt/md/xlsx/pptx и др.; сканированные PDF автоматически проходят через OCR; также поддерживается инкрементальность (если mtime исходного файла не изменился — пропускается).
Обзор MCP-инструментов
Категория | Инструменты |
Чтение Zotero |
|
Поток документов |
|
adhoc |
|
Задачи/обслуживание |
|
Примечание: локальный API Zotero доступен только для чтения, поэтому инструменты записи не предоставляются.
Структура каталога семантического пакета
$SOVENA_ROOT/
<分类名>/
_manifest.json # 分类级清单(增量依据)
<作者>_<年份>_<标题>/
meta.json # Zotero 元数据 + 转换统计
content.md # AI 友好 markdown(含【书页页码】标注)
adhoc/
<资料包名>/
_manifest.json
<文件名slug>/
meta.json
content.md
_lancedb/ # 向量库Обзор REST API
Метод | Путь | Описание |
GET |
| Категории Zotero + adhoc-пакеты и статус готовности |
GET |
| Конфигурация запуска, состояние системы (память/CPU/диск/задачи) |
GET |
| Список каталогов на сервере (для Web-выбора пути) |
POST |
| Отправка задачи prepare (collection/limit/use_ocr/rebuild) |
POST |
| Отправка задачи adhoc (paths/name/use_ocr/recursive) |
GET |
| Список/детали задач (включая журналы), POST |
GET |
| Семантический поиск (можно ограничить collection) |
GET |
| Манифест |
GET |
| Содержимое/метаданные |
GET |
| Состояние системы, конфигурация MCP-клиента |
Структура проекта
sovena/
main.py # 一键启动入口
sovena/
server.py # 服务总入口(Web + MCP 同进程,自动加载 .env)
web.py / webui.html # Web 监管台(分区 Tab + 路径选择器)
mcp_server.py # MCP 工具集
zotero_collector.py # Zotero 本地 API 采集(附件 4 路解析)
pipeline.py # prepare 流水线(增量)
adhoc.py # 任意资料临时处理
converter.py # L1/L2/anydoc 转换
indexer.py # 分块 + 向量化 + LanceDB
packager.py # 语义包落盘
jobs.py # 任务调度(内存守卫/OCR 并发=1)
zotero-plugin/ # Zotero 客户端插件源码(bootstrap 结构)
dist/ # 构建产物(sovena-plugin-<version>.xpi)
ocr_port/ # Unlimited-OCR-MLX(MLX OCR 引擎)
.env # 本地个人配置(可选,不入库)Благодарности
sovena стоит на плечах следующих проектов, за что выражаем глубокую благодарность:
Unlimited-OCR (Baidu, MIT) — сама модель OCR для документов; код
ocr_port/портирован из реализации MLX сообщества mlx-vlm; MLX-веса (формат LoJexLLM) и GGUF-квантованная версия (sahilchachra) взяты из сообщества HuggingFace; http-бэкенд работает через llama-server от llama.cpp (MIT)cookjohn/zotero-mcp — один из источников вдохновения проекта
Zotero (AGPL) — основа управления литературой и локальный API
PyMuPDF (AGPL) — извлечение текста из PDF и метки страниц
LanceDB (Apache-2.0) — локальная векторная база данных
FastMCP (MIT) — фреймворк MCP-сервисов
anydoc (firecrawl-anydoc) — конвертация документов, отличных от PDF (docx/epub и др.)
trafilatura (Apache-2.0) — извлечение основного текста веб-страниц
mlx-lm (Apple ml-explore, MIT) — локальный сервис инференса embedding (
mlx_lm.server, OpenAI-совместимый API)uv (Astral, MIT) — управление Python-пакетами
Лицензия
MIT © участники Sovena, Институт антропологии искусства Юго-Западного университета, Китайский институт музыкального психологического здоровья Юго-Западного университета; автор: Ши Фэнкай (sfklc@hotmail.com)
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables semantic search and conversational querying across a personal research library of PDFs, DOCX, and other documents using a vector database. It provides tools for document summarization, finding related papers, and high-accuracy retrieval for AI clients like Claude Desktop.
- AlicenseAqualityDmaintenanceEnables AI assistants to search, read, and manage Zotero references locally with customizable research workflows.94MIT
- FlicenseNot gradedqualityDmaintenanceEnables semantic search across scientific papers in your Zotero library with hybrid search, incremental indexing, and cross-encoder reranking.
- AlicenseNot gradedqualityDmaintenanceMCP server that connects AI assistants to your Zotero library, enabling full-text PDF extraction and metadata search.MIT
Related MCP Connectors
Search and reason over your Obsidian-style Markdown vault, right from ChatGPT.
Serve a folder of Markdown notes as an MCP server: hybrid search, reading, and sourced answers.
Search arXiv/Semantic Scholar/OpenAlex + medical evidence (PubMed/Europe PMC) + LaTeX/PDF tools.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/sfk8815-create/sovena'
If you have feedback or need assistance with the MCP directory API, please join our Discord server