Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -1,9 +1,9 @@
|
|
| 1 |
import os
|
| 2 |
import chainlit as cl
|
| 3 |
from groq import Groq
|
|
|
|
| 4 |
|
| 5 |
# 1. Configuração do Cliente Groq
|
| 6 |
-
# A API key será lida da variável de ambiente GROQ_API_KEY.
|
| 7 |
client = Groq()
|
| 8 |
|
| 9 |
# 2. Configurações do Modelo
|
|
@@ -12,10 +12,6 @@ MODEL_ID = "groq/compound"
|
|
| 12 |
# 3. Início do Chat
|
| 13 |
@cl.on_chat_start
|
| 14 |
def start_chat():
|
| 15 |
-
"""
|
| 16 |
-
Define um prompt de sistema detalhado para instruir o modelo a se comportar
|
| 17 |
-
como um assistente de pesquisa que resume o conteúdo de websites.
|
| 18 |
-
"""
|
| 19 |
system_prompt = (
|
| 20 |
"Você é um assistente de pesquisa avançado. "
|
| 21 |
"Quando um usuário perguntar sobre o conteúdo de um site (ex: 'o que tem no site X?'), "
|
|
@@ -28,57 +24,48 @@ def start_chat():
|
|
| 28 |
[{"role": "system", "content": system_prompt}]
|
| 29 |
)
|
| 30 |
|
| 31 |
-
# 4. Lógica Principal de Mensagem (com
|
| 32 |
@cl.on_message
|
| 33 |
async def main(message: cl.Message):
|
| 34 |
-
"""
|
| 35 |
-
Processa cada nova mensagem do usuário com uma única chamada de streaming para a API
|
| 36 |
-
e exibe os chunks brutos da resposta nos logs.
|
| 37 |
-
"""
|
| 38 |
-
# Recupera e atualiza o histórico da conversa
|
| 39 |
message_history = cl.user_session.get("message_history")
|
| 40 |
message_history.append({"role": "user", "content": message.content})
|
| 41 |
|
| 42 |
-
# Cria a mensagem de resposta vazia para o streaming
|
| 43 |
msg = cl.Message(content="")
|
| 44 |
await msg.send()
|
| 45 |
|
|
|
|
| 46 |
try:
|
| 47 |
-
# Realiza a chamada única e direta para a API, com streaming ativado
|
| 48 |
stream = client.chat.completions.create(
|
| 49 |
model=MODEL_ID,
|
| 50 |
messages=message_history,
|
| 51 |
temperature=0.7,
|
| 52 |
max_tokens=4096,
|
| 53 |
stream=True,
|
| 54 |
-
# Parâmetros essenciais para o modelo 'groq/compound' usar ferramentas
|
| 55 |
compound_custom={"tools": {"enabled_tools": ["web_search", "code_interpreter", "visit_website"]}}
|
| 56 |
)
|
| 57 |
|
| 58 |
-
# Processa o stream e exibe a resposta token a token
|
| 59 |
-
full_response = ""
|
| 60 |
for chunk in stream:
|
| 61 |
-
#
|
| 62 |
-
#
|
| 63 |
-
print("--- CHUNK BRUTO RECEBIDO ---")
|
| 64 |
-
print(chunk.model_dump_json(indent=2))
|
| 65 |
-
print("----------------------------")
|
| 66 |
|
| 67 |
-
# Verifica se o 'chunk' (pedaço) da resposta contém conteúdo de texto
|
| 68 |
if chunk.choices and chunk.choices[0].delta.content:
|
| 69 |
token = chunk.choices[0].delta.content
|
| 70 |
await msg.stream_token(token)
|
| 71 |
full_response += token
|
| 72 |
-
|
| 73 |
-
# Atualiza a mensagem final e o histórico da conversa com a resposta completa
|
| 74 |
-
await msg.update()
|
| 75 |
-
if full_response:
|
| 76 |
-
message_history.append({"role": "assistant", "content": full_response})
|
| 77 |
-
cl.user_session.set("message_history", message_history)
|
| 78 |
-
|
| 79 |
except Exception as e:
|
| 80 |
-
|
| 81 |
-
print(f"Ocorreu um erro inesperado: {e}")
|
| 82 |
-
import traceback
|
| 83 |
traceback.print_exc()
|
| 84 |
-
await msg.update(content=f"Desculpe, ocorreu um erro
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
import os
|
| 2 |
import chainlit as cl
|
| 3 |
from groq import Groq
|
| 4 |
+
import traceback
|
| 5 |
|
| 6 |
# 1. Configuração do Cliente Groq
|
|
|
|
| 7 |
client = Groq()
|
| 8 |
|
| 9 |
# 2. Configurações do Modelo
|
|
|
|
| 12 |
# 3. Início do Chat
|
| 13 |
@cl.on_chat_start
|
| 14 |
def start_chat():
|
|
|
|
|
|
|
|
|
|
|
|
|
| 15 |
system_prompt = (
|
| 16 |
"Você é um assistente de pesquisa avançado. "
|
| 17 |
"Quando um usuário perguntar sobre o conteúdo de um site (ex: 'o que tem no site X?'), "
|
|
|
|
| 24 |
[{"role": "system", "content": system_prompt}]
|
| 25 |
)
|
| 26 |
|
| 27 |
+
# 4. Lógica Principal de Mensagem (com Correção Final)
|
| 28 |
@cl.on_message
|
| 29 |
async def main(message: cl.Message):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 30 |
message_history = cl.user_session.get("message_history")
|
| 31 |
message_history.append({"role": "user", "content": message.content})
|
| 32 |
|
|
|
|
| 33 |
msg = cl.Message(content="")
|
| 34 |
await msg.send()
|
| 35 |
|
| 36 |
+
full_response = ""
|
| 37 |
try:
|
|
|
|
| 38 |
stream = client.chat.completions.create(
|
| 39 |
model=MODEL_ID,
|
| 40 |
messages=message_history,
|
| 41 |
temperature=0.7,
|
| 42 |
max_tokens=4096,
|
| 43 |
stream=True,
|
|
|
|
| 44 |
compound_custom={"tools": {"enabled_tools": ["web_search", "code_interpreter", "visit_website"]}}
|
| 45 |
)
|
| 46 |
|
|
|
|
|
|
|
| 47 |
for chunk in stream:
|
| 48 |
+
# O log de depuração pode ser comentado após confirmar que está tudo ok
|
| 49 |
+
# print(f"--- CHUNK BRUTO RECEBIDO ---\n{chunk.model_dump_json(indent=2)}\n----------------------------")
|
|
|
|
|
|
|
|
|
|
| 50 |
|
|
|
|
| 51 |
if chunk.choices and chunk.choices[0].delta.content:
|
| 52 |
token = chunk.choices[0].delta.content
|
| 53 |
await msg.stream_token(token)
|
| 54 |
full_response += token
|
| 55 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 56 |
except Exception as e:
|
| 57 |
+
print(f"--- ERRO DURANTE O STREAMING ---")
|
|
|
|
|
|
|
| 58 |
traceback.print_exc()
|
| 59 |
+
await msg.update(content=f"Desculpe, ocorreu um erro durante a comunicação com a API: {e}")
|
| 60 |
+
return
|
| 61 |
+
|
| 62 |
+
# --- CORREÇÃO PRINCIPAL APLICADA AQUI ---
|
| 63 |
+
# Finalizamos a mensagem e o histórico de forma mais segura,
|
| 64 |
+
# garantindo que mesmo uma resposta vazia não quebre a sessão.
|
| 65 |
+
if full_response.strip(): # Verifica se a resposta não está vazia ou só com espaços
|
| 66 |
+
await msg.update()
|
| 67 |
+
message_history.append({"role": "assistant", "content": full_response})
|
| 68 |
+
cl.user_session.set("message_history", message_history)
|
| 69 |
+
else:
|
| 70 |
+
# Se nenhuma resposta foi gerada, removemos a mensagem vazia para limpar a interface.
|
| 71 |
+
await msg.remove()
|