Utiric commited on
Commit
ebef9a1
·
1 Parent(s): c7133b5

Changed usage

Browse files
Files changed (1) hide show
  1. app.py +70 -12
app.py CHANGED
@@ -1,20 +1,21 @@
1
  from flask import Flask, request, jsonify, render_template_string
2
  import os
 
3
  import torch
4
  from detoxify import Detoxify
5
  from transformers import AutoModelForSequenceClassification, AutoTokenizer
6
 
7
  app = Flask(__name__)
8
 
9
- # Load models
10
  detoxify_model = Detoxify('multilingual')
11
  koala_model = AutoModelForSequenceClassification.from_pretrained("KoalaAI/Text-Moderation")
12
  koala_tokenizer = AutoTokenizer.from_pretrained("KoalaAI/Text-Moderation")
13
 
14
- # API key from environment variable
15
  API_KEY = os.getenv('API_KEY')
16
 
17
- # Modern HTML interface with Tailwind CSS
18
  HTML_TEMPLATE = '''
19
  <!DOCTYPE html>
20
  <html lang="en">
@@ -55,7 +56,7 @@ HTML_TEMPLATE = '''
55
  method: 'POST',
56
  headers: {
57
  'Content-Type': 'application/json',
58
- 'Authorization': 'Bearer YOUR_API_KEY' // Replace YOUR_API_KEY with your actual API key
59
  },
60
  body: JSON.stringify({ model: model, texts: [text] })
61
  });
@@ -67,10 +68,11 @@ HTML_TEMPLATE = '''
67
  let html = '<h2 class="text-2xl font-bold mb-4">Results:</h2>';
68
  data.results.forEach(item => {
69
  html += `<div class="mb-4 p-4 bg-gray-200 dark:bg-gray-700 rounded">
70
- <p class="font-semibold">Input: ${item.input}</p>
 
71
  <ul>`;
72
- for (const [key, value] of Object.entries(item.predictions)) {
73
- html += `<li>${key}: ${value.toFixed(5)}</li>`;
74
  }
75
  html += ` </ul>
76
  </div>`;
@@ -86,13 +88,53 @@ HTML_TEMPLATE = '''
86
  </html>
87
  '''
88
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
89
  @app.route('/')
90
  def home():
91
  return render_template_string(HTML_TEMPLATE)
92
 
93
  @app.route('/v1/moderations', methods=['POST'])
94
  def moderations():
95
- # Retrieve API key from Authorization header in Bearer format
96
  auth_header = request.headers.get('Authorization')
97
  if not auth_header or not auth_header.startswith("Bearer "):
98
  return jsonify({"error": "Unauthorized"}), 401
@@ -108,29 +150,45 @@ def moderations():
108
  return jsonify({"error": "Invalid input, expected a list of texts"}), 400
109
 
110
  results = []
 
111
  if model_choice == "koalaai/text-moderation":
112
  for text in texts:
113
  inputs = koala_tokenizer(text, return_tensors="pt")
114
  outputs = koala_model(**inputs)
115
  logits = outputs.logits
116
  probabilities = torch.softmax(logits, dim=-1).squeeze().tolist()
 
117
  if isinstance(probabilities, float):
118
  probabilities = [probabilities]
119
  labels = [koala_model.config.id2label[idx] for idx in range(len(probabilities))]
120
  prediction = {label: prob for label, prob in zip(labels, probabilities)}
121
- results.append({"input": text, "predictions": prediction})
 
 
 
 
 
 
122
  response_model = "koalaai/text-moderation"
123
  else:
124
  for text in texts:
125
  pred = detoxify_model.predict([text])
 
126
  prediction = {k: v[0] for k, v in pred.items()}
127
- results.append({"input": text, "predictions": prediction})
 
 
 
 
 
 
128
  response_model = "unitaryai/detoxify-multilingual"
129
 
130
  response_data = {
131
- "object": "moderation",
132
  "model": response_model,
133
- "results": results
 
134
  }
135
  return jsonify(response_data)
136
 
 
1
  from flask import Flask, request, jsonify, render_template_string
2
  import os
3
+ import uuid
4
  import torch
5
  from detoxify import Detoxify
6
  from transformers import AutoModelForSequenceClassification, AutoTokenizer
7
 
8
  app = Flask(__name__)
9
 
10
+ # Modelleri yükle
11
  detoxify_model = Detoxify('multilingual')
12
  koala_model = AutoModelForSequenceClassification.from_pretrained("KoalaAI/Text-Moderation")
13
  koala_tokenizer = AutoTokenizer.from_pretrained("KoalaAI/Text-Moderation")
14
 
15
+ # API key environment variable'dan
16
  API_KEY = os.getenv('API_KEY')
17
 
18
+ # Modern, TailwindCSS destekli HTML arayüzü (dark/light)
19
  HTML_TEMPLATE = '''
20
  <!DOCTYPE html>
21
  <html lang="en">
 
56
  method: 'POST',
57
  headers: {
58
  'Content-Type': 'application/json',
59
+ 'Authorization': 'Bearer YOUR_API_KEY' // Değiştir!
60
  },
61
  body: JSON.stringify({ model: model, texts: [text] })
62
  });
 
68
  let html = '<h2 class="text-2xl font-bold mb-4">Results:</h2>';
69
  data.results.forEach(item => {
70
  html += `<div class="mb-4 p-4 bg-gray-200 dark:bg-gray-700 rounded">
71
+ <p class="font-semibold">Flagged: ${item.flagged}</p>
72
+ <p class="font-semibold">Categories:</p>
73
  <ul>`;
74
+ for (const [key, value] of Object.entries(item.categories)) {
75
+ html += `<li>${key}: ${value} (score: ${item.category_scores[key].toFixed(5)})</li>`;
76
  }
77
  html += ` </ul>
78
  </div>`;
 
88
  </html>
89
  '''
90
 
91
+ def transform_predictions(model_choice, prediction_dict):
92
+ """
93
+ OpenAI tarzı response formatı için tahminleri dönüştür.
94
+ Dönüştürülen alanlar: flagged, categories, category_scores, category_applied_input_types
95
+ """
96
+ # OpenAI'nın moderasyon API'sinde kullanılan kategori anahtarları
97
+ category_keys = [
98
+ "sexual", "sexual/minors", "harassment", "harassment/threatening",
99
+ "hate", "hate/threatening", "illicit", "illicit/violent",
100
+ "self-harm", "self-harm/intent", "self-harm/instructions",
101
+ "violence", "violence/graphic"
102
+ ]
103
+ scores = {}
104
+ # Detoxify modeli için örnek eşleştirme:
105
+ if model_choice == "unitaryai/detoxify-multilingual":
106
+ scores["sexual"] = prediction_dict.get("sexual_explicit", 0.0)
107
+ scores["harassment"] = max(prediction_dict.get("identity_attack", 0.0), prediction_dict.get("insult", 0.0))
108
+ scores["hate"] = prediction_dict.get("toxicity", 0.0)
109
+ scores["violence"] = max(prediction_dict.get("severe_toxicity", 0.0), prediction_dict.get("threat", 0.0))
110
+ # Diğer kategoriler için varsayılan 0 değeri
111
+ for key in category_keys:
112
+ if key not in scores:
113
+ scores[key] = 0.0
114
+ else:
115
+ # Koala modelinden gelen tahminlerde, label isimleri doğrudan uyumlu olabilir;
116
+ # uyumlu değilse varsayılan 0 değeri ver.
117
+ for key in category_keys:
118
+ scores[key] = prediction_dict.get(key, 0.0)
119
+
120
+ # Kategori boolean değerleri; eşik değeri: 0.7
121
+ threshold = 0.7
122
+ bool_categories = {key: (scores[key] > threshold) for key in category_keys}
123
+ # category_applied_input_types: biz text ile çalıştığımız için, skor > 0 ise ["text"] değilse boş liste
124
+ cat_applied_input_types = {key: (["text"] if scores[key] > 0 else []) for key in category_keys}
125
+
126
+ # Flagged: herhangi bir kategori eşik değerinin üzerinde ise True
127
+ flagged = any(bool_categories.values())
128
+
129
+ return flagged, bool_categories, scores, cat_applied_input_types
130
+
131
  @app.route('/')
132
  def home():
133
  return render_template_string(HTML_TEMPLATE)
134
 
135
  @app.route('/v1/moderations', methods=['POST'])
136
  def moderations():
137
+ # Authorization header'dan API key kontrolü
138
  auth_header = request.headers.get('Authorization')
139
  if not auth_header or not auth_header.startswith("Bearer "):
140
  return jsonify({"error": "Unauthorized"}), 401
 
150
  return jsonify({"error": "Invalid input, expected a list of texts"}), 400
151
 
152
  results = []
153
+ # Her bir metin için tahmin ve transform işlemi
154
  if model_choice == "koalaai/text-moderation":
155
  for text in texts:
156
  inputs = koala_tokenizer(text, return_tensors="pt")
157
  outputs = koala_model(**inputs)
158
  logits = outputs.logits
159
  probabilities = torch.softmax(logits, dim=-1).squeeze().tolist()
160
+ # Eğer tek değer ise listeye çevir
161
  if isinstance(probabilities, float):
162
  probabilities = [probabilities]
163
  labels = [koala_model.config.id2label[idx] for idx in range(len(probabilities))]
164
  prediction = {label: prob for label, prob in zip(labels, probabilities)}
165
+ flagged, bool_categories, scores, cat_applied_input_types = transform_predictions(model_choice, prediction)
166
+ results.append({
167
+ "flagged": flagged,
168
+ "categories": bool_categories,
169
+ "category_scores": scores,
170
+ "category_applied_input_types": cat_applied_input_types
171
+ })
172
  response_model = "koalaai/text-moderation"
173
  else:
174
  for text in texts:
175
  pred = detoxify_model.predict([text])
176
+ # Detoxify sonuçları liste formatında, tek değer alıyoruz
177
  prediction = {k: v[0] for k, v in pred.items()}
178
+ flagged, bool_categories, scores, cat_applied_input_types = transform_predictions(model_choice, prediction)
179
+ results.append({
180
+ "flagged": flagged,
181
+ "categories": bool_categories,
182
+ "category_scores": scores,
183
+ "category_applied_input_types": cat_applied_input_types
184
+ })
185
  response_model = "unitaryai/detoxify-multilingual"
186
 
187
  response_data = {
188
+ "id": "modr-" + uuid.uuid4().hex[:24],
189
  "model": response_model,
190
+ "results": results,
191
+ "object": "moderation"
192
  }
193
  return jsonify(response_data)
194