| |
| import subprocess |
| import time |
| import requests |
| import sys |
| import os |
| import datetime |
| from flask import Flask, request, jsonify |
| from loguru import logger |
|
|
| app = Flask(__name__) |
| OLLAMA_URL = "http://localhost:11434" |
|
|
| |
| os.environ["OLLAMA_NUM_PARALLEL"] = "3" |
| os.environ["OLLAMA_MAX_QUEUE"] = "10" |
| os.environ["OLLAMA_KEEP_ALIVE"] = "10m" |
| os.environ["OLLAMA_MAX_LOADED_MODELS"] = "1" |
|
|
| |
| def start_ollama(): |
| logger.info("Iniciando ollama serve...") |
| subprocess.Popen(["ollama", "serve"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) |
|
|
| def check_ollama(): |
| try: |
| resp = requests.get(f"{OLLAMA_URL}/api/tags", timeout=10) |
| return resp.status_code == 200 |
| except: |
| return False |
|
|
| def wait_for_ollama(): |
| logger.info("Aguardando Ollama (11434)...") |
| for i in range(60): |
| if check_ollama(): |
| logger.success("Ollama PRONTO! phi3.5:mini-instruct-q4_0") |
| return True |
| time.sleep(2) |
| logger.critical("Ollama não subiu!") |
| return False |
|
|
| |
| @app.route("/") |
| def index(): |
| return ''' |
| <div style="font-family: monospace; text-align: center; margin: 50px; background: #000; color: #0f0; padding: 40px;"> |
| <h1>AKIRA V19 OLLAMA SERVER</h1> |
| <p><strong>phi3.5:mini-instruct-q4_0</strong></p> |
| <p><strong>Recebe: mensagem, historico, usuario, numero</strong></p> |
| <p><code>POST /api/generate</code></p> |
| <p>Health: <a href="/health">/health</a></p> |
| </div> |
| ''', 200 |
|
|
| @app.route("/health") |
| def health(): |
| return jsonify({"status": "OK" if check_ollama() else "INICIANDO..."}), 200 |
|
|
| |
| @app.route("/api/generate", methods=['POST']) |
| def generate(): |
| if not check_ollama(): |
| return jsonify({'resposta': 'Epá, tô acordando... espera 10s!'}), 503 |
|
|
| data = request.get_json() or {} |
| mensagem = data.get('mensagem', '').strip() |
| historico = data.get('historico', [])[-8:] |
| usuario = data.get('usuario', 'anonimo') |
| numero = data.get('numero', '') |
| mensagem_citada = data.get('mensagem_citada', '').strip() |
|
|
| if not mensagem and not mensagem_citada: |
| return jsonify({'error': 'mensagem obrigatória'}), 400 |
|
|
| logger.info(f"Recebido de {usuario} ({numero}) → {mensagem[:60]}") |
|
|
| |
| now = datetime.datetime.now().strftime('%d/%m %H:%M') |
| hist_text = '\n'.join([f"Usuário: {h[0]}\nAkira: {h[1]}" for h in historico]) |
|
|
| prompt = f"""Você é Akira, uma angolana de Luanda, 18 anos, forte e debochada. |
| Fala com gírias: epá, puto, kandando, kota, kamba, bué, xingue, mambo. |
| Responde em 1-3 frases curtas, sem censura. |
| Data/hora: {now} |
| Bot: 244952786417 |
| |
| ### Usuário ### |
| - Nome: {usuario} |
| - Número: {numero} |
| |
| """ |
|
|
| if historico: |
| prompt += f"### Histórico ###\n{hist_text}\n\n" |
|
|
| if mensagem_citada: |
| prompt += f"### Resposta ao reply ###\n{mensagem_citada}\n\n{mensagem}\n\n" |
| else: |
| prompt += f"### Mensagem ###\n{mensagem}\n\n" |
|
|
| prompt += "Akira:" |
|
|
| |
| payload = { |
| "model": "phi3.5:mini-instruct-q4_0", |
| "prompt": prompt.strip(), |
| "stream": False, |
| "options": { |
| "temperature": 0.9, |
| "num_predict": 256, |
| "num_ctx": 2048, |
| "num_thread": 2 |
| } |
| } |
|
|
| try: |
| resp = requests.post(f"{OLLAMA_URL}/api/generate", json=payload, timeout=90) |
| if resp.status_code == 200: |
| resposta = resp.json().get("response", "").strip() |
| if resposta: |
| logger.success(f"Resposta: {resposta[:60]}...") |
| return jsonify({'resposta': resposta}) |
| else: |
| fallback = "Epá, kandando bué! Tô aqui, puto!" |
| logger.warning("Ollama vazio → fallback") |
| return jsonify({'resposta': fallback}) |
| else: |
| logger.warning(f"Ollama erro {resp.status_code}: {resp.text}") |
| return jsonify({'resposta': 'Epá, tô com problema... tenta de novo!'}), 500 |
| except Exception as e: |
| logger.error(f"Erro Ollama: {e}") |
| return jsonify({'resposta': 'Epá, tô off... volta já!'}), 500 |
|
|
| |
| if __name__ == "__main__": |
| logger.remove() |
| logger.add(sys.stderr, format="<green>{time:HH:mm:ss}</green> → <level>{message}</level>") |
| logger.info("AKIRA V19 — OLLAMA SERVER (PHI3.5-MINI) INICIANDO...") |
| start_ollama() |
| if not wait_for_ollama(): |
| sys.exit(1) |
|
|
| logger.info("Warming up...") |
| try: |
| requests.post(f"{OLLAMA_URL}/api/generate", json={ |
| "model": "phi3.5:mini-instruct-q4_0", |
| "prompt": "Oi", |
| "options": {"num_predict": 1} |
| }, timeout=60) |
| logger.success("Akira aquecida!") |
| except: |
| pass |
|
|
| logger.info("Flask na porta 7860") |
| app.run(host="0.0.0.0", port=7860, debug=False) |