Jdp-08 commited on
Commit
244b845
·
verified ·
1 Parent(s): 529f3d1

Update server.py

Browse files
Files changed (1) hide show
  1. server.py +7 -83
server.py CHANGED
@@ -8,16 +8,10 @@ import hashlib
8
  import httpx
9
  import os
10
  import base64
11
- import asyncio
12
  import json
13
 
14
  # ---------------- API KEYS ----------------
15
- HF_API_KEY = os.getenv("HF_API_KEY")
16
  GROQ_API_KEY = os.getenv("GROQ_API_KEY")
17
-
18
- # ---------------- CLOUD MODELS ----------------
19
- CLOUD_MODEL_1 = "https://router.huggingface.co/hf-inference/models/Ateeqq/ai-vs-human-image-detector"
20
- CLOUD_MODEL_2 = "https://router.huggingface.co/hf-inference/models/prithivMLmods/deepfake-detector-model-v1"
21
  GROQ_API_URL = "https://api.groq.com/openai/v1/chat/completions"
22
 
23
  # ---------------- APP ----------------
@@ -65,55 +59,10 @@ def fusion_score(model_score: float, metadata_risk: float):
65
  return authenticity, fake
66
 
67
 
68
- def normalize_output(label_prob_dict: dict) -> float:
69
- FAKE_KEYWORDS = ["fake", "ai", "generated", "manipulated", "deepfake", "artificial", "synthetic"]
70
- REAL_KEYWORDS = ["real", "authentic", "genuine", "human", "original"]
71
-
72
- fake_score = 0.0
73
- uncertain_score = 0.0
74
-
75
- for label, prob in label_prob_dict.items():
76
- label_lower = label.lower()
77
- if any(k in label_lower for k in FAKE_KEYWORDS):
78
- fake_score += prob
79
- elif any(k in label_lower for k in REAL_KEYWORDS):
80
- pass
81
- else:
82
- uncertain_score += prob
83
-
84
- fake_score += 0.4 * uncertain_score
85
- return min(fake_score, 1.0)
86
-
87
-
88
  # ==============================
89
- # CLOUD MODEL CALLS
90
  # ==============================
91
 
92
- async def call_model(url: str, contents: bytes, name: str, content_type: str = "image/jpeg") -> Optional[float]:
93
- if not HF_API_KEY:
94
- print(f"No HF_API_KEY, skipping {name}")
95
- return None
96
- try:
97
- async with httpx.AsyncClient(timeout=30.0) as client:
98
- response = await client.post(
99
- url,
100
- headers={
101
- "Authorization": f"Bearer {HF_API_KEY}",
102
- "Content-Type": content_type
103
- },
104
- content=contents,
105
- )
106
- print(f"{name} status: {response.status_code}")
107
- print(f"{name} response: {response.text}")
108
- response.raise_for_status()
109
- data = response.json()
110
- label_prob_dict = {item["label"]: item["score"] for item in data}
111
- return normalize_output(label_prob_dict)
112
- except Exception as e:
113
- print(f"{name} failed: {e}")
114
- return None
115
-
116
-
117
  async def call_groq_vision(contents: bytes) -> Optional[float]:
118
  if not GROQ_API_KEY:
119
  print("No GROQ_API_KEY set")
@@ -188,37 +137,16 @@ fake_probability must be between 0.0 (definitely real) and 1.0 (definitely AI/fa
188
  async def analyze_image(contents: bytes, content_type: str = "image/jpeg"):
189
  image = Image.open(io.BytesIO(contents)).convert("RGB")
190
 
191
- # all 3 run in parallel
192
- score1, score2, score3 = await asyncio.gather(
193
- call_model(CLOUD_MODEL_1, contents, "Ateeqq", content_type),
194
- call_model(CLOUD_MODEL_2, contents, "prithivMLmods", content_type),
195
- call_groq_vision(contents)
196
- )
197
-
198
- scores = [(s, n) for s, n in [
199
- (score1, "Ateeqq"),
200
- (score2, "prithivMLmods"),
201
- (score3, "Groq_Llama4")
202
- ] if s is not None]
203
-
204
- if scores:
205
- combined_model_score = sum(s for s, _ in scores) / len(scores)
206
- models_used = [n for _, n in scores]
207
- else:
208
- combined_model_score = 0.5
209
- models_used = []
210
 
211
  metadata_risk = calculate_metadata_risk(image)
212
  authenticity, fake = fusion_score(combined_model_score, metadata_risk)
213
 
214
- # confidence level
215
  diff = abs(authenticity - fake)
216
- if diff < 20:
217
- confidence_level = "low"
218
- elif diff < 40:
219
- confidence_level = "medium"
220
- else:
221
- confidence_level = "high"
222
 
223
  return {
224
  "type": "image",
@@ -227,9 +155,7 @@ async def analyze_image(contents: bytes, content_type: str = "image/jpeg"):
227
  "confidence_level": confidence_level,
228
  "models_used": models_used,
229
  "details": {
230
- "model1_score": round(score1, 4) if score1 is not None else "unavailable",
231
- "model2_score": round(score2, 4) if score2 is not None else "unavailable",
232
- "groq_score": round(score3, 4) if score3 is not None else "unavailable",
233
  "metadata_risk": round(metadata_risk, 4),
234
  }
235
  }
@@ -243,8 +169,6 @@ def analyze_video(contents: bytes):
243
  "confidence_level": "low",
244
  "models_used": ["placeholder"],
245
  "details": {
246
- "model1_score": "unavailable",
247
- "model2_score": "unavailable",
248
  "groq_score": "unavailable",
249
  "metadata_risk": 0.1,
250
  }
 
8
  import httpx
9
  import os
10
  import base64
 
11
  import json
12
 
13
  # ---------------- API KEYS ----------------
 
14
  GROQ_API_KEY = os.getenv("GROQ_API_KEY")
 
 
 
 
15
  GROQ_API_URL = "https://api.groq.com/openai/v1/chat/completions"
16
 
17
  # ---------------- APP ----------------
 
59
  return authenticity, fake
60
 
61
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
62
  # ==============================
63
+ # GROQ VISION
64
  # ==============================
65
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
  async def call_groq_vision(contents: bytes) -> Optional[float]:
67
  if not GROQ_API_KEY:
68
  print("No GROQ_API_KEY set")
 
137
  async def analyze_image(contents: bytes, content_type: str = "image/jpeg"):
138
  image = Image.open(io.BytesIO(contents)).convert("RGB")
139
 
140
+ score = await call_groq_vision(contents)
141
+
142
+ combined_model_score = score if score is not None else 0.5
143
+ models_used = ["Groq_Llama4"] if score is not None else []
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
144
 
145
  metadata_risk = calculate_metadata_risk(image)
146
  authenticity, fake = fusion_score(combined_model_score, metadata_risk)
147
 
 
148
  diff = abs(authenticity - fake)
149
+ confidence_level = "low" if diff < 20 else "medium" if diff < 40 else "high"
 
 
 
 
 
150
 
151
  return {
152
  "type": "image",
 
155
  "confidence_level": confidence_level,
156
  "models_used": models_used,
157
  "details": {
158
+ "groq_score": round(score, 4) if score is not None else "unavailable",
 
 
159
  "metadata_risk": round(metadata_risk, 4),
160
  }
161
  }
 
169
  "confidence_level": "low",
170
  "models_used": ["placeholder"],
171
  "details": {
 
 
172
  "groq_score": "unavailable",
173
  "metadata_risk": 0.1,
174
  }