Show HN: Bash4LLM+ – A lightweight, dependency-free Bash wrapper for LLM APIs

Hacker News Top Tools

Summary

Bash4LLM+ is a lightweight, dependency-free Bash wrapper for LLM APIs, offering secure and auditable interaction with Groq and other providers, with features like dynamic model lists, streaming, and extensible extras.

Bash4LLM is a single-file Bash wrapper for interacting with LLMs from the terminal. I created it because I wanted something simple that worked without installing Python, Node, or any other runtime.<p>It uses only Bash, curl, and jq. You can send prompts, start a small chat, process files line by line, stream output, and save session metadata in JSON format.<p>I tried to make it safe and predictable: no use of the system &#x2F;tmp, no use of eval. Groq is supported by default, and other providers can be added with dedicated Bash scripts in the extras&#x2F;providers&#x2F; folder.<p>Example:<p><pre><code> echo &quot;explains the command: ls -l&quot; | .&#x2F;bash4llm</code></pre>
Original Article
View Cached Full Text

Cached at: 06/28/26, 11:00 PM

kamaludu/bash4llm

Source: https://github.com/kamaludu/bash4llm

Logo 320

CLI License: GPLv3 ShellCheck Smoke Tests

Bash4LLM⁺ 🇮🇹 🇬🇧

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.


Requisiti

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

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

Installazione

⏩ 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

Uso rapido

Prompt diretto:

./bash4llm "scrivi una breve poesia in italiano"

Prompt multilinea:

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

Input da file:

./bash4llm -f prompt.txt

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

Modelli e provider

FlagArgomentoEffetto
--refresh-models, --refresh-modelnoAggiorna la lista modelli (richiede API key).
--list-modelsnoStampa lista modelli (formato interattivo).
--list-models-rawnoStampa lista modelli in formato raw (una riga per modello).
--list-providersnoStampa lista provider.
--list-providers-rawnoStampa provider in formato raw.
--set-default <model>sìImposta modello di default persistente per il provider attivo.
-m <model>, --model <model>sìImposta modello per questa esecuzione.
--provider <name>sìImposta provider da CLI.
--providernoSe senza argomento → apre selezione interattiva.

Input (file, JSON, template, batch)

FlagArgomentoEffetto
-f <file>sìAggiunge file a FILE_INPUTS.
--json-input <json>sìImposta input JSON (formato OpenAI-like).
--template <name>sìApplica template da BASH4LLM_TEMPLATES_DIR.
--batch <file>sìEsegue richieste batch (una riga = un prompt).

Sessioni

FlagArgomentoEffetto
--session <id>sìAbilita sessione con ID specifico.
--session-window [n]opzionaleImposta finestra sessione (default 10 se non fornito).
--init-sessionsiInizializza 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

FlagArgomentoEffetto
--system <text>sìImposta system prompt.
--ture <n>sìImposta parametro temperatura (da 0.0 a 2.0, alias canonico).
--temperature <n>sìAlias di --ture.
--max <n>sìImposta max token.

Output e salvataggio

FlagArgomentoEffetto
--savenoForza salvataggio output.
--nosavenoDisabilita salvataggio.
--out <path>sìPercorso file/directory output.
--threshold <n>sìSoglia dimensione in byte per salvataggio automatico (default: 1000).
--jsonnoOutput JSON raw integro.
--prettynoOutput JSON formattato.
--textnoOutput testuale standard estratto (comportamento predefinito).
--rawnoOutput testuale grezzo escludendo separazioni finali.

Modalità operative

FlagArgomentoEffetto
--dry-runnoNessuna chiamata API reale (comportamento simulato).
--quietnoRiduce l’output non necessario e sopprime i titoli su TTY.
--streamnoStreaming asincrono attivo.
--no-streamnoDisattiva streaming asincrono.
--chatnoModalità chat interattiva REPL.
--bootstrap-onlynoEsegue solo validazione percorsi/lock e termina.

Configurazione e diagnostica

FlagArgomentoEffetto
--show-confignoMostra configurazione completa attiva.
--diagnosticsnoEsegue diagnostica completa del sistema.
--versionnoStampa versione dello script e termina.
-h, --helpnoMostra help interattivo formattato da file.

Installazione extras

FlagArgomentoEffetto
--install-extrasopzionaleInstalla extras; può accettare directory sorgente.
--install-extras=<dir>sìInstalla extras da directory sorgente specifica.

Terminazione parsing

FlagEffetto
--Termina parsing opzioni.
-*Opzione sconosciuta → errore.
*Argomento posizionale → aggiunto a ARGS.

Configurazione e modelli

File di configurazione

  • $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=...)

File temporanei e output

  • 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.

📁 Sistema di Stato UI (ui_state)

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.


📘 Memoria contestuale in Bash4LLM⁺

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"

🟧 Regola fondamentale

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


Note di sicurezza

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

Codici di uscita

CodiceVariabileSignificato
0-Successo
10BASH4LLM_ERR_NO_API_KEYAPI key mancante
11BASH4LLM_ERR_BAD_MODELModello non valido o non in whitelist
12BASH4LLM_ERR_CURL_FAILEDErrore rete/curl
14BASH4LLM_ERR_NO_PROMPTNessun prompt fornito
15BASH4LLM_ERR_TMPErrore generico filesystem / temporanei
16BASH4LLM_ERR_APIErrore HTTP/API del fornitore

Variabili principali

VariabileNecessariaDescrizione
GROQ_API_KEYsì per chiamate APIAPI key provider Groq.
BASH4LLM_CONFIG_DIRconsigliataDirectory configurazione.
BASH4LLM_MODELS_DIRconsigliataDirectory modelli.
BASH4LLM_TMPDIRsìDirectory temporanea.
BASH4LLM_HISTORY_DIRconsigliataDirectory sessioni e cronologia.
MODELnoModello attivo.
PROVIDERnoProvider attivo.
ALLOWED_MODELSnoWhitelist modelli ammessi.

Licenza

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


Contatti

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

Similar Articles

Using LLM in the shebang line of a script

Simon Willison's Blog

Simon Willison demonstrates how to use the llm CLI tool in script shebang lines to execute LLM prompts and tool calls directly from executable files.

Show HN: Lathe – Use LLMs to learn a new domain, not skip past it

Hacker News Top

Lathe is an open-source tool that generates hands-on, multi-part technical tutorials from any prompt using LLMs, aiming to teach users rather than just provide answers. It includes a local UI for working through tutorials and supports integration with Claude Code, Cursor, and Codex.