ragcli помогает задавать вопросы к большим локальным текстам через LLM из терминала. Он работает с OpenAI-compatible API и поддерживает четыре режима: map, retrieval-ориентированный rag, гибридный hybrid и agentic tools.
Подходит для логов, документации, отчётов и других файлов, которые неудобно скармливать модели целиком. Если входной файл не указан, команда читает stdin, поэтому ragcli удобно встраивать в shell-скрипты и пайплайны.
- Не нужно вручную копировать большие файлы в чат.
- Можно выбрать стратегию под задачу: chunked-обработка, retrieval или точечное исследование файла.
- Один и тот же CLI работает с локальными и удалёнными OpenAI-compatible backend'ами.
- В терминале финальный ответ рендерится как Markdown; при
--rawили выводе в pipe/redirect печатается исходный текст вstdout. Ошибки без--debugпечатаются одной строкой вstderr, а runtime-логи при--debugидут туда же в structured-виде.
| Режим | Когда выбирать | Сильная сторона | Ограничения |
|---|---|---|---|
map |
Нужно разбить большой файл на чанки и агрегировать ответ по ним | Работает с объёмом, который неудобно отправлять одним куском | На больших файлах может быть медленным, а между чанками теряется часть контекста |
rag |
Нужен retrieval по релевантным фрагментам, а не чтение файла целиком | Локальный индекс и ответ по evidence chunks | Нужен совместимый embedding endpoint (/embeddings) |
hybrid |
Документ длинный, структура смешанная, и нужен баланс между retrieval, дочитыванием соседнего контекста и извлечением фактов | Комбинирует lexical/semantic retrieval, локальное дочитывание и map-style сбор фактов | Нужен совместимый embedding endpoint (/embeddings); режим обычно сложнее в тюнинге, чем чистый rag |
tools |
Нужно найти конкретные строки, секции или причины в файле | Модель умеет вызывать search_file, read_lines, read_around |
Требуется корректная поддержка tool calling на backend'е |
Короткая эвристика:
- Для больших логов и summary-задач начинайте с
map, если файл не помещается в один запрос и вас устраивает более долгий прогон. - Для Q&A по документу с опорой на релевантные куски используйте
rag. - Для длинных документов со смешанной структурой, где одного retrieval мало, попробуйте
hybrid. - Для точечного расследования по строкам и секциям используйте
tools.
- Go
1.25.6+для сборки из исходников. - OpenAI-compatible API для chat completion.
- Для
ragиhybridдополнительно нужен совместимый embedding endpoint (/embeddings). - Поддерживаемые сценарии включают локальные backend'ы вроде Ollama, LM Studio и vLLM, если они совместимы по API.
go build -o ragcli ./cmd/ragcli
./ragcli --versionСразу после сборки рекомендуется выставить базовые переменные окружения, чтобы дальше не повторять одни и те же флаги:
export LLM_API_URL=http://localhost:1234/v1
export OPENAI_API_KEY=your-api-key
export LLM_MODEL=your-chat-model
export LLM_PROXY_URL=http://127.0.0.1:1080 # optional explicit proxyЕсли LLM_MODEL не задана, ragcli использует значение по умолчанию local-model. Во многих локальных OpenAI-compatible backend'ах это означает "возьми последнюю загруженную модель", но это поведение определяется самим backend'ом, а не CLI.
Для режимов rag и hybrid, если --embedding-model и EMBEDDING_MODEL не заданы, по умолчанию используется embedding-модель text-embedding-3-small. При необходимости её можно переопределить флагом или переменной окружения.
После этого можно запускать команды без постоянной передачи --api-url, --api-key и --model.
Если нужно явно управлять прокси независимо от платформы, используйте --proxy-url или LLM_PROXY_URL. Чтобы полностью отключить любой прокси для запросов ragcli, используйте --no-proxy или LLM_NO_PROXY=true.
На Windows удобно задавать override явно, не полагаясь на системное поведение HTTP_PROXY:
$env:LLM_PROXY_URL = "http://127.0.0.1:1080"
./ragcli rag --file spec.txt "Какие ограничения описаны?"./ragcli map --file document.txt "Какие основные выводы?"
./ragcli rag --file spec.txt "Что сказано про retry policy?"
./ragcli tools --file app.log "Где в логах причины 5xx?"
./ragcli rag --proxy-url http://127.0.0.1:1080 --file spec.txt "Какие ограничения описаны?"mapполезен, когда файл приходится обрабатывать чанками, но на больших файлах такой прогон может занимать заметное время.- На локальных моделях и при фактически последовательной обработке
mapобычно не даёт выигрыша по скорости. ragотвечает только по найденным evidence chunks, поэтому качество зависит от embedding-модели и параметров chunking.hybridсочетает lexical/semantic retrieval, точечное дочитывание и map-style извлечение фактов, поэтому обычно полезен для длинных документов со смешанной структурой.toolsне читает весь файл в контекст модели сразу; вместо этого модель вызывает локальные инструментыsearch_file,read_linesиread_around.- Если backend плохо поддерживает tool calling, режим
toolsможет работать менее надёжно. - В интерактивном терминале
ragcliрендерит финальный Markdown-ответ через ANSI-стили; если вывод перенаправлен в файл или pipe, остаётся сырой Markdown без ANSI. --rawпринудительно отключает markdown-рендер и печатает исходный ответ как есть.--debugвключает подробные runtime-логи вstderr, не смешивая их с финальным ответом вstdout; без негоstderrостаётся каналом для краткой пользовательской ошибки.--verboseпоказывает пользовательский статус выполнения вstderrотдельными строками; ранняя подготовка и открытие input отображаются как текстовые этапы, а процентный прогресс начинается внутри выбранного режима.--proxy-urlиLLM_PROXY_URLпринудительно направляют весь LLM-трафик через указанный proxy URL и перекрываютHTTP_PROXY/HTTPS_PROXY.--no-proxyиLLM_NO_PROXY=trueотключают любой proxy для запросовragcli, включая proxy из окружения.- Язык интерфейса CLI можно задать через
--langилиRAGCLI_LANG; если override не задан,ragcliпытается определить locale системы и в случае неуспеха падает вen. - Язык ответа модели по умолчанию следует языку вопроса пользователя, а не locale интерфейса CLI.
./ragcli map --file report.txt -c 4 "Собери ключевые выводы"
cat report.txt | ./ragcli map "Какие риски и ограничения описаны в документе?"
./ragcli map --file report.txt --length 8000 --debug "Что означает --retry в этом документе?"
./ragcli map --file report.txt --raw "Верни ответ без терминального markdown-рендера"./ragcli rag --file architecture.md --embedding-model text-embedding-3-small \
"Какие ограничения описаны в разделе про масштабирование?"
cat spec.txt | ./ragcli rag --rag-top-k 10 --rag-final-k 5 \
"Какие требования относятся к отказоустойчивости?"
./ragcli rag --proxy-url http://127.0.0.1:1080 --file architecture.md \
"Какие ограничения описаны в документе?"
./ragcli rag --no-proxy --file architecture.md \
"Собери требования без использования системного прокси"./ragcli hybrid --file design.md --verbose \
"Какие ограничения и компромиссы описаны в документе?"./ragcli tools --file app.log "Где начинаются ошибки авторизации?"
./ragcli tools --file handbook.md --debug \
"Что сказано про release process и rollback?"Основные команды:
ragcli map [options] <prompt>ragcli rag [options] <prompt>ragcli hybrid [options] <prompt>ragcli tools [options] <prompt>ragcli versionragcli help [command]
Поведение CLI:
ragcliбез подкоманды печатает help.ragcli --versionиragcli versionвыводят версию.ragcli help mapиragcli map --helpпоказывают help одной и той же команды.promptпередаётся как позиционный аргумент.--fileопционален: если его нет, команда читает входные данные изstdin.
Глобальные:
| Флаг | Переменная | Значение |
|---|---|---|
--file, -f |
INPUT_FILE |
Путь к входному файлу; если не задан, читается stdin |
--api-url |
LLM_API_URL |
URL OpenAI-compatible API |
--api-key |
OPENAI_API_KEY |
API key |
--proxy-url |
LLM_PROXY_URL |
Явный proxy URL для всех LLM HTTP-запросов |
--no-proxy |
LLM_NO_PROXY |
Отключить любой proxy для запросов ragcli |
--model |
LLM_MODEL |
Chat-модель для map, rag, tools |
--retry, -r |
RETRY |
Количество retry для LLM HTTP-клиента |
--raw |
RAW |
Отключить markdown-рендер финального ответа и печатать сырой текст |
--debug, -d |
DEBUG |
Подробные runtime-логи в stderr; без флага ошибки печатаются одной строкой |
--verbose, -v |
VERBOSE |
Печатать в stderr пользовательские статусы выполнения по этапам |
--lang |
RAGCLI_LANG |
Язык интерфейса CLI: en или ru; без override идёт автоопределение по системной locale |
map:
--concurrency,-cилиCONCURRENCY--length,-lилиLENGTH— строгий override лимита токенов на chunk; если не задан,mapпытается автоопределить context length модели и при неуспехе использует10000
rag:
--embedding-modelилиEMBEDDING_MODEL--rag-top-kилиRAG_TOP_K--rag-final-kилиRAG_FINAL_K--rag-chunk-sizeилиRAG_CHUNK_SIZE--rag-chunk-overlapилиRAG_CHUNK_OVERLAP--rag-index-ttlилиRAG_INDEX_TTL--rag-index-dirилиRAG_INDEX_DIR--rag-rerankилиRAG_RERANK
hybrid:
--embedding-modelилиEMBEDDING_MODEL--rag-index-ttlилиRAG_INDEX_TTL--rag-index-dirилиRAG_INDEX_DIR--hybrid-top-kилиHYBRID_TOP_K--hybrid-final-kилиHYBRID_FINAL_K--hybrid-map-kилиHYBRID_MAP_K--hybrid-read-windowилиHYBRID_READ_WINDOW--hybrid-fallbackилиHYBRID_FALLBACK
Полный справочник по текущим флагам смотрите через встроенный help:
./ragcli --help
./ragcli map --help
./ragcli rag --help
./ragcli hybrid --help
./ragcli tools --helpТочка входа находится в cmd/ragcli/main.go, а CLI-описание и help-тексты определены в internal/app/cli.go. Если нужен полный обзор доступных опций и их значений по умолчанию, удобнее начинать именно с help или этих файлов.