# app.py — OLLAMA V19 AUTÔNOMO (PHI3.5-MINI) — DOCKER + PROMPT LIMPO 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" # === CONFIGURAÇÃO OLLAMA === 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" # === INICIA OLLAMA === 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 # === RAIZ === @app.route("/") def index(): return '''

AKIRA V19 OLLAMA SERVER

phi3.5:mini-instruct-q4_0

Recebe: mensagem, historico, usuario, numero

POST /api/generate

Health: /health

''', 200 @app.route("/health") def health(): return jsonify({"status": "OK" if check_ollama() else "INICIANDO..."}), 200 # === ROTA PRINCIPAL === @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:] # últimos 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]}") # === PROMPT LIMPO (AKIRA STYLE) === 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:" # === ENVIA PARA OLLAMA (PHI3.5-MINI) === 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 # === INÍCIO === if __name__ == "__main__": logger.remove() logger.add(sys.stderr, format="{time:HH:mm:ss}{message}") 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)