Skip to content

feat(embed): one-variable presets and working local endpoints - #9

Merged
AbsoluteMode merged 1 commit into
mainfrom
feat/embed-presets
Jul 27, 2026
Merged

feat(embed): one-variable presets and working local endpoints#9
AbsoluteMode merged 1 commit into
mainfrom
feat/embed-presets

Conversation

@AbsoluteMode

Copy link
Copy Markdown
Owner

Проблема

Эмбеддинги числились подключаемыми, но на практике на локальный движок не наводились:

  • OpenAIEmbedder всегда слал dimensions — Ollama и llama.cpp на этом возвращают ошибку;
  • SDK всегда требовал OPENAI_API_KEY, которого у локального сервера нет.

То есть «укажи свой эндпоинт» ломалось на любом локальном сервере, который человек реально
попробует.

Что сделано

Пресеты. SESSION_RECALL_EMBED=voyage|ollama|lmstudio|openai задаёт эндпоинт, модель,
размерность и реранкер одним куском — эти четыре вещи не независимы: выбрать локальную модель
и оставить облачный реранкер значит упасть позже и дальше от причины. Точечные
SESSION_RECALL_EMBED_* по-прежнему перебивают пресет, так что свой эндпоинт подключается
свободно.

Автодетект. Нет пресета и нет ключа Voyage — пробуем локальный сервер, который уже слушает.
Работающий эндпоинт лучше, чем провайдер, который гарантированно откажет. Если ключ есть,
проба не выполняется вовсе — ничего не добавляем к настроенной конфигурации.

Честная ошибка размерности. Store больше не открывает индекс, ширина векторов которого не
совпадает с конфигом. Раньше сырая ошибка sqlite поднималась в degrade-путь recall_search и
докладывалась как «embeddings unavailable» — то есть после смены модели человек шёл чинить
исправный эмбеддер.

Про выбор дефолта

nomic-embed-text (Apache-2.0), а не более сильная модель под CC BY-NC: любой, кто
проиндексирует рабочую историю второй, окажется в нарушении, ни разу об этом не узнав.
Для некоммерческого использования путь открыт через явные переменные — так и написано в README.

Проверка

135 тестов зелёные (было 128). Новые писались до кода и падали как надо. Оба пути проверены
вживую:

без пресета, с ключом → voyage voyage-4-large 1024 | rerank: voyage
пресет ollama         → openai-compatible nomic-embed-text 768 | rerank: none | dimensions: False

🤖 Generated with Claude Code

…m mismatch

Embeddings were nominally pluggable and practically not: `OpenAIEmbedder` always
sent `dimensions` (Ollama and llama.cpp reject the request outright) and always
required OPENAI_API_KEY (local servers have none). So "point it at your own
embedder" failed on every local server anyone would actually try.

- SESSION_RECALL_EMBED=voyage|ollama|lmstudio|openai sets endpoint, model, dim and
  reranker as one unit. Those four are not independent: choosing a local model and
  leaving a cloud reranker configured only fails later, further from the cause.
  Individual SESSION_RECALL_EMBED_* variables still override, so a preset never
  blocks a custom endpoint.
- With no preset and no Voyage key, probe for a local server that is already
  listening — a running endpoint beats defaulting to one certain to reject us. A
  configured key skips the probe entirely, so nothing is added to a working setup.
- Store now refuses to open an index whose vector width differs from the configured
  embedder, naming the fix. Previously the raw sqlite dimension error travelled up
  into recall_search's degrade path and was reported as "embeddings unavailable" —
  sending the user to debug a healthy embedder after switching models.

Default is Apache-2.0 `nomic-embed-text`, not a stronger CC-BY-NC model: anyone
indexing work history with the latter would be in breach without being told.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@AbsoluteMode
AbsoluteMode merged commit 54daaa7 into main Jul 27, 2026
7 checks passed
@AbsoluteMode
AbsoluteMode deleted the feat/embed-presets branch July 27, 2026 06:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants