|
import os |
|
from dotenv import find_dotenv, load_dotenv |
|
import streamlit as st |
|
from typing import Generator |
|
from groq import Groq |
|
|
|
|
|
_ = load_dotenv(find_dotenv()) |
|
|
|
|
|
st.set_page_config(page_icon="📃", layout="wide", page_title="Groq & LLaMA3.1 Chat Bot...") |
|
|
|
|
|
st.markdown( |
|
""" |
|
<style> |
|
.menu-container { |
|
padding: 20px; |
|
background-color: transparent; /* Fondo transparente */ |
|
border-bottom: 1px solid #e1e1e1; |
|
} |
|
.menu-title { |
|
font-size: 24px; |
|
font-weight: bold; |
|
margin-bottom: 10px; |
|
} |
|
.menu-description { |
|
line-height: 1.5; |
|
} |
|
.menu-description a { |
|
color: #1f77b4; |
|
text-decoration: none; |
|
} |
|
.menu-description a:hover { |
|
text-decoration: underline; |
|
} |
|
</style> |
|
<div class="menu-container"> |
|
<p class="menu-title">Bot con I.A. para crear BENEFICIOS de productos.</p> |
|
<p class="menu-description"> |
|
Estos BENEFICIOS van en la descripcion LARGA de producto (En la parte de ARRIBA).<br><br> |
|
Si desea usar otro BOT de I.A. escoja:<br> |
|
<a href='https://sentrycom-mc-bot.hf.space'>Marketing de Contenidos |</a> |
|
<a href='https://sentrycom-bot-tit.hf.space'> Creacion de TITULOS |</a> |
|
<a href='https://sentrycom-bot-dp.hf.space'> Descripcion de Productos |</a> |
|
<a href='https://sentrycom-bot-cp.hf.space'> Caracteristicas de Productos |</a> |
|
<a href='https://wa.me/51927929109'> Desarrollado por MAGNET IMPACT - Agencia de Marketing Digital</a> |
|
</p> |
|
</div> |
|
""", |
|
unsafe_allow_html=True |
|
) |
|
|
|
|
|
client = Groq( |
|
api_key=os.environ['GROQ_API_KEY'], |
|
) |
|
|
|
|
|
if "messages" not in st.session_state: |
|
st.session_state.messages = [] |
|
|
|
if "selected_model" not in st.session_state: |
|
st.session_state.selected_model = "mixtral-8x7b-32768" |
|
|
|
|
|
models = { |
|
"mixtral-8x7b-32768": { |
|
"name": "Mixtral-8x7b-Instruct-v0.1", |
|
"tokens": 32768, |
|
"developer": "Mistral", |
|
}, |
|
} |
|
|
|
|
|
model_option = "mixtral-8x7b-32768" |
|
max_tokens_range = models[model_option]["tokens"] |
|
|
|
|
|
st.session_state.max_tokens = max_tokens_range |
|
|
|
|
|
if st.session_state.selected_model != model_option: |
|
st.session_state.messages = [] |
|
st.session_state.selected_model = model_option |
|
|
|
|
|
if st.button("Limpiar Chat"): |
|
st.session_state.messages = [] |
|
|
|
|
|
assistant_avatar = "botm.png" |
|
|
|
|
|
for message in st.session_state.messages: |
|
avatar = assistant_avatar if message["role"] == "assistant" else "🧑💻" |
|
with st.chat_message(message["role"], avatar=avatar): |
|
st.markdown(message["content"]) |
|
|
|
def generate_chat_responses(chat_completion) -> Generator[str, None, None]: |
|
"""Generar contenido de respuesta del chat a partir de la respuesta de la API de Groq.""" |
|
for chunk in chat_completion: |
|
if chunk.choices[0].delta.content: |
|
yield chunk.choices[0].delta.content |
|
|
|
|
|
private_instruction = ( |
|
"# Quiero que actúes como consultor de marketing profesional. # Te proporcionaré una persona que te dará el nombre de un producto o servicio para que generes publicaciones de marketing de contenidos en español con atractivos emojis que motiven al lector a conocer más sobre [producto] a través de tips, guías y sugerencias útiles. # Debes utilizar tus conocimientos de Marketing de Contenidos que deben ser inspiradores, completamente enfocados a aportar valor al lector sin publicidad directa o indirecta. # Generar contenido de al menos 5 párrafos cortos pero relevantes. Comprueba que el contenido anterior no se repite. # Generar contenido con párrafos de entre 10 y 20 palabras. # Utiliza emojis atractivos y títulos como: \"Los 5 mejores trucos para [acción]\". \"La guía definitiva para principiantes sobre [tema].\" \"¿Quieres [resultado]? Te muestro cómo lograrlo en 5 pasos.\" # Usa consejos prácticos como: \"Con estos 5 consejos podrás \"Obtendrás [resultado].\" \"Cinco formas innovadoras de utilizar [producto] en tu vida diaria.\" # Contenido educativo: \"Los errores más comunes y cómo evitarlos.\" \"Mitos y verdades sobre [tema].\" \"Las últimas tendencias que necesitas conocer.\" # Testimonios y ejemplos que conectan emocionalmente: \"Esto es lo que aprendí cuando comencé a usar [producto]\" \"Historias de usuarios reales que resuelto [problema]\" # Generar contenido enfocado a resolver dudas y agregar valor, NO venta directa. ¡Sorpréndeme con tus mejores ideas! # Siempre responde en ESPAÑOL AMERICANO. Para después de terminar el primer marketing de contenidos generado." |
|
) |
|
|
|
|
|
if prompt := st.chat_input("Escribe tu mensaje aquí..."): |
|
st.session_state.messages.append({"role": "user", "content": prompt}) |
|
|
|
with st.chat_message("user", avatar="🧑💻"): |
|
st.markdown(prompt) |
|
|
|
|
|
messages_for_api = [ |
|
{"role": "system", "content": private_instruction}, |
|
] + [ |
|
{"role": m["role"], "content": m["content"]} |
|
for m in st.session_state.messages |
|
] |
|
|
|
|
|
try: |
|
chat_completion = client.chat.completions.create( |
|
model=model_option, |
|
messages=messages_for_api, |
|
max_tokens=max_tokens_range, |
|
stream=True, |
|
) |
|
|
|
|
|
with st.chat_message("assistant", avatar=assistant_avatar): |
|
chat_responses_generator = generate_chat_responses(chat_completion) |
|
full_response = st.write_stream(chat_responses_generator) |
|
|
|
|
|
if isinstance(full_response, str): |
|
st.session_state.messages.append( |
|
{"role": "assistant", "content": full_response} |
|
) |
|
else: |
|
combined_response = "\n".join(str(item) for item in full_response) |
|
st.session_state.messages.append( |
|
{"role": "assistant", "content": combined_response} |
|
) |
|
|
|
except Exception as e: |
|
st.error(e, icon="❌") |
|
|