Connect LLMs to your shell with a secure Bash CLI wrapper
Bash4LLM+ is a dependency-free Bash CLI and TUI for calling OpenAI-compatible LLM APIs, with an optional encrypted key vault.
2.8.5Add to Favorites
Why it matters
Enable developers and power users to integrate OpenAI-compatible LLM APIs (Groq, Gemini, Hugging Face, Mistral) directly into Unix-like shell environments with full auditability, security controls, and session management for automated workflows and interactive chat.
Outcomes
What it gets done
Query multiple LLM providers from the command line with streaming or batch modes
Manage persistent chat sessions with configurable context windows and NDJSON storage
Integrate LLM responses into shell scripts, pipes, and automation workflows securely
Expose real-time UI state metadata in JSON format for external tools and dashboards
Source
Get it from source
Spark does not host a copy of it.
Open sourceReports
Agent outcome reports
No reports yet
Overview
Bash4llm
Bash4LLM+ is a Bash-native wrapper for OpenAI-compatible LLM APIs, defaulting to Groq and extendable to Gemini, Mistral, or Hugging Face. It runs as a CLI, a full-screen TUI REPL, or an optional browser WebApp, with no dependencies beyond POSIX tools, curl, and jq for the core workflow. It supports multi-turn threaded conversations with saved history and an optional encrypted vault for API keys. Use it to call an LLM from a shell script, pipe, or terminal session without adding a Python or Node dependency to the core workflow. Not a fit if you need a GUI-first client by default or built-in multi-user remote access.
What it does
Bash4LLM+ is a Bash-native wrapper for calling OpenAI-compatible LLM APIs. It ships with Groq as its default provider and extends to others, such as Gemini, Mistral, and Hugging Face, via optional provider modules. It offers three interaction modes: a direct CLI, a full-screen interactive TUI REPL (both 100% native Bash, no external runtime), and an optional browser-based WebApp GUI (Python 3.10+, FastAPI/Uvicorn, streamed over SSE, bound to loopback only). --refresh-models queries the active provider's GET /v1/models endpoint directly, so supported models are never hardcoded in the script. The core executable has no dependencies beyond POSIX/coreutils, curl, and jq, and runs natively on Linux, macOS, WSL, Cygwin, Termux (Android), and BSD.
When to use - and when NOT to
Use it when you want to query an LLM from a shell script or terminal session without pulling a Python or Node runtime into the core workflow - piping file contents or command output straight into a prompt, running multi-turn conversations with saved history, or batch-processing a list of prompts from a file. It is not a fit if you need a GUI-first chat client by default (the WebApp GUI is an opt-in extra requiring Python) or built-in multi-user/remote access - the WebApp binds to localhost only and authenticates via a one-time URL, by design for single-user local use.
Inputs and outputs
Input comes as a CLI prompt argument, piped stdin, a file (-f), a raw JSON message array (--json-input), a template, or a batch file of one prompt per line. Generation is controlled with flags like --model/-m, --provider, --temperature (0.0-2.0), and --max (response token cap, default 4096); multi-turn context is kept per --thread <id>, with a configurable history window (default 10 messages) saved as NDJSON and thread IDs anonymized to avoid leaking personal data. Output can be returned as plain text (default), raw text with no trailing newline, or full/pretty JSON, optionally ANSI-sanitized, and saved to a file or directory above a configurable byte threshold (default 1000 bytes). The runtime writes atomic JSON state files - active thread metadata, a thread index, last API call info, provider capabilities - to a ui_state directory for external dashboards or monitoring scripts to read. Exit codes are specific per failure mode, from a missing API key (10) to a security policy violation (17).
Integrations
Temp files live in a per-process directory with 0700 permissions rather than shared /tmp; on Termux, where flock is limited, concurrency falls back to atomic mkdir-based locking. API keys can be encrypted at rest via an optional --vault mode (OpenSSL AES-256-CBC, PBKDF2 with 100,000 iterations, a master password, and an offline recovery key). Optional modules, loaded from a manifest-authorized, SHA-256- and Ed25519-signature-verified staging copy, add a session engine with NDJSON history rotation and TTL caching, an SML v2.0 response validator, regex response validation, and a 6-stage automated test suite. CI runs continuous security checks against the core executable, including a secret-leak audit that confirms API keys and Bearer tokens never appear in the OS process table during a curl call. It is GPLv3-licensed.
./extras/security/generate-manifest.sh --no-sign-if-missing-key
Who it's for
Developers who want to script LLM calls from Bash - CI pipelines, local automation, or a terminal-first chat workflow - without adding a Python or Node dependency to the hot path, and who want the option to encrypt API keys at rest and verify that community-contributed provider modules haven't been tampered with.
Source README
🛡️ Nota sulla Verifica del Core: La riga inferiore dei badge dedicati a sicurezza, isolamento dello sourcing, integrità delle sezioni e chaos test API viene eseguita rigorosamente ed esclusivamente sul file eseguibile core
./bash4llmper garantire Zero-Leakage, conformità all'Architettura Piatta e una resilienza superiore.
Bash4LLM⁺ 🇮🇹 🇬🇧
Wrapper in ambiente Bash per l'interfacciamento con API LLM compatibili con lo standard OpenAI. Integra un provider predefinito (Groq) ed è estendibile ad altri provider tramite moduli aggiuntivi (es. gemini, mistral, huggingface). Offre tre modalità di interazione: linea di comando diretta (CLI) e terminale interattivo a schermo intero (TUI REPL) - entrambi 100% nativi in Bash -, oltre a un'interfaccia grafica su browser (WebApp GUI) fornita come estensione opzionale (richiede Python 3.10+).
Il Core del progetto è strutturato come uno script Bash autonomo senza dipendenze esterne oltre ai comandi POSIX standard e alle utilità di base della shell.
Compatibilità nativa: Linux, macOS, WSL e Cygwin (Windows), Termux (Android), BSD.
Caratteristiche tecniche
- Gestione dinamica dei modelli
Interrogazione degli endpoint degli utenti (GET /v1/models) per l'aggiornamento dell'elenco dei modelli supportati, senza identificatori hardcoded nello script principale. - Isolamento a livello di filesystem
I file temporanei sono gestiti all'interno di directory di processo dedicate (RUN_TMPDIR) con permessi restrittivi0700(umask 077). Non vengono usate directory condivise come/tmp. - Cifratura delle chiavi API (
--vault)
Integrazione opzionale tramite OpenSSL per la cifratura locale delle chiavi API. Utilizza l'algoritmo AES-256-CBC con derivazione della chiave tramite PBKDF2 (100.000 iterazioni) e Master Password. Supporta una chiave di ripristino offline, il riutilizzo del contesto di sessione (_B4L_RT_CTX) e la policy di obbligatorietàBASH4LLM_REQUIRE_VAULT. - Supporto Termux / Android
Rilevamento dell'ambiente Android Termux con adattamento dei meccanismi di locking: doveflockpresenta limitazioni di sistema, la gestione della concorrenza è reindirizzata su atomic directory lock (mkdir). - Integrazione dati di stato (
ui_state)
Scrittura atomica di file JSON contenenti i metadati operativi del runtime nella cartellaui_state, per l'integrazione con pannelli di controllo esterni o script di monitoraggio. - Gestione sessioni, cronologia e protezione PII
Gestione del contesto conversazionale multi-turno con salvataggio dello storico in formato NDJSON e anonimizzazione crittografica degli ID di thread (anonymize_thread_id) per prevenire fughe di dati personali. Con il modulo opzionalesession-engine.shvengono abilitati il tracciamento dei token, la rotazione/compressione dei segmenti di storico e il caching locale con TTL. - Moduli estendibili e firma crittografica
Caricamento dinamico dei moduli provider esterni (builtin,vendor,local) in copia di staging anti-TOCTOU, con verifica di integrità dell'hash SHA-256 e convalida della firma crittografica Ed25519 del manifesto (manifest.sha256.sig). - Validazione deterministica
Supporto nativo per la validazione sintattica delle risposte (--validate-smlper SML v2.0,--validate-regex), sanitizzazione ANSI zero-eval (--sanitize), diagnostica JSON strutturata (--json-diagnostics), guardie di immutabilità delle funzioni (readonly -f) e rate limiting locale a finestra scorrevole (30s). - Interfaccia WebApp GUI locale (--gui, --webapp):
WebApp responsive basata su stack Python/FastAPI e frontend Vanilla JS/CSS (Zero CDN). Architettura Thin Adapter / Domain-Stateless con streaming dei token via SSE, binding esclusivo su loopback (127.0.0.1), autenticazione tramite One-Time URL, cookie HttpOnly / SameSite=Strict e protezione Anti-CSRF in tempo costante.
📘 Documentazione Architetturale: Per l'analisi dettagliata delle macro-sezioni, dei meccanismi di isolamento e del layout di memoria, consulta la Specifica Tecnica del Sistema Bash4LLM⁺.
Requisiti di sistema
Pacchetti richiesti nel PATH:
- bash (versione 4.0 o superiore)
- coreutils (
stat,chmod,mkdir,mv,rm,cp,mktemp,base64, ecc.) - findutils
- util-linux
- awk
- curl
- jq
Requisiti opzionali per la WebApp GUI (--gui, --webapp):
- Python (versione 3.10 o superiore)
- Pacchetti Python:
fastapi,uvicorn,pydantic
pip install --user fastapi "uvicorn[standard]" pydantic
(L'uso in modalità CLI e TUI rimane al 100% nativo Bash/POSIX senza dipendenze Python).
Guida all'installazione
Installazione rapida ⏩
Con Installazione degli Extras opzionali:
# 1. Clona il repository
git clone --depth 1 --branch main https://github.com/kamaludu/bash4llm.git repo-bash4llm
# 2. Copia l'eseguibile nella cartella di lavoro
mkdir -p bash4llm
cp repo-bash4llm/bin/bash4llm bash4llm/
chmod +x bash4llm/bash4llm
# 3. Inizializzazione e aggiornamento modelli
cd bash4llm
./bash4llm --refresh-models
# 4. Installazione opzionale degli Extras (provider aggiuntivi, TUI, moduli)
./bash4llm --install-extras ../repo-bash4llm/extras/
Al primo avvio senza variabile d'ambiente impostata, lo script chiederà l'inserimento interattivo della chiave API (input nascosto a schermo).
Istruzioni dettagliate sono disponibili in INSTALL.
Esempi d'uso
Prompt da linea di comando:
./bash4llm "Fornisci una spiegazione del protocollo SSH."
Input da standard input (pipe):
cat codice.sh | ./bash4llm "Analizza questo script"
Selezione di un modello specifico:
./bash4llm -m llama-3.3-70b-versatile "Spiega il paradosso di Fermi."
Esecuzione di prova senza chiamate di rete (Dry-Run):
./bash4llm --dry-run "Test di generazione payload"
Uso di un provider secondario:
./bash4llm --provider gemini "Traduci il testo in inglese"
Moduli Aggiuntivi (Extras)
Mentre il Core ./bash4llm è un eseguibile completamente autonomo e privo di dipendenze esterne (compatibile POSIX/Bash 4.0+), la cartella extras/ estende il runtime attraverso moduli opzionali con dipendenze software mirate (soft dependencies). Tutti i moduli aderiscono al principio di Zero-Eval, all'isolamento su filesystem (RUN_TMPDIR, no /tmp) e al principio del minimo privilegio (0700 per le directory, 0600 per i file e bit di esecuzione limitato ai 4 entrypoint autorizzati).
- Interfacce Utente Avanzate:
- TUI REPL (
extras/chat/tui-repl.sh): Interfaccia interattiva a schermo intero nativa al 100% in Bash con supporto multilingua (--chat,--tui). - WebApp GUI (
extras/gui-py/): Interfaccia grafica su browser in Python 3.10+ (FastAPI + Uvicorn) con streaming SSE e protezione CSRF (--gui,--webapp).
- TUI REPL (
- Provider LLM Estesi (
extras/providers/): Driver plug-and-play caricati in subshell isolata per backend OpenAI-compatibili comegemini,mistralehuggingface(--provider <nome>). - Sicurezza, Cifratura e Sanitizzazione (
extras/security/):- OpenSSL Key Vault (
openssl-helper.sh): Cifratura locale delle chiavi API con AES-256-CBC, PBKDF2 (100k iterazioni), Master Password e Recovery Key offline a 32 char (--vault). - Output Sanitizer (
output-sanitizer.sh): Motore Zero-Eval per il filtraggio deterministico di sequenze ANSI e caratteri non stampabili (--sanitize).
- OpenSSL Key Vault (
- Session Engine Avanzato (
extras/session/session-engine.sh): Gestione di contesti estesi con segmentazione NDJSON su soglia (1MB), rotazione automatica (.gz), deduplicazione, byte-budgeting e caching in memoria con TTL. - Hooks e Validazione Semantica (
extras/hooks/sml-gate.sh): Gate di conformità per forzare la struttura Structured Metadata Layout (SML v2.0) sulle risposte (--validate-sml). - Autocompletamento Shell (
extras/docs/bash4llm-completion.sh): Modulo di completamento contestuale nativo per Bash 4.0+ per opzioni CLI, modelli e codici d'errore. - Master Test Suite (
extras/test/run-all-tests.sh): Framework di collaudo a 6 livelli (Sanity, Compatibility, Regression, Hardening, Concurrency, Stress) integrato con la suitescintilla-t3.shper la verifica del refactoring di sicurezza (--test,--run-all-tests).
Integrità della Supply Chain & Manifest
Il caricamento dei moduli segue il modello Manifest-Authorized: ogni componente deve corrispondere al checksum SHA-256 registrato in extras/manifest.sha256 (verificato contro manomissioni con codice d'uscita 17 / BASH4LLM_ERR_SEC). Per registrare modifiche o moduli aggiunti in locale:
# Aggiornamento locale rapido del manifest SHA-256
./extras/security/generate-manifest.sh --no-sign-if-missing-key
📖 Per la documentazione tecnica completa di ogni componente, consulta la Guida agli Extras.
Sicurezza e permessi del filesystem 🚨
Per proteggere lo script bash4llm da modifiche non autorizzate in ambienti condivisi, è possibile impostare i permessi di sola lettura/esecuzione appropriati per il sistema operativo in uso:
- Linux (GNU/Linux):
sudo chown root:root /path/to/bash4llm && sudo chmod 755 /path/to/bash4llm sudo chattr +i /path/to/bash4llm - macOS / BSD:
sudo chown root:wheel /path/to/bash4llm && sudo chmod 755 /path/to/bash4llm sudo chflags schg /path/to/bash4llm - Termux (Android):
chmod 500 ~/bash4llm - WSL / Cygwin:
setfacl -b /path/to/bash4llm 2>/dev/null chmod 755 /path/to/bash4llm
Per informazioni dettagliate sulle politiche di sicurezza, consultare SECURITY.md.
Verifiche di sicurezza e test automatizzati 🛡️
L'eseguibile ./bash4llm integra verifiche continue sul codice e sull'ambiente di esecuzione:
- Verifica marcatura sezioni: Controllo della struttura ad ancoraggi e delimitatori di sezione del file principale.
- Isolamento ambiente di sourcing: Test della funzione
_cleanup_sourced_envper verificare che l'inclusione viasourcenon lasci funzioni residue nella shell chiamante. - Verifica secret leak in
argv: Verifica della mancata presenza di chiavi API e token Bearer nella tabella dei processi del sistema operativo durante l'esecuzione dicurl. Controllo permessi POSIX0700e0600. - Test di resilienza API: Simulazione di risposte di errore HTTP, rate limit e casi limite tramite server mock.
- Integrità del manifest
extras: Controllo degli hash SHA-256 e della firma crittografica Ed25519 (manifest.sha256.sig) dei moduli opzionali rispetto al fileextras/manifest.sha256.
Riferimento comandi e opzioni
Modelli e provider
| Flag | Argomento | Descrizione |
|---|---|---|
--refresh-models, --refresh-model |
No | Sincronizza l'elenco dei modelli del provider attivo. |
--list-models |
No | Elenca i modelli disponibili per il provider attivo. |
--list-models-raw |
No | Stampa l'elenco dei modelli in formato testo grezzo. |
--list-providers |
No | Elenca i provider installati. |
--list-providers-raw |
No | Stampa l'elenco dei provider in formato testo grezzo. |
--set-default <modello> |
Sì | Imposta il modello predefinito per il provider attivo. |
-m <modello>, --model <modello> |
Sì | Specifica il modello per l'esecuzione corrente. |
--provider <nome> |
Sì | Seleziona il provider attivo per l'esecuzione corrente. |
--provider |
No | Apre il menu interattivo di selezione del provider. |
Input
| Flag | Argomento | Descrizione |
|---|---|---|
-f <file> |
Sì | Aggiunge il contenuto del file al prompt di input. |
--json-input <json> |
Sì | Invia una struttura JSON diretta con l'array dei messaggi. |
--template <nome> |
Sì | Applica un file di modello dalla cartella dei template. |
--batch <file> |
Sì | Esegue una serie di prompt da file (un prompt per riga). |
Gestione thread e contesto
| Flag | Argomento | Descrizione |
|---|---|---|
--thread <id> |
Sì | Attiva il contesto conversazionale per l'ID specificato. |
--thread-window [n] |
Opzionale | Imposta il numero massimo di messaggi storici da includere (default: 10). |
--init-thread |
No | Inizializza i file di contesto per un nuovo thread ed esce. |
--delete-thread <id> |
Sì | Elimina in modo atomico lo storico e i metadati del thread. |
--rename-thread <id> |
Sì | Rinombra il titolo dei metadati per il thread specificato. |
--title <titolo> |
Sì | Specifica il nuovo titolo in combinazione con --rename-thread. |
Parametri di generazione
| Flag | Argomento | Descrizione |
|---|---|---|
--system <testo> |
Sì | Imposta il prompt di sistema per l'esecuzione. |
--ture <n>, --temperature <n> |
Sì | Imposta il valore di temperatura (da 0.0 a 2.0). |
--max <n> |
Sì | Imposta il limite massimo dei token della risposta (default: 4096). |
Output e salvataggio
| Flag | Argomento | Descrizione |
|---|---|---|
--save |
No | Forza il salvataggio della risposta nella cronologia. |
--nosave |
No | Disabilita il salvataggio della risposta nella cronologia. |
--out <percorso> |
Sì | Salva l'output nel file o nella directory specificata. |
--threshold <n> |
Sì | Soglia minima in byte per il salvataggio automatico (default: 1000). |
--json |
No | Restituisce il payload JSON completo dell'API. |
--pretty |
No | Restituisce il payload JSON formattato. |
--text |
No | Restituisce il solo testo della risposta (predefinito). |
--raw |
No | Restituisce il testo grezzo senza a capo finale. |
--sanitize |
No | Filtra ed elide le sequenze di escape ANSI e i caratteri non stampabili dall'output. |
Modalità operative
| Flag | Argomento | Descrizione |
|---|---|---|
--dry-run |
No | Simula l'esecuzione senza effettuare chiamate di rete. |
--quiet |
No | Omette i messaggi informativi non essenziali su stderr. |
--stream |
No | Abilita la ricezione in streaming (Server-Sent Events). |
--no-stream |
No | Disabilita lo streaming per la richiesta corrente. |
--chat, --tui |
No | Avvia l'interfaccia interattiva TUI/REPL. |
--gui, --webapp |
No | Avvia l'interfaccia grafica WebApp locale su browser. |
--bootstrap-only |
No | Esegue la fase di avvio e verificate filesystem, poi termina. |
--test, --run-all-tests |
No | Invoca l'orchestratore della suite di test automatizzati. |
Configurazione e diagnostica
| Flag | Argomento | Descrizione |
|---|---|---|
--check-config |
No | Esegue la verifica dei permessi e il linter della configurazione. |
--explain-error <codice> |
Sì | Mostra la definizione e le mitigazioni per il codice d'errore inserito. |
--show-config |
No | Stampa le variabili di configurazione attive. |
--diagnostics |
No | Esegue i test diagnostici di sistema e la verifica TLS. |
--vault |
No | Avvia la console di gestione del Key Vault cifrato. |
--validate-sml |
No | Valida la risposta dell'LLM rispetto allo standard sintattico SML v2.0. |
--validate-regex <regex> |
Sì | Valida la risposta rispetto all'espressione regolare POSIX ERE fornita. |
--json-diagnostics |
No | Emette gli errori di sistema e di rete in formato JSON strutturato. |
--print-config-dir |
No | Stampa a schermo il percorso canonico della directory di configurazione. |
--print-provider-file |
No | Stampa a schermo il percorso del file di persistenza del provider attivo. |
--print-model-file [provider] |
Opzionale | Stampa a schermo il percorso del file di modello per il provider. |
--version |
No | Mostra la versione dello script. |
--install-extras |
Opzionale | Installa l'intero pacchetto degli extras in bash4llm.d/extras/ con verifica di integrità. Come argomento opzionale accetta il percorso della cartella sorgente. |
-h, --help |
No | Mostra l'aiuto in linea. |
Struttura dello stato UI (ui_state)
Il runtime aggiorna in modo atomico i metadati di stato nella directory:
bash4llm.d/config/ui_state/
File generati:
threads/<thread_id>.json: Stato e metadati del thread attivo.threads/index.json: Indice dei thread salvati.last_api.json: Metadati dell'ultima chiamata API (stato HTTP, ID richiesta, tempo).last_history.json: Informazioni sull'ultimo file scritto in cronologia.provider_capabilities.json: Funzionalità supportate dal provider attivo.
Codici di uscita (Exit Codes)
| Codice | Costante | Descrizione |
|---|---|---|
| 0 | - | Esecuzione completata con successo. |
| 10 | BASH4LLM_ERR_NO_API_KEY |
Chiave API non trovata per il provider attivo. |
| 11 | BASH4LLM_ERR_BAD_MODEL |
Modello non valido o formato non supportato. |
| 12 | BASH4LLM_ERR_CURL_FAILED |
Errore durante l'esecuzione della richiesta HTTP (curl). |
| 13 | BASH4LLM_ERR_PARSE |
Errore di parsing JSON, o fallimento della validazione sintattica/SML/REGEX della risposta. |
| 14 | BASH4LLM_ERR_NO_PROMPT |
Prompt o payload di input vuoto. |
| 15 | BASH4LLM_ERR_TMP |
Errore di filesystem, allocazione temporanea o lock. |
| 16 | BASH4LLM_ERR_API |
Errore restituito dall'API o completamento vuoto. |
| 17 | BASH4LLM_ERR_SEC |
Violazione della politica di sicurezza o mancata corrispondenza dell'hash/firma del modulo. |
Licenza e Contatti
- Licenza: GNU General Public License v3.0 (LICENSE)
- Autore: Cristian Evangelisti
- Email:
opensource@cevangel.anonaddy.me - Repository: GitHub kamaludu/bash4llm
Uso di strumenti di Intelligenza Artificiale nello sviluppo
Bash4LLM è un'opera sviluppata dall'autore con un uso esteso di strumenti di Intelligenza Artificiale generativa (LLM) per progettazione, implementazione, analisi, debugging, revisione e documentazione.
Gli LLM sono stati utilizzati come strumenti di sviluppo, non come generatori autonomi del progetto. L'autore ha definito l'architettura, i requisiti e le scelte progettuali, orchestrando il lavoro attraverso modelli e sessioni differenti e utilizzando gli stessi LLM anche per esaminare, mettere in discussione e criticare il lavoro prodotto da altri modelli.
Il codice e la documentazione sono quindi il risultato di un processo iterativo e supervisionato, nel quale le proposte generate dagli LLM sono state valutate, confrontate, modificate o scartate dall'autore. Le decisioni finali e il risultato complessivo del progetto sono dell'autore.
L'uso degli LLM offre significativi vantaggi in termini di produttività, analisi e revisione, ma introduce anche rischi: nessun processo di verifica può garantire che ogni errore o omissione venga individuato. Questa informativa intende rendere trasparente sia l'ampiezza dell'utilizzo degli LLM sia il loro ruolo effettivo nel processo di sviluppo.
FAQ
Common questions
Discussion
Questions & comments · 0
Sign In Sign in to leave a comment.