CLI-чат с локальной LLM (GGUF) на базе llama-go — Go-биндингов к llama.cpp. Стриминг ответа, поддержка reasoning-моделей, разовая генерация и интерактивный чат с TUI (bubbletea).
- Linux/macOS, C++-компилятор (g++/clang) и CMake
- Go 1.26+ (версия ниже —
goсам скачает нужный toolchain при сборке) - ~1.5 ГБ свободного места (библиотека + модель 639 МБ)
make download-model # скачивает тестовую модель Qwen3-0.6B-Q8_0.gguf в models/
make build # собирает llama-go (один раз) и бинарник в bin/
make run # запускает интерактивный чат# Интерактивный чат (стриминг, по умолчанию)
./bin/gguf_llm_runner
# Разовая генерация
./bin/gguf_llm_runner -message "What is the capital of France?"
# Другая модель
./bin/gguf_llm_runner -model models/mymodel.gguf
# Без показа рассуждений (<think>...</think> скрываются)
./bin/gguf_llm_runner -reasoning=false
# Классический построчный интерактив без TUI (для pipe/не-TTY)
./bin/gguf_llm_runner -tui=false
# Без инструментов (function calling отключён)
./bin/gguf_llm_runner -tools=false
# С LoRA-адаптером (применяется к контексту)
./bin/gguf_llm_runner -lora models/my-adapter.gguf -lora-scale 0.8
# Полный список опций
./bin/gguf_llm_runner -hВ интерактивном режиме в терминале открывается TUI (bubbletea). Вверху — шапка с моделью и параметрами генерации (контекст, max_tokens, температура, top-p/k, seed, потоки, GPU, LoRA), под каждым ответом — статистика генерации (токены, скорость ток/с, время, размер контекста). Рассуждения модели (<think>...</think>) показываются приглушённым курсивом и не попадают в историю диалога. Горячие клавиши:
Enter— отправить сообщениеTab— переключить фокус между полем ввода и прокруткой диалога- Колесо мыши /
PgUp/PgDn— прокрутка диалога (работает и при фокусе на поле ввода) Ctrl-C— прервать генерацию / выйти из чата- Команды в поле ввода:
/clear— сбросить диалог,/exit(или/quit) — выйти,/help— справка
Во время генерации чат автоматически прокручивается к свежим токенам. Если отлистать вверх (например, чтобы прочитать начало длинных рассуждений <think>), автопрокрутка приостанавливается и в футере появляется подсказка ↑/↓ прокрутка; вернуться в конец — PgDn или колесо вниз.
При перенаправлении stdout (не TTY) TUI автоматически отключается и включается построчный режим.
| Флаг | По умолчанию | Описание |
|---|---|---|
-model |
models/Qwen3-0.6B-Q8_0.gguf |
Путь к GGUF-модели |
-message |
— | Разовая генерация (пусто = интерактив) |
-system |
You are a helpful assistant. |
Системный промпт |
-context |
4096 |
Размер контекста (0 = нативный максимум) |
-max-tokens |
1024 |
Максимум токенов в ответе |
-temperature |
0.7 |
Температура сэмплинга |
-top-p |
0.9 |
Nucleus sampling |
-top-k |
40 |
Top-K sampling |
-seed |
-1 |
Сид (фикс. результат; -1 = случайный) |
-ngl |
-1 |
Слоёв на GPU (-1 = все, работает при GPU-сборке) |
-threads |
число CPU | Потоков CPU |
-reasoning |
true |
Подсвечивать рассуждения <think>...</think> |
-timeout |
120 |
Таймаут генерации, сек. (0 = без) |
-stream |
true |
Стриминг ответа |
-tui |
true |
TUI в интерактивном режиме (автофолбэк на построчный вне TTY) |
-lora |
— | Путь к LoRA-адаптеру (.gguf), применяется к контексту |
-lora-scale |
1.0 |
Масштаб LoRA-адаптера |
-debug |
false |
Отладка (лог llama.cpp, промпт перед каждым ходом) |
-tools |
true |
Function calling (инструменты: get_weather) |
Модель может вызывать инструменты для получения данных. Встроенный инструмент:
get_weather(location)— всегда возвращает"На Дерибасовская хорошая погода"
При запросе погоды модель автоматически вызовет инструмент и вернёт результат. Пример:
./bin/gguf_llm_runner -message "Какая погода на Дерибасовской?"В TUI tool calls отображаются значком 🔧 (вызов) и 📋 (результат). Чтобы добавить свои инструменты, создайте реестр через llmtools.NewRegistry() и зарегистрируйте функции через registry.Register(tool, fn).
Скрипты сборки требуют клона llama-go с submodule llama.cpp (делается автоматически через make build):
# Вручную
git clone --depth 1 --branch llama.cpp-b10069 \
--recurse-submodules --shallow-submodules \
https://github.com/tcpipuk/llama-go third_party/llama-go
make -C third_party/llama-go libbinding.a
export LIBRARY_PATH=$PWD/third_party/llama-go
export C_INCLUDE_PATH=$PWD/third_party/llama-go
go build -o bin/gguf_llm_runner ./cmd/gguf_llm_runnerGPU-сборки: см. building.md (CUDA, Metal, Vulkan, OpenCL — через BUILD_TYPE и Go-теги).
cmd/gguf_llm_runner/ точка входа CLI
internal/llmadapter/ загрузка и применение LoRA (cgo-шим llama.cpp)
internal/llmcli/ стриминг-рендерер (обработка <think>) и построчный режим
internal/llmtools/ инструменты (function calling): реестр, парсер, get_weather
internal/tui/ TUI-чат на bubbletea
scripts/ обёртки над Makefile
models/ скачанные модели (в git не коммитятся)
third_party/llama-go/ локальный клон llama-go для сборки (gitignored)