feat(embed): one-variable presets and working local endpoints - #9
Merged
Conversation
…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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Проблема
Эмбеддинги числились подключаемыми, но на практике на локальный движок не наводились:
OpenAIEmbedderвсегда слалdimensions— Ollama и llama.cpp на этом возвращают ошибку;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). Новые писались до кода и падали как надо. Оба пути проверены
вживую:
🤖 Generated with Claude Code