Skip to content

Repository files navigation

FileSearch

Tests

Скачать последний установщик

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-провайдер в этом режиме не вызывается и отдельное согласие для него не запрашивается.

Сборка EXE

scripts\build-exe.cmd

Готовое приложение будет находиться в:

dist\FileSearch\FileSearch.exe

Это папочная сборка: не переносите отдельно один EXE, переносите всю папку dist\FileSearch.

Установщик Windows

Готовый установщик содержит 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-ключи в чат, репозиторий или скриншоты.

Ограничения версии 0.1

  • Поиск считает 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 и способ хранения ключа.

Frozen PDF smoke test

В EXE встроен служебный smoke-режим, который открывает многостраничный PDF через bundled PDFium, извлекает текст, рендерит каждую страницу и записывает тестовый SQLite-индекс:

dist\FileSearch\FileSearch.exe --smoke-pdf path\to\multi-page.pdf path\to\smoke.sqlite3

Код возврата 0 означает, что все страницы были извлечены, отрендерены и сохранены в индекс.

About

Семантический поиск по локальным документам для Windows

Topics

Resources

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages