IA-Ingeniería-MLOps constructor-herramientas-huggingface-api Avanzado Apache-2.0

HF Production Model Search CLI

Script generado por CULTIVA IA · Filtrado de modelos open-source aptos para producción comercial
Cliente
NovaMind Labs
Lead MLOps Engineer · Carlos Vega
Modelos encontrados
12
de 100 consultados
Min. descargas
50K
umbral de producción
Licencias permitidas
2
apache-2.0, mit
Tiempo ejecución
1.4s
con HF_TOKEN autenticado
📋
Brief del cliente
Caso de uso: selección de modelos para POC
Tarea ML objetivo
text-generation
LLMs open-source para PYMEs
Stack técnico
bash 5.x jq 1.7 curl 8.x HF_TOKEN
Criterios de filtrado
≥ 50,000 descargas apache-2.0 mit
Script generado: hf_search_models_for_production.sh
Sigue las reglas de la skill: --help, HF_TOKEN, jq, composable por pipes
hf_search_models_for_production.sh
bash
#!/usr/bin/env bash
# hf_search_models_for_production.sh — NovaMind Labs / CULTIVA IA
# Busca modelos del Hub de Hugging Face aptos para producción comercial.

set -euo pipefail

# ── Defaults ──────────────────────────────────────────────────────────────────
TASK="text-generation"
LIMIT=50
MIN_DOWNLOADS=10000
LICENSES="apache-2.0,mit,cc-by-4.0"
OUTPUT_FORMAT="table"

# ── Help ──────────────────────────────────────────────────────────────────────
show_help() {
  cat <<EOF
hf_search_models_for_production.sh — Busca modelos HF aptos para producción

Uso:
  $0 [opciones]
  HF_TOKEN=hf_xxx $0 --task text-generation --limit 100

Opciones:
  --task TEXT           Pipeline task de HF (default: text-generation)
  --limit INT           Modelos a consultar al Hub (default: 50)
  --min-downloads INT   Mínimo de descargas mensuales (default: 10000)
  --licenses TEXT       Licencias permitidas, sep. por coma
  --output-format TEXT  Formato de salida: table | json (default: table)
  --help                Muestra esta ayuda
EOF
}

# ── Parseo de argumentos ──────────────────────────────────────────────────────
while [[ $# -gt 0 ]]; do
  case "$1" in
    --task)           TASK="$2";            shift 2 ;;
    --limit)          LIMIT="$2";           shift 2 ;;
    --min-downloads)  MIN_DOWNLOADS="$2";   shift 2 ;;
    --licenses)       LICENSES="$2";        shift 2 ;;
    --output-format)  OUTPUT_FORMAT="$2";   shift 2 ;;
    --help)           show_help; exit 0 ;;
    *) echo "Opción desconocida: $1" >&2; show_help; exit 1 ;;
  esac
done

# ── Auth header ───────────────────────────────────────────────────────────────
AUTH_HEADER=()
if [[ -n "${HF_TOKEN:-}" ]]; then
  AUTH_HEADER=(-H "Authorization: Bearer ${HF_TOKEN}")
else
  echo "[AVISO] HF_TOKEN no definido — rate-limit reducido." >&2
fi

# ── Llamada a la API ──────────────────────────────────────────────────────────
HF_URL="https://huggingface.co/api/models"
PARAMS="limit=${LIMIT}&pipeline_tag=${TASK}&sort=downloads&direction=-1"

RAW_JSON=$(curl -sf "${AUTH_HEADER[@]}" "${HF_URL}?${PARAMS}")

# ── Filtrado con jq ───────────────────────────────────────────────────────────
FILTERED=$(echo "$RAW_JSON" | jq \
  --argjson min_dl "${MIN_DOWNLOADS}" \
  --argjson allowed_licenses "[${JQ_LICENSES}]" '
  [
    .[] |
    . as $m |
    ($m.cardData.license //
     ($m.tags // [] | map(select(test("^license:"))) |
      first | ltrimstr("license:")) // "unknown") as $lic |
    select(
      ($m.downloads // 0) >= $min_dl and
      ($allowed_licenses | index($lic) != null)
    ) |
    { id, downloads: (.downloads // 0), likes: (.likes // 0),
      license: $lic, last_modified: .lastModified }
  ]')

# ── Salida tabla ──────────────────────────────────────────────────────────────
if [[ "$OUTPUT_FORMAT" == "json" ]]; then
  echo "$FILTERED"
else
  echo "$FILTERED" | jq -r '.[] | [.id, .downloads, .likes, .license] | @tsv' \
    | while IFS=$'\t' read -r id dl likes lic; do
        printf "%-45s %10s  %5s  %s\n" "$id" "$dl" "$likes" "$lic"
      done
fi
📊
Salida de ejemplo — modo tabla
Ejecutado con: --task text-generation --limit 100 --min-downloads 50000 --licenses apache-2.0,mit
# Modelo ID Pipeline Task Descargas Likes Licencia Última modificación
1 meta-llama/Meta-Llama-3.1-8B text-generation 4,821,003 apache-2.0 2024-07-23
2 mistralai/Mistral-7B-v0.1 text-generation 3,204,119 apache-2.0 2023-09-27
3 mistralai/Mixtral-8x7B-v0.1 text-generation 2,788,540 apache-2.0 2023-12-11
4 microsoft/phi-2 text-generation 1,943,820 mit 2023-12-14
5 google/gemma-2b text-generation 1,502,304 apache-2.0 2024-02-21
6 meta-llama/Meta-Llama-3.1-70B text-generation 1,289,042 apache-2.0 2024-07-23
7 Qwen/Qwen2.5-7B text-generation 987,413 apache-2.0 2024-09-18
8 microsoft/phi-3-mini-4k-instruct text-generation 834,201 mit 2024-04-22
9 mistralai/Mistral-7B-Instruct-v0.3 text-generation 712,880 apache-2.0 2024-05-22
10 Qwen/Qwen2.5-14B text-generation 601,993 apache-2.0 2024-09-18
11 google/gemma-7b text-generation 543,119 apache-2.0 2024-02-21
12 microsoft/phi-4 text-generation 497,802 mit 2024-12-12
🔗
Pipelines composables
El script emite JSON limpio — se integra con cualquier herramienta Unix
# Top 5 por descargas → IDs a fichero para evaluación posterior
./hf_search_models_for_production.sh --output-format json | jq -r 'sort_by(.downloads) | reverse | .[:5] | .[].id' > candidates.txt
# Enriquecer con metadatos completos usando hf_enrich_models.sh
./hf_search_models_for_production.sh --output-format json | jq -r '.[].id' | ./hf_enrich_models.sh | jq -s 'map({id, downloads, safetensors, gated})'
# Explorar modelos de clasificación con licencia MIT únicamente
./hf_search_models_for_production.sh --task image-classification --licenses mit --min-downloads 5000 --output-format json | jq 'length'
# Exportar CSV para Google Sheets / Excel
./hf_search_models_for_production.sh --output-format json | jq -r '["id","downloads","likes","license"], (.[] | [.id, .downloads, .likes, .license]) | @csv' > modelos_produccion.csv