¿Puede tu computadora escribir un libro de 5 hojas?

Iniciado por ze0rX!, Abril 07, 2025, 03:05:19 PM

Tema anterior - Siguiente tema

0 Miembros y 2 Visitantes están viendo este tema.

Hola underc0der's!

Les comparto el siguiente script para que puedan ejecutarlo en sus dispositivos pc o laptop.

Requisitos para ejecutar exitosamente el script.

WSL No tienes permitido ver enlaces. Registrate o Entra a tu cuenta

Docker No tienes permitido ver enlaces. Registrate o Entra a tu cuenta

Contenedor de ollama No tienes permitido ver enlaces. Registrate o Entra a tu cuenta

En la variable MODELS=("gemma3:4b" "llama3.2:3b")  # LLM1 (Escritor), LLM2 (Editor)
Deben ingresar a la sesion de ollama desde docker o desde la terminal e instalar los modelos que se adecuen a sus necesidades y cambiarlos, use estos dos que son pequeños para que no se sobrecargue mi sistema.
En LOG_DIR="RUTA/DE/TU/DIRECTORIO/PARA/GUARDAR" debes poner tu ruta para que guarde el log para que veas si algo pasa y en el cual se guardara el pequeño libro.


Código: text

#!/bin/bash

# Configuración inicial
OLLAMA_URL="http://localhost:11434/api/generate"
MODELS=("gemma3:4b" "llama3.2:3b")  # LLM1 (Escritor), LLM2 (Editor) 
SYSTEM_PROMPT1="Eres un escritor de libros de ficción. Escribe una página (aproximadamente 100 palabras) para un libro. Usa el contexto previo para continuar la historia de manera coherente, manteniendo los personajes, el tono y la trama. No incluyas títulos ni explicaciones, solo el texto de la página."
SYSTEM_PROMPT2="Eres un editor de libros. Recibe una página escrita y revísala para mejorar la coherencia, estilo y continuidad con el contexto previo. Asegúrate de que los personajes, el tono y la trama se mantengan consistentes. Devuelve la página editada (aproximadamente 100 palabras). Si no hay cambios necesarios, devuelve la página tal cual. No incluyas explicaciones, solo el texto editado."
LOG_DIR="RUTA/DE/TU/DIRECTORIO/PARA/GUARDAR"
LOG_FILE="$LOG_DIR/book_ollama.log"
BOOK_FILE="$LOG_DIR/book.txt"
PAGE_COUNT=0
MAX_PAGES=5  # Reducido a 5 páginas

# Verificar dependencias
for cmd in curl jq; do
    if ! command -v "$cmd" &> /dev/null; then
        echo "Error: $cmd no está instalado. Instálalo para continuar."
        exit 1
    fi
done

# Crear directorio de logs
if [ ! -d "$LOG_DIR" ]; then
    echo "Creando directorio $LOG_DIR..."
    mkdir -p "$LOG_DIR" 2>/tmp/mkdir_error.log
    if [ $? -ne 0 ]; then
        echo "Error al crear $LOG_DIR. Detalles:"
        cat /tmp/mkdir_error.log
        exit 1
    fi
else
    if [ ! -w "$LOG_DIR" ]; then
        echo "Error: No tienes permisos de escritura en $LOG_DIR"
        exit 1
    fi
fi

for log in "$LOG_FILE" "$BOOK_FILE"; do
    touch "$log" || { echo "Error al crear $log"; exit 1; }
done

# Función para registrar mensajes
log_message() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
}

# Función para enviar solicitud a Ollama
send_request() {
    local prompt="$1"
    local model="$2"

    json_payload=$(jq -n --arg model "$model" --arg prompt "$prompt" '{model: $model, prompt: $prompt, stream: false}')
    response=$(curl -s -X POST "$OLLAMA_URL" -H "Content-Type: application/json" -d "$json_payload")
    if [ $? -ne 0 ]; then
        echo "Error: No se pudo conectar con Ollama"
        log_message "Error: No se pudo conectar con Ollama para $model"
        exit 1
    fi

    answer=$(echo "$response" | jq -r '.response')
    if [ -z "$answer" ] || [ "$answer" = "null" ]; then
        echo "Error: Respuesta inválida de $model"
        log_message "Error: Respuesta inválida de $model"
        exit 1
    fi

    echo "$answer"
}

# Función para obtener el contexto reciente (última página)
get_recent_context() {
    if [ -s "$BOOK_FILE" ]; then
        # Extraer la última página (ignorando las líneas de "Página X" y los separadores)
        tac "$BOOK_FILE" | awk '/^Página [0-9]+$/ {exit} {print}' | tac | grep -v '^$' | tail -n 100
    else
        echo ""
    fi
}

# Inicializar el libro
> "$BOOK_FILE"
log_message "Inicio de la creación del libro"

# Bucle para generar las 5 páginas
while [ $PAGE_COUNT -lt $MAX_PAGES ]; do
    PAGE_COUNT=$((PAGE_COUNT + 1))
    log_message "Generando página $PAGE_COUNT"

    # Obtener el contexto reciente (solo la última página)
    CONTEXT=$(get_recent_context)
    if [ -z "$CONTEXT" ]; then
        log_message "Contexto vacío para página $PAGE_COUNT (inicio del libro)"
    else
        log_message "Contexto para página $PAGE_COUNT:\n$CONTEXT"
    fi

    # LLM1: Generar página inicial
    log_message "LLM1 (${MODELS[0]}) escribiendo página $PAGE_COUNT"
    WRITER_PROMPT="$SYSTEM_PROMPT1\nContexto previo:\n$CONTEXT"
    INITIAL_PAGE=$(send_request "$WRITER_PROMPT" "${MODELS[0]}")
    log_message "Página inicial generada:\n$INITIAL_PAGE"

    # LLM2: Revisar y editar página
    log_message "LLM2 (${MODELS[1]}) editando página $PAGE_COUNT"
    EDITOR_PROMPT="$SYSTEM_PROMPT2\nContexto previo:\n$CONTEXT\nPágina a editar:\n$INITIAL_PAGE"
    EDITED_PAGE=$(send_request "$EDITOR_PROMPT" "${MODELS[1]}")
    log_message "Página editada:\n$EDITED_PAGE"

    # Validar continuidad (simple: comparar si hay palabras clave comunes)
    # Por ejemplo, buscamos si hay al menos 3 palabras comunes entre el contexto y la página editada
    if [ -n "$CONTEXT" ]; then
        COMMON_WORDS=$(echo "$CONTEXT" | tr ' ' '\n' | sort | uniq | grep -F -f - <(echo "$EDITED_PAGE" | tr ' ' '\n' | sort | uniq) | wc -l)
        if [ "$COMMON_WORDS" -lt 3 ]; then
            log_message "Advertencia: La página $PAGE_COUNT parece no seguir el contexto (solo $COMMON_WORDS palabras comunes). Reintentando..."
            PAGE_COUNT=$((PAGE_COUNT - 1))
            continue
        fi
    fi

    # Agregar la página al libro
    echo "Página $PAGE_COUNT" >> "$BOOK_FILE"
    echo "$EDITED_PAGE" >> "$BOOK_FILE"
    echo "" >> "$BOOK_FILE"  # Separador entre páginas
    log_message "Página $PAGE_COUNT agregada al libro"
done

log_message "Libro completado con $PAGE_COUNT páginas. Guardado en $BOOK_FILE"
echo "Libro completado. Revisa $BOOK_FILE para ver el resultado."


Modifiquenlo a su gusto y diviertanse.
Todos los días tenemos la oportunidad de aprender algo nuevo. ¡Hazlo posible!