caarleexx commited on
Commit
d7ba497
·
verified ·
1 Parent(s): 7ccac9e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +106 -39
app.py CHANGED
@@ -1,4 +1,5 @@
1
  import os
 
2
  import chainlit as cl
3
  from groq import Groq
4
 
@@ -7,58 +8,124 @@ client = Groq(
7
  api_key=os.environ.get("GROQ_API_KEY"),
8
  )
9
 
10
- # Configurações do Modelo
11
- MODEL_ID = "groq/compound" # Agora está correto, pois vamos passar os parâmetros necessários
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
 
13
  @cl.on_chat_start
14
  def start_chat():
15
- # Inicializa o histórico da conversa na sessão do usuário
16
  cl.user_session.set(
17
  "message_history",
18
- [{"role": "system", "content": "Você é um assistente inteligente e útil, capaz de usar ferramentas como pesquisa na web."}]
19
  )
20
 
21
  @cl.on_message
22
  async def main(message: cl.Message):
23
- # Recupera o histórico
24
  message_history = cl.user_session.get("message_history")
25
-
26
- # Adiciona a nova mensagem do usuário
27
  message_history.append({"role": "user", "content": message.content})
28
 
29
- # Cria a mensagem de resposta vazia para streaming
30
- msg = cl.Message(content="")
31
- await msg.send()
32
-
33
- # Chamada à API do Groq com Streaming
34
- stream = client.chat.completions.create(
35
- messages=message_history,
36
- model=MODEL_ID,
37
- temperature=0.7,
38
- max_tokens=1024,
39
- stream=True,
40
- # --- PARÂMETRO OBRIGATÓRIO ADICIONADO AQUI ---
41
- compound_custom={
42
- "tools": {
43
- "enabled_tools": [
44
- "web_search",
45
- "code_interpreter",
46
- "visit_website",
47
- "browser_automation"
48
- ]
49
  }
50
  }
51
- )
 
 
 
 
 
52
 
53
- # Processa o stream
54
- for chunk in stream:
55
- if chunk.choices[0].delta.content:
56
- token = chunk.choices[0].delta.content
57
- await msg.stream_token(token)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58
 
59
- # Atualiza o histórico com a resposta completa do assistente
60
- if msg.content:
61
- message_history.append({"role": "assistant", "content": msg.content})
62
- cl.user_session.set("message_history", message_history)
63
-
64
- await msg.update()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import os
2
+ import json
3
  import chainlit as cl
4
  from groq import Groq
5
 
 
8
  api_key=os.environ.get("GROQ_API_KEY"),
9
  )
10
 
11
+ # --- PASSO 1: Usar o modelo de agente 'groq/compound' ---
12
+ MODEL_ID = "groq/compound"
13
+
14
+ # --- PASSO 2: Criar uma função para executar as ferramentas ---
15
+ # A Groq não executa as ferramentas por você; ela apenas lhe diz QUAL ferramenta executar.
16
+ # Nós precisamos implementar a lógica para cada ferramenta aqui.
17
+ # Por enquanto, estas são implementações FALSAS (placeholders) para demonstração.
18
+ def execute_tool(tool_call: dict) -> str:
19
+ """Executa uma ferramenta com base na chamada da API e retorna o resultado como uma string."""
20
+ tool_name = tool_call.function.name
21
+ try:
22
+ args = json.loads(tool_call.function.arguments)
23
+ except json.JSONDecodeError:
24
+ return f"Erro: Argumentos inválidos para a ferramenta {tool_name}."
25
+
26
+ print(f"Executando ferramenta: {tool_name} com argumentos: {args}")
27
+
28
+ # Implementação real das ferramentas iria aqui
29
+ if tool_name == "web_search":
30
+ # Em um app real, você usaria bibliotecas como 'requests' e 'BeautifulSoup'
31
+ query = args.get("query", "")
32
+ return f"Resultado da busca na web para '{query}': A Groq é uma empresa de tecnologia que desenvolve o LPU (Language Processing Unit)."
33
+
34
+ elif tool_name == "code_interpreter":
35
+ # Em um app real, você usaria 'exec()' ou um sandbox para executar o código
36
+ code = args.get("code", "")
37
+ return f"Resultado da execução do código '{code}': O resultado é 42."
38
+
39
+ # Adicione outras ferramentas aqui (visit_website, browser_automation)
40
+
41
+ else:
42
+ return f"Erro: Ferramenta desconhecida '{tool_name}'"
43
+
44
 
45
  @cl.on_chat_start
46
  def start_chat():
 
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
  @cl.on_message
53
  async def main(message: cl.Message):
 
54
  message_history = cl.user_session.get("message_history")
 
 
55
  message_history.append({"role": "user", "content": message.content})
56
 
57
+ # --- PASSO 3: Lógica do Agente (Ciclo de duas chamadas) ---
58
+ while True:
59
+ # Define os parâmetros obrigatórios para o 'groq/compound'
60
+ compound_params = {
61
+ "model": MODEL_ID,
62
+ "messages": message_history,
63
+ "temperature": 0.7,
64
+ "max_tokens": 4096, # Aumentado para permitir respostas mais longas
65
+ "stream": False, # A primeira chamada NÃO PODE ser streaming, precisamos da resposta completa
66
+ "compound_custom": {
67
+ "tools": {
68
+ "enabled_tools": [
69
+ "web_search",
70
+ "code_interpreter" # Removido visit_website e browser_automation por simplicidade
71
+ ]
72
+ }
 
 
 
 
73
  }
74
  }
75
+
76
+ # Primeira chamada para a API para obter a chamada da ferramenta
77
+ async with cl.Step(name="Pensando...", show_input=False) as thinking_step:
78
+ thinking_step.output = "O modelo está decidindo qual ferramenta usar..."
79
+ response = client.chat.completions.create(**compound_params)
80
+ response_message = response.choices[0].message
81
 
82
+ # Se a resposta contiver uma chamada de ferramenta
83
+ if response_message.tool_calls:
84
+ tool_calls = response_message.tool_calls
85
+ # Adiciona a resposta do assistente (com a chamada da ferramenta) ao histórico
86
+ message_history.append(response_message)
87
+
88
+ async with cl.Step(name="Executando Ferramenta", show_input=False) as tool_step:
89
+ tool_step.input = f"Ferramenta: {tool_calls[0].function.name}, Argumentos: {tool_calls[0].function.arguments}"
90
+
91
+ # Executa a ferramenta
92
+ tool_output = execute_tool(tool_calls[0])
93
+ tool_step.output = tool_output
94
+
95
+ # Adiciona o resultado da ferramenta ao histórico
96
+ message_history.append({
97
+ "role": "tool",
98
+ "tool_call_id": tool_calls[0].id,
99
+ "content": tool_output,
100
+ })
101
+
102
+ # Continua o loop para a próxima chamada da API, que gerará a resposta final
103
+ continue
104
 
105
+ # Se não houver chamada de ferramenta, o modelo deu uma resposta final
106
+ else:
107
+ # Agora fazemos a SEGUNDA chamada, desta vez COM STREAMING, para a resposta final
108
+ final_stream_params = compound_params.copy()
109
+ final_stream_params["stream"] = True
110
+
111
+ stream = client.chat.completions.create(**final_stream_params)
112
+
113
+ # Envia a resposta final para a interface do usuário
114
+ msg = cl.Message(content="")
115
+ await msg.send()
116
+
117
+ full_response = ""
118
+ for chunk in stream:
119
+ if chunk.choices[0].delta.content:
120
+ token = chunk.choices[0].delta.content
121
+ await msg.stream_token(token)
122
+ full_response += token
123
+
124
+ # Adiciona a resposta final do assistente ao histórico
125
+ if full_response:
126
+ message_history.append({"role": "assistant", "content": full_response})
127
+
128
+ await msg.update()
129
+ break # Sai do loop while
130
+
131
+ cl.user_session.set("message_history", message_history)