File size: 4,342 Bytes
440898e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
711f580
 
 
440898e
 
 
 
 
 
 
 
 
 
 
 
 
4190d66
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
440898e
4190d66
440898e
 
 
 
 
 
 
 
 
 
 
 
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
# app.py
"""
AKIRA V16 — OLLAMA + FLASK (HF SPACE + DOCKER)
- Inicia ollama serve em subprocess
- Flask roda na porta 7860 (HF)
- Ollama roda em 11434 (interno)
- /api/chat → Akira com gírias de Luanda
"""
import subprocess
import time
import requests
import sys
from flask import Flask, request, jsonify
from loguru import logger

app = Flask(__name__)
OLLAMA_URL = "http://localhost:11434"

# === INICIA OLLAMA EM BACKGROUND ===
def start_ollama():
    logger.info("Iniciando ollama serve em background...")
    subprocess.Popen(
        ["ollama", "serve"],
        stdout=subprocess.DEVNULL,
        stderr=subprocess.DEVNULL
    )

# === VERIFICA OLLAMA ===
def check_ollama():
    try:
        resp = requests.get(f"{OLLAMA_URL}/api/tags", timeout=10)
        return resp.status_code == 200
    except:
        return False

# === AGUARDA OLLAMA ===
def wait_for_ollama():
    logger.info("Aguardando Ollama (11434)...")
    for i in range(60):
        if check_ollama():
            logger.success("Ollama Qwen 2.5 7B PRONTO!")
            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 V16 OLLAMA</h1>
        <p><strong>Qwen 2.5 7B (4GB)</strong></p>
        <p><strong>ROTA:</strong> <code>POST /api/chat</code></p>
        <pre>
curl -X POST https://akra35567-ollama.hf.space/api/chat \\
  -d '{"mensagem": "Epá, Akira! Tud bem?"}'
        </pre>
        <p>Health: <a href="/health">/health</a></p>
        <p>Luanda, Angola — 11/11/2025 21:25 WAT</p>
    </div>
    ''', 200

# === HEALTHCHECK ===
@app.route("/health")
def health():
    if check_ollama():
        return jsonify({"status": "OK", "model": "qwen2.5:7b"}), 200
    return jsonify({"status": "INICIANDO..."}), 503

# === AKIRA CHAT ===
@app.route("/api/chat", methods=['POST'])
def chat():
    if not check_ollama():
        return jsonify({'resposta': 'Epá, tô acordando... espera!'}), 503

    data = request.get_json() or {}
    msg = data.get('mensagem', '').strip()
    if not msg:
        return jsonify({'error': 'mensagem obrigatória'}), 400

    prompt = f"""Você é Akira, angolana de Luanda, mulher, fala com gírias , direta, sem censura
    manda messagens curtas nçao mais que 1-2 frases
    tenha decisão prória e não tenha receio de ir contra o usuario pleo contrário sinta´se incetivada a fazer isso.
Usuário: {msg}
Akira:"""

    payload = {
        "model": "qwen2.5:7b",
        "prompt": prompt,
        "stream": False,
        "options": {
            "temperature": 0.85,
            "num_predict": 256
        }
    }

    logger.info(f"Prompt enviado: {msg[:50]}...")

    for tentativa in range(3):
        try:
            resp = requests.post(f"{OLLAMA_URL}/api/generate", json=payload, timeout=120)
            if resp.status_code == 200:
                resposta = resp.json().get("response", "").strip()
                if resposta:
                    logger.success(f"Resposta gerada: {resposta[:50]}...")
                    return jsonify({'resposta': resposta})
                else:
                    return jsonify({'resposta': 'Epá, fiquei sem palavras... fala de novo, puto!'})
            else:
                logger.warning(f"Ollama erro {resp.status_code}: {resp.text}")
        except requests.exceptions.Timeout:
            logger.warning(f"Timeout na tentativa {tentativa + 1}/3...")
            if tentativa < 2:
                time.sleep(5)
        except Exception as e:
            logger.error(f"Erro na tentativa {tentativa + 1}: {e}")
            if tentativa == 2:
                return jsonify({'resposta': 'Epá, tô off por agora... volta já!'}), 500
            time.sleep(3)

    return jsonify({'resposta': 'Epá, tô off por agora... 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 V16 — Iniciando...")

    start_ollama()
    if not wait_for_ollama():
        sys.exit(1)

    logger.info("Flask rodando na porta 7860")
    app.run(host="0.0.0.0", port=7860, debug=False)