#!/bin/bash set -euo pipefail echo "🚀 Iniciando Llama Dev Suite PRO v5 en HF Spaces" OLLAMA_BIN="$(command -v ollama || true)" if [ -z "$OLLAMA_BIN" ]; then echo "❌ No se encontró el binario de Ollama dentro del contenedor." echo " Verifica que la imagen incluya Ollama (usa el runtime Docker o rebuild)." exit 1 fi LOG_FILE="/tmp/ollama.log" echo "📡 Iniciando servidor Ollama..." "$OLLAMA_BIN" serve > "$LOG_FILE" 2>&1 & OLLAMA_PID=$! cleanup() { echo "🧹 Deteniendo procesos..." if kill -0 "$OLLAMA_PID" >/dev/null 2>&1; then kill "$OLLAMA_PID" >/dev/null 2>&1 || true fi if [ -n "${APP_PID:-}" ] && kill -0 "$APP_PID" >/dev/null 2>&1; then kill "$APP_PID" >/dev/null 2>&1 || true fi } trap cleanup EXIT TARGET_URL="${LLAMA_DEV_OLLAMA_URL:-http://127.0.0.1:11434}" WAIT_SECONDS="${OLLAMA_WAIT_TIMEOUT:-60}" echo "⌛ Esperando a que Ollama escuche en ${TARGET_URL} (timeout: ${WAIT_SECONDS}s)..." READY=0 for ((second = 1; second <= WAIT_SECONDS; second++)); do if curl -sf "${TARGET_URL}/api/version" >/dev/null 2>&1; then VERSION=$(curl -sf "${TARGET_URL}/api/version" | grep -o '"version":"[^"]*"' | cut -d'"' -f4) echo "✅ Ollama está corriendo (PID: $OLLAMA_PID, versión: ${VERSION:-desconocida})" READY=1 break fi if ! kill -0 "$OLLAMA_PID" >/dev/null 2>&1; then echo "❌ El proceso de Ollama terminó inesperadamente. Logs:" cat "$LOG_FILE" exit 1 fi sleep 1 done if [ "$READY" -ne 1 ]; then echo "❌ ERROR: Ollama no pudo iniciarse en ${WAIT_SECONDS}s." echo "📋 Últimos logs:" tail -n 200 "$LOG_FILE" || true exit 1 fi if [ -n "${OLLAMA_AUTO_PULL:-}" ]; then echo "📥 Descargando modelo '${OLLAMA_AUTO_PULL}' en el arranque..." if "$OLLAMA_BIN" pull "$OLLAMA_AUTO_PULL"; then echo "✅ Modelo '${OLLAMA_AUTO_PULL}' disponible." else echo "⚠️ No se pudo descargar el modelo '${OLLAMA_AUTO_PULL}'. Continúo sin él." fi fi if [ -n "$HF_TOKEN" ]; then echo "🔑 Configurando acceso a modelos privados de HF..." mkdir -p ~/.ollama fi echo "🎨 Iniciando aplicación Gradio..." python -u app.py & APP_PID=$! wait "$APP_PID"