Comenzar

Skills + CLI

Ejecuta Thunderbit desde la terminal — destila páginas a Markdown, extrae datos estructurados, sugiere campos y procesa hasta 100 URLs por lotes. La CLI funciona de forma autónoma o como toolkit de skills que los agentes de IA de codificación pueden descubrir.

Destila, extrae, sugiere campos y ejecuta trabajos por lotes directamente desde la terminal.

Instalación

La CLI se publica en npm como @thunderbit/thunderbit-cli y expone un binario thunderbit en tu PATH.

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

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

Una variante en Python (pip install thunderbit) con la misma superficie de comandos está en la hoja de ruta.

Autenticación

Antes de usar la CLI, necesitas autenticarte con tu API key de Thunderbit. Consigue una key en app.thunderbit.com/console. Formato: tb_ seguido de 32 caracteres hex.

Definir vía variable de entorno

export THUNDERBIT_API_KEY=tb_YOUR_API_KEY

Pasarla por comando

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

Self-hosted / Desarrollo local

Para gateways de Thunderbit self-hosted, sobreescribe 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

Comprobar versión

thunderbit --version
# or
thunderbit -V

Opciones globales

Estos flags están disponibles para cada comando:

OpciónDescripción
--api-key <key>, -kAPI key (o establece THUNDERBIT_API_KEY)
--base-url <url>API base URL (o establece THUNDERBIT_API_BASE_URL)
--format <format>, -fFormato de salida: json, table o markdown (por defecto json)
--version, -VImprime la versión de la CLI
--help, -hMuestra la ayuda del comando

Comandos

Distill

Destila una sola URL a Markdown limpio y listo para 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

Opciones de 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

Opciones disponibles:

OpciónPor defectoDescripción
--render-mode <mode>nonenone, basic o full
--timeout <ms>30000Timeout de petición por página en ms
--country-code <CC>USCódigo ISO de 2 letras, mayúsculas
--syncfalseModo sync en lugar del async submit + poll por defecto

Extract

Extrae datos estructurados de una página. El schema es un mapa plano de fieldName → instrucción en lenguaje natural — cada valor es una pista que la IA usa para encontrar el campo en la página.

Nota: el ejemplo de la spec OpenAPI upstream muestra JSON Schema ({type:"object",properties:…}). En el momento de escribir esto el servidor en producción espera el mapa plano de instrucciones que se muestra debajo; estamos alineando la spec.

# Schema inline — mapa plano de campo → instrucción
thunderbit extract https://example.com/product \
  --schema '{"name":"product name","price":"the listed price as a number","currency":"3-letter currency code"}'

# Schema desde archivo
thunderbit extract https://example.com/product --schema ./schema.json

# Guardar el JSON extraído
thunderbit extract https://example.com/product --schema ./schema.json --format json -o data.json

La respuesta siempre devuelve data.data como un array, un elemento por región de página que coincida con tu schema:

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

Modo interactivo

# 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

Opciones de 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

Opciones disponibles:

OpciónPor defectoDescripción
--schema <json-or-file>JSON inline o ruta al archivo de schema
--interactive, -ifalseSugerir → curar → extraer en una sola pasada
--prompt <text>Pista para la sugerencia de IA (con -i)
--render-mode <mode>nonenone, basic o full
--timeout <ms>60000Timeout de petición por página en ms
--syncfalseModo sync
--save-schema <file>Persistir el schema final para reutilizarlo

Suggest Fields

Deja que la IA proponga campos extraíbles antes de escribir un 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

El editor interactivo permite alternar campos por número (1 3 5), add, rm 2, edit 4, y luego done para confirmar. suggest-fields devuelve [{name, type, instruction}, …]; cuando lo conectas a extract, transfórmalo primero en un mapa plano:

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

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

Opciones disponibles:

OpciónPor defectoDescripción
--prompt <text>Pista de guía
--country-code <CC>USCódigo ISO de 2 letras

Batch Distill

Envía hasta 100 URLs en un solo trabajo por lotes. Por defecto: enviar + polling hasta 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

Opciones de 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

Opciones disponibles:

OpciónPor defectoDescripción
--file <path>Lee URLs desde archivo (una por línea)
--timeout <ms>30000Timeout de petición por página en ms
--no-pollfalseSolo enviar, imprimir job ID y salir

Cancelar un job de batch distill en ejecución

thunderbit batch cancel-distill <jobId>

Las páginas ya completadas conservan sus resultados. Las páginas pendientes se descartan y dejas de pagar por ellas. El estado cambia a CANCELLED en cuanto el servidor lo confirma.


Batch Extract

Envía hasta 100 URLs con un schema compartido.

# 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

Opciones disponibles:

OpciónPor defectoDescripción
--file <path>Lee URLs desde archivo (una por línea)
--schema <json-or-file>JSON inline o archivo de schema (obligatorio)
--timeout <ms>60000Timeout de petición por página en ms
--no-pollfalseSolo enviar, imprimir job ID y salir

Cancelar un job de batch extract en ejecución

thunderbit batch cancel-extract <jobId>

Misma semántica que cancel-distill: las filas completadas se conservan, las pendientes se descartan, y la facturación se detiene para el resto.

Manejo de salida

La CLI escribe a stdout por defecto, lo que facilita pipelines y redirecciones.

# 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

Comportamiento de formato

  • --format json (por defecto): respuesta API completa como JSON compacto, incluye success, data, creditsUsed, etc. Pásala por jq.
  • --format markdown: cuerpo Markdown bruto para distill; JSON completo para los demás comandos.
  • --format table: tabla ASCII para resultados tabulares (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

Ejemplos

Distill rápido

# 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

Ingesta RAG masiva

# 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

Descubre y luego extrae

# 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

Compuerta de CI — falla cuando la extracción no devuelve nada

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

Combina con otras herramientas

# 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'

Códigos de salida

CódigoSignificado
0Éxito. El resultado está en stdout en el formato elegido por --format.
1Cualquier fallo — falta de API key, error de auth, HTTP 4xx/5xx, error de red, archivo de schema faltante, argumento obligatorio faltante.

Todo el texto de error se escribe en stderr. Ante un fallo, stdout queda vacío (sí, incluso con --format json). Eso significa que un pipeline jq nunca recibe un envelope a medias — comprueba el código de salida (o set -e) antes de parsear.

El progreso del polling (por ejemplo Processing... (3) desde async submit + poll) también se escribe en stderr. Con 2>/dev/null lo silencias. Las llamadas síncronas de página única (--sync) no emiten progreso.

Solución de problemas

Error: API key is required. Exporta THUNDERBIT_API_KEY o pasa --api-key.

Errores de red detrás de un proxy corporativo. Define HTTPS_PROXY y HTTP_PROXY — tanto los clientes Node como Python los respetan.

Polling de batch lento. Sube --timeout para el presupuesto por página. La cadencia de polling en sí está fijada en unos pocos segundos y no es configurable hoy desde la CLI.

Open Source

La CLI de Thunderbit está bajo licencia MIT y es open source en GitHub: thunderbit-open/thunderbit-mcp-server (el mismo repositorio también incluye el servidor MCP y el plugin de Claude Code). Distribuida en npm como @thunderbit/thunderbit-cli.

Relacionado

  • MCP Server — las mismas operaciones, expuestas como herramientas MCP
  • SDKs — llama desde tu propio código
  • API Reference — HTTP puro