caarleexx commited on
Commit
2635dd8
·
verified ·
1 Parent(s): 8933de2

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +49 -64
app.py CHANGED
@@ -1,94 +1,79 @@
1
  import os
2
- import json
3
  import traceback
4
  import chainlit as cl
5
- import httpx # Importamos a nova biblioteca
6
 
7
- # 1. Configurações do Modelo e API
 
 
 
8
  MODEL_ID = "groq/compound"
9
- GROQ_API_KEY = os.environ.get("GROQ_API_KEY")
10
- API_URL = "https://api.groq.com/openai/v1/chat/completions"
11
 
12
- # 2. Início do Chat
13
  @cl.on_chat_start
14
  def start_chat():
15
- """Define o prompt de sistema para guiar o comportamento do modelo."""
16
  system_prompt = (
17
  "Você é um assistente de pesquisa avançado. "
18
  "Quando um usuário perguntar sobre o conteúdo de um site (ex: 'o que tem no site X?'), "
19
  "sua tarefa é usar internamente as ferramentas 'visit_website' ou 'web_search' para obter as informações. "
20
- "Após coletar os dados, você deve fornecer uma resposta final completa, bem estruturada e detalhada em markdown, "
21
- "organizando o conteúdo em seções claras com títulos e listas, como um resumo executivo."
22
  )
23
  cl.user_session.set(
24
  "message_history",
25
  [{"role": "system", "content": system_prompt}]
26
  )
27
 
28
- # 3. Lógica Principal de Mensagem (usando httpx)
29
  @cl.on_message
30
  async def main(message: cl.Message):
31
- """Processa a mensagem do usuário usando httpx para mais controle sobre o stream."""
32
  message_history = cl.user_session.get("message_history")
33
  message_history.append({"role": "user", "content": message.content})
34
 
35
- msg = cl.Message(content="")
36
- await msg.send()
 
37
 
38
- full_response = ""
39
  try:
40
- # Montamos os headers e o payload manualmente
41
- headers = {
42
- "Authorization": f"Bearer {GROQ_API_KEY}",
43
- "Content-Type": "application/json",
44
- }
45
-
46
- payload = {
47
- "model": MODEL_ID,
48
- "messages": message_history,
49
- "temperature": 0.7,
50
- "max_tokens": 4096,
51
- "stream": True, # Essencial para o streaming
52
- "compound_custom": {"tools": {"enabled_tools": ["web_search", "code_interpreter", "visit_website"]}}
53
- }
54
 
55
- # Usamos um AsyncClient do httpx para fazer a requisição
56
- async with httpx.AsyncClient(timeout=60) as client:
57
- # client.stream nos dá um objeto de resposta para iterar
58
- async with client.stream("POST", API_URL, headers=headers, json=payload) as response:
59
- # Verificamos se a requisição foi bem-sucedida
60
- response.raise_for_status()
61
-
62
- # Iteramos sobre as linhas da resposta (formato SSE)
63
- async for line in response.aiter_lines():
64
- if line.startswith("data: "):
65
- # Removemos o prefixo "data: "
66
- json_data = line.removeprefix("data: ").strip()
67
-
68
- # O stream termina com um sinal "[DONE]"
69
- if json_data == "[DONE]":
70
- break
71
-
72
- # Convertemos o texto JSON em um dicionário Python
73
- chunk = json.loads(json_data)
 
 
74
 
75
- # Extraímos o token de texto, se existir
76
- if chunk["choices"] and chunk["choices"][0]["delta"].get("content"):
77
- token = chunk["choices"][0]["delta"]["content"]
78
- await msg.stream_token(token)
79
- full_response += token
80
-
81
  except Exception as e:
 
 
82
  print(f"--- ERRO INESPERADO CAPTURADO ---")
83
  traceback.print_exc()
84
- await msg.update(content=f"Desculpe, ocorreu um erro: {e}")
85
- return
86
-
87
- # Finaliza a mensagem e atualiza o histórico
88
- if full_response.strip():
89
- await msg.update()
90
- message_history.append({"role": "assistant", "content": full_response})
91
- cl.user_session.set("message_history", message_history)
92
- else:
93
- # Se não houve resposta, informa o usuário e remove a mensagem vazia
94
- await msg.update(content="O modelo não gerou uma resposta desta vez.")
 
1
  import os
2
+ import asyncio
3
  import traceback
4
  import chainlit as cl
5
+ from groq import Groq
6
 
7
+ # 1. Configuração do Cliente Groq
8
+ client = Groq()
9
+
10
+ # 2. Configurações do Modelo
11
  MODEL_ID = "groq/compound"
 
 
12
 
13
+ # 3. Início do Chat
14
  @cl.on_chat_start
15
  def start_chat():
 
16
  system_prompt = (
17
  "Você é um assistente de pesquisa avançado. "
18
  "Quando um usuário perguntar sobre o conteúdo de um site (ex: 'o que tem no site X?'), "
19
  "sua tarefa é usar internamente as ferramentas 'visit_website' ou 'web_search' para obter as informações. "
20
+ "Após coletar os dados, você deve fornecer uma resposta final completa, bem estruturada e detalhada em markdown."
 
21
  )
22
  cl.user_session.set(
23
  "message_history",
24
  [{"role": "system", "content": system_prompt}]
25
  )
26
 
27
+ # 4. Lógica Principal (Modelo Robusto)
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
+ # Mensagem de status para o usuário saber que algo está acontecendo
34
+ status_msg = cl.Message(content="Processando sua solicitação com a Groq...")
35
+ await status_msg.send()
36
 
 
37
  try:
38
+ # --- ETAPA 1: BUSCAR A RESPOSTA COMPLETA (SEM STREAMING) ---
39
+ # Esta é a mudança crucial. Fazemos uma chamada bloqueante (assíncrona)
40
+ # para obter a resposta inteira de uma vez.
41
+ response = client.chat.completions.create(
42
+ model=MODEL_ID,
43
+ messages=message_history,
44
+ temperature=0.7,
45
+ max_tokens=4096,
46
+ stream=False, # MUDANÇA CRÍTICA
47
+ compound_custom={"tools": {"enabled_tools": ["web_search", "code_interpreter", "visit_website"]}}
48
+ )
49
+
50
+ full_response = response.choices[0].message.content
 
51
 
52
+ # Remove a mensagem de status "Processando..."
53
+ await status_msg.remove()
54
+
55
+ # --- ETAPA 2: "TRANSMITIR" A RESPOSTA RECEBIDA PARA A INTERFACE ---
56
+ # Simulamos o streaming para uma melhor experiência do usuário.
57
+ if full_response and full_response.strip():
58
+ msg = cl.Message(content="")
59
+ await msg.send()
60
+
61
+ for token in full_response:
62
+ await msg.stream_token(token)
63
+ # Um pequeno atraso para tornar o streaming visível
64
+ await asyncio.sleep(0.005)
65
+
66
+ await msg.update()
67
+
68
+ # Adiciona a resposta final ao histórico
69
+ message_history.append({"role": "assistant", "content": full_response})
70
+ cl.user_session.set("message_history", message_history)
71
+ else:
72
+ await cl.Message(content="O modelo não retornou uma resposta.").send()
73
 
 
 
 
 
 
 
74
  except Exception as e:
75
+ # Se a chamada à API falhar, removemos o status e mostramos o erro.
76
+ await status_msg.remove()
77
  print(f"--- ERRO INESPERADO CAPTURADO ---")
78
  traceback.print_exc()
79
+ await cl.Message(content=f"Desculpe, ocorreu um erro: {e}").send()