{
  "id": "deepfake-pro",
  "name": "Deepfake-Pro (Multi-Engine)",
  "version": "1.0.0",
  "type": "agent-tool",
  "author": "Astoris",
  "premium": true,
  "description": "Robuste Deepfake-/Manipulations-Pruefung: fragt MEHRERE Erkennungsdienste parallel ab (Sightengine + AI-or-Not) und bildet einen gewichteten Gesamtscore mit Begruendung. Jeder Anbieter ist optional — je mehr Schluessel, desto zuverlaessiger.",
  "inputHint": "{ \"imageUrl\": \"https://...\", \"sightengineUser\": \"\", \"sightengineSecret\": \"\", \"aiornotKey\": \"\" }",
  "code": "// Deepfake-Pro: kombiniert mehrere Erkennungs-Engines zu einem gewichteten Gesamtscore.\nasync function run(input) {\n  const url = String((input && input.imageUrl) || '').trim();\n  if (!/^https?:\\/\\//.test(url)) return { fehler: 'Bitte eine vollstaendige Bild-URL (http/https) angeben.' };\n  const seUser = String((input && input.sightengineUser) || '').trim();\n  const seSecret = String((input && input.sightengineSecret) || '').trim();\n  const aiornotKey = String((input && input.aiornotKey) || '').trim();\n\n  const ergebnisse = [];\n\n  // Engine 1: Sightengine (deepfake + genai)\n  if (seUser && seSecret) {\n    try {\n      const ep = 'https://api.sightengine.com/1.0/check.json?models=deepfake,genai'\n        + '&api_user=' + encodeURIComponent(seUser) + '&api_secret=' + encodeURIComponent(seSecret)\n        + '&url=' + encodeURIComponent(url);\n      const res = await fetch(ep);\n      const d = await res.json();\n      if (res.ok && d && d.status === 'success') {\n        const score = Math.max(\n          (d.type && typeof d.type.deepfake === 'number') ? d.type.deepfake : 0,\n          (d.type && typeof d.type.ai_generated === 'number') ? d.type.ai_generated : 0\n        );\n        ergebnisse.push({ anbieter: 'Sightengine', ok: true, score: score });\n      } else {\n        ergebnisse.push({ anbieter: 'Sightengine', ok: false, fehler: (d && d.error && d.error.message) || ('HTTP ' + res.status) });\n      }\n    } catch (e) { ergebnisse.push({ anbieter: 'Sightengine', ok: false, fehler: 'nicht erreichbar' }); }\n  }\n\n  // Engine 2: AI or Not (KI-Bild-Erkennung)\n  if (aiornotKey) {\n    try {\n      const res = await fetch('https://api.aiornot.com/v1/reports/image', {\n        method: 'POST',\n        headers: { 'authorization': 'Bearer ' + aiornotKey, 'content-type': 'application/json' },\n        body: JSON.stringify({ object: url })\n      });\n      const d = await res.json();\n      const rep = d && d.report;\n      let score = null;\n      if (rep && rep.ai && typeof rep.ai.confidence === 'number') score = rep.ai.confidence;\n      else if (rep && rep.verdict) score = rep.verdict === 'ai' ? 0.8 : 0.2;\n      if (res.ok && score != null) ergebnisse.push({ anbieter: 'AI or Not', ok: true, score: score });\n      else ergebnisse.push({ anbieter: 'AI or Not', ok: false, fehler: (d && (d.error || d.message)) || ('HTTP ' + res.status) });\n    } catch (e) { ergebnisse.push({ anbieter: 'AI or Not', ok: false, fehler: 'nicht erreichbar' }); }\n  }\n\n  const valide = ergebnisse.filter(function (r) { return r.ok; });\n  if (!valide.length) return {\n    fehler: 'Kein Erkennungsdienst lieferte ein Ergebnis. Mindestens einen Schluessel angeben — Sightengine (sightengineUser + sightengineSecret) und/oder AI or Not (aiornotKey).',\n    versucht: ergebnisse\n  };\n\n  const scores = valide.map(function (r) { return r.score; });\n  const avg = scores.reduce(function (a, b) { return a + b; }, 0) / scores.length;\n  const max = Math.max.apply(null, scores);\n  const gesamt = (avg + max) / 2; // hoechstes Signal staerker gewichtet\n\n  function stufe(s) {\n    if (s < 0.2) return 'sehr wahrscheinlich echt';\n    if (s < 0.5) return 'unklar';\n    if (s < 0.8) return 'wahrscheinlich manipuliert';\n    return 'sehr wahrscheinlich manipuliert';\n  }\n\n  return {\n    gesamtscore: Math.round(gesamt * 1000) / 1000,\n    prozent: Math.round(gesamt * 100) + '%',\n    bewertung: stufe(gesamt),\n    anbieterAusgewertet: valide.length,\n    einzelergebnisse: ergebnisse.map(function (r) {\n      return r.ok ? { anbieter: r.anbieter, score: Math.round(r.score * 100) + '%' } : { anbieter: r.anbieter, fehler: r.fehler };\n    }),\n    begruendung: valide.length + ' Engine(s) kombiniert (Durchschnitt + hoechstes Einzelsignal gewichtet). Mehr Anbieter erhoehen die Zuverlaessigkeit.',\n    hinweis: 'Wahrscheinlichkeit, kein forensischer Beweis.',\n    bild: url\n  };\n}"
}