hrlima commited on
Commit
774768d
·
verified ·
1 Parent(s): 1bf44c3

Upload 6 files

Browse files
Files changed (6) hide show
  1. .gitattributes +1 -35
  2. Dockerfile +3 -33
  3. app.py +59 -81
  4. emotion-api.zip +0 -0
  5. requirements.txt +4 -17
  6. runtime.txt +1 -1
.gitattributes CHANGED
@@ -1,35 +1 @@
1
- *.7z filter=lfs diff=lfs merge=lfs -text
2
- *.arrow filter=lfs diff=lfs merge=lfs -text
3
- *.bin filter=lfs diff=lfs merge=lfs -text
4
- *.bz2 filter=lfs diff=lfs merge=lfs -text
5
- *.ckpt filter=lfs diff=lfs merge=lfs -text
6
- *.ftz filter=lfs diff=lfs merge=lfs -text
7
- *.gz filter=lfs diff=lfs merge=lfs -text
8
- *.h5 filter=lfs diff=lfs merge=lfs -text
9
- *.joblib filter=lfs diff=lfs merge=lfs -text
10
- *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
- *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
- *.model filter=lfs diff=lfs merge=lfs -text
13
- *.msgpack filter=lfs diff=lfs merge=lfs -text
14
- *.npy filter=lfs diff=lfs merge=lfs -text
15
- *.npz filter=lfs diff=lfs merge=lfs -text
16
- *.onnx filter=lfs diff=lfs merge=lfs -text
17
- *.ot filter=lfs diff=lfs merge=lfs -text
18
- *.parquet filter=lfs diff=lfs merge=lfs -text
19
- *.pb filter=lfs diff=lfs merge=lfs -text
20
- *.pickle filter=lfs diff=lfs merge=lfs -text
21
- *.pkl filter=lfs diff=lfs merge=lfs -text
22
- *.pt filter=lfs diff=lfs merge=lfs -text
23
- *.pth filter=lfs diff=lfs merge=lfs -text
24
- *.rar filter=lfs diff=lfs merge=lfs -text
25
- *.safetensors filter=lfs diff=lfs merge=lfs -text
26
- saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
- *.tar.* filter=lfs diff=lfs merge=lfs -text
28
- *.tar filter=lfs diff=lfs merge=lfs -text
29
- *.tflite filter=lfs diff=lfs merge=lfs -text
30
- *.tgz filter=lfs diff=lfs merge=lfs -text
31
- *.wasm filter=lfs diff=lfs merge=lfs -text
32
- *.xz filter=lfs diff=lfs merge=lfs -text
33
- *.zip filter=lfs diff=lfs merge=lfs -text
34
- *.zst filter=lfs diff=lfs merge=lfs -text
35
- *tfevents* filter=lfs diff=lfs merge=lfs -text
 
1
+ *.py linguist-language=Python
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Dockerfile CHANGED
@@ -1,42 +1,12 @@
1
- # ==========================
2
- # Base Image
3
- # ==========================
4
  FROM python:3.10-slim
5
 
6
- # ==========================
7
- # Environment
8
- # ==========================
9
- ENV PIP_NO_CACHE_DIR=1
10
- ENV PYTHONUNBUFFERED=1
11
- ENV PYTHONIOENCODING=utf-8
12
- ENV PORT=7860
13
-
14
- # ==========================
15
- # Working directory
16
- # ==========================
17
  WORKDIR /home/user/app
18
 
19
- # ==========================
20
- # Install system dependencies
21
- # ==========================
22
- RUN apt-get update && apt-get install -y \
23
- git \
24
- curl \
25
- ffmpeg \
26
- libsm6 \
27
- libxext6 \
28
- && rm -rf /var/lib/apt/lists/*
29
-
30
- # ==========================
31
- # Copy project files
32
- # ==========================
33
  COPY requirements.txt .
34
- RUN pip install --upgrade pip
35
- RUN pip install -r requirements.txt
36
 
37
  COPY . .
38
 
39
- # ==========================
40
- # Run App
41
- # ==========================
42
  CMD ["python", "app.py"]
 
 
 
 
1
  FROM python:3.10-slim
2
 
 
 
 
 
 
 
 
 
 
 
 
3
  WORKDIR /home/user/app
4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
  COPY requirements.txt .
6
+ RUN pip install --no-cache-dir -r requirements.txt
 
7
 
8
  COPY . .
9
 
10
+ EXPOSE 8080
11
+
 
12
  CMD ["python", "app.py"]
app.py CHANGED
@@ -1,103 +1,81 @@
1
- from flask import Flask, request, jsonify
2
- import firebase_admin
3
- from firebase_admin import credentials, firestore
4
- from huggingface_hub import InferenceClient
5
  import os
6
  import json
 
 
 
 
 
7
 
8
  app = Flask(__name__)
9
 
10
- # =============== 🔥 Firebase Initialization ==================
11
  try:
12
- firebase_json = os.getenv("FIREBASE_CONFIG")
13
- if firebase_json:
14
- cred_dict = json.loads(firebase_json)
15
- cred = credentials.Certificate(cred_dict)
16
- firebase_admin.initialize_app(cred)
17
- db = firestore.client()
18
- print("✅ Firebase conectado com sucesso.")
19
- else:
20
- print("⚠️ Variável FIREBASE_CONFIG não encontrada.")
21
  except Exception as e:
22
  print(f"❌ Erro ao inicializar Firebase: {e}")
23
 
24
- # =============== 🤖 Hugging Face API ==================
25
  HF_TOKEN = os.getenv("HF_TOKEN")
26
  if not HF_TOKEN:
27
  raise RuntimeError("❌ HF_TOKEN não encontrado nos Secrets do Space.")
28
 
29
- client = InferenceClient(token=HF_TOKEN)
30
-
31
- # Lista de emoções permitidas
32
- TARGET_EMOTIONS = ["tristeza", "ansiedade", "insegurança", "raiva", "alegria"]
33
 
34
- # =============== 🧩 Função de análise ==================
35
  @app.route("/analyze", methods=["POST"])
36
- def analyze_text():
37
  try:
38
- data = request.get_json(force=True)
39
- text = data.get("text", "").strip()
40
-
41
- if not text:
42
- return jsonify({"error": "Campo 'text' é obrigatório"}), 400
43
-
44
- # Chamada ao modelo Hugging Face
45
- response = client.text_classification(
46
- model="SamLowe/roberta-base-go_emotions", # multilabel + multilingue
47
- inputs=text,
48
- )
49
-
50
- # Extrai as labels com maior score
51
- best = max(response, key=lambda x: x["score"])
52
- detected_label = best["label"].lower()
53
-
54
- # Mapeia as emoções do modelo para as suas emoções personalizadas
55
- mapped_emotion = "insegurança"
56
- if "happy" in detected_label or "joy" in detected_label or "content" in detected_label:
57
- mapped_emotion = "alegria"
58
- elif "anger" in detected_label or "annoyance" in detected_label:
59
- mapped_emotion = "raiva"
60
- elif "sad" in detected_label or "grief" in detected_label:
61
- mapped_emotion = "tristeza"
62
- elif "anxiety" in detected_label or "fear" in detected_label or "worry" in detected_label:
63
- mapped_emotion = "ansiedade"
64
- elif "nervous" in detected_label or "confusion" in detected_label or "embarrassment" in detected_label:
65
- mapped_emotion = "insegurança"
66
-
67
- result = {
68
- "emotion": mapped_emotion,
69
- "score": round(best["score"], 4),
70
- "emode": [mapped_emotion],
71
- "suggestion": gerar_sugestao(mapped_emotion),
72
- "status": "ok"
73
  }
74
 
75
- return jsonify(result), 200
76
-
77
- except Exception as e:
78
- return jsonify({"error": str(e)}), 500
79
-
80
-
81
- def gerar_sugestao(emocao):
82
- """Sugestões personalizadas por emoção"""
83
- sugestoes = {
84
- "alegria": "Continue cultivando momentos positivos!",
85
- "tristeza": "Procure descansar e conversar com alguém de confiança.",
86
- "raiva": "Respire fundo, tente se afastar um pouco da situação.",
87
- "ansiedade": "Tente uma pausa breve, respiração profunda e se hidratar.",
88
- "insegurança": "Lembre-se do quanto você já conquistou, confie em você!",
89
- }
90
- return sugestoes.get(emocao, "Tudo bem sentir isso — observe sem se julgar.")
91
 
 
 
 
 
 
 
92
 
93
- @app.route("/", methods=["GET"])
94
- def home():
95
- return jsonify({
96
- "message": "API Flask funcionando no Space!",
97
- "status": "online"
98
- })
99
-
100
 
101
  if __name__ == "__main__":
102
- app.run(host="0.0.0.0", port=7860)
103
-
 
 
 
 
 
1
  import os
2
  import json
3
+ import traceback
4
+ import firebase_admin
5
+ from firebase_admin import credentials, firestore
6
+ from flask import Flask, request, jsonify
7
+ import requests
8
 
9
  app = Flask(__name__)
10
 
 
11
  try:
12
+ firebase_json = os.getenv("FIREBASE_KEY")
13
+ if not firebase_json:
14
+ raise RuntimeError("❌ FIREBASE_KEY não encontrado nos Secrets do Space.")
15
+
16
+ cred_dict = json.loads(firebase_json)
17
+ cred = credentials.Certificate(cred_dict)
18
+ firebase_admin.initialize_app(cred)
19
+ db = firestore.client()
20
+ print(" Firebase conectado com sucesso.")
21
  except Exception as e:
22
  print(f"❌ Erro ao inicializar Firebase: {e}")
23
 
 
24
  HF_TOKEN = os.getenv("HF_TOKEN")
25
  if not HF_TOKEN:
26
  raise RuntimeError("❌ HF_TOKEN não encontrado nos Secrets do Space.")
27
 
28
+ MODEL_URL = "https://api-inference.huggingface.co/models/j-hartmann/emotion-english-distilroberta-base"
29
+ HEADERS = {"Authorization": f"Bearer {HF_TOKEN}"}
 
 
30
 
 
31
  @app.route("/analyze", methods=["POST"])
32
+ def analyze():
33
  try:
34
+ data = request.get_json()
35
+ if not data or "text" not in data:
36
+ return jsonify({"error": "Campo 'text' ausente."}), 400
37
+
38
+ text = data["text"]
39
+ print(f"🧠 Analisando texto: {text}")
40
+
41
+ response = requests.post(MODEL_URL, headers=HEADERS, json={"inputs": text}, timeout=15)
42
+ if response.status_code != 200:
43
+ raise RuntimeError(f"Erro na API HF: {response.text}")
44
+
45
+ result = response.json()
46
+
47
+ emotion_data = result[0] if isinstance(result, list) else []
48
+ if isinstance(emotion_data, list) and len(emotion_data) > 0:
49
+ best = max(emotion_data, key=lambda x: x.get("score", 0))
50
+ emotion = best.get("label", "").lower()
51
+ else:
52
+ emotion = "desconhecido"
53
+
54
+ allowed_emotions = ["tristeza", "ansiedade", "insegurança", "raiva", "alegria"]
55
+ if emotion not in allowed_emotions:
56
+ emotion = "desconhecido"
57
+
58
+ suggestions = {
59
+ "tristeza": "Tente conversar com alguém de confiança e fazer algo que te acalme 💙",
60
+ "ansiedade": "Respire fundo e pratique mindfulness por alguns minutos 🌿",
61
+ "insegurança": "Lembre-se do quanto você já conquistou, acredite em si mesmo 💪",
62
+ "raiva": "Afaste-se um pouco e respire fundo antes de reagir 🔥",
63
+ "alegria": "Continue assim! Espalhe positividade 😊",
64
+ "desconhecido": "Emoção não identificada com precisão."
 
 
 
 
65
  }
66
 
67
+ suggestion = suggestions.get(emotion, "Sem sugestão disponível.")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
68
 
69
+ return jsonify({
70
+ "status": "ok",
71
+ "emotion": emotion,
72
+ "emode": [emotion],
73
+ "suggestion": suggestion
74
+ })
75
 
76
+ except Exception as e:
77
+ traceback.print_exc()
78
+ return jsonify({"status": "fallback", "error": str(e)}), 500
 
 
 
 
79
 
80
  if __name__ == "__main__":
81
+ app.run(host="0.0.0.0", port=8080)
 
emotion-api.zip ADDED
Binary file (3.68 kB). View file
 
requirements.txt CHANGED
@@ -1,17 +1,4 @@
1
- # Servidor Flask
2
- flask==3.0.3
3
- gunicorn==23.0.0
4
- huggingface-hub==0.25.2
5
-
6
- # Firebase
7
- firebase-admin==7.6.0
8
-
9
- # Transformers e PyTorch
10
- transformers==4.40.2
11
- torch==2.2.0
12
-
13
- # Requisições HTTP mais avançadas (se precisar)
14
- requests==2.32.3
15
-
16
- # Para JSON e manipulação de tempo
17
- python-dotenv==1.0.0
 
1
+ flask
2
+ firebase-admin
3
+ requests
4
+ gunicorn
 
 
 
 
 
 
 
 
 
 
 
 
 
runtime.txt CHANGED
@@ -1 +1 @@
1
- python-3.10
 
1
+ python-3.10