File size: 5,051 Bytes
f3b7acc
440898e
 
 
 
a96588e
f3b7acc
440898e
 
 
 
 
 
3b28115
 
 
 
a96588e
 
3b28115
440898e
4fed00b
 
 
440898e
 
 
 
 
 
 
 
 
 
 
f3b7acc
440898e
 
 
 
 
 
 
 
 
 
f3b7acc
 
 
64b6538
440898e
 
 
 
 
 
4fed00b
440898e
f3b7acc
64b6538
 
440898e
a96588e
440898e
 
4fed00b
f3b7acc
 
 
4fed00b
440898e
f3b7acc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4fed00b
 
f3b7acc
 
 
 
 
4fed00b
f3b7acc
440898e
f3b7acc
 
440898e
 
4fed00b
 
a96588e
 
440898e
 
 
4fed00b
f3b7acc
4fed00b
 
 
 
 
4190d66
f3b7acc
 
 
4fed00b
 
 
 
 
 
a96588e
440898e
 
 
 
f3b7acc
440898e
 
 
f3b7acc
4fed00b
a96588e
 
f3b7acc
a96588e
 
 
 
 
4fed00b
f3b7acc
4fed00b
3b28115
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# 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 '''
    <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

# === 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="<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)