#!/bin/bash # [Author] Cortana Rosero One # [Generated] Created by Claude Code (claude-3-7-sonnet-20250219) # Modified Date: 2025-04-07 # Version $(cat "$(dirname "$0")/config/version" 2>/dev/null || echo "1.0.0") # # Description: Script para ejecutar aider con la configuración adecuada de OpenRouter # Usage: ./sora.sh [parámetros para aider] # Verifica si aider está instalado if ! command -v aider &> /dev/null; then echo "Error: aider no está instalado." echo "Instálelo ejecutando: bin/sora_install.sh" exit 1 fi # Obtiene la ruta base de tokens desde el archivo de configuración TOKENS_BASE_PATH=$(cat "$(dirname "$0")/config/ai_tokens.path" 2>/dev/null) if [ -z "$TOKENS_BASE_PATH" ]; then echo "Error: No se pudo obtener la ruta base de tokens." exit 1 fi # Expande la ruta si comienza con ~ if [[ "$TOKENS_BASE_PATH" == "~"* ]]; then TOKENS_BASE_PATH="${TOKENS_BASE_PATH/#\~/$HOME}" fi # Define el archivo de tokens de OpenRouter OPENROUTER_TOKEN_FILE="${TOKENS_BASE_PATH}/router.sops.yaml" # Verifica si el archivo de token existe if [ ! -f "$OPENROUTER_TOKEN_FILE" ]; then echo "Error: Archivo de token no encontrado: $OPENROUTER_TOKEN_FILE" echo "Registre su token usando ai_token.sh o solicite el token al administrador del proyecto." exit 1 fi # Desencripta y obtiene el token de OpenRouter (decodificando base64) OPENROUTER_API_KEY=$(sops -d "$OPENROUTER_TOKEN_FILE" | cut -d\| -f2 | tr -d '[:space:]' | base64 -d) if [ -z "$OPENROUTER_API_KEY" ]; then echo "Error: No se pudo desencriptar el token de OpenRouter." exit 1 fi # Lee o crea el archivo de configuración de la API base API_BASE_CONFIG_FILE="$(dirname "$0")/config/sora_api_base.cfg" if [ ! -f "$API_BASE_CONFIG_FILE" ]; then echo "https://openrouter.ai/api/v1" > "$API_BASE_CONFIG_FILE" fi OPENAI_API_BASE=$(cat "$API_BASE_CONFIG_FILE" 2>/dev/null || echo "https://openrouter.ai/api/v1") # Lee o crea el archivo de configuración del modelo MODEL_CONFIG_FILE="$(dirname "$0")/config/sora_model.cfg" if [ ! -f "$MODEL_CONFIG_FILE" ]; then echo "deepseek/deepseek-r1-distill-llama-70b:free" > "$MODEL_CONFIG_FILE" fi AIDER_MODEL=$(cat "$MODEL_CONFIG_FILE" 2>/dev/null || echo "deepseek/deepseek-r1-distill-llama-70b:free") # Pregunta al usuario si desea usar modelo remoto o local (ollama) MODE=$(gum choose "Remoto (OpenRouter)" "Local (Ollama)") if [[ "$MODE" == "Local (Ollama)" ]]; then # Muestra advertencia sobre rendimiento echo "⚠️ ADVERTENCIA: El uso de modelos locales requiere hardware adecuado." echo " Si su hardware no es suficiente, las respuestas pueden ser extremadamente lentas." # Evalúa el hardware de la máquina CPU_CORES=$(nproc) RAM_TOTAL_GB=$(free -g | awk '/^Mem:/{print $2}') RAM_AVAILABLE_GB=$(free -g | awk '/^Mem:/{print $7}') HAS_GPU=$(lspci | grep -i nvidia | grep -v "Audio\|USB" || echo "") # Determina nivel de rendimiento PERFORMANCE_LEVEL="Muy Malo" if [ -n "$HAS_GPU" ] && [ $CPU_CORES -ge 8 ] && [ $RAM_AVAILABLE_GB -ge 16 ]; then PERFORMANCE_LEVEL="Excelente" elif [ -n "$HAS_GPU" ] && [ $CPU_CORES -ge 6 ] && [ $RAM_AVAILABLE_GB -ge 12 ]; then PERFORMANCE_LEVEL="Muy Bueno" elif [ $CPU_CORES -ge 8 ] && [ $RAM_AVAILABLE_GB -ge 12 ]; then PERFORMANCE_LEVEL="Bueno" elif [ $CPU_CORES -ge 6 ] && [ $RAM_AVAILABLE_GB -ge 8 ]; then PERFORMANCE_LEVEL="Intermedio" elif [ $CPU_CORES -ge 4 ] && [ $RAM_AVAILABLE_GB -ge 6 ]; then PERFORMANCE_LEVEL="Pobre" elif [ $CPU_CORES -ge 2 ] && [ $RAM_AVAILABLE_GB -ge 4 ]; then PERFORMANCE_LEVEL="Malo" fi # Muestra estado del hardware echo "" echo "Evaluación de hardware:" echo "- CPU Cores: $CPU_CORES" echo "- RAM Total: $RAM_TOTAL_GB GB" echo "- RAM Disponible: $RAM_AVAILABLE_GB GB" echo "- GPU NVIDIA: $([ -n "$HAS_GPU" ] && echo "Detectada" || echo "No detectada")" # Muestra barra de rendimiento con gum echo "" echo -n "Rendimiento esperado: " case "$PERFORMANCE_LEVEL" in "Muy Malo") gum style --foreground 255 --background 1 " Muy Malo " ;; "Malo") gum style --foreground 255 --background 1 " Malo " ;; "Pobre") gum style --foreground 255 --background 202 " Pobre " ;; "Intermedio") gum style --foreground 255 --background 3 " Intermedio " ;; "Bueno") gum style --foreground 255 --background 35 " Bueno " ;; "Muy Bueno") gum style --foreground 255 --background 2 " Muy Bueno " ;; "Excelente") gum style --foreground 255 --background 5 " Excelente " ;; esac echo "" # Pregunta si desea continuar if ! gum confirm "¿Desea continuar con el modo local?"; then echo "Operación cancelada por el usuario." exit 0 fi # Verifica si ollama está activo if ! curl -s http://127.0.0.1:11434/api/tags >/dev/null 2>&1; then echo "Ollama no está activo. Iniciando..." "$(dirname "$0")/ollama_up.sh" # Espera hasta 30 segundos para que Ollama se inicie completamente WAIT_TIME=0 MAX_WAIT=30 while ! curl -s http://127.0.0.1:11434/api/tags >/dev/null 2>&1; do if [ $WAIT_TIME -ge $MAX_WAIT ]; then echo "Error: No se pudo iniciar Ollama después de $MAX_WAIT segundos." exit 1 fi echo "Esperando que Ollama responda... ($WAIT_TIME/$MAX_WAIT)" sleep 1 WAIT_TIME=$((WAIT_TIME + 1)) done OLLAMA_STARTED=true fi # Verifica que Ollama funcione correctamente haciendo una solicitud simple echo "Verificando que Ollama responda correctamente..." if ! curl -s http://127.0.0.1:11434/api/tags | jq -e '.models' >/dev/null 2>&1; then echo "Error: Ollama está iniciado pero no responde correctamente." exit 1 fi # Configura para usar Ollama OLLAMA_API_BASE=$(cat "$(dirname "$0")/config/ollama.local" 2>/dev/null) echo "Usando Ollama con API base: $OLLAMA_API_BASE" # Lista y permite seleccionar modelos disponibles en Ollama echo "Consultando modelos disponibles en Ollama..." OLLAMA_MODELS=$(curl -s http://127.0.0.1:11434/api/tags | jq -r '.models[].name') if [ -z "$OLLAMA_MODELS" ]; then echo "Error: No se encontraron modelos en Ollama." exit 1 fi # Permite seleccionar un modelo utilizando gum echo "Seleccione un modelo:" SELECTED_MODEL=$(echo "$OLLAMA_MODELS" | gum filter --placeholder="Buscar modelo...") if [ -z "$SELECTED_MODEL" ]; then echo "No se seleccionó ningún modelo. Saliendo." exit 1 fi echo "Modelo seleccionado: $SELECTED_MODEL" # Añade el prefijo al modelo de Ollama OLLAMA_FULL_MODEL="ollama_chat/$SELECTED_MODEL" echo "Modelo con prefijo: $OLLAMA_FULL_MODEL" # Ejecuta aider con la configuración de Ollama OLLAMA_API_BASE="$OLLAMA_API_BASE" AIDER_MODEL="$OLLAMA_FULL_MODEL" aider --no-git --no-show-model-warnings "$@" # Si iniciamos Ollama, lo detenemos al finalizar if [ "$OLLAMA_STARTED" = true ]; then echo "Deteniendo Ollama..." "$(dirname "$0")/ollama_down.sh" fi else # Ejecuta aider con la configuración de OpenRouter OPENAI_API_BASE="$OPENAI_API_BASE" OPENROUTER_API_KEY="$OPENROUTER_API_KEY" AIDER_MODEL="$AIDER_MODEL" aider --no-git --no-show-model-warnings "$@" fi