Windows-приложение для семантического поиска по локальным PDF, сканам, DOCX, XLSX, TXT/MD и изображениям через embeddings.
- Поиск по смыслу, а не только по точным словам.
- PDF обрабатывается постранично, включая сканы без текстового слоя.
- Обычная синхронизация добавляет новые, обновляет изменённые и удаляет из индекса удалённые с диска файлы.
- «Перестроить» заново индексирует все папки в отдельную базу и подменяет рабочий индекс одной операцией: до самого конца поиск продолжает работать на старом индексе, а отмена или сбой ничего не портят.
- Поиск и индексация выполняются в фоновых потоках — окно не блокируется на время удалённого запроса.
- RouterAI преднастроен для
google/gemini-embedding-2. - RouterAI Vision преднастроен для
qwen/qwen3.7-flash; vision-провайдер и его активная модель выбираются отдельно от embeddings. - Можно добавить любой OpenAI-совместимый embedding API.
- В одном профиле можно хранить несколько моделей, переключать активную и удалять ненужные модели; пользовательские профили также удаляются из интерфейса.
- Ключи хранятся локально в
%LOCALAPPDATA%\FileSearch\.env, отдельно от исходников и EXE. - Светлая и тёмная темы переключаются без перезапуска и сохраняются между запусками.
- Анимации появления результатов можно отключить в настройках.
- Интерфейс использует боковую навигацию, пустые состояния и отдельные состояния загрузки и ошибок.
Визуальная система построена на нейтральных поверхностях и одном бирюзовом акценте. Все цвета, размеры текста, интервалы и радиусы задаются централизованно в src/filesearch/gui/theme.py. Иконки Lucide встроены в код и перекрашиваются под активную тему; фирменный знак и многоразмерная иконка Windows лежат в assets/brand/.
Для проверки интерфейса во всех разделах и темах без обращения к реальному индексу:
.venv\Scripts\python.exe scripts\screenshot.pyСкриншоты будут созданы в локальной папке _shots.
scripts\run-dev.cmdТесты:
.venv\Scripts\python.exe -m pytestВ разделе Провайдеры вставьте API-ключ RouterAI, сохраните и сделайте профиль активным. Затем в разделе Папки и индекс добавьте папку и нажмите «Синхронизировать». Переключатель Vision для сканов можно отключить, если нужно индексировать только через embedding-модель: Vision-провайдер в этом режиме не вызывается и отдельное согласие для него не запрашивается.
scripts\build-exe.cmdГотовое приложение будет находиться в:
dist\FileSearch\FileSearch.exe
Это папочная сборка: не переносите отдельно один EXE, переносите всю папку dist\FileSearch.
Готовый установщик содержит FileSearch и все необходимые библиотеки. Python на компьютере пользователя не нужен. Запустите FileSearch-Setup-0.1.1.exe, подтвердите запрос Windows и завершите русский мастер установки. Программа будет установлена в Program Files, появится в меню «Пуск» и в списке установленных приложений. Ярлык на рабочем столе можно выбрать в мастере.
Настройки, API-ключи и SQLite-индекс находятся в %LOCALAPPDATA%\FileSearch и сохраняются при обновлении или удалении программы. Поскольку релиз не подписан цифровым сертификатом, Windows SmartScreen может запросить дополнительное подтверждение первого запуска.
Для воспроизводимой release-сборки нужны 64-битный Python 3.11.15 и Inno Setup 6.7.3. После их установки выполните:
scripts\build-installer.cmdСкрипт создаёт чистое окружение .venv-release, устанавливает зависимости с проверкой хешей из requirements-release.lock, проверяет x64-архитектуру EXE и затем создаёт dist\installer\FileSearch-Setup-<версия>.exe. Версия берётся из pyproject.toml.
| Данные | Путь |
|---|---|
| Настройки профилей и папок | %LOCALAPPDATA%\FileSearch\settings.json |
| Ключи API | %LOCALAPPDATA%\FileSearch\.env |
| Локальный SQLite-индекс | %LOCALAPPDATA%\FileSearch\filesearch.sqlite3 |
На странице Папки и индекс нажмите Подключить SQLite-индекс и выберите перенесённый файл .sqlite3, .sqlite или .db. FileSearch проверит схему и целостность базы до подключения. Если документы на новом компьютере находятся в другом месте, выделите исходную папку в таблице и нажмите Указать новое расположение файлов — пути root и всех файлов будут изменены одной транзакцией без повторного получения embeddings.
В таблице папка и используемый SQLite-индекс показаны рядом. Если присутствует только папка, интерфейс предложит синхронизацию; если в перенесённом индексе остался недоступный старый путь, интерфейс предложит переназначение. Галочка в колонке Поиск временно исключает папку из результатов, не удаляя её данные из индекса.
.env не попадает в Git. Не отправляйте API-ключи в чат, репозиторий или скриншоты.
- Поиск считает similarity локально: векторы хранятся как нормализованный
float32и сравниваются пакетами через NumPy. Индексу не нужен внешний векторный движок, но полный проход по всем фрагментам остаётся линейным, поэтому очень большие архивы (сотни тысяч страниц) будут отвечать заметно медленнее. - PDF и изображения требуют провайдера с мультимодальными embeddings. Страницы и сканы отправляются в
/embeddingsкак файл или изображение — это расширение, которого нет в базовом OpenAI-совместимом API. У провайдера без такой поддержки эти файлы будут отмечены ошибкой (с понятным сообщением), а DOCX, XLSX, TXT и MD продолжат индексироваться. RouterAI поддерживает нужный формат. - При смене embedding-модели выполните «Перестроить» — векторы разных моделей несравнимы. Перестройка собирает новый индекс в отдельном файле и заменяет рабочий только после успешного завершения.
- Индексы, созданные ранними сборками (embeddings в JSON), конвертируются автоматически при первом открытии.
FileSearch отправляет текст запроса и индексируемые логические/физические страницы выбранному embedding endpoint. PDF и изображения могут передаваться как визуальные данные.
Перед первым удалённым запросом требуется согласие. Отпечаток согласия включает provider, Base URL и model и отдельно активный Vision-профиль с его Base URL и моделью — сканы уходят именно туда. Изменение любого из этих значений, включая переключение Vision-провайдера, требует нового согласия.
HTTP разрешён только для loopback-адресов, остальные endpoint должны использовать HTTPS. Запросы имеют ограниченные таймауты (соединение 15 с, чтение 300 с), поэтому недоступный провайдер не подвешивает приложение. API-ключи хранятся локально в plaintext-файле .env и не входят в индекс или Git; сохранённый в приложении ключ имеет приоритет над переменной окружения.
Кнопки проверки embeddings- и vision-провайдеров используют фоновые cancel-aware запросы, показывают прошедшее время и требуют согласия до первого сетевого обращения. На странице провайдера постоянно указано, какие данные передаются, активный endpoint и способ хранения ключа.
В EXE встроен служебный smoke-режим, который открывает многостраничный PDF через bundled PDFium, извлекает текст, рендерит каждую страницу и записывает тестовый SQLite-индекс:
dist\FileSearch\FileSearch.exe --smoke-pdf path\to\multi-page.pdf path\to\smoke.sqlite3Код возврата 0 означает, что все страницы были извлечены, отрендерены и сохранены в индекс.