akra35567 commited on
Commit
5c8d8f1
·
verified ·
1 Parent(s): 2be1180

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +67 -44
app.py CHANGED
@@ -1,76 +1,99 @@
1
- # app.py — AKIRA V38FUNCIONA 100% NO TEU SPACE AGORA MESMO
2
- import os
3
  import re
4
- import time
 
5
  import requests
6
  from flask import Flask, request, jsonify
7
  from loguru import logger
 
 
 
8
 
9
  app = Flask(__name__)
10
 
 
11
  OLLAMA_URL = "http://localhost:11434"
12
 
13
- # MODELO GARANTIDO — usa o fine-tunado se existir, senão o base
14
- def get_model():
 
 
15
  try:
16
  r = requests.get(f"{OLLAMA_URL}/api/tags", timeout=5)
17
- models = [m["name"] for m in r.json()["models"]]
18
- if "akira-luanda" in " ".join(models):
19
- return "akira-luanda:latest" # teu fine-tune
20
- return "gemma2:2b-instruct-q4_0"
21
  except:
22
- return "gemma2:2b-instruct-q4_0" # fallback seguro
23
-
24
- # Espera Ollama acordar
25
- def wait_ollama():
26
- logger.info("Akira acordando Ollama...")
27
- for _ in range(90):
28
- try:
29
- r = requests.get(f"{OLLAMA_URL}/api/tags", timeout=5)
30
- if r.status_code == 200:
31
- logger.success(f"Ollama pronto! Modelo: {get_model()}")
32
- return
33
- except:
34
- time.sleep(1)
35
- logger.warning("Ollama demorou, mas vamos tentar mesmo assim...")
36
-
37
- wait_ollama()
38
 
39
  @app.route("/")
40
- def home():
41
- return "<h1 style='color:#0f0;text-align:center;margin-top:100px'>AKIRA V38 ONLINE — POST /api/generate</h1>", 200
 
 
 
 
 
 
 
 
 
 
42
 
43
  @app.route("/api/generate", methods=["POST"])
44
  def generate():
 
 
 
45
  data = request.get_json() or {}
46
  mensagem = data.get("mensagem", "").strip()
47
  usuario = data.get("usuario", "kota").split()[0]
 
48
 
49
  if not mensagem:
50
- return jsonify({"error": "manda mensagem kota"}), 400
 
 
 
 
 
 
51
 
52
- prompt = f"<start_of_turn>user\n{mensagem}<end_of_turn>\n<start_of_turn>model\nEpá {usuario}, "
 
 
 
 
 
 
 
 
 
 
 
53
 
54
  try:
55
- r = requests.post(f"{OLLAMA_URL}/api/generate", json={
56
- "model": get_model(),
57
- "prompt": prompt,
58
- "stream": False,
59
- "options": {
60
- "temperature": 0.9,
61
- "num_predict": 200,
62
- "stop": ["<end_of_turn>"]
63
- }
64
- }, timeout=60)
65
-
66
- resposta = r.json().get("response", "Bué fixe kota kkkkk").strip()
67
- resposta = re.sub(r'[\*\_`<>[\]()#]', '', resposta)[:280]
 
 
68
 
69
  return jsonify({"resposta": resposta})
70
 
71
  except Exception as e:
72
- logger.error(f"Erro: {e}")
73
- return jsonify({"resposta": "Epá, Ollamade pau hoje... tenta daqui a pouco kota!"})
 
74
 
75
  if __name__ == "__main__":
 
76
  app.run(host="0.0.0.0", port=7860)
 
1
+ # app.py — AKIRA V31Gemma2: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 V31 — LUANDA 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 na merda agora, tenta já."}), 500
95
+
96
 
97
  if __name__ == "__main__":
98
+ logger.info("AKIRA V31 — INICIANDO")
99
  app.run(host="0.0.0.0", port=7860)