cadasme commited on
Commit
18af915
·
1 Parent(s): 2b7bcda

refactor: v1

Browse files
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 optimize_content_with_langchain
5
- from cases.content_generation import content_generation_with_langchain
6
 
7
  load_dotenv()
8
 
9
- OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
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. **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
- 2. **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.
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
- def content_generation_with_langchain(content, openai_key):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
  chat = ChatOpenAI(
14
- model="gpt-3.5-turbo-0613",
15
- temperature=0,
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
- def optimize_content_with_langchain(content, openai_key):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
  chat = ChatOpenAI(
14
- model="gpt-3.5-turbo-0613",
15
- temperature=0,
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 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)