Inizia

Skills + CLI

Esegui Thunderbit dal terminale — distilla pagine in Markdown, estrai dati strutturati, suggerisci campi ed elabora in batch fino a 100 URL. La CLI funziona da sola o come toolkit di skills che gli agenti AI di coding possono scoprire.

Distilla, estrai, suggerisci campi ed esegui job in batch direttamente dal terminale.

Installazione

La CLI è pubblicata su npm come @thunderbit/thunderbit-cli ed espone un binario thunderbit nel tuo PATH.

# Install globally
npm install -g @thunderbit/thunderbit-cli

# Or run one-shot via npx
npx -y @thunderbit/thunderbit-cli --help

Una variante Python (pip install thunderbit) con la stessa superficie di comandi è nella roadmap.

Autenticazione

Prima di usare la CLI, devi autenticarti con la tua chiave API Thunderbit. Ottieni una chiave dalla Thunderbit Dashboard. Formato: tb_ seguito da 32 caratteri esadecimali.

Impostare tramite variabile d'ambiente

export THUNDERBIT_API_KEY=tb_YOUR_API_KEY

Passare per comando

thunderbit --api-key tb_YOUR_API_KEY distill https://example.com

Self-hosted / Sviluppo locale

Per gateway Thunderbit self-hosted, sovrascrivi la base URL:

# Per call
thunderbit --base-url https://api.your-domain.com distill https://example.com

# Or set via environment variable
export THUNDERBIT_API_BASE_URL=https://api.your-domain.com
thunderbit distill https://example.com

Controlla versione

thunderbit --version
# or
thunderbit -V

Opzioni globali

Questi flag sono disponibili per ogni comando:

OpzioneDescrizione
--api-key <key>, -kChiave API (oppure imposta THUNDERBIT_API_KEY)
--base-url <url>URL base dell'API (oppure imposta THUNDERBIT_API_BASE_URL)
--format <format>, -fFormato di output: json, table o markdown (default json)
--version, -VStampa la versione della CLI
--help, -hMostra la guida del comando

Comandi

Distill

Distilla un singolo URL in Markdown pulito e pronto per LLM.

# Basic usage
thunderbit distill https://example.com/article

# Stream Markdown to stdout
thunderbit distill https://example.com --format markdown

# Save to file
thunderbit distill https://example.com --format markdown > article.md

Opzioni di Distill

# Use the basic JS renderer (covers most modern sites)
thunderbit distill https://example.com --render-mode basic

# Use the full headless browser (slowest, highest fidelity)
thunderbit distill https://example.com --render-mode full

# Geo-target for region-aware sites
thunderbit distill https://example.com --country-code DE

# Bump per-page timeout
thunderbit distill https://example.com --timeout 60000

# Use sync /distill instead of the default async submit + poll
thunderbit distill https://example.com --sync

Opzioni disponibili:

OpzioneDefaultDescrizione
--render-mode <mode>nonenone, basic o full
--timeout <ms>30000Timeout della richiesta per pagina in ms
--country-code <CC>USCodice ISO a 2 lettere, maiuscolo
--syncfalseUsa la modalità sync invece di async submit + poll

Extract

Estrai dati strutturati da una pagina. Lo schema è una mappa piatta di fieldName → istruzione in linguaggio naturale — ogni valore è un suggerimento che l'AI usa per trovare il campo nella pagina.

Nota: l'esempio della spec OpenAPI a monte mostra JSON Schema ({type:"object",properties:…}). Al momento della scrittura il server in produzione si aspetta la mappa piatta di istruzioni mostrata sotto; stiamo allineando la spec.

# Schema inline — mappa piatta campo → istruzione
thunderbit extract https://example.com/product \
  --schema '{"name":"product name","price":"the listed price as a number","currency":"3-letter currency code"}'

# Schema da file
thunderbit extract https://example.com/product --schema ./schema.json

# Salva il JSON estratto
thunderbit extract https://example.com/product --schema ./schema.json --format json -o data.json

La risposta restituisce sempre data.data come array, un elemento per regione di pagina che corrisponde al tuo schema:

{
  "success": true,
  "data": {
    "url": "https://example.com/product",
    "data": [
      { "name": "iPhone 15 Pro", "price": 999, "currency": "USD" }
    ]
  }
}

Modalità interattiva

# AI proposes fields, you toggle/edit, then extraction runs with the curated schema
thunderbit extract https://example.com/product --interactive

# Steer the suggestion with a prompt
thunderbit extract https://example.com/product -i --prompt "focus on pricing and availability"

# Persist the schema for reuse
thunderbit extract https://example.com/product -i --save-schema ./product-schema.json

Opzioni di Extract

# Bump page-render time for SPAs
thunderbit extract https://example.com --schema ./schema.json --render-mode full

# Sync mode
thunderbit extract https://example.com --schema ./schema.json --sync

# Longer timeout for complex pages
thunderbit extract https://example.com --schema ./schema.json --timeout 120000

Opzioni disponibili:

OpzioneDefaultDescrizione
--schema <json-or-file>JSON inline o percorso a un file di schema
--interactive, -ifalseSuggerisci → cura → estrai in un unico passaggio
--prompt <text>Suggerimento per il proposal AI (con -i)
--render-mode <mode>nonenone, basic o full
--timeout <ms>60000Timeout della richiesta per pagina in ms
--syncfalseModalità sync
--save-schema <file>Salva lo schema finale per riutilizzarlo

Suggest Fields

Lascia che l'AI proponga i campi estraibili prima che tu scriva uno schema.

# Basic
thunderbit suggest-fields https://example.com/product

# Steer with a prompt
thunderbit suggest-fields https://example.com/listings --prompt "extract job postings only"

# Region-aware
thunderbit suggest-fields https://example.com --country-code DE

L'editor interattivo ti permette di attivare/disattivare i campi tramite numero (1 3 5), add, rm 2, edit 4, e poi done per confermare. suggest-fields restituisce [{name, type, instruction}, …]; quando lo passi a extract, trasformalo prima in una mappa piatta:

thunderbit suggest-fields "$URL" --format json \
  | jq 'map({(.name): .instruction}) | add' > schema.json

thunderbit extract "$URL" --schema ./schema.json

Opzioni disponibili:

OpzioneDefaultDescrizione
--prompt <text>Suggerimento di indirizzo
--country-code <CC>USCodice ISO a 2 lettere

Batch Distill

Invia fino a 100 URL in un unico job in batch. Per default invia + esegue il polling fino a COMPLETED / FAILED / CANCELLED.

# URLs as positional args
thunderbit batch distill https://a.com https://b.com https://c.com

# Or read URLs from a file (one per line)
thunderbit batch distill --file urls.txt

# Submit only — print the job ID and exit (use webhook or poll later)
thunderbit batch distill --file urls.txt --no-poll

Opzioni di Batch Distill

# Bump per-page timeout
thunderbit batch distill --file urls.txt --timeout 60000

# Pipe results into another tool
thunderbit batch distill --file urls.txt --format json \
  | jq -r '.data.results[] | select(.success == true) | .markdown' \
  > distilled.md

Opzioni disponibili:

OpzioneDefaultDescrizione
--file <path>Leggi gli URL da un file (uno per riga)
--timeout <ms>30000Timeout della richiesta per pagina in ms
--no-pollfalseSolo invio, stampa il job ID ed esci

Annullare un job batch distill in esecuzione

thunderbit batch cancel-distill <jobId>

Le pagine già completate mantengono i loro risultati. Le pagine in attesa vengono scartate e non vengono più addebitate. Lo stato passa a CANCELLED non appena il server conferma.


Batch Extract

Invia fino a 100 URL con uno schema condiviso.

# URLs as positional args + inline schema
thunderbit batch extract https://a.com https://b.com \
  --schema ./schema.json

# Read URLs from a file
thunderbit batch extract --file urls.txt --schema ./schema.json

# Submit only
thunderbit batch extract --file urls.txt --schema ./schema.json --no-poll

Opzioni disponibili:

OpzioneDefaultDescrizione
--file <path>Leggi gli URL da un file (uno per riga)
--schema <json-or-file>JSON inline o file di schema (obbligatorio)
--timeout <ms>60000Timeout della richiesta per pagina in ms
--no-pollfalseSolo invio, stampa il job ID ed esci

Annullare un job batch extract in esecuzione

thunderbit batch cancel-extract <jobId>

Stessa semantica di cancel-distill: le righe completate vengono mantenute, quelle in attesa scartate, e l'addebito si interrompe per il resto.

Gestione dell'output

La CLI scrive su stdout per default, rendendo facile il piping o il redirect.

# Pipe Markdown into another tool
thunderbit distill https://example.com --format markdown | head -50

# Redirect to a file
thunderbit distill https://example.com --format markdown > output.md

# Save extraction JSON
thunderbit extract https://example.com --schema ./schema.json --format json > data.json

Comportamento del formato

  • --format json (default): risposta API completa come JSON compatto, inclusi success, data, creditsUsed, ecc. Da pipare in jq.
  • --format markdown: corpo Markdown grezzo per distill; JSON completo per gli altri comandi.
  • --format table: tabella ASCII per risultati tabellari (extract, suggest-fields).
# Markdown body straight to disk
thunderbit distill https://example.com --format markdown

# Full structured response
thunderbit distill https://example.com --format json

Esempi

Distill rapido

# Distill an article
thunderbit distill https://docs.thunderbit.com/introduction --format markdown

# Save HTML-converted Markdown to disk
thunderbit distill https://example.com --format markdown -o page.md

Ingestione RAG in massa

# Distill a docs site listed in urls.txt and write each page to disk
thunderbit batch distill --file urls.txt --format json \
  | jq -r '.data.results[] | select(.success == true) | "\(.url)\t\(.markdown)"' \
  > corpus.tsv

Scopri poi estrai

# Step 1: AI proposes fields, you curate, schema saved to disk
thunderbit extract https://example.com/product -i --save-schema ./schema.json

# Step 2: re-use across the catalog
thunderbit batch extract --file urls.txt --schema ./schema.json --format json > products.json

Gate CI — fallisci quando l'estrazione non restituisce nulla

thunderbit extract "$URL" --schema ./schema.json --format json \
  | jq -e '.data | length > 0'

Combinare con altri strumenti

# Extract URLs from a search-result JSON
thunderbit distill https://example.com --format json \
  | jq -r '.data.metadata.canonicalUrl'

# Pipe distilled content into a model for summarisation
thunderbit distill "$URL" --format markdown \
  | claude -p "summarise the article in 5 bullets"

# Count successful pages in a batch
thunderbit batch distill --file urls.txt --format json \
  | jq '[.data.results[] | select(.success == true)] | length'

Codici di uscita

CodiceSignificato
0Successo. Il risultato è su stdout nel formato scelto da --format.
1Qualsiasi errore — API key mancante, errore di auth, HTTP 4xx/5xx, errore di rete, file di schema mancante, argomento obbligatorio mancante.

Tutto il testo di errore viene scritto su stderr. In caso di errore, stdout resta vuoto (sì, anche con --format json). Significa che una pipeline jq non riceve mai un envelope a metà — controlla il codice di uscita (o set -e) prima di fare il parsing.

Anche il progresso del polling (es. Processing... (3) da async submit + poll) viene scritto su stderr. Pipa 2>/dev/null per silenziarlo. Le chiamate sincrone su singola pagina (--sync) non emettono progresso.

Risoluzione dei problemi

Error: API key is required. Esporta THUNDERBIT_API_KEY o passa --api-key.

Errori di rete dietro un proxy aziendale. Imposta HTTPS_PROXY e HTTP_PROXY — sia i client Node che Python li rispettano.

Polling dei batch lento. Aumenta --timeout per il budget per pagina. La cadenza di polling è fissata a pochi secondi e oggi non è configurabile dalla CLI.

Open source

La Thunderbit CLI è rilasciata con licenza MIT ed è open source su GitHub: GitHub repository (lo stesso repository ospita anche il server MCP e il plugin Claude Code). Distribuita su npm come @thunderbit/thunderbit-cli.

Correlati