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
Modifiquenlo a su gusto y diviertanse.
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.
#!/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.