caarleexx commited on
Commit
68ced7a
·
verified ·
1 Parent(s): e9e9db9

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +57 -108
app.py CHANGED
@@ -1,135 +1,84 @@
1
  import os
2
- import json
3
- import traceback
4
  import chainlit as cl
5
  from groq import Groq
6
 
7
  # 1. Configuração do Cliente Groq
8
- # Certifique-se de que a variável de ambiente GROQ_API_KEY está definida.
9
- client = Groq(
10
- api_key=os.environ.get("GROQ_API_KEY"),
11
- )
12
 
13
- # 2. Definição do Modelo
14
  MODEL_ID = "groq/compound"
15
 
16
- # 3. Implementação das Ferramentas (Placeholders)
17
- def execute_tool(tool_call: dict) -> str:
18
- """Executa uma ferramenta com base na chamada da API e retorna o resultado como uma string."""
19
- tool_name = tool_call.function.name
20
- try:
21
- args = json.loads(tool_call.function.arguments)
22
- except json.JSONDecodeError:
23
- return f"Erro: Argumentos JSON inválidos para a ferramenta {tool_name}."
24
-
25
- print(f"--- EXECUTANDO FERRAMENTA ---")
26
- print(f"Nome: {tool_name}")
27
- print(f"Argumentos: {args}")
28
- print(f"--------------------------")
29
-
30
- if tool_name == "web_search":
31
- query = args.get("query", "")
32
- # Em um app real, aqui você faria a busca na web.
33
- return f"Resultado da busca na web para '{query}': A Groq é uma empresa de tecnologia que desenvolve o LPU (Language Processing Unit), um novo tipo de processador para cargas de trabalho de IA."
34
-
35
- elif tool_name == "code_interpreter":
36
- code = args.get("code", "")
37
- # Em um app real, aqui você executaria o código de forma segura.
38
- return f"Resultado da execução do código '{code}': O resultado é 42."
39
-
40
- else:
41
- return f"Erro: Ferramenta desconhecida '{tool_name}'"
42
-
43
- # 4. Início do Chat
44
  @cl.on_chat_start
45
  def start_chat():
46
- """Inicializa o histórico da conversa quando um novo chat começa."""
 
 
 
 
 
 
 
 
 
 
47
  cl.user_session.set(
48
  "message_history",
49
- [{"role": "system", "content": "Você é um assistente poderoso que pode navegar na web e executar código para responder às perguntas dos usuários."}]
50
  )
51
 
52
- # 5. Lógica Principal de Mensagem
53
  @cl.on_message
54
  async def main(message: cl.Message):
55
- """Processa cada nova mensagem do usuário."""
 
 
 
 
56
  message_history = cl.user_session.get("message_history")
57
  message_history.append({"role": "user", "content": message.content})
58
 
59
- # NOVO: Exibe uma mensagem de status imediata para o usuário.
60
- status_msg = cl.Message(content="Aguardando resposta da Groq...")
61
- await status_msg.send()
62
 
63
  try:
64
- # PRIMEIRA CHAMADA (Não-Streaming): Decide a ação do modelo.
65
- async with cl.Step(name="Pensando...", show_input=False):
66
- response = client.chat.completions.create(
67
- model=MODEL_ID,
68
- messages=message_history,
69
- temperature=1,
70
- max_completion_tokens=1024,
71
- top_p=1,
72
- stream=True,
73
- stop=None,
74
- compound_custom={"tools":{"enabled_tools":["web_search","code_interpreter","visit_website"]}}
75
- )
76
-
77
-
78
-
79
- # NOVO: Exibe o log da resposta bruta no console para depuração.
80
- print("--- RESPOSTA BRUTA DA API GROQ ---")
81
- print(response.model_dump_json(indent=2))
82
- print("---------------------------------")
83
-
84
- response_message = response.choices[0].message
85
-
86
- # CASO 1: O modelo decidiu usar uma ferramenta.
87
- if response_message.tool_calls:
88
- tool_call = response_message.tool_calls[0]
89
-
90
- async with cl.Step(name="Executando Ferramenta", show_input=False) as tool_step:
91
- tool_step.input = f"Ferramenta: {tool_call.function.name}"
92
- tool_output = execute_tool(tool_call)
93
- tool_step.output = tool_output
94
-
95
- message_history.append(response_message)
96
- message_history.append({"role": "tool", "tool_call_id": tool_call.id, "content": tool_output})
97
 
98
- # SEGUNDA CHAMADA (Streaming): Gera a resposta final.
99
- final_stream = client.chat.completions.create(
100
- model=MODEL_ID, messages=message_history, stream=True
101
- )
102
-
103
- msg = cl.Message(content="")
104
- await msg.send()
105
- full_response = ""
106
- for chunk in final_stream:
107
- if chunk.choices[0].delta.content:
108
- token = chunk.choices[0].delta.content
109
- await msg.stream_token(token)
110
- full_response += token
111
-
112
- if full_response:
113
- message_history.append({"role": "assistant", "content": full_response})
114
- await msg.update()
115
 
116
- # CASO 2: O modelo respondeu diretamente.
117
- elif response_message.content:
118
- await cl.Message(content=response_message.content).send()
119
- message_history.append({"role": "assistant", "content": response_message.content})
 
120
 
121
- # CASO 3: Resposta inesperada.
122
- else:
123
- await cl.Message(content="Ocorreu um erro: O modelo não retornou uma resposta válida.").send()
 
 
124
 
125
  except Exception as e:
126
- print(f"--- ERRO INESPERADO CAPTURADO ---")
 
 
127
  traceback.print_exc()
128
- await cl.Message(content=f"Ocorreu um erro crítico na aplicação: {e}").send()
129
-
130
- finally:
131
- # NOVO: Remove a mensagem de status "Aguardando..." ao final do processo.
132
- await status_msg.remove()
133
-
134
- # Salva o histórico atualizado.
135
- cl.user_session.set("message_history", message_history)
 
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
10
  MODEL_ID = "groq/compound"
11
 
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?'), "
22
+ "sua tarefa é usar internamente as ferramentas 'visit_website' ou 'web_search' para obter as informações. "
23
+ "Após coletar os dados, você deve fornecer uma resposta final completa, bem estruturada e detalhada em markdown, "
24
+ "organizando o conteúdo em seções claras com títulos e listas, como um resumo executivo."
25
+ )
26
  cl.user_session.set(
27
  "message_history",
28
+ [{"role": "system", "content": system_prompt}]
29
  )
30
 
31
+ # 4. Lógica Principal de Mensagem (com Depuração)
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
+ # --- LOG DE DEPURAÇÃO ADICIONADO AQUI ---
62
+ # Exibe cada chunk bruto recebido da API no console para análise.
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
+ # Captura e exibe qualquer erro que possa ocorrer durante a chamada da API
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 ao processar sua solicitação: {e}")