The dense leg used to be a pair of files next to the database: a full .npy re-encoded from every atom, re-normalized on every query, and stale the moment anything was ingested. It is now a vec0 table inside the same SQLite file, written in the same transaction as the atom it describes, so a memory is queryable the instant it is remembered. - vector_index.py maintains the table; the writer inserts, the reader never rebuilds. A repair scan (ely-eye build-dense-index) catches what a crash hid, and it is not on the search path. - Ranking stays in the engine; every boundary (closed, retired, not yet true, another holder's private memory, the mounted cartridge) is checked once against the atoms table afterwards. A visibility subquery inside the KNN cost 48.9s on 153,857 vectors; the same check over 200 candidates costs 0.2ms. When the boundaries reject enough candidates the ask widens once, never twice. - The Go mirror and the web panel carry the new status fields. - bench/dense_scale.py and bench/quant_probe.py measure the leg at corpus size; bench/scale_check.py now works on a copy so the frozen baseline stays frozen. Measured on the frozen 165,973-atom corpus. bench/reports/DENSE.md, QUANT.md and SCALE.md carry the numbers and the machine they were taken on. Gates: 285 pytest, ruff clean, pyright 0 on the touched files, go build/vet/test and gofmt clean, frontend build and eslint clean. mypy is 25 findings against the parent's 24: the new one is "Skipping analyzing sqlite_vec: missing library stubs", the same class as the two existing qwen_vl_utils lines, and the repo keeps no type: ignore anywhere.
66 lines
1.4 KiB
TOML
66 lines
1.4 KiB
TOML
[build-system]
|
|
requires = ["setuptools>=80", "wheel"]
|
|
build-backend = "setuptools.build_meta"
|
|
|
|
[project]
|
|
name = "ely-eye"
|
|
version = "0.1.0"
|
|
description = "Local multimodal context operating system for Qwen3.5-9B."
|
|
readme = "README.md"
|
|
license = "AGPL-3.0-only"
|
|
requires-python = ">=3.12"
|
|
dependencies = [
|
|
"accelerate>=1.12.0",
|
|
"bitsandbytes>=0.49.2",
|
|
"datasets>=4.8.5",
|
|
"fastapi>=0.124.0",
|
|
"huggingface-hub>=1.2.0",
|
|
"httpx>=0.28.0",
|
|
"networkx>=3.6.0",
|
|
"ninja>=1.13.0",
|
|
"numpy>=2.3.0",
|
|
"opencv-python-headless>=4.12.0.0",
|
|
"orjson>=3.11.0",
|
|
"peft>=0.19.0",
|
|
"pillow>=12.0.0",
|
|
"platformdirs>=4.5.0",
|
|
"pyarrow>=22.0.0",
|
|
"pydantic>=2.12.0",
|
|
"pydantic-settings>=2.12.0",
|
|
"pymupdf>=1.26.0",
|
|
"python-multipart>=0.0.20",
|
|
"qwen-vl-utils>=0.0.14",
|
|
"rank-bm25>=0.2.2",
|
|
"rapidocr-onnxruntime>=1.2.3,<2",
|
|
"safetensors>=0.7.0",
|
|
"sentence-transformers>=5.2.0",
|
|
"sqlite-vec>=0.1.9",
|
|
"torch>=2.12.0",
|
|
"torchvision>=0.27.0",
|
|
"transformers>=4.57.0",
|
|
"typer>=0.20.0",
|
|
"uvicorn[standard]>=0.38.0",
|
|
"zstandard>=0.25.0"
|
|
]
|
|
|
|
[project.optional-dependencies]
|
|
dev = [
|
|
"pytest>=9.1.0",
|
|
"ruff==0.16.10"
|
|
]
|
|
|
|
[project.scripts]
|
|
ely-eye = "ely_eye.cli:app"
|
|
|
|
[tool.setuptools.packages.find]
|
|
where = ["src"]
|
|
|
|
[tool.ruff]
|
|
line-length = 100
|
|
target-version = "py312"
|
|
|
|
[tool.ruff.lint]
|
|
# Typer requires an option default to be a typer.Option call, which is what B008 forbids.
|
|
ignore = ["B008"]
|
|
|