Skip to main content

Vue d’ensemble

Chaque utilisateur qui annote via une app partenaire possède un score de réputation allant de 0 à 100. Ce score est calculé automatiquement à partir de ses réponses aux golden tasks. Le score détermine son niveau de certification, visible dans l’app partenaire.

Niveaux de certification

NiveauScore minimumGolden tasks minimumDescription
⚪ Unranked< 10Nouvel annotateur, pas encore évalué
🥉 Bronze≥ 40≥ 10Fiabilité de base établie
🥈 Silver≥ 60≥ 50Annotateur régulier et fiable
🥇 Gold≥ 75≥ 200Expert reconnu
⭐ Expert≥ 90≥ 500Niveau le plus élevé
Les deux conditions (score ET nombre de réponses) doivent être remplies simultanément.

Évolution du score

ÉvénementImpact
Golden task — bonne réponse+ 1
Golden task — mauvaise réponse- 3
Score plancher0 (ne descend pas en dessous)
Score plafond100
Score initial50

Exemple de progression

Départ : score 50, 0 réponses → Unranked

+10 bonnes réponses  → score 60, 10 réponses → Bronze  🥉
+40 bonnes réponses  → score 100, mais plafonné à 100
                       50 réponses  → Silver  🥈  (si score ≥ 60)

-3 mauvaises réponses en séquence → score 97 → toujours Silver

Isolation par développeur

Le score de réputation est par (développeur, utilisateur) — un même utilisateur peut avoir des scores différents dans des apps différentes. Cela permet à chaque développeur d’avoir sa propre mesure de qualité, indépendante des autres apps.
// Score de l'utilisateur "user_123" dans votre app
const rep = await dloopiq.getUserReputation('user_123')
// → score spécifique à votre clé API

Intégrer la certification dans votre app

Exemple React Native

import { DLoopIQ } from '@dloopiq/sdk'

const LEVEL_CONFIG = {
  Unranked: { color: '#9ca3af', emoji: '⚪', label: 'Débutant' },
  Bronze:   { color: '#92400e', emoji: '🥉', label: 'Bronze' },
  Silver:   { color: '#6b7280', emoji: '🥈', label: 'Argent' },
  Gold:     { color: '#d97706', emoji: '🥇', label: 'Or' },
  Expert:   { color: '#7c3aed', emoji: '⭐', label: 'Expert' },
}

function UserBadge({ userId }) {
  const [rep, setRep] = useState(null)

  useEffect(() => {
    dloopiq.getUserReputation(userId).then(setRep)
  }, [userId])

  if (!rep) return null

  const config = LEVEL_CONFIG[rep.certification]

  return (
    <View style={styles.badge}>
      <Text style={{ color: config.color }}>
        {config.emoji} {config.label}
      </Text>
      <Text style={styles.accuracy}>
        Précision : {Math.round(rep.accuracy * 100)}%
      </Text>
      {rep.nextLevel && (
        <ProgressBar
          label={`Vers ${rep.nextLevel.level}`}
          value={rep.score}
          max={rep.nextLevel.requiredScore}
        />
      )}
    </View>
  )
}

Motiver les utilisateurs

// Après chaque réponse, montrer la progression
const result = await dloopiq.completeTask({ ... })
const rep = await dloopiq.getUserReputation(userId)

if (rep.nextLevel) {
  showToast(`${rep.nextLevel.missingAnswers} réponses avant ${rep.nextLevel.level} !`)
}

Consulter la réputation via l’API REST

curl "https://dloopiq.onrender.com/api/v1/sdk/reputation/user_abc123" \
  -H "Authorization: Bearer <apiKey_développeur>"
{
  "userId": "user_abc123",
  "score": 73,
  "goldenTasksAnswered": 62,
  "correctAnswers": 51,
  "accuracy": 0.82,
  "certification": "Silver",
  "nextLevel": {
    "level": "Gold",
    "requiredScore": 75,
    "requiredAnswers": 200,
    "missingScore": 2,
    "missingAnswers": 138
  }
}

Impact sur le consensus

À l’avenir, les annotateurs de niveau supérieur pourront voir leurs réponses pondérées plus fortement dans le calcul du consensus. Pour l’instant, toutes les réponses ont le même poids.