Show HN: Bash4LLM+ – 一个轻量级、零依赖的 LLM API Bash 封装工具
Show HN: Bash4LLM+ – A lightweight, dependency-free Bash wrapper for LLM APIs

原始链接: https://github.com/kamaludu/bash4llm/

以下是 **Bash4LLM⁺** 的简要概述: **Bash4LLM⁺** 是一个轻量级、安全且完全可审计的“Bash 优先”命令行包装器,用于与 Groq API 及其他提供商(如 Gemini、Mistral)进行交互。它由单个自包含脚本组成,非常适合类 Unix 环境(Linux、macOS、Termux 等)。 **主要特性:** * **安全性:** 不使用 `eval` 或共享的 `/tmp` 目录;具有严格的权限设置和防漏洞设计。 * **灵活性:** 支持流式传输、来自管道或文件的输入、自定义模板以及通过 API 进行动态模型管理。 * **集成性:** 持续以 JSON 格式 (`ui_state`) 公开元数据,便于图形界面或自动化工具(如 Home Assistant)使用。 * **会话管理:** 通过 `--session` 标志激活持久化 NDJSON 文件,从而支持上下文记忆。 * **优化:** 针对 Termux/Android 进行了专门优化,例如通过原子目录锁定管理来克服移动内核的限制。 **快速安装:** 克隆存储库,将脚本设置为可执行文件,导出 API 密钥,然后使用 `./bash4llm --refresh-models` 即可开始。这是一个开源项目 (GPL v3),专为寻求对 Shell 拥有最大控制权的个人用户而设计。

**Bash4LLM+** 是一个轻量级、无依赖的 Bash 封装工具,旨在直接从终端与大语言模型 (LLM) API 进行交互。该工具由 GitHub 用户 `kamaludu` 开发,专注于简洁性,仅依赖 Bash、`curl` 和 `jq`,无需安装 Python 或 Node 运行环境。 主要功能包括: * **功能性**:支持提示词输入、交互式聊天、文件处理、流式输出以及 JSON 元数据存储。 * **安全性**:设计注重安全,避免使用 `eval` 或 `/tmp` 目录。 * **可扩展性**:预置了 Groq 配置,并通过模块化脚本支持其他服务商。 该项目近期收到了关于代码结构的社区反馈,部分用户认为 5,000 行的代码库过于冗长。此外,该项目最初在 Hacker News 提交时曾因被标记为 AI 生成文本而短暂被封,但在重写后已恢复。
相关文章

原文

Logo 320

CLI License: GPLv3 ShellCheck Smoke Tests

Bash4LLM⁺ — wrapper CLI sicuro, Bash‑first e completamente auditabile per l’API Chat Completions compatibile OpenAI di Groq (ed estendibile ad altri provider).

Bash4LLM⁺ è un singolo script Bash, auto‑contenuto, leggibile e verificabile.
Scaricalo, rendilo eseguibile, esporta la tua API key e inizia subito a usarlo.

Compatibile con ambienti Unix‑like: Linux, macOS, WSL, Cygwin, Termux (Android), BSD.


Caratteristiche principali

  • Lista modelli dinamica
    tramite GET https://api.groq.com/openai/v1/models
    → nessun modello hardcoded.

  • Sicurezza by design
    → nessun uso di /tmp, nessun eval, permessi restrittivi, validazione provider avanzata.

  • Struttura modulare a sezioni
    → PRECORE_BOOT, PRECORE_RUN, PROVIDER, CORE_SETUP, CORE_PROVIDER.

  • Sistema di Stato UI (ui_state)
    → il CORE espone costantemente metadati in formato JSON atomico per l'integrazione con GUI o strumenti esterni (es. Home Assistant).

  • Streaming e non‑streaming
    → output in tempo reale o completo a fine risposta.

  • Salvataggio automatico
    → per output lunghi oltre una soglia configurabile.

  • Gestione modelli avanzata
    → refresh, lista, default persistente, whitelist dinamica, auto‑selezione.

  • Extras opzionali
    → provider aggiuntivi (come Gemini, Hugging Face, Mistral), template, documentazione, strumenti di sicurezza.

  • Pronto per Termux / Android
    → rileva automaticamente l'ambiente Termux bypassando flock (spesso instabile o limitato a livello kernel/SELinux su Android) e devia trasparentemente la gestione della concorrenza sul robusto meccanismo di directory lock (mkdir atomico).


Modello di minaccia (versione breve)

Bash4LLM⁺ è progettato per ambienti single‑user (PC/laptop, server personali).

  • I provider sono codice eseguito nella tua shell: devono risiedere in directory sicure di tua proprietà.
  • Variabili come BASH4LLM_EXTRAS_DIR e BASH4LLM_TMPDIR sono considerate configurazione fidata.
  • Lo script non esegue mai l’output del modello.
  • I rischi TOCTOU e i limiti del parsing JSON/SSE sono mitigati e documentati.

Dettagli completi in SECURITY.


Bash4LLM⁺ richiede che i seguenti pacchetti (o equivalenti) siano disponibili nel PATH:

  • bash
  • coreutils
  • findutils
  • util-linux
  • gawk
  • curl
  • jq

Tip

⏩ FAST FORWARD (Installazione Rapida)

Esegui questi comandi nel tuo terminale per avviare subito Bash4LLM⁺:

# 1. Clona il repository (solo l'ultimo commit per massima velocità)
git clone --depth 1 --branch main https://github.com/kamaludu/bash4llm.git repo-bash4llm  

# 2. Crea una cartella di lavoro ed estrai l'eseguibile
mkdir -p bash4llm
cp repo-bash4llm/bin/bash4llm bash4llm/
chmod +x bash4llm/bash4llm

# 3. Entra nella cartella e aggiorna i modelli 
cd bash4llm 
./bash4llm --refresh-models

Lo script ti chiederà l'inserimento della tua chiave API per il provider di default (Groq): Enter API key for provider groq (env GROQ_API_KEY):

Inserisci la tua API key, poi esportala per non doverla più inserire durante la sessione:

export GROQ_API_KEY="gsk_xxxxxxxxxxxxxxxxx"

Consigliato: installa gli Extras opzionali:

# 4. Installazione degli Extras
./bash4llm --install-extras ../repo-bash4llm/extras/

Usa Bash4llm ⚡

Istruzioni dettagliate in: INSTALL

In breve:

chmod +x bash4llm
export GROQ_API_KEY="gsk_xxxxxxxxxxxxxxxxx"
./bash4llm --help

Extras opzionali:

./bash4llm --install-extras

Con opzioni:

  • --source <dir>
  • --force
  • --dry-run
  • installazione selettiva:
    ./bash4llm --install-extras provider1 templateA

Prompt diretto:

./bash4llm "scrivi una breve poesia in italiano"

Prompt multilinea:

./bash4llm <<'EOF'
scrivi una breve poesia
in italiano
EOF

Input da file:

Pipe:

echo "spiegami la relatività" | ./bash4llm

Modello specifico:

./bash4llm -m llama-3.3-70b-versatile "scrivi un saggio breve"

Dry run:

./bash4llm --dry-run "ciao"

Provider esterno (se installato):

./bash4llm --provider gemini "traduci questo"

Comandi, flag e opzioni disponibili

Flag Argomento Effetto
--refresh-models, --refresh-model no Aggiorna la lista modelli (richiede API key).
--list-models no Stampa lista modelli (formato interattivo).
--list-models-raw no Stampa lista modelli in formato raw (una riga per modello).
--list-providers no Stampa lista provider.
--list-providers-raw no Stampa provider in formato raw.
--set-default <model> Imposta modello di default persistente per il provider attivo.
-m <model>, --model <model> Imposta modello per questa esecuzione.
--provider <name> Imposta provider da CLI.
--provider no Se senza argomento → apre selezione interattiva.

Input (file, JSON, template, batch)

Flag Argomento Effetto
-f <file> Aggiunge file a FILE_INPUTS.
--json-input <json> Imposta input JSON (formato OpenAI-like).
--template <name> Applica template da BASH4LLM_TEMPLATES_DIR.
--batch <file> Esegue richieste batch (una riga = un prompt).
Flag Argomento Effetto
--session <id> Abilita sessione con ID specifico.
--session-window [n] opzionale Imposta finestra sessione (default 10 se non fornito).
--init-session si Inizializza in sicurezza una sessione vuota (creando i file NDJSON e i metadati) e la registra nell'indice globale delle sessioni, senza effettuare chiamate API. Richiede l'uso congiunto di --session <id>.

Parametri modello / generazione

Flag Argomento Effetto
--system <text> Imposta system prompt.
--ture <n> Imposta parametro temperatura (da 0.0 a 2.0, alias canonico).
--temperature <n> Alias di --ture.
--max <n> Imposta max token.
Flag Argomento Effetto
--save no Forza salvataggio output.
--nosave no Disabilita salvataggio.
--out <path> Percorso file/directory output.
--threshold <n> Soglia dimensione in byte per salvataggio automatico (default: 1000).
--json no Output JSON raw integro.
--pretty no Output JSON formattato.
--text no Output testuale standard estratto (comportamento predefinito).
--raw no Output testuale grezzo escludendo separazioni finali.
Flag Argomento Effetto
--dry-run no Nessuna chiamata API reale (comportamento simulato).
--quiet no Riduce l'output non necessario e sopprime i titoli su TTY.
--stream no Streaming asincrono attivo.
--no-stream no Disattiva streaming asincrono.
--chat no Modalità chat interattiva REPL.
--bootstrap-only no Esegue solo validazione percorsi/lock e termina.

Configurazione e diagnostica

Flag Argomento Effetto
--show-config no Mostra configurazione completa attiva.
--diagnostics no Esegue diagnostica completa del sistema.
--version no Stampa versione dello script e termina.
-h, --help no Mostra help interattivo formattato da file.
Flag Argomento Effetto
--install-extras opzionale Installa extras; può accettare directory sorgente.
--install-extras=<dir> Installa extras da directory sorgente specifica.
Flag Effetto
-- Termina parsing opzioni.
-* Opzione sconosciuta → errore.
* Argomento posizionale → aggiunto a ARGS.

  • $BASH4LLM_CONFIG_DIR/config
    → parametri locali (MODEL, TURE, MAX_TOKENS, FORMAT, THRESHOLD)

  • $BASH4LLM_CONFIG_DIR/model.$PROVIDER
    → modello predefinito per provider

  • $MODELS_FILE
    → whitelist modelli aggiornata da --refresh-models

Precedenza selezione modello

  1. -m/--model
  2. model.$PROVIDER
  3. auto‑selezione provider (auto_select_model_<provider>)
  4. prima voce della whitelist (models.txt)
  5. configurazione globale legacy config (MODEL=...)

  • Nessun uso di /tmp a livello di sistema operativo condiviso.
  • File temporanei isolati in directory $RUN_TMPDIR con permessi 700 (umask 077).
  • File salvati con permessi 600.
  • Con --out Bash4LLM⁺ crea la directory se possibile.

Bash4LLM⁺ espone metadati operativi destinati a GUI/strumenti esterni tramite file JSON atomici in:

$BASH4LLM_CONFIG_DIR/ui_state

Contiene:

  • sessions/<id>.json → stato sessione (active, msg_count, last_ts)
  • sessions/index.json → elenco sessioni
  • last_api.json → ultimo risultato API (http_status, req_id, edgecase_detected, ecc.)
  • last_history.json → ultimo salvataggio history
  • provider_capabilities.json → capacità provider attivo (streaming, refresh_models)

La GUI (extra opzionale) legge solo questi file per i placeholder CGI.


Bash4LLM⁺ non mantiene memoria da solo.
La memoria esiste solo se attivi una sessione tramite --session.

Ogni sessione crea un file NDJSON persistente:

$BASH4LLM_HISTORY_DIR/sessions/<session_id>.ndjson

E Bash4LLM⁺ mantiene i metadati della sessione in:

$BASH4LLM_CONFIG_DIR/ui_state/sessions/<session_id>.json

Questi metadati sono la fonte canonica per GUI/strumenti esterni.


🟩 Uso corretto di --session

./bash4llm --session chat1 "Ciao"
./bash4llm --session chat1 "Riassumi ciò che ho detto"

🟩 Uso corretto di --session-window

./bash4llm --session chat1 --session-window 10 "continua"

Per avere memoria contestuale devi sempre includere --session <id>.


  • Nessun eval.
  • Nessuna esecuzione dell’output del modello.
  • Provider = codice: mantieni extras/providers sicuro.
  • Variabili d’ambiente = configurazione fidata.
  • TOCTOU mitigato.

Codice Variabile Significato
0 - Successo
10 BASH4LLM_ERR_NO_API_KEY API key mancante
11 BASH4LLM_ERR_BAD_MODEL Modello non valido o non in whitelist
12 BASH4LLM_ERR_CURL_FAILED Errore rete/curl
14 BASH4LLM_ERR_NO_PROMPT Nessun prompt fornito
15 BASH4LLM_ERR_TMP Errore generico filesystem / temporanei
16 BASH4LLM_ERR_API Errore HTTP/API del fornitore

Variabile Necessaria Descrizione
GROQ_API_KEY sì per chiamate API API key provider Groq.
BASH4LLM_CONFIG_DIR consigliata Directory configurazione.
BASH4LLM_MODELS_DIR consigliata Directory modelli.
BASH4LLM_TMPDIR Directory temporanea.
BASH4LLM_HISTORY_DIR consigliata Directory sessioni e cronologia.
MODEL no Modello attivo.
PROVIDER no Provider attivo.
ALLOWED_MODELS no Whitelist modelli ammessi.

Bash4LLM⁺ è distribuito sotto licenza GPL v3.
Vedi LICENSE.


Autore: Cristian Evangelisti
Email: opensource​@​cevangel.​anonaddy.​me
Repository: https://github.com/kamaludu/bash4llm

联系我们 contact @ memedata.com