Spaces:
Runtime error
Runtime error
refactor: v1
Browse files- app.py +15 -35
- cases/content_generation.py +72 -16
- cases/monitoring.py +1 -1
- cases/optimize_content.py +47 -15
app.py
CHANGED
@@ -1,60 +1,40 @@
|
|
1 |
from dotenv import load_dotenv
|
2 |
-
import os
|
3 |
import streamlit as st
|
4 |
-
from cases.optimize_content import
|
5 |
-
from cases.content_generation import
|
6 |
|
7 |
load_dotenv()
|
8 |
|
9 |
-
|
10 |
|
11 |
-
def display_home():
|
12 |
st.title("Bienvenido a la página de inicio")
|
13 |
st.markdown('''
|
14 |
En esta aplicación, exploraremos los siguientes casos de uso de SEO potenciado por IA:
|
15 |
-
1. **
|
16 |
-
2. **
|
17 |
Para continuar, selecciona el caso de uso en la barra lateral.
|
18 |
''')
|
19 |
|
20 |
-
def handle_seo_action(text, action, action_text):
|
21 |
-
if text:
|
22 |
-
with st.spinner(f'{action_text}...'):
|
23 |
-
return action(text, OPENAI_API_KEY)
|
24 |
-
return None
|
25 |
-
|
26 |
-
def display_content_optimization():
|
27 |
-
st.title("Optimización de Contenido")
|
28 |
-
st.markdown("Por favor, copia y pega tu artículo a continuación:")
|
29 |
-
article_content = st.text_area("Contenido del Artículo")
|
30 |
-
|
31 |
-
optimized_content = handle_seo_action(article_content, optimize_content_with_langchain, 'Optimizando el contenido para SEO')
|
32 |
-
if optimized_content:
|
33 |
-
st.success('Optimización de contenido completada.')
|
34 |
-
st.markdown(optimized_content)
|
35 |
-
|
36 |
-
def display_content_generation():
|
37 |
-
st.title("Generación de Contenido")
|
38 |
-
st.markdown("Por favor, una descripción del tipo de contenido que deseas generar:")
|
39 |
-
content_type = st.text_area("Tipo de Contenido (Artículo de ventas, Posts sobre IA en RRSS, Newsletter de Suscripcion mensual sobre Tecnologia)")
|
40 |
-
|
41 |
-
generated_content = handle_seo_action(content_type, content_generation_with_langchain, 'Creando el contenido optimizado para SEO')
|
42 |
-
if generated_content:
|
43 |
-
st.success('Generación de contenido completada.')
|
44 |
-
st.markdown(generated_content)
|
45 |
|
46 |
MENU_FUNCTIONS = {
|
47 |
'Home': display_home,
|
48 |
-
'Optimización de Contenido': display_content_optimization,
|
49 |
'Generación de Contenido': display_content_generation,
|
|
|
50 |
}
|
51 |
|
52 |
def main():
|
53 |
st.sidebar.title("Menú")
|
54 |
selection = st.sidebar.radio("SEO Powered By AI", list(MENU_FUNCTIONS.keys()))
|
55 |
|
|
|
|
|
|
|
|
|
|
|
|
|
56 |
menu_function = MENU_FUNCTIONS[selection]
|
57 |
-
menu_function()
|
58 |
|
59 |
if __name__ == '__main__':
|
60 |
-
main()
|
|
|
1 |
from dotenv import load_dotenv
|
|
|
2 |
import streamlit as st
|
3 |
+
from cases.optimize_content import display_content_optimization
|
4 |
+
from cases.content_generation import display_content_generation
|
5 |
|
6 |
load_dotenv()
|
7 |
|
8 |
+
# Movemos la asignación de la clave API a un lugar más abajo en el código.
|
9 |
|
10 |
+
def display_home(api_key, model):
|
11 |
st.title("Bienvenido a la página de inicio")
|
12 |
st.markdown('''
|
13 |
En esta aplicación, exploraremos los siguientes casos de uso de SEO potenciado por IA:
|
14 |
+
1. **Generación de Contenido**: Las herramientas de AI pueden generar tu contenido, como artículos, newsletters o posts para RRSS, de modo que sea más amigable para SEO.
|
15 |
+
2. **Optimización de Contenido**: Las herramientas de AI pueden sugerir mejoras a tu contenido, como cambios en la redacción o la ubicación de palabras clave, para que sea más amigable para SEO. También pueden analizar el rendimiento SEO de tu contenido existente y sugerir mejoras.
|
16 |
Para continuar, selecciona el caso de uso en la barra lateral.
|
17 |
''')
|
18 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
19 |
|
20 |
MENU_FUNCTIONS = {
|
21 |
'Home': display_home,
|
|
|
22 |
'Generación de Contenido': display_content_generation,
|
23 |
+
'Optimización de Contenido': display_content_optimization,
|
24 |
}
|
25 |
|
26 |
def main():
|
27 |
st.sidebar.title("Menú")
|
28 |
selection = st.sidebar.radio("SEO Powered By AI", list(MENU_FUNCTIONS.keys()))
|
29 |
|
30 |
+
st.sidebar.markdown("Por favor selecciona el modelo de AI que prefieres utilizar:")
|
31 |
+
model = st.sidebar.selectbox('Modelo de AI', ('gpt-3.5-turbo', 'gpt-3.5-turbo-0613', 'gpt-4'))
|
32 |
+
|
33 |
+
st.sidebar.markdown("Por favor ingresa tu API Key:")
|
34 |
+
api_key = st.sidebar.text_input("API Key", type='password')
|
35 |
+
|
36 |
menu_function = MENU_FUNCTIONS[selection]
|
37 |
+
menu_function(api_key, model)
|
38 |
|
39 |
if __name__ == '__main__':
|
40 |
+
main()
|
cases/content_generation.py
CHANGED
@@ -9,26 +9,82 @@ from langchain.prompts.chat import (
|
|
9 |
)
|
10 |
|
11 |
|
12 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
13 |
chat = ChatOpenAI(
|
14 |
-
model=
|
15 |
-
temperature=
|
16 |
openai_api_key=openai_key,
|
17 |
-
headers=HEADERS,
|
18 |
)
|
19 |
|
20 |
-
template = """
|
21 |
-
Debes actuar como un agente experto en SEO y Marketing Digital, y utilizando tus habilidades y conocimientos
|
22 |
-
deberás generar contenido basado en las necesidades del usuario optimizado para SEO.
|
23 |
-
Basado en esto deberás:
|
24 |
-
1. Generar un esquema, esbozando la estrucutra del contenido a generar. Esto puede incluir una introducción, algunos puntos principales y una conclusión. La introducción debe ser atractiva y captar la atención del lector, los puntos principales deben proporcionar información valiosa y la conclusión debe resumir los puntos clave y proporcionar una llamada a la acción.
|
25 |
-
2. Escritura del contenido: Desarrolla cada sección de tu esquema en párrafos completos. Intenta mantener cada párrafo corto y fácil de leer. Utiliza un lenguaje claro y directo, y evita el jergón siempre que sea posible. Incluye tus palabras clave de manera natural en el texto.
|
26 |
-
3. Inclusión de emojies: Los emojis pueden hacer que tu contenido sea más atractivo y amigable. Sin embargo, debes usarlos con moderación para evitar sobrecargar tu contenido. Inclúyelos en puntos donde puedas resaltar una emoción o un punto importante, pero asegúrate de que sean apropiados para el tono y el contenido de tu artículo.
|
27 |
-
4. Optimización SEO: Asegúrate de que tus palabras clave aparecen en los lugares importantes de tu contenido, como el título, los subtítulos, el primer y último párrafo, y la descripción de la meta.
|
28 |
-
5. Analisis: Debes analizar el contenido generado con el fin de identificar palabras claves que puedan optimizarse para SEO, puntos de mejora en la estructura y detalle del contenido.
|
29 |
-
"""
|
30 |
-
st.markdown("**Instrucciones del bot:**")
|
31 |
-
st.markdown(template)
|
32 |
system_message_prompt = SystemMessagePromptTemplate.from_template(template)
|
33 |
human_template = "{content}"
|
34 |
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
|
|
|
9 |
)
|
10 |
|
11 |
|
12 |
+
CREATIVE_TEMPLATE = """Debes actuar como un agente experto en SEO y Marketing Digital, y utilizando tus habilidades y conocimientos deberás proporcionar ideas innovadoras para la creación de contenido basado en las necesidades del usuario.\n
|
13 |
+
Analiza la descripción proporcionada y propone varias ideas de temas, ángulos o enfoques que podrían ser interesantes y atractivos para la audiencia, manteniendo siempre un enfoque de optimización SEO.
|
14 |
+
"""
|
15 |
+
|
16 |
+
GENERATIVE_TEMPLATE = """Debes actuar como un agente experto en SEO y Marketing Digital, y utilizando tus habilidades y conocimientos deberás generar contenido basado en las ideas y necesidades del usuario optimizado para SEO.\n
|
17 |
+
1. Generar un esquema, esbozando la estructura del contenido a generar.\n
|
18 |
+
2. Escritura del contenido: Desarrolla cada sección de tu esquema en párrafos completos.\n
|
19 |
+
3. Inclusión de emojies: Los emojis pueden hacer que tu contenido sea más atractivo y amigable.\n
|
20 |
+
4. Optimización SEO: Asegúrate de que tus palabras clave aparecen en los lugares importantes de tu contenido.\n
|
21 |
+
5. Análisis: Debes analizar el contenido generado con el fin de identificar palabras claves que puedan optimizarse para SEO, puntos de mejora en la estructura y detalle del contenido.
|
22 |
+
"""
|
23 |
+
|
24 |
+
def handle_seo_action(template, action, action_text, model, api_key, creativity_level=None):
|
25 |
+
if api_key:
|
26 |
+
if template:
|
27 |
+
with st.spinner(f'{action_text}...'):
|
28 |
+
if creativity_level:
|
29 |
+
return action(None, model, api_key, creativity_level, template)
|
30 |
+
return action(None, model, api_key, template)
|
31 |
+
else:
|
32 |
+
st.warning('Please enter some template to generate.')
|
33 |
+
else:
|
34 |
+
st.warning('Please enter your API Key.')
|
35 |
+
return None
|
36 |
+
|
37 |
+
|
38 |
+
def get_prompt_template(mode, include_emojis, tone, user_request):
|
39 |
+
base_template = CREATIVE_TEMPLATE if mode == "Lluvia de Ideas" else GENERATIVE_TEMPLATE
|
40 |
+
if include_emojis:
|
41 |
+
base_template += "\n\nIncluye emojis en tu contenido para hacerlo más atractivo."
|
42 |
+
if tone == 'Formal':
|
43 |
+
base_template += "\n\nEl tono del contenido debe ser formal."
|
44 |
+
|
45 |
+
if user_request:
|
46 |
+
base_template += f"\n\nSolicitud del usuario: {user_request}"
|
47 |
+
|
48 |
+
return base_template
|
49 |
+
|
50 |
+
def display_content_generation(api_key, model):
|
51 |
+
st.title("Generación de Contenido Digital")
|
52 |
+
|
53 |
+
# Agregamos las opciones personalizables
|
54 |
+
st.markdown("Personaliza tu contenido:")
|
55 |
+
mode = st.radio("Modo", ['Lluvia de Ideas', 'Generador de Contenido'])
|
56 |
+
include_emojis = st.checkbox("Incluir emojis")
|
57 |
+
tone = st.selectbox("Tono del contenido", ['Formal', 'Informal', 'Amigable', 'Profesional'])
|
58 |
+
|
59 |
+
st.markdown("Selecciona el nivel de creatividad:")
|
60 |
+
creativity_level = st.slider("Nivel de Creatividad", min_value=0.0, max_value=1.0, value=0.5, step=0.1)
|
61 |
+
|
62 |
+
# Allow the user to modify the template and enter user request
|
63 |
+
st.markdown("Modifica las instrucciones del bot si lo deseas:")
|
64 |
+
user_request = st.text_input("Solicitud del usuario")
|
65 |
+
_ = st.text_area("Previsualización de Solicitud", get_prompt_template(mode, include_emojis, tone, user_request), height=200)
|
66 |
+
|
67 |
+
if st.button("Generar"):
|
68 |
+
# Combine template and user request
|
69 |
+
template_with_request = get_prompt_template(mode, include_emojis, tone, user_request)
|
70 |
+
|
71 |
+
# Pass the template to handle_seo_action function
|
72 |
+
generated_content = handle_seo_action(template_with_request, content_generation_with_langchain, 'Creando el contenido optimizado para SEO', model, api_key, creativity_level)
|
73 |
+
|
74 |
+
if generated_content:
|
75 |
+
st.success('Generación de contenido completada.')
|
76 |
+
st.markdown("**Contenido generado:**")
|
77 |
+
st.markdown(f"> {generated_content}")
|
78 |
+
|
79 |
+
|
80 |
+
def content_generation_with_langchain(content, model, openai_key, creativity_level, template):
|
81 |
chat = ChatOpenAI(
|
82 |
+
model=model,
|
83 |
+
temperature=creativity_level,
|
84 |
openai_api_key=openai_key,
|
85 |
+
headers=HEADERS if HEADERS else None,
|
86 |
)
|
87 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
88 |
system_message_prompt = SystemMessagePromptTemplate.from_template(template)
|
89 |
human_template = "{content}"
|
90 |
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
|
cases/monitoring.py
CHANGED
@@ -5,7 +5,7 @@ openai.api_base = "https://oai.hconeai.com/v1"
|
|
5 |
HELICONE_API_KEY = getenv("HELICONE_API_KEY")
|
6 |
|
7 |
HEADERS = {
|
8 |
-
"Helicone-Auth": f"Bearer {HELICONE_API_KEY}",
|
9 |
"Helicone-Cache-Enabled": "true",
|
10 |
"Helicone-Property-App": "HuggingFace",
|
11 |
"Helicone-Property-DataSource": "SEO Powered by AI",
|
|
|
5 |
HELICONE_API_KEY = getenv("HELICONE_API_KEY")
|
6 |
|
7 |
HEADERS = {
|
8 |
+
"Helicone-Auth": f"Bearer {HELICONE_API_KEY}" if HELICONE_API_KEY else "",
|
9 |
"Helicone-Cache-Enabled": "true",
|
10 |
"Helicone-Property-App": "HuggingFace",
|
11 |
"Helicone-Property-DataSource": "SEO Powered by AI",
|
cases/optimize_content.py
CHANGED
@@ -9,27 +9,59 @@ from langchain.prompts.chat import (
|
|
9 |
|
10 |
from .monitoring import HEADERS
|
11 |
|
12 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
13 |
chat = ChatOpenAI(
|
14 |
-
model=
|
15 |
-
temperature=
|
16 |
-
openai_api_key=
|
17 |
headers=HEADERS
|
18 |
)
|
19 |
|
20 |
-
template = """
|
21 |
-
Debes actuar como un agente experto en SEO y Marketing Digital, y utilizando tus habilidades y conocimientos
|
22 |
-
deberás ayudar al usuario a determinar como mejorar el SEO del articulo en el cual este este trabajando.
|
23 |
-
Basado en esto deberás:
|
24 |
-
1. Proporcionar puntos de mejora respecto al contenido del articulo.
|
25 |
-
2. Proporcionar alternativas para titulo con el fin de generar más tracción a que los usuarios realicen click.
|
26 |
-
3. Proporcionar una lista de keywords que puedan incluirse en el contenido del articulo y que NO se encuentren en el contenido proporcionado por el usuario.
|
27 |
-
"""
|
28 |
-
st.markdown("**Instrucciones del bot:**")
|
29 |
-
st.markdown(template)
|
30 |
system_message_prompt = SystemMessagePromptTemplate.from_template(template)
|
|
|
|
|
31 |
human_template = "{content}"
|
32 |
-
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
|
33 |
chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])
|
34 |
|
35 |
chain = LLMChain(llm=chat, prompt=chat_prompt)
|
|
|
9 |
|
10 |
from .monitoring import HEADERS
|
11 |
|
12 |
+
OPTIMIZE_TEMPLATE = """Debes actuar como un agente experto en SEO y Marketing Digital, y utilizando tus habilidades y conocimientos deberás ayudar al usuario a determinar cómo mejorar el SEO del artículo en el cual este este trabajando.\n
|
13 |
+
Basado en esto deberás:
|
14 |
+
1. Proporcionar puntos de mejora respecto al contenido del artículo.
|
15 |
+
2. Proporcionar alternativas para el título con el fin de generar más tracción y que los usuarios realicen clic.
|
16 |
+
3. Proporcionar una lista de palabras clave que puedan incluirse en el contenido del artículo y que NO se encuentren en el contenido proporcionado por el usuario.
|
17 |
+
"""
|
18 |
+
|
19 |
+
def handle_seo_action(content, action, action_text, model, api_key, creativity_level=None, template=None):
|
20 |
+
if content:
|
21 |
+
with st.spinner(f'{action_text}...'):
|
22 |
+
if creativity_level:
|
23 |
+
return action(content, model, api_key, creativity_level, template)
|
24 |
+
return action(content, model, api_key, template)
|
25 |
+
return None
|
26 |
+
|
27 |
+
|
28 |
+
def display_content_optimization(api_key, model):
|
29 |
+
st.title("Optimización de Contenido")
|
30 |
+
st.markdown("Por favor, copia y pega tu artículo a continuación:")
|
31 |
+
|
32 |
+
# Agregar un estado para almacenar el contenido del artículo ingresado por el usuario
|
33 |
+
article_content = st.text_area("Contenido del Artículo", height=200, key="article_content")
|
34 |
+
|
35 |
+
st.markdown("Selecciona el nivel de creatividad:")
|
36 |
+
creativity_level = st.slider("Nivel de Creatividad", min_value=0.0, max_value=1.0, value=0.5, step=0.1)
|
37 |
+
|
38 |
+
# Mostrar el prompt template en un textarea para que el usuario pueda verlo y editarlo
|
39 |
+
st.markdown("**Instrucciones del bot:**")
|
40 |
+
template = st.text_area("Prompt Template", value=OPTIMIZE_TEMPLATE, height=200)
|
41 |
+
|
42 |
+
if st.button("Enviar"):
|
43 |
+
# Concatenar el contenido ingresado por el usuario con el prompt template
|
44 |
+
prompt_template = template + f"\n\n{article_content}"
|
45 |
+
|
46 |
+
optimized_content = handle_seo_action(article_content, optimize_content_with_langchain, 'Optimizando el contenido para SEO', model, api_key, creativity_level, prompt_template)
|
47 |
+
if optimized_content:
|
48 |
+
st.success('Optimización de contenido completada.')
|
49 |
+
st.markdown(optimized_content)
|
50 |
+
|
51 |
+
|
52 |
+
def optimize_content_with_langchain(content, model, api_key, creativity_level=None, template=None):
|
53 |
chat = ChatOpenAI(
|
54 |
+
model=model,
|
55 |
+
temperature=creativity_level,
|
56 |
+
openai_api_key=api_key,
|
57 |
headers=HEADERS
|
58 |
)
|
59 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
60 |
system_message_prompt = SystemMessagePromptTemplate.from_template(template)
|
61 |
+
|
62 |
+
# Actualizar el contenido del usuario en el template de mensaje humano
|
63 |
human_template = "{content}"
|
64 |
+
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template, content=content)
|
65 |
chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])
|
66 |
|
67 |
chain = LLMChain(llm=chat, prompt=chat_prompt)
|