drguilhermeapolinario commited on
Commit
6cd58f9
·
verified ·
1 Parent(s): 295cbd6

Create groq.py

Browse files
Files changed (1) hide show
  1. pages/groq.py +117 -0
pages/groq.py ADDED
@@ -0,0 +1,117 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ from typing import Generator
3
+ from groq import Groq
4
+
5
+ st.set_page_config(page_icon="💬", layout="wide",
6
+ page_title="Groq Vai Zummm...")
7
+
8
+ def icon(emoji: str):
9
+ """Mostra um emoji como um ícone de página no estilo Notion."""
10
+ st.write(
11
+ f'<span style="font-size: 78px; line-height: 1">{emoji}</span>',
12
+ unsafe_allow_html=True,
13
+ )
14
+
15
+ icon("🏎️")
16
+
17
+ st.subheader("Aplicativo Groq Chat Streamlit", divider="arco-íris", anchor=False)
18
+
19
+ client = Groq(
20
+ api_key=st.secrets["GROQ_API_KEY"],
21
+ )
22
+
23
+ # Inicializar histórico de chat e modelo selecionado
24
+ if "messages" not in st.session_state:
25
+ st.session_state.messages = []
26
+
27
+ if "selected_model" not in st.session_state:
28
+ st.session_state.selected_model = None
29
+
30
+ # Definir detalhes dos modelos
31
+ modelos = {
32
+ "gemma-7b-it": {"name": "Gemma-7b-it", "tokens": 8192, "developer": "Google"},
33
+ "llama2-70b-4096": {"name": "LLaMA2-70b-chat", "tokens": 4096, "developer": "Meta"},
34
+ "llama3-70b-8192": {"name": "LLaMA3-70b-8192", "tokens": 8192, "developer": "Meta"},
35
+ "llama3-8b-8192": {"name": "LLaMA3-8b-8192", "tokens": 8192, "developer": "Meta"},
36
+ "mixtral-8x7b-32768": {"name": "Mixtral-8x7b-Instruct-v0.1", "tokens": 32768, "developer": "Mistral"},
37
+ }
38
+
39
+ # Layout para seleção do modelo e controle deslizante de max_tokens
40
+ col1, col2 = st.columns(2)
41
+
42
+ with col1:
43
+ opcao_modelo = st.selectbox(
44
+ "Escolha um modelo:",
45
+ options=list(modelos.keys()),
46
+ format_func=lambda x: modelos[x]["name"],
47
+ index=4 # Padrão para mixtral
48
+ )
49
+
50
+ # Detectar mudança de modelo e limpar histórico de chat se o modelo mudou
51
+ if st.session_state.selected_model != opcao_modelo:
52
+ st.session_state.messages = []
53
+ st.session_state.selected_model = opcao_modelo
54
+
55
+ intervalo_max_tokens = modelos[opcao_modelo]["tokens"]
56
+
57
+ with col2:
58
+ # Ajustar controle deslizante de max_tokens dinamicamente com base no modelo selecionado
59
+ max_tokens = st.slider(
60
+ "Máximo de Tokens:",
61
+ min_value=512, # Valor mínimo para permitir alguma flexibilidade
62
+ max_value=intervalo_max_tokens,
63
+ # Valor padrão ou máximo permitido, se for menor
64
+ value=min(32768, intervalo_max_tokens),
65
+ step=512,
66
+ help=f"Ajuste o número máximo de tokens (palavras) para a resposta do modelo. Máximo para o modelo selecionado: {intervalo_max_tokens}"
67
+ )
68
+
69
+ # Exibir mensagens do chat do histórico na reexecução do aplicativo
70
+ for message in st.session_state.messages:
71
+ avatar = '🤖' if message["role"] == "assistant" else '👨‍💻'
72
+ with st.chat_message(message["role"], avatar=avatar):
73
+ st.markdown(message["content"])
74
+
75
+ def generate_chat_responses(chat_completion) -> Generator[str, None, None]:
76
+ """Gera conteúdo de resposta do chat a partir da resposta da API Groq."""
77
+ for chunk in chat_completion:
78
+ if chunk.choices[0].delta.content:
79
+ yield chunk.choices[0].delta.content
80
+
81
+ if prompt := st.chat_input("Digite seu prompt aqui..."):
82
+ st.session_state.messages.append({"role": "user", "content": prompt})
83
+
84
+ with st.chat_message("user", avatar='👨‍💻'):
85
+ st.markdown(prompt)
86
+
87
+ # Buscar resposta da API Groq
88
+ try:
89
+ chat_completion = client.chat.completions.create(
90
+ model=opcao_modelo,
91
+ messages=[
92
+ {
93
+ "role": m["role"],
94
+ "content": m["content"]
95
+ }
96
+ for m in st.session_state.messages
97
+ ],
98
+ max_tokens=max_tokens,
99
+ stream=True
100
+ )
101
+
102
+ # Usar a função geradora com st.write_stream
103
+ with st.chat_message("assistant", avatar="🤖"):
104
+ chat_responses_generator = generate_chat_responses(chat_completion)
105
+ full_response = st.write_stream(chat_responses_generator)
106
+ except Exception as e:
107
+ st.error(e, icon="🚨")
108
+
109
+ # Adicionar a resposta completa ao st.session_state.messages
110
+ if isinstance(full_response, str):
111
+ st.session_state.messages.append(
112
+ {"role": "assistant", "content": full_response})
113
+ else:
114
+ # Lidar com o caso em que full_response não é uma string
115
+ combined_response = "\n".join(str(item) for item in full_response)
116
+ st.session_state.messages.append(
117
+ {"role": "assistant", "content": combined_response})