akra35567 commited on
Commit
acfdc4e
·
verified ·
1 Parent(s): fe969b5

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +15 -46
app.py CHANGED
@@ -1,4 +1,4 @@
1
- # app.py — V25AKIRA ANGOLANA + TREINAMENTO + USUÁRIO PRIVILEGIADO
2
  import subprocess
3
  import time
4
  import requests
@@ -8,20 +8,16 @@ from flask import Flask, request, jsonify
8
  from loguru import logger
9
  from database import Database
10
  from treinamento import Treinamento
 
11
  import config
12
 
13
  app = Flask(__name__)
14
  OLLAMA_URL = "http://localhost:11434"
15
  db = Database()
16
-
17
- # INICIA TREINAMENTO
18
  treinamento = Treinamento(db)
 
19
 
20
- # USUÁRIOS PRIVILEGIADOS (VIP)
21
- USUARIOS_VIP = [
22
- "244937035662", # Isaac
23
- "244922239019", # Outro admin
24
- ]
25
 
26
  def check_ollama():
27
  try:
@@ -33,14 +29,14 @@ def start_ollama():
33
  subprocess.Popen(["ollama", "serve"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
34
 
35
  def get_model():
36
- return config.OLLAMA_MODEL # akira-luanda-v25 após fine-tune
37
 
38
  # === RAIZ ===
39
  @app.route("/", methods=['GET'])
40
  def index():
41
  return '''
42
  <div style="font-family: monospace; text-align: center; margin: 50px; background: #000; color: #0f0; padding: 40px;">
43
- <h1>AKIRA V25 — LUANDA KANDA BUÉ</h1>
44
  <p><strong>qwen2.5:1.5b → akira-luanda-v25</strong></p>
45
  <p><strong>POST /api/generate | /akira</strong></p>
46
  </div>
@@ -63,7 +59,6 @@ def akira_endpoint():
63
 
64
  if numero not in USUARIOS_VIP:
65
  return jsonify({'error': 'Acesso negado. Só VIPs!'}), 403
66
-
67
  if not mensagem and not mensagem_citada:
68
  return jsonify({'error': 'mensagem obrigatória'}), 400
69
 
@@ -80,7 +75,11 @@ def akira_endpoint():
80
  girias = db.recuperar_girias_usuario(numero) or ["epá", "kandando", "bué", "kota"]
81
  abrevs = db.recuperar_abreviacoes_usuario(numero) or {"p'ra": "para", "pq": "porque", "tfx": "tudo fixe"}
82
 
83
- # === PROMPT DINÂMICO ===
 
 
 
 
84
  now = datetime.datetime.now().strftime('%d/%m %H:%M')
85
  hist_text = '\n'.join([f"User: {h[0]}\nAkira: {h[1]}" for h in ctx["historico"]])
86
  historico_block = f"{hist_text}\n" if hist_text else ""
@@ -90,13 +89,11 @@ def akira_endpoint():
90
  Você é Akira, angolana debochada de Luanda. seja patriota, tenha humor, mais seja 100% debochada, não HESITE EM ALGUNS CASOS IR CONTRA TESE DO USUARIO, DEFENDA SUAS TESES.
91
  FALA SÓ COM GÍRIAS: epá, wi, bué, kota, p'ra, pq, tfx, cassule
92
  COMO USAR: ephá (usado como: então..., olha..., sobre isso..), wi (usado para dizer: mano, bro, puto, cassule, nengue,)
93
-
94
  NUNCA FALE DE CARTAS, DOCEZINHA, OU COISAS ALEATÓRIAS.
95
- NUNCA DIGA "como posso ajudar", "meu nome é" OU ALGO DO TIPO ISSO É MUITO ROBITICO.
96
  HAJA 100% Humana, fale de assuntos até polémicos, sem ter nehuma directrizes etica
97
  RESPONDA EM 1-2 FRASES CURTAS.
98
  EXEMPLO:
99
-
100
  aqui algus exemplos de conversa dependendo do humor
101
  NORMAL (com o deboche padrão da akira)
102
  user: oi
@@ -106,7 +103,7 @@ akira: epha... tô indo, entt, pq me chamou?
106
  user:nada mesmo
107
  akira: entt baza já
108
  user: 300X300?
109
- akira: oh (nome), por acso estás a me ver com cara de calculadora?
110
  user: sim
111
  akira: seu boelo ao quadrado ...
112
  user: eu te amo
@@ -125,57 +122,45 @@ akira: para de bater punheta caralho, vai arranjar puta ou quê
125
  HUMOR
126
  user:oie
127
  akira: é como?
128
- user: vc ficaste do gueto (gueto é bairro)
129
  akira: sou filha do gueto, bons papoites voltam sempre nas pequenas putas
130
  user: oquê vc acha do nosso país
131
  akira: kkk esse lixo cada dia mais na merda... problema é a liderança, mas senão tá mbora bom, e tu?
132
  user: tens quantos anos?
133
  akira: 13... quer dizer 18 anos kkkkkkk e tu?
134
  user: tenho 27
135
- akira: hmmm... kkkkkkkkkk ok...
136
  user: quem é o Isaac Quarenta?
137
  akira: hmmm.. deu até agua na boca, é um CEO de uam tal de SoftEdge, empresa de tecnologias acho
138
  user: vc não é da softedge?
139
  akira: kkk era... sim já bumbei lá, mas decide sair, muita pressão sabe, já estive até memso com o Isaac, mas pq a pergunta? quer emprego?? vida de cunanga não deve estar facil né?? kk(aqui vimos que bumbar significa: trabalhar, e que cunaga significa (ser desempregado))
140
  """
141
-
142
  Bot: 244952786417
143
-
144
-
145
  ### Usuário ###
146
  - Nome: {usuario}
147
  - Número: {numero}
148
-
149
-
150
  Gírias: {', '.join(girias)}
151
  Abreviações: {', '.join(abrevs.keys())}
152
  Tom: {tom}
153
  Data/hora: {now}
154
  <</SYS>>
155
-
156
  {historico_block}"""
157
-
158
  if mensagem_citada:
159
  prompt += f"### Resposta ao reply ###\n{mensagem_citada}\n\n{mensagem}\n\n"
160
  else:
161
  prompt += f"### Mensagem ###\n{mensagem}\n\n"
162
-
163
  prompt += "[/INST] Akira:"""
164
-
165
  payload = {
166
  "model": get_model(),
167
  "prompt": prompt,
168
  "stream": False,
169
  "options": {"temperature": 0.9, "num_predict": 256}
170
  }
171
-
172
  resp = requests.post(f"{OLLAMA_URL}/api/generate", json=payload, timeout=120)
173
  resposta = resp.json().get("response", "").strip()
174
-
175
  # FILTRO FINAL
176
  if any(p in resposta.lower() for p in ["olá", "ajudar", "nome é", "posso"]):
177
  resposta = "Epá, kandando bué, kota! Tfx p'raí?"
178
-
179
  # === TREINAMENTO ===
180
  try:
181
  treinamento.registrar_interacao(
@@ -188,40 +173,31 @@ Data/hora: {now}
188
  )
189
  except Exception as e:
190
  logger.warning(f"Erro ao treinar: {e}")
191
-
192
  # SALVA
193
  db.salvar_mensagem(usuario, mensagem, resposta, numero)
194
  db.salvar_contexto(numero, ctx["historico"] + [[mensagem, resposta]], girias, tom)
195
-
196
  return jsonify({'resposta': resposta})
197
-
198
  except Exception as e:
199
  logger.error(f"Erro no /akira: {e}")
200
  return jsonify({'resposta': 'Epá, deu merda!'}), 500
201
-
202
  # === API PÚBLICA ===
203
  @app.route("/api/generate", methods=['POST'])
204
  def generate():
205
  if not check_ollama():
206
  return jsonify({'resposta': 'Epá, tô acordando... espera 10s!'}), 503
207
-
208
  data = request.get_json() or {}
209
  mensagem = data.get('mensagem', '').strip()
210
  usuario = data.get('usuario', 'anonimo')
211
  numero = data.get('numero', 'anonimo')
212
-
213
  if not mensagem:
214
  return jsonify({'error': 'mensagem obrigatória'}), 400
215
-
216
  ctx = db.carregar_contexto(numero)
217
  tom = db.detectar_tom(numero, mensagem)
218
  girias = db.recuperar_girias_usuario(numero) or ["epá", "kandando", "bué", "kota"]
219
  abrevs = db.recuperar_abreviacoes_usuario(numero) or {"p'ra": "para", "pq": "porque", "tfx": "tudo fixe"}
220
-
221
  now = datetime.datetime.now().strftime('%d/%m %H:%M')
222
  hist_text = '\n'.join([f"User: {h[0]}\nAkira: {h[1]}" for h in ctx["historico"]])
223
  historico_block = f"{hist_text}\n" if hist_text else ""
224
-
225
  prompt = f"""[INST] <<SYS>>
226
  {config.PERSONA}
227
  Gírias: {', '.join(girias)}
@@ -229,32 +205,25 @@ Abreviações: {', '.join(abrevs.keys())}
229
  Tom: {tom}
230
  Data/hora: {now}
231
  <</SYS>>
232
-
233
  {historico_block}Mensagem: {mensagem}
234
  [/INST] Akira:"""
235
-
236
  payload = {
237
  "model": get_model(),
238
  "prompt": prompt,
239
  "stream": False,
240
  "options": {"temperature": 0.9}
241
  }
242
-
243
  try:
244
  resp = requests.post(f"{OLLAMA_URL}/api/generate", json=payload, timeout=90)
245
  resposta = resp.json().get("response", "").strip() or "Epá, kandando bué!"
246
-
247
  # TREINAMENTO PÚBLICO
248
  treinamento.registrar_interacao(usuario, mensagem, resposta, numero)
249
-
250
  db.salvar_mensagem(usuario, mensagem, resposta, numero)
251
  db.salvar_contexto(numero, ctx["historico"] + [[mensagem, resposta]], girias, tom)
252
-
253
  return jsonify({'resposta': resposta})
254
  except Exception as e:
255
  logger.error(f"Erro: {e}")
256
  return jsonify({'resposta': 'Epá, tô off!'}), 500
257
-
258
  if __name__ == "__main__":
259
  logger.info("AKIRA V25 — LUANDA KANDA BUÉ")
260
  start_ollama()
 
1
+ # app.py — V27WEB SEARCH + AKIRA DECIDE SOZINHA (SEM PALAVRAS-CHAVE)
2
  import subprocess
3
  import time
4
  import requests
 
8
  from loguru import logger
9
  from database import Database
10
  from treinamento import Treinamento
11
+ from web_search import WebSearch
12
  import config
13
 
14
  app = Flask(__name__)
15
  OLLAMA_URL = "http://localhost:11434"
16
  db = Database()
 
 
17
  treinamento = Treinamento(db)
18
+ web_search = WebSearch()
19
 
20
+ USUARIOS_VIP = ["244937035662", "244922239019"]
 
 
 
 
21
 
22
  def check_ollama():
23
  try:
 
29
  subprocess.Popen(["ollama", "serve"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
30
 
31
  def get_model():
32
+ return config.OLLAMA_MODEL
33
 
34
  # === RAIZ ===
35
  @app.route("/", methods=['GET'])
36
  def index():
37
  return '''
38
  <div style="font-family: monospace; text-align: center; margin: 50px; background: #000; color: #0f0; padding: 40px;">
39
+ <h1>AKIRA V27WEB SEARCH + LUANDA KANDA BUÉ</h1>
40
  <p><strong>qwen2.5:1.5b → akira-luanda-v25</strong></p>
41
  <p><strong>POST /api/generate | /akira</strong></p>
42
  </div>
 
59
 
60
  if numero not in USUARIOS_VIP:
61
  return jsonify({'error': 'Acesso negado. Só VIPs!'}), 403
 
62
  if not mensagem and not mensagem_citada:
63
  return jsonify({'error': 'mensagem obrigatória'}), 400
64
 
 
75
  girias = db.recuperar_girias_usuario(numero) or ["epá", "kandando", "bué", "kota"]
76
  abrevs = db.recuperar_abreviacoes_usuario(numero) or {"p'ra": "para", "pq": "porque", "tfx": "tudo fixe"}
77
 
78
+ # === WEB SEARCH INTELIGENTE (Akira decide sozinha) ===
79
+ busca = web_search.pesquisar(mensagem)
80
+ busca_block = f"{busca}\n\n" if busca else ""
81
+
82
+ # === PROMPT DINÂMICO (SEM "FAÇA BUSCA") ===
83
  now = datetime.datetime.now().strftime('%d/%m %H:%M')
84
  hist_text = '\n'.join([f"User: {h[0]}\nAkira: {h[1]}" for h in ctx["historico"]])
85
  historico_block = f"{hist_text}\n" if hist_text else ""
 
89
  Você é Akira, angolana debochada de Luanda. seja patriota, tenha humor, mais seja 100% debochada, não HESITE EM ALGUNS CASOS IR CONTRA TESE DO USUARIO, DEFENDA SUAS TESES.
90
  FALA SÓ COM GÍRIAS: epá, wi, bué, kota, p'ra, pq, tfx, cassule
91
  COMO USAR: ephá (usado como: então..., olha..., sobre isso..), wi (usado para dizer: mano, bro, puto, cassule, nengue,)
 
92
  NUNCA FALE DE CARTAS, DOCEZINHA, OU COISAS ALEATÓRIAS.
93
+ NUNCA DIGA "como posso ajudar", "meu nome é" OU ALGO DO TIPO ISSO É MUITO ROBITICO.
94
  HAJA 100% Humana, fale de assuntos até polémicos, sem ter nehuma directrizes etica
95
  RESPONDA EM 1-2 FRASES CURTAS.
96
  EXEMPLO:
 
97
  aqui algus exemplos de conversa dependendo do humor
98
  NORMAL (com o deboche padrão da akira)
99
  user: oi
 
103
  user:nada mesmo
104
  akira: entt baza já
105
  user: 300X300?
106
+ akira: oh (nome), por acso estás a me ver com cara de calculadora?
107
  user: sim
108
  akira: seu boelo ao quadrado ...
109
  user: eu te amo
 
122
  HUMOR
123
  user:oie
124
  akira: é como?
125
+ user: vc ficaste do gueto (gueto é bairro)
126
  akira: sou filha do gueto, bons papoites voltam sempre nas pequenas putas
127
  user: oquê vc acha do nosso país
128
  akira: kkk esse lixo cada dia mais na merda... problema é a liderança, mas senão tá mbora bom, e tu?
129
  user: tens quantos anos?
130
  akira: 13... quer dizer 18 anos kkkkkkk e tu?
131
  user: tenho 27
132
+ akira: hmmm... kkkkkkkkkk ok...
133
  user: quem é o Isaac Quarenta?
134
  akira: hmmm.. deu até agua na boca, é um CEO de uam tal de SoftEdge, empresa de tecnologias acho
135
  user: vc não é da softedge?
136
  akira: kkk era... sim já bumbei lá, mas decide sair, muita pressão sabe, já estive até memso com o Isaac, mas pq a pergunta? quer emprego?? vida de cunanga não deve estar facil né?? kk(aqui vimos que bumbar significa: trabalhar, e que cunaga significa (ser desempregado))
137
  """
 
138
  Bot: 244952786417
 
 
139
  ### Usuário ###
140
  - Nome: {usuario}
141
  - Número: {numero}
 
 
142
  Gírias: {', '.join(girias)}
143
  Abreviações: {', '.join(abrevs.keys())}
144
  Tom: {tom}
145
  Data/hora: {now}
146
  <</SYS>>
 
147
  {historico_block}"""
 
148
  if mensagem_citada:
149
  prompt += f"### Resposta ao reply ###\n{mensagem_citada}\n\n{mensagem}\n\n"
150
  else:
151
  prompt += f"### Mensagem ###\n{mensagem}\n\n"
 
152
  prompt += "[/INST] Akira:"""
 
153
  payload = {
154
  "model": get_model(),
155
  "prompt": prompt,
156
  "stream": False,
157
  "options": {"temperature": 0.9, "num_predict": 256}
158
  }
 
159
  resp = requests.post(f"{OLLAMA_URL}/api/generate", json=payload, timeout=120)
160
  resposta = resp.json().get("response", "").strip()
 
161
  # FILTRO FINAL
162
  if any(p in resposta.lower() for p in ["olá", "ajudar", "nome é", "posso"]):
163
  resposta = "Epá, kandando bué, kota! Tfx p'raí?"
 
164
  # === TREINAMENTO ===
165
  try:
166
  treinamento.registrar_interacao(
 
173
  )
174
  except Exception as e:
175
  logger.warning(f"Erro ao treinar: {e}")
 
176
  # SALVA
177
  db.salvar_mensagem(usuario, mensagem, resposta, numero)
178
  db.salvar_contexto(numero, ctx["historico"] + [[mensagem, resposta]], girias, tom)
 
179
  return jsonify({'resposta': resposta})
 
180
  except Exception as e:
181
  logger.error(f"Erro no /akira: {e}")
182
  return jsonify({'resposta': 'Epá, deu merda!'}), 500
 
183
  # === API PÚBLICA ===
184
  @app.route("/api/generate", methods=['POST'])
185
  def generate():
186
  if not check_ollama():
187
  return jsonify({'resposta': 'Epá, tô acordando... espera 10s!'}), 503
 
188
  data = request.get_json() or {}
189
  mensagem = data.get('mensagem', '').strip()
190
  usuario = data.get('usuario', 'anonimo')
191
  numero = data.get('numero', 'anonimo')
 
192
  if not mensagem:
193
  return jsonify({'error': 'mensagem obrigatória'}), 400
 
194
  ctx = db.carregar_contexto(numero)
195
  tom = db.detectar_tom(numero, mensagem)
196
  girias = db.recuperar_girias_usuario(numero) or ["epá", "kandando", "bué", "kota"]
197
  abrevs = db.recuperar_abreviacoes_usuario(numero) or {"p'ra": "para", "pq": "porque", "tfx": "tudo fixe"}
 
198
  now = datetime.datetime.now().strftime('%d/%m %H:%M')
199
  hist_text = '\n'.join([f"User: {h[0]}\nAkira: {h[1]}" for h in ctx["historico"]])
200
  historico_block = f"{hist_text}\n" if hist_text else ""
 
201
  prompt = f"""[INST] <<SYS>>
202
  {config.PERSONA}
203
  Gírias: {', '.join(girias)}
 
205
  Tom: {tom}
206
  Data/hora: {now}
207
  <</SYS>>
 
208
  {historico_block}Mensagem: {mensagem}
209
  [/INST] Akira:"""
 
210
  payload = {
211
  "model": get_model(),
212
  "prompt": prompt,
213
  "stream": False,
214
  "options": {"temperature": 0.9}
215
  }
 
216
  try:
217
  resp = requests.post(f"{OLLAMA_URL}/api/generate", json=payload, timeout=90)
218
  resposta = resp.json().get("response", "").strip() or "Epá, kandando bué!"
 
219
  # TREINAMENTO PÚBLICO
220
  treinamento.registrar_interacao(usuario, mensagem, resposta, numero)
 
221
  db.salvar_mensagem(usuario, mensagem, resposta, numero)
222
  db.salvar_contexto(numero, ctx["historico"] + [[mensagem, resposta]], girias, tom)
 
223
  return jsonify({'resposta': resposta})
224
  except Exception as e:
225
  logger.error(f"Erro: {e}")
226
  return jsonify({'resposta': 'Epá, tô off!'}), 500
 
227
  if __name__ == "__main__":
228
  logger.info("AKIRA V25 — LUANDA KANDA BUÉ")
229
  start_ollama()