Skip to content

fix(installer): install the llama.cpp engine in a bare interpreter and stop reporting false success - #134

Merged
ManSio merged 5 commits into
mainfrom
fix/llama-import-without-httpx
Nov 15, 2026
Merged

ManSio merged 5 commits into
mainfrom
fix/llama-import-without-httpx

Conversation

@ManSio

@ManSio ManSio commented Nov 14, 2026

Copy link
Copy Markdown
Owner

Что и почему

python install.py системным интерпретатором (C:\Python314\python.exe, без зависимостей проекта) не устанавливал движок llama.cpp — и рапортовал успех. Живой прогон вскрыл три слоя одной проблемы: «шаг установщика зависит от того, чего в этом интерпретаторе нет», а итог не отражает реальность.

Слой 1 — импорт падал (No module named 'httpx')

install.py:669 (step_llama) импортирует src.providers.reranker.llama_runner, а тот делал top-level import httpx. Шагу нужны только download_llama_binary/is_installed (stdlib, urllib). Зависимости проекта ставятся в venv расширения (шаг 6), а install.py работает интерпретатором пользователя — это штатный путь по docs/en/INSTALL.md.

Там же: llama_install.py:233 на импорте вызывал wmic cpu/wmic memorychip (на Windows 11 24H2 wmic удалён) → трейсбек в консоль установки и деградация RAM/CPU до 8/unknown.

Слой 2 — --with-models падал так же

download_gguf_model делал безусловный from huggingface_hub import hf_hub_download вне try, хотя step_gguf (шаг 7) идёт до step_models (шаг 8). Комментарий «…или urllib» обещал fallback, которого не существовало. Плюс vulkaninfo спавнился на импорте на любой машине с vulkan-1.dll и печатал предупреждение в консоль установки.

Слой 3 — движок не ставился, но шаг был «✓»

Живой прогон после фикса импорта показал: SHA256 не совпадает! Ожидался d5d7…, получен a23e… → 🚫 Отказ от установки — и одновременно ✓ Step 7/12 и итог 12 ok, 0 skipped, 0 failed.

  • Пин LLAMA_BIN_SHA256["win-cpu-x64"] неверен с первого коммита. Архив при этом правильный: GitHub API для ассета отдаёт digest=sha256:a23e548c…, совпадающий с фактическим; win-vulkan-x64 тоже неверен.
  • step_llama на провале добавлял жёлтую строку и возвращался нормально → _step считал шаг ok; main() не возвращал код ошибки (exit 0 всегда).

Что изменено

  • src/providers/reranker/llama_runner.py — ленивый _httpx() (6 мест), top-level import httpx убран.
  • src/providers/reranker/llama_install.py:
    • RAM через GlobalMemoryStatusEx (ctypes), CPU через ProcessorNameString из реестра — без процессов, с прежним дефолтом;
    • Vulkan-проба вынесена в _detect_vulkan(has_binary): без Vulkan-сборки не запускается, сбой — debug;
    • GGUF: except ImportError + рабочий urllib-fallback (sha256, .part → atomic replace);
    • хэши приведены к GitHub digest; проверка: пин → (если устарел) GitHub digest → иначе fail closed; уборка через _discard (занятый на Windows файл больше не даёт PermissionError).
  • install.py: step_llama/step_gguf бросают RuntimeError вместо зелёной строки; main() -> int, sys.exit(main()), return 1 if has_err else 0.

Доказательства

Живой прогон шага 7 в изолированный каталог (реальная сеть):

download_llama_binary -> True
llama-server.exe exists: True
files in target: 23
archive left on disk: False

Реальный ассет: 19 441 535 байт, sha256 = a23e… = пин, _verify_archive_sha256 -> True.
Тот самый интерпретатор: до — ModuleNotFoundError (llama_runner.py:53), после — import ok; installed=False version=b11476, rc=0.

Тесты (3 файла, 28 штук):

tests/test_install_import_isolation.py   12
tests/test_install_offline_paths.py       7
tests/test_install_integrity_status.py    9

Красные на старом коде (origin/main, те же тесты): 5 failed + 2 errors — импорт, 5 failed + 2 errors — офлайн-пути.

Мутации (каждая краснеет):

top-level import httpx                  | sha256 не сверяется
устаревший пин не сверяется с GitHub    | нет пина и нет сети — пропускаем
уборка .part не ловит OSError           | провал шага снова даёт exit 0
проба без сборки запускается            | провал загрузки снова зелёный
нет early-return на существующий файл   | ImportError не перехватывается

Полный suite: 2543 passed, 11 skipped, rc=0. ruff check src/ tests/ — чисто.

Независимое ревью

  • Раунд 1 (на первом коммите): 3 major — --with-models (huggingface_hub), Vulkan-проба на импорте, guard только по src.* — все закрыты.
  • Раунд 2 (на втором коммите): вердикт «принимать», 1 major — part.unlink мог выбросить PermissionError — закрыт (_discard); nit'ы: guard мог молча опустеть (добавлен assert состава), CPU-тесты зависели от железа (ослаблены до контракта), hub-путь не сверяет sha256 (не регресс — отражено здесь), проба при наличии сборки не покрыта тестом (осознанно).

Не проверено / ограничения

  • get_system_summary() (экспорт без вызывающих) всё ещё зовёт wmic os get caption; ошибка ловится OSError, трейсбека нет — неточность отчёта, не падение. Отдельной задачей.
  • Путь с установленным huggingface_hub (hub скачивает сам) офлайн не проверялся: проверен fallback и short-circuit на существующий файл.
  • Пересборка релиза llama.cpp меняет digest; в этом случае проверка идёт в GitHub и пишет warning с новым значением — таблицу надо обновить.

@coderabbitai

coderabbitai Bot commented Nov 14, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

Run configuration

  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 67f5dc5d-124f-4680-ac7f-1ca53821a714

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

@ManSio
ManSio merged commit 32dc4a4 into main Nov 15, 2026
13 checks passed
@ManSio
ManSio deleted the fix/llama-import-without-httpx branch November 15, 2026 07:43
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.

1 participant