Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -1,113 +1,129 @@
|
|
1 |
-
import gradio as gr
|
2 |
-
import google.generativeai as genai
|
3 |
-
import os
|
4 |
from dotenv import load_dotenv
|
5 |
-
|
6 |
-
import
|
|
|
|
|
7 |
|
8 |
-
# Cargar variables de entorno
|
9 |
load_dotenv()
|
10 |
|
11 |
-
|
12 |
-
genai.configure(api_key=os.getenv("GEMINI_API_KEY"))
|
13 |
-
|
14 |
-
def to_markdown(text):
|
15 |
-
return Markdown(textwrap.indent(text, '> ', predicate=lambda _: True))
|
16 |
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
"
|
23 |
-
"
|
24 |
-
|
25 |
-
|
|
|
26 |
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
|
|
|
|
32 |
|
33 |
-
|
34 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
35 |
{
|
36 |
-
"
|
37 |
-
"
|
38 |
-
|
39 |
-
"Para escribir este párrafo de apertura utiliza una o algunas de estas técnicas de Apertura para Cartas de Ventas, escoge las mas adecuadas:"
|
40 |
-
"1. Si.. Entonces"
|
41 |
-
"Este es uno de los párrafos de apertura más usados. Gary Halbert, uno de los publicistas más importantes del siglo XX, solía usarlos en casi cada una de sus cartas de venta. Es muy simple, claro y poderoso. Hace que la gente sepa qué esperar."
|
42 |
-
"Y hay una estructura de creencia muy interesante que se construye con este combo. Si eso, entonces esto. Es como si tuvieran que tener una especie de requisito previo a obtener el beneficio."
|
43 |
-
"Un ejemplo de esto sería: 'Si quieres hacer más de 100,000 dólares al año trabajando solo 4 horas al día, entonces esta carta te mostrará cómo.'"
|
44 |
-
"Muy simple. Si quieres eso, entonces así es cómo lo haces."
|
45 |
-
"2. Si / Entonces + Autoridad"
|
46 |
-
"Aún más poderoso que la llave 'Si / Entonces' es la misma, pero agregando la figura de autoridad o credibilidad. Por ejemplo: 'Si quieres saber una manera secreta de volverte casi invencible en una pelea... entonces aquí te mostraré lo que hacían los gladiadores y los samuráis. Y por qué tú también puedes hacer lo mismo a partir de hoy.'"
|
47 |
-
"Una manera de notar el poder de estos párrafos de apertura es quitando la figura de autoridad. En este caso: los gladiadores y samuráis."
|
48 |
-
"Eso cambiaría el párrafo a: 'Si quieres saber una manera secreta de volverte casi invencible en una pelea... entonces aquí te mostraré por qué tú también puedes hacer lo mismo a partir de hoy.'"
|
49 |
-
"Como puedes ver, no tiene tanto impacto como la versión que agrega a los gladiadores y samuráis."
|
50 |
-
"3. Honestidad"
|
51 |
-
"Ser transparente es una de las mejores formas de obtener más clientes. Y también funciona con los párrafos de apertura."
|
52 |
-
"Por ejemplo, uno de los anuncios de Gary Halbert iniciaba de esta manera: 'Mi nombre es Betty Adams, y lo primero que debes saber sobre mí es que... no soy una doctora. Tampoco soy experta en nutrición. No fui a la universidad y ni siquiera tengo un grado académico. De hecho, la única cosa en la que me considero experta es...'"
|
53 |
-
"Y luego iba a un subtítulo en el que mencionaba cómo podía hacerte bajar 10 kilos de una manera muy sencilla."
|
54 |
-
"En este caso puedes notar todos los negativos que usa: 'no soy doctora', 'no soy experta en nutrición', 'no fui a la escuela', 'no tengo un grado académico'. Son cuatro cosas negativas lo cual fortalece su afirmación sobre lo que sí es. Ahora, esto no siempre va a funcionar para todas las cartas. Dependerá de tu mercado y tu cliente ideal. Si tu mercado no es escéptico, no necesitas usar este tipo de párrafo."
|
55 |
-
"4. Sensacionalista"
|
56 |
-
"Éste está relacionado con el encabezado sensacionalista. Aquí es donde dirías algo como:'Déjame contarte esta historia extraña sobre un hombre que fue arrestado debido a que tenía herpes.'"
|
57 |
-
"Es sensacionalista. Y lo sensacionalista vende. Siempre lo ha hecho y lo hará."
|
58 |
-
"Sin duda, el párrafo es extraño y hace pensar a tu lector: '¿Cómo alguien fue arrestado por tener herpes? ¿Qué hizo? ¿Qué sucedió?' Los deja enganchados, adictos a querer saber más. Tienen que saberlo."
|
59 |
-
"5. Haz una pregunta"
|
60 |
-
"Hacen que las personas se detengan si están interesadas. Uno de los mejores párrafos de apertura que hay es el siguiente: '¿Sabías que el valor a largo plazo de las tarjetas de béisbol es mucho mayor que el de las acciones y monedas raras?'"
|
61 |
-
"Así que cuando le hablas a alguien que está en el nicho de finanzas, inversionistas y demás, sobre este tema, estará interesado porque es diferente y lo deja listo para iniciar la aventura."
|
62 |
-
"6. 'Micro aperturas'"
|
63 |
-
"Este párrafo debe ser corto. Unas cuantas palabras... para que lean el siguiente. Esto es debido a que al ser breve, lo hace fácil de leer."
|
64 |
-
"Y si dices algo que ponga a tu lector en la mentalidad adecuada, esto puede ser bastante poderoso. Por ejemplo, si tu producto está dirigido a un mercado escéptico, puedes usar un párrafo como el siguiente: 'Yo era un escéptico total.'"
|
65 |
-
"Con esto estás yendo justo a su mente, a sus dudas."
|
66 |
-
"Uno que puedes usar con efectividad es: 'Imagina lo siguiente:'"
|
67 |
-
],
|
68 |
-
},
|
69 |
]
|
70 |
-
|
|
|
|
|
71 |
|
72 |
-
|
73 |
-
|
74 |
|
75 |
-
#
|
76 |
-
|
77 |
-
<style>
|
78 |
-
body { font-family: Arial, sans-serif; }
|
79 |
-
.gradio-container { max-width: 800px; margin: auto; }
|
80 |
-
</style>
|
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 |
-
outputs=[target_audience, product, temperature, text_type, model_selector]
|
110 |
-
)
|
111 |
|
112 |
-
#
|
113 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
from dotenv import load_dotenv
|
2 |
+
import streamlit as st
|
3 |
+
import os
|
4 |
+
import google.generativeai as genai
|
5 |
+
from PIL import Image
|
6 |
|
|
|
7 |
load_dotenv()
|
8 |
|
9 |
+
genai.configure(api_key=os.getenv("GOOGLE_API_KEY"))
|
|
|
|
|
|
|
|
|
10 |
|
11 |
+
# Function to get response from Gemini model
|
12 |
+
def get_gemini_response(input_prompt, image_data, genre, length, language, mood):
|
13 |
+
model = genai.GenerativeModel('gemini-1.5-flash')
|
14 |
+
# If both image and text are provided
|
15 |
+
if image_data and input_prompt:
|
16 |
+
full_prompt = f"""
|
17 |
+
You are a famous creative writer. Look at the image provided and also consider the following prompt: "{input_prompt}".
|
18 |
+
Create a {length} {genre} in {language}. The {genre} should be {mood}, based on both the image and the prompt, and contain realistic and emotional elements.
|
19 |
+
"""
|
20 |
+
response = model.generate_content([full_prompt, image_data[0]])
|
21 |
|
22 |
+
# If only image is provided
|
23 |
+
elif image_data:
|
24 |
+
full_prompt = f"""
|
25 |
+
You are a famous creative writer. Look at the image provided and create a {length} {genre} in {language}.
|
26 |
+
The {genre} should be {mood}. The {genre} should be based on the image and contain realistic and emotional elements.
|
27 |
+
"""
|
28 |
+
response = model.generate_content([full_prompt, image_data[0]])
|
29 |
|
30 |
+
# If only text is provided
|
31 |
+
elif input_prompt:
|
32 |
+
full_prompt = f"""
|
33 |
+
You are a creative writer. Create a {length} {genre} in {language}. The {genre} should be {mood}. The {genre} should be based on the following prompt:
|
34 |
+
|
35 |
+
"{input_prompt}"
|
36 |
+
|
37 |
+
Make sure it contains realistic and emotional elements.
|
38 |
+
"""
|
39 |
+
response = model.generate_content([full_prompt])
|
40 |
+
|
41 |
+
# If neither image nor text is provided
|
42 |
+
else:
|
43 |
+
raise ValueError("Please provide either an image or a text prompt.")
|
44 |
+
|
45 |
+
# Check if response is valid and return text
|
46 |
+
if response and response.parts:
|
47 |
+
return response.parts[0].text
|
48 |
+
else:
|
49 |
+
raise ValueError("Sorry, please try a different combination of inputs.")
|
50 |
+
|
51 |
+
# Function to setup uploaded image
|
52 |
+
def input_image_setup(uploaded_file):
|
53 |
+
if uploaded_file is not None:
|
54 |
+
bytes_data = uploaded_file.getvalue()
|
55 |
+
image_parts = [
|
56 |
{
|
57 |
+
"mime_type": uploaded_file.type,
|
58 |
+
"data": bytes_data
|
59 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
60 |
]
|
61 |
+
return image_parts
|
62 |
+
else:
|
63 |
+
return None
|
64 |
|
65 |
+
# Initialize Streamlit app
|
66 |
+
st.set_page_config(page_title="Poetic Vision", page_icon=":pencil:", layout="wide") # Set layout to wide
|
67 |
|
68 |
+
# Main UI components
|
69 |
+
st.markdown("<h1 style='text-align: center;'>VisionTales</h1>", unsafe_allow_html=True)
|
70 |
+
st.markdown("<h3 style='text-align: center;'>Convierte tus ideas en historias inolvidables.</h3>", unsafe_allow_html=True)
|
|
|
|
|
|
|
|
|
71 |
|
72 |
+
# Add custom CSS for the button
|
73 |
+
st.markdown("""
|
74 |
+
<style>
|
75 |
+
div.stButton > button {
|
76 |
+
background-color: #FFCC00; /* Color llamativo */
|
77 |
+
color: black; /* Texto en negro */
|
78 |
+
width: 90%;
|
79 |
+
height: 60px;
|
80 |
+
font-weight: bold;
|
81 |
+
font-size: 22px; /* Tamaño más grande */
|
82 |
+
text-transform: uppercase; /* Texto en mayúsculas */
|
83 |
+
border: 1px solid #000000; /* Borde negro de 1px */
|
84 |
+
border-radius: 8px;
|
85 |
+
display: block;
|
86 |
+
margin: 0 auto; /* Centramos el botón */
|
87 |
+
}
|
88 |
+
div.stButton > button:hover {
|
89 |
+
background-color: #FFD700; /* Color al pasar el mouse */
|
90 |
+
color: black; /* Texto sigue en negro */
|
91 |
+
}
|
92 |
+
</style>
|
93 |
+
""", unsafe_allow_html=True)
|
94 |
+
|
95 |
+
# Create two columns for layout (40% and 60%)
|
96 |
+
col1, col2 = st.columns([2, 3]) # 2 + 3 = 5 parts total
|
97 |
+
|
98 |
+
with col1:
|
99 |
+
# Subir imagen primero
|
100 |
+
uploaded_file = st.file_uploader("Elegir una imagen...", type=["jpg", "jpeg", "png"])
|
101 |
+
|
102 |
+
# Agrupar opciones en un desplegable con un nuevo título
|
103 |
+
with st.expander("Clic para personalizar tu historia", expanded=False): # El desplegable está cerrado por defecto
|
104 |
+
input_prompt = st.text_input("Escribe de qué quieres que trate tu historia (opcional):", placeholder="Escribe tu mensaje aquí...")
|
105 |
+
genre = st.selectbox("Tipo de texto:", ["Historia", "Shayari", "Sher", "Poema", "Cita"])
|
106 |
+
length = st.selectbox("Longitud del texto:", ["Corto", "Largo"])
|
107 |
+
language = st.selectbox("Idioma del texto:", ["Español", "Inglés"])
|
108 |
+
mood = st.selectbox("Estado de ánimo:", ["Emocional", "Triste", "Feliz", "Horror", "Comedia", "Romántico"])
|
109 |
+
|
110 |
+
# Generate button con el nuevo estilo, centrado y ajustado
|
111 |
+
submit = st.button("Escribir mi historia")
|
112 |
|
113 |
+
# Display uploaded image
|
114 |
+
if uploaded_file is not None:
|
115 |
+
image = Image.open(uploaded_file)
|
116 |
+
col1.image(image, caption="Imagen subida", use_column_width=True)
|
|
|
|
|
117 |
|
118 |
+
# Handling the button click
|
119 |
+
if submit:
|
120 |
+
if uploaded_file or input_prompt:
|
121 |
+
try:
|
122 |
+
image_data = input_image_setup(uploaded_file)
|
123 |
+
response = get_gemini_response(input_prompt, image_data, genre, length, language, mood)
|
124 |
+
col2.subheader("Contenido generado:")
|
125 |
+
col2.write(response)
|
126 |
+
except ValueError as e:
|
127 |
+
col2.error(f"Error: {str(e)}")
|
128 |
+
else:
|
129 |
+
col2.error("Por favor, sube una imagen o proporciona un mensaje.")
|