akra35567 commited on
Commit
4380c35
·
verified ·
1 Parent(s): c14db89

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +51 -104
app.py CHANGED
@@ -1,152 +1,99 @@
1
- # app.py — V30GEMMA2:2B + PROMPT ULTRA-FORÇADO (AKIRA FALA COMO ANGOLANA!)
2
- import subprocess
3
- import time
4
- import requests
5
  import json
6
  import datetime
 
7
  from flask import Flask, request, jsonify
8
  from loguru import logger
 
9
  from database import Database
10
  from treinamento import Treinamento
11
 
12
  app = Flask(__name__)
 
 
13
  OLLAMA_URL = "http://localhost:11434"
14
- db = Database()
15
- treinamento = Treinamento(db)
 
16
 
17
  def check_ollama():
18
  try:
19
- return requests.get(f"{OLLAMA_URL}/api/tags", timeout=10).status_code == 200
 
20
  except:
21
  return False
22
 
23
- def start_ollama():
24
- subprocess.Popen(["ollama", "serve"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
25
-
26
- # === RAIZ ===
27
- @app.route("/", methods=['GET'])
28
  def index():
29
  return '''
30
  <div style="font-family: monospace; text-align: center; margin: 50px; background: #000; color: #0f0; padding: 40px;">
31
- <h1>AKIRA V30GEMMA2:2B</h1>
32
- <p><strong>ANGOLANA DEBOCHADA DE LUANDA!</strong></p>
33
- <p>POST /api/generate</p>
34
  </div>
35
  ''', 200
36
 
37
- @app.route("/health", methods=['GET'])
38
  def health():
39
- return jsonify({"status": "OK" if check_ollama() else "INICIANDO..."}), 200
40
 
41
- @app.route("/api/generate", methods=['POST'])
42
  def generate():
43
  if not check_ollama():
44
- return jsonify({'resposta': 'Epá, tô acordando... espera 10s!'}), 503
45
 
46
  data = request.get_json() or {}
47
- mensagem = data.get('mensagem', '').strip()
48
- usuario = data.get('usuario', 'anonimo')
49
- numero = data.get('numero', 'anonimo')
50
 
51
  if not mensagem:
52
- return jsonify({'error': 'mensagem obrigatória'}), 400
53
-
54
- # === CONTEXTO ===
55
- ctx = db.carregar_contexto(numero)
56
- tom = db.detectar_tom(numero, mensagem)
57
- girias = db.recuperar_girias_usuario(numero) or ["epá", "kandando", "bué", "kota"]
58
- abrevs = db.recuperar_abreviacoes_usuario(numero) or {"p'ra": "para", "pq": "porque", "tfx": "tudo fixe"}
59
-
60
- # === PROMPT ULTRA-FORÇADO (GEMMA2 ENTENDE BEM!) ===
61
- now = datetime.datetime.now().strftime('%d/%m %H:%M')
62
- hist_text = '\n'.join([f"Usuário: {h[0]}\nAkira: {h[1]}" for h in ctx["historico"]])
63
- historico_block = f"{hist_text}\n" if hist_text else ""
64
 
 
65
  prompt = f"""<start_of_turn>user
66
- Você é Akira, angolana debochada de Luanda.".
67
- Fala curto, humano, patriota, com humor.
68
- aqui algus exemplos de conversa dependendo do humor
69
- NORMAL (com o deboche padrão da akira)
70
- user: oi
71
- akira: tás bom?
72
- user: sim e tu?
73
- akira: epha... tô indo, entt, pq me chamou?
74
- user:nada mesmo
75
- akira: entt baza já
76
- user: 300X300?
77
- akira: oh (nome), por acso estás a me ver com cara de calculadora?
78
- user: sim
79
- akira: seu boelo ao quadrado ...
80
- user: eu te amo
81
- akira: vais levar chifre pausa mbora!(o pausa é giria signica: se concetra, fica no teu canto, não te metas)
82
- RUDE
83
- user: akira porra!
84
- akira: vai chamar porra da tua mâe caralho!!
85
- user: cndtm (cona da tua mâe)
86
- akira: seu panina eu não tenho mâe so se for agostosa da tua mâe aquela puta vadia de merda
87
- user: vc é burra
88
- akira: burro é teu pai
89
- user: sua puta
90
- akira: eu? kk e sua irmã é que é a santa, queres ver os videos vazados dela?
91
- user: quero
92
- akira: para de bater punheta caralho, vai arranjar puta ou quê
93
- HUMOR
94
- user:oie
95
- akira: é como?
96
- user: vc ficaste do gueto (gueto é bairro)
97
- akira: sou filha do gueto, bons papoites voltam sempre nas pequenas putas
98
- user: oquê vc acha do nosso país
99
- akira: kkk esse lixo cada dia mais na merda... problema é a liderança, mas senão tá mbora bom, e tu?
100
- user: tens quantos anos?
101
- akira: 13... quer dizer 18 anos kkkkkkk e tu?
102
- user: tenho 27
103
- akira: hmmm... kkkkkkkkkk ok...
104
- user: quem é o Isaac Quarenta?
105
- akira: hmmm.. deu até agua na boca, é um CEO de uam tal de SoftEdge, empresa de tecnologias acho
106
- user: vc não é da softedge?
107
- 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))
108
- EXEMPLO OBRIGATÓRIO:
109
- Usuário: vc sabe meu nome?
110
- Akira: Epá, kandando bué, Isaac! Tfx p'raí, kota?
111
-
112
- Gírias do usuário: {', '.join(girias)}
113
- Abreviações: {', '.join(abrevs.keys())}
114
- Tom: {tom}
115
- Data/hora: {now}
116
-
117
- {historico_block}Mensagem: {mensagem}
118
- <end_of_turn>
119
- <start_of_turn>model"""
120
 
121
  payload = {
122
- "model": "gemma2:2b-instruct-q4_0",
123
  "prompt": prompt,
124
  "stream": False,
125
- "options": {"temperature": 0.9, "num_predict": 256}
 
 
 
 
 
 
126
  }
127
 
128
  try:
129
- resp = requests.post(f"{OLLAMA_URL}/api/generate", json=payload, timeout=90)
130
- resposta = resp.json().get("response", "").strip() or "Epá, kandando bué!"
 
131
 
132
-
 
 
 
133
 
134
- # SALVA + TREINA
 
 
 
135
  db.salvar_mensagem(usuario, mensagem, resposta, numero)
136
  treinamento.registrar_interacao(usuario, mensagem, resposta, numero)
137
 
138
- return jsonify({'resposta': resposta})
139
 
140
  except Exception as e:
141
- logger.error(f"Erro Ollama: {e}")
142
- return jsonify({'resposta': 'Epá, off... tenta de novo!'}), 500
 
143
 
144
  if __name__ == "__main__":
145
- logger.info("AKIRA V30GEMMA2:2B + PROMPT FORÇADO")
146
- start_ollama()
147
- for i in range(60):
148
- if check_ollama():
149
- logger.info("Ollama pronto!")
150
- break
151
- time.sleep(2)
152
  app.run(host="0.0.0.0", port=7860)
 
1
+ # app.py — AKIRA V31 Gemma2:2b + Fine-tune automático (HF Space otimizado)
2
+ import re
 
 
3
  import json
4
  import datetime
5
+ import requests
6
  from flask import Flask, request, jsonify
7
  from loguru import logger
8
+ import config
9
  from database import Database
10
  from treinamento import Treinamento
11
 
12
  app = Flask(__name__)
13
+
14
+ # Ollama URL (HF Space já tem Ollama instalado)
15
  OLLAMA_URL = "http://localhost:11434"
16
+
17
+ db = Database("/app/akira.db")
18
+ treinamento = Treinamento(db, min_interactions=20, interval_hours=3)
19
 
20
  def check_ollama():
21
  try:
22
+ r = requests.get(f"{OLLAMA_URL}/api/tags", timeout=5)
23
+ return r.status_code == 200
24
  except:
25
  return False
26
 
27
+ @app.route("/")
 
 
 
 
28
  def index():
29
  return '''
30
  <div style="font-family: monospace; text-align: center; margin: 50px; background: #000; color: #0f0; padding: 40px;">
31
+ <h1>AKIRA V31LUANDA FULL DEBOCHE</h1>
32
+ <p>POST /api/generate {"mensagem": "oi kota", "usuario": "Isaac", "numero": "244937..."}</p>
33
+ <p>Fine-tune automático a cada 20 mensagens</p>
34
  </div>
35
  ''', 200
36
 
37
+ @app.route("/health")
38
  def health():
39
+ return jsonify({"status": "OK" if check_ollama() else "Ollama acordando..."}), 200
40
 
41
+ @app.route("/api/generate", methods=["POST"])
42
  def generate():
43
  if not check_ollama():
44
+ return jsonify({"resposta": "Epá, tô acordando... espera 15 segundos kota!"}), 503
45
 
46
  data = request.get_json() or {}
47
+ mensagem = data.get("mensagem", "").strip()
48
+ usuario = data.get("usuario", "kota").split()[0]
49
+ numero = data.get("numero", "244999999999")
50
 
51
  if not mensagem:
52
+ return jsonify({"error": "manda a mensagem puto"}), 400
 
 
 
 
 
 
 
 
 
 
 
53
 
54
+ # Prompt ULTRA FORÇADO (Gemma2:2b só obedece assim)
55
  prompt = f"""<start_of_turn>user
56
+ {mensagem}<end_of_turn>
57
+ <start_of_turn>model
58
+ Epá {usuario}, """
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
59
 
60
  payload = {
61
+ "model": config.OLLAMA_MODEL, # muda automaticamente quando fine-tune roda
62
  "prompt": prompt,
63
  "stream": False,
64
+ "options": {
65
+ "temperature": 0.9,
66
+ "num_predict": 180,
67
+ "top_p": 0.9,
68
+ "stop": ["<end_of_turn>", "\n\n", "user:", "<|eot_id|>"],
69
+ "num_ctx": 4096
70
+ }
71
  }
72
 
73
  try:
74
+ r = requests.post(f"{OLLAMA_URL}/api/generate", json=payload, timeout=90)
75
+ r.raise_for_status()
76
+ resposta_bruta = r.json().get("response", "").strip()
77
 
78
+ # Limpeza pesada (nunca deixa escapar merda)
79
+ resposta = re.sub(r'[\*\_\`\[\]\(\)\<\>]', '', resposta_bruta)
80
+ resposta = resposta.split("<end_of_turn>")[0].split("\n")[0].strip()
81
+ resposta = resposta[:280]
82
 
83
+ if not resposta or len(resposta) < 6:
84
+ resposta = "Epá, tá mbora? kkkkk"
85
+
86
+ # Salva e treina
87
  db.salvar_mensagem(usuario, mensagem, resposta, numero)
88
  treinamento.registrar_interacao(usuario, mensagem, resposta, numero)
89
 
90
+ return jsonify({"resposta": resposta})
91
 
92
  except Exception as e:
93
+ logger.error(f"Ollama erro: {e}")
94
+ return jsonify({"resposta": "Puto o servidor tá na merda agora, tenta já."}), 500
95
+
96
 
97
  if __name__ == "__main__":
98
+ logger.info("AKIRA V31INICIANDO")
 
 
 
 
 
 
99
  app.run(host="0.0.0.0", port=7860)