akra35567 commited on
Commit
a96588e
·
verified ·
1 Parent(s): daa7341

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +45 -21
app.py CHANGED
@@ -1,21 +1,28 @@
1
  # app.py
2
  """
3
  AKIRA V16 — OLLAMA + FLASK (HF SPACE + DOCKER)
4
- - Inicia ollama serve em subprocess
5
- - Flask roda na porta 7860 (HF)
6
- - Ollama roda em 11434 (interno)
7
- - /api/chat → Akira com gírias de Luanda
8
  """
9
  import subprocess
10
  import time
11
  import requests
12
  import sys
 
13
  from flask import Flask, request, jsonify
14
  from loguru import logger
15
 
16
  app = Flask(__name__)
17
  OLLAMA_URL = "http://localhost:11434"
18
 
 
 
 
 
 
 
19
  # === INICIA OLLAMA EM BACKGROUND ===
20
  def start_ollama():
21
  logger.info("Iniciando ollama serve em background...")
@@ -38,7 +45,7 @@ def wait_for_ollama():
38
  logger.info("Aguardando Ollama (11434)...")
39
  for i in range(60):
40
  if check_ollama():
41
- logger.success("Ollama Qwen 2.5 7B PRONTO!")
42
  return True
43
  time.sleep(2)
44
  logger.critical("Ollama não subiu!")
@@ -50,14 +57,16 @@ def index():
50
  return '''
51
  <div style="font-family: monospace; text-align: center; margin: 50px; background: #000; color: #0f0; padding: 40px;">
52
  <h1>AKIRA V16 OLLAMA</h1>
53
- <p><strong>Qwen 2.5 7B (4GB)</strong></p>
 
54
  <p><strong>ROTA:</strong> <code>POST /api/chat</code></p>
55
  <pre>
56
  curl -X POST https://akra35567-ollama.hf.space/api/chat \\
57
- -d '{"mensagem": "Epá, Akira! Tud bem?"}'
 
58
  </pre>
59
  <p>Health: <a href="/health">/health</a></p>
60
- <p>Luanda, Angola — 11/11/2025 21:25 WAT</p>
61
  </div>
62
  ''', 200
63
 
@@ -65,14 +74,14 @@ curl -X POST https://akra35567-ollama.hf.space/api/chat \\
65
  @app.route("/health")
66
  def health():
67
  if check_ollama():
68
- return jsonify({"status": "OK", "model": "qwen2.5:7b"}), 200
69
  return jsonify({"status": "INICIANDO..."}), 503
70
 
71
- # === AKIRA CHAT ===
72
  @app.route("/api/chat", methods=['POST'])
73
  def chat():
74
  if not check_ollama():
75
- return jsonify({'resposta': 'Epá, tô acordando... espera!'}), 503
76
 
77
  data = request.get_json() or {}
78
  msg = data.get('mensagem', '').strip()
@@ -86,40 +95,43 @@ Usuário: {msg}
86
  Akira:"""
87
 
88
  payload = {
89
- "model": "qwen2.5:7b",
90
  "prompt": prompt,
91
  "stream": False,
92
  "options": {
93
  "temperature": 0.85,
94
- "num_predict": 256
 
 
95
  }
96
  }
97
 
98
- logger.info(f"Prompt enviado: {msg[:50]}...")
99
 
100
  for tentativa in range(3):
101
  try:
102
- resp = requests.post(f"{OLLAMA_URL}/api/generate", json=payload, timeout=120)
103
  if resp.status_code == 200:
104
  resposta = resp.json().get("response", "").strip()
105
  if resposta:
106
- logger.success(f"Resposta gerada: {resposta[:50]}...")
107
  return jsonify({'resposta': resposta})
108
  else:
109
- return jsonify({'resposta': 'Epá, fiquei sem palavras... fala de novo, puto!'})
110
  else:
111
  logger.warning(f"Ollama erro {resp.status_code}: {resp.text}")
112
  except requests.exceptions.Timeout:
113
  logger.warning(f"Timeout na tentativa {tentativa + 1}/3...")
114
  if tentativa < 2:
115
- time.sleep(5)
116
  except Exception as e:
117
- logger.error(f"Erro na tentativa {tentativa + 1}: {e}")
118
  if tentativa == 2:
119
  return jsonify({'resposta': 'Epá, tô off por agora... volta já!'}), 500
120
- time.sleep(3)
121
 
122
  return jsonify({'resposta': 'Epá, tô off por agora... volta já!'}), 500
 
123
  # === INÍCIO ===
124
  if __name__ == "__main__":
125
  logger.remove()
@@ -130,5 +142,17 @@ if __name__ == "__main__":
130
  if not wait_for_ollama():
131
  sys.exit(1)
132
 
 
 
 
 
 
 
 
 
 
 
 
 
133
  logger.info("Flask rodando na porta 7860")
134
- app.run(host="0.0.0.0", port=7860, debug=False)
 
1
  # app.py
2
  """
3
  AKIRA V16 — OLLAMA + FLASK (HF SPACE + DOCKER)
4
+ - Modelo: qwen2.5:3b-q4_0 (leve, rápido, 4-bit)
5
+ - 3 requisições simultâneas
6
+ - Usa RAM sobrando, alivia CPU
7
+ - Warm-up automático
8
  """
9
  import subprocess
10
  import time
11
  import requests
12
  import sys
13
+ import os
14
  from flask import Flask, request, jsonify
15
  from loguru import logger
16
 
17
  app = Flask(__name__)
18
  OLLAMA_URL = "http://localhost:11434"
19
 
20
+ # === CONFIGURAÇÃO OLLAMA (3 REQUISIÇÕES SIMULTÂNEAS) ===
21
+ os.environ["OLLAMA_NUM_PARALLEL"] = "3" # ← 3 por vez!
22
+ os.environ["OLLAMA_MAX_QUEUE"] = "10" # Fila de 10
23
+ os.environ["OLLAMA_KEEP_ALIVE"] = "10m" # Mantém modelo na RAM
24
+ os.environ["OLLAMA_MAX_LOADED_MODELS"] = "1"
25
+
26
  # === INICIA OLLAMA EM BACKGROUND ===
27
  def start_ollama():
28
  logger.info("Iniciando ollama serve em background...")
 
45
  logger.info("Aguardando Ollama (11434)...")
46
  for i in range(60):
47
  if check_ollama():
48
+ logger.success("Ollama Qwen 2.5 3B q4_0 PRONTO!")
49
  return True
50
  time.sleep(2)
51
  logger.critical("Ollama não subiu!")
 
57
  return '''
58
  <div style="font-family: monospace; text-align: center; margin: 50px; background: #000; color: #0f0; padding: 40px;">
59
  <h1>AKIRA V16 OLLAMA</h1>
60
+ <p><strong>Qwen 2.5 3B q4_0 (2.5GB)</strong></p>
61
+ <p><strong>3 requisições simultâneas • CPU leve</strong></p>
62
  <p><strong>ROTA:</strong> <code>POST /api/chat</code></p>
63
  <pre>
64
  curl -X POST https://akra35567-ollama.hf.space/api/chat \\
65
+ -H "Content-Type: application/json" \\
66
+ -d '{"mensagem": "Epá, Akira! Bora kandando?"}'
67
  </pre>
68
  <p>Health: <a href="/health">/health</a></p>
69
+ <p>Luanda, Angola — 11/11/2025 22:33 WAT</p>
70
  </div>
71
  ''', 200
72
 
 
74
  @app.route("/health")
75
  def health():
76
  if check_ollama():
77
+ return jsonify({"status": "OK", "model": "qwen2.5:3b-q4_0"}), 200
78
  return jsonify({"status": "INICIANDO..."}), 503
79
 
80
+ # === AKIRA CHAT (COM RETRY + TIMEOUT ALTO) ===
81
  @app.route("/api/chat", methods=['POST'])
82
  def chat():
83
  if not check_ollama():
84
+ return jsonify({'resposta': 'Epá, tô acordando... espera 10s!'}), 503
85
 
86
  data = request.get_json() or {}
87
  msg = data.get('mensagem', '').strip()
 
95
  Akira:"""
96
 
97
  payload = {
98
+ "model": "qwen2.5:3b-q4_0",
99
  "prompt": prompt,
100
  "stream": False,
101
  "options": {
102
  "temperature": 0.85,
103
+ "num_predict": 128,
104
+ "num_ctx": 2048,
105
+ "num_thread": 2
106
  }
107
  }
108
 
109
+ logger.info(f"Prompt recebido: {msg[:50]}...")
110
 
111
  for tentativa in range(3):
112
  try:
113
+ resp = requests.post(f"{OLLAMA_URL}/api/generate", json=payload, timeout=90)
114
  if resp.status_code == 200:
115
  resposta = resp.json().get("response", "").strip()
116
  if resposta:
117
+ logger.success(f"Resposta: {resposta[:50]}...")
118
  return jsonify({'resposta': resposta})
119
  else:
120
+ return jsonify({'resposta': 'Epá, fiquei sem palavras... manda de novo, puto!'})
121
  else:
122
  logger.warning(f"Ollama erro {resp.status_code}: {resp.text}")
123
  except requests.exceptions.Timeout:
124
  logger.warning(f"Timeout na tentativa {tentativa + 1}/3...")
125
  if tentativa < 2:
126
+ time.sleep(3)
127
  except Exception as e:
128
+ logger.error(f"Erro: {e}")
129
  if tentativa == 2:
130
  return jsonify({'resposta': 'Epá, tô off por agora... volta já!'}), 500
131
+ time.sleep(2)
132
 
133
  return jsonify({'resposta': 'Epá, tô off por agora... volta já!'}), 500
134
+
135
  # === INÍCIO ===
136
  if __name__ == "__main__":
137
  logger.remove()
 
142
  if not wait_for_ollama():
143
  sys.exit(1)
144
 
145
+ # === WARM-UP AUTOMÁTICO ===
146
+ logger.info("Aquecendo Akira (qwen2.5:3b-q4_0)...")
147
+ try:
148
+ requests.post(f"{OLLAMA_URL}/api/generate", json={
149
+ "model": "qwen2.5:3b-q4_0",
150
+ "prompt": "Oi",
151
+ "options": {"num_predict": 1}
152
+ }, timeout=60)
153
+ logger.success("Akira aquecida!")
154
+ except:
155
+ logger.warning("Warm-up falhou, mas continua...")
156
+
157
  logger.info("Flask rodando na porta 7860")
158
+ app.run(host="0.0.0.0", port=7860, debug=False)