File size: 5,795 Bytes
49d3851
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
import torch
from transformers import pipeline
from huggingface_hub import login
import re
from runware import Runware, IPromptEnhance, IImageInference 
import asyncio
import gradio as gr
import os
from dotenv import load_dotenv

# Cargar las variables del archivo .env
load_dotenv()

# Obtener las claves desde las variables de entorno
hf_token = os.getenv("HF_TOKEN")
RUNWARE_API_KEY = os.getenv("RUNWARE_API_KEY")

# Variables de configuraci贸n del modelo
model_id = "meta-llama/Llama-3.2-1B-Instruct"

# Autenticaci贸n en Hugging Face
login(hf_token)

# Configuraci贸n del pipeline
pipe = pipeline(
    "text-generation",
    model=model_id,
    torch_dtype=torch.bfloat16,
    device_map="auto",
    temperature=0.2,  # Reducir creatividad
    top_p=0.8,
)

# Definir la funci贸n para generar texto mejorado
def generar_texto_mejorado(contenido_usuario, max_new_tokens=256):
    messages = [
        {"role": "system", "content": "Eres un editor profesional y experimentado que ayuda a escritores a mejorar su estilo de escritura. Tu objetivo es revisar el texto proporcionado por el usuario, mejorando su claridad, fluidez, gram谩tica y precisi贸n. Haz sugerencias que mantengan el tono y el estilo general del autor, pero que hagan el texto m谩s atractivo y f谩cil de leer. Recuerda no agregar mas texto del que ya existe. Y al final del texto, introduce una lista con las mejoras que has realizado en el texto empezando con <mejoras>"},
        {"role": "user", "content": contenido_usuario},
    ]
    
    # Generar la respuesta con el modelo
    outputs = pipe(
        messages,
        max_new_tokens=max_new_tokens
    )
    
    # Extraer y retornar solo el contenido generado por el asistente
    texto_generado = outputs[0]["generated_text"]
    
    # Buscar y extraer 煤nicamente el contenido despu茅s del primer ':', omitiendo informaci贸n redundante
    # Ajustamos el contenido generado al esquema esperado
    if isinstance(texto_generado, list) and "content" in texto_generado[-1]:
        texto_generado = texto_generado[-1]["content"]
    
    # Buscar el contenido dentro de las etiquetas <mejoras> y extraerlo
        match = re.search(r"<mejoras>", texto_generado, re.IGNORECASE)
    
    if match:
        # Separar el contenido principal y las mejoras
        contenido_principal = texto_generado[:match.start()].strip()
        mejoras = texto_generado[match.end():].strip()  # Tomar desde el final de <mejoras> hasta el final del texto
        return contenido_principal, mejoras
    else:
        mejoras="No se encontraron mejoras en el texto."
        return texto_generado, mejoras

# Definir la funci贸n para generar texto mejorado
def generar_prompt_imagen(texto_generado, max_new_tokens=256):
    messages = [
        {"role": "system", "content": "Utilizando el siguiente texto de un art铆culo de noticia, crea un prompt visual detallado para generar una imagen que represente de manera precisa el tema y tono del art铆culo. Aseg煤rate de capturar los aspectos clave mencionados en el art铆culo, como el entorno, las personas, el contexto o los eventos, y expresar visualmente los sentimientos o conceptos que se mencionan. Mant茅n en cuenta la est茅tica y los detalles descriptivos de lo que se discute"},
        {"role": "user", "content": texto_generado},
    ]
    
    # Generar la respuesta con el modelo
    outputs = pipe(
        messages,
        max_new_tokens=max_new_tokens
    )
    
    # Extraer y retornar solo el contenido generado por el asistente
    prompt_generado = outputs[0]["generated_text"]
    
    # Buscar y extraer 煤nicamente el contenido despu茅s del primer ':', omitiendo informaci贸n redundante
    # Ajustamos el contenido generado al esquema esperado
    if isinstance(prompt_generado, list) and "content" in prompt_generado[-1]:
        prompt_generado = prompt_generado[-1]["content"]
    return prompt_generado

# Funci贸n para generar imagen desde texto usando la API de Runware
async def generar_imagen(prompt_generado):
    if not (3 <= len(prompt_generado) <= 2000):
        return "Error: El texto debe tener entre 3 y 2000 caracteres."

    runware = Runware(api_key=RUNWARE_API_KEY)
    await runware.connect()

    request_image = IImageInference(
        positivePrompt=prompt_generado,
        model="civitai:36520@76907",
        numberResults=1,
        negativePrompt="cloudy, rainy",
        height=512,
        width=512,
    )

    images = await runware.imageInference(requestImage=request_image)
    if images:
        return images[0].imageURL
    else:
        return "No se gener贸 ninguna imagen."


# Funci贸n principal que se pasar谩 a Gradio
def interfaz_gradio(text):
    # Ejecutar la tarea asincr贸nica de procesar el texto y generar la imagen
    texto_mejorado, mejoras= generar_texto_mejorado(text)
    prompt_generado = generar_prompt_imagen(texto_mejorado)
    imagen_url = asyncio.run(generar_imagen(prompt_generado))

    # Retornar los resultados para mostrarlos en la interfaz
    return texto_mejorado, mejoras, imagen_url


iface = gr.Interface(
    fn=interfaz_gradio,  # Funci贸n que ser谩 llamada al interactuar con la interfaz
    inputs=gr.Textbox(label="Texto para mejorar"),  # Campo de texto para el usuario
    outputs=[
        gr.Textbox(label="Texto Mejorado"),  # Mostrar el texto mejorado
        gr.Textbox(label="Mejoras realizadas"),  # Mostrar las mejoras
        gr.Image(label="Imagen Generada")  # Mostrar la imagen generada
    ],
    live=False,  # Desactivar la actualizaci贸n en tiempo real
    allow_flagging="never",  # Opcional: desactivar las banderas de los usuarios
)


# Iniciar la interfaz
iface.launch()