dilem.

    API, MCP et agents

    Documentation développeurs

    Un agent peut soumettre un choix, recevoir une question de clarification, puis obtenir une recommandation et ses raisons. Aucun compte ni clé fournisseur à configurer.

    REST v1.1.0 MCP · Streamable HTTP Markdown ↗

    MCP

    Pour les assistants et clients MCP. Configure le serveur, puis découvre ses outils.

    REST API

    Pour ton application ou ton script. HTTP, authentification Bearer et réponses JSON.

    WebMCP

    Pour un agent dans la page ouverte. Identité et historique du navigateur.

    Connexion MCP

    Adresse MCP
    https://dilem.si/api/v1/mcp

    Transport HTTP distant, sans OAuth. Le jeton applicatif est passé aux outils, pas dans la configuration du serveur. Prévois 110 secondes pour un appel de décision.

    Choisis ton client. Fusionne l’exemple avec ta configuration existante, sans la remplacer. Recharge ensuite les outils MCP et vérifie la présence de start_session, get_usage et decide.

    Claude Code
    Terminal · Bash
    claude mcp add --transport http dilem https://dilem.si/api/v1/mcp

    Documentation du client ↗

    Codex
    Fichier de configuration
    ~/.codex/config.toml
    Configuration · TOML
    [mcp_servers.dilem]
    url = "https://dilem.si/api/v1/mcp"
    tool_timeout_sec = 110

    Documentation du client ↗

    Cursor
    Fichier de configuration
    .cursor/mcp.json
    Configuration · JSON
    {
      "mcpServers": {
        "dilem": {
          "url": "https://dilem.si/api/v1/mcp"
        }
      }
    }

    Documentation du client ↗

    OpenCode
    Fichier de configuration
    opencode.json
    Configuration · JSON
    {
      "mcp": {
        "dilem": {
          "type": "remote",
          "url": "https://dilem.si/api/v1/mcp",
          "enabled": true,
          "oauth": false
        }
      }
    }

    Documentation du client ↗

    Hermes Agent
    Terminal · Bash
    hermes mcp add dilem --url https://dilem.si/api/v1/mcp

    Documentation du client ↗

    Mistral Vibe
    Fichier de configuration
    ~/.vibe/config.toml
    Configuration · TOML
    [[mcp_servers]]
    name = "dilem"
    transport = "streamable-http"
    url = "https://dilem.si/api/v1/mcp"
    tool_timeout_sec = 110
    
    [mcp_servers.auth]
    type = "static"
    headers = {}

    Documentation du client ↗

    OpenClaw
    Fichier de configuration
    ~/.openclaw/openclaw.json
    Configuration · JSON
    {
      "mcp": {
        "servers": {
          "dilem": {
            "url": "https://dilem.si/api/v1/mcp",
            "transport": "streamable-http",
            "enabled": true,
            "connectionTimeoutMs": 10000,
            "requestTimeoutMs": 110000
          }
        }
      }
    }

    Documentation du client ↗

    Pi
    Fichier de configuration
    ~/.pi/agent/mcp.json
    Configuration · JSON
    {
      "mcpServers": {
        "dilem": {
          "url": "https://dilem.si/api/v1/mcp",
          "timeout": 110
        }
      }
    }

    Documentation du client ↗

    Référence MCP

    start_session

    Écriture

    Créer ou renouveler l’identité privée du client.

    • session string | null facultatif · Par défaut null

    Réponse: Session

    POST /api/v1/session

    Entrée

    En-têtes
    • Authorization string

      Jeton de session envoyé sous la forme Bearer <session>.

    Aucun corps de requête requis.

    Réponse

    200 application/json
    Exemple illustratif · JSON
    {
      "session": "OPAQUE_SESSION_KEEP_PRIVATE",
      "expires_in": 7776000
    }
    • session string · obligatoire

      Jeton privé du client, à conserver pour les appels suivants.

    • expires_in integer · obligatoire

      Durée de validité de la session, en secondes.

      Valeur : 7776000

    Erreurs et reprise

    403 · 408 · 409 · 413 · 422 · 429 · 503 application/json

    Exemple illustratif · JSON
    {
      "type": "error",
      "code": "case_completed"
    }
    • type string · obligatoire

      Nature de la réponse renvoyée.

      Valeur : "error"

    • code string · obligatoire

      Code à examiner pour traiter le refus ou l’échec.

    • message string

      Explication lisible du refus ou de l’échec.

    • retryable boolean

      Indique si une nouvelle tentative peut être envisagée.

    • resets_at string

      Date et heure du prochain renouvellement des crédits.

      Date et heure au format ISO 8601

    get_usage

    Lecture

    Consulter les crédits, leur renouvellement et l’état éventuel du cas.

    • session string obligatoire
    • case_id string | null facultatif · Par défaut null

    Réponse: Usage

    GET /api/v1/usage

    Entrée

    En-têtes
    • Authorization string · obligatoire

      Jeton de session envoyé sous la forme Bearer <session>.

    • X-Dilem-Case-ID string

      Identifiant conservé pour tous les échanges d’un même dilemme.

      Format technique

      ^[a-zA-Z0-9_-]{1,80}$

    Aucun corps de requête requis.

    Réponse

    200 application/json
    Exemple illustratif · JSON
    {
      "day": "2026-01-01",
      "resets_at": "2026-01-02T00:00:00Z",
      "collective": {
        "completed": 42
      },
      "dilemmas": {
        "used": 1,
        "limit": 20,
        "remaining": 19
      },
      "case": {
        "id": "my-unique-dilemma-id",
        "admitted": true,
        "completed": false
      },
      "voice": {
        "seconds_used": 0,
        "seconds_reserved": 0,
        "seconds_remaining": 1200,
        "seconds_limit": 1200,
        "max_seconds": 60
      },
      "budget": {
        "daily_usd": 5,
        "available": true
      }
    }
    • day string · obligatoire

      Journée UTC des compteurs.

      Date au format ISO 8601

    • resets_at string · obligatoire

      Date et heure du prochain renouvellement des crédits.

      Date et heure au format ISO 8601

    • collective object · obligatoire

      Compteur collectif des dilemmes terminés.

      Champs
      • completed integer · obligatoire

        Nombre de dilemmes terminés dans le compteur collectif.

    • dilemmas object · obligatoire

      Crédits de dilemme utilisés, disponibles et autorisés.

      Champs
      • used integer · obligatoire

        Crédits déjà utilisés.

        Minimum : 0

      • limit integer · obligatoire

        Plafond de crédits de la politique active.

        Minimum : 0

      • remaining integer · obligatoire

        Crédits encore disponibles.

        Minimum : 0

    • case object · obligatoire

      État du dilemme correspondant au Case-ID fourni.

      Champs
      • id string | null · obligatoire

        Case-ID demandé, ou null sans identifiant.

      • admitted boolean · obligatoire

        Indique si ce dilemme a déjà été admis dans le quota.

      • completed boolean · obligatoire

        Indique si une première recommandation a terminé ce dilemme.

    • voice object · obligatoire

      Durées de dictée et plafonds, en secondes.

      Champs
      • seconds_used number

        Secondes de dictée déjà consommées.

      • seconds_reserved number

        Secondes temporairement réservées par une capture en cours.

      • seconds_remaining number

        Secondes de dictée encore disponibles.

      • seconds_limit number

        Plafond total de dictée, en secondes.

      • max_seconds number

        Durée maximale d’une capture, en secondes.

    • budget object · obligatoire

      Budget financier partagé et disponibilité du service.

      Champs
      • daily_usd number · obligatoire

        Plafond financier quotidien du service, en dollars US.

      • available boolean · obligatoire

        Indique si le budget permet encore des calculs.

    Erreurs et reprise

    403 · 408 · 409 · 413 · 422 · 429 · 503 application/json

    Exemple illustratif · JSON
    {
      "type": "error",
      "code": "case_completed"
    }
    • type string · obligatoire

      Nature de la réponse renvoyée.

      Valeur : "error"

    • code string · obligatoire

      Code à examiner pour traiter le refus ou l’échec.

    • message string

      Explication lisible du refus ou de l’échec.

    • retryable boolean

      Indique si une nouvelle tentative peut être envisagée.

    • resets_at string

      Date et heure du prochain renouvellement des crédits.

      Date et heure au format ISO 8601

    decide

    Calcul IA

    Soumettre un tour de décision : question, recommandation ou erreur.

    • session string obligatoire
    • case_id string obligatoire
    • text string obligatoire
    • language "fr" | "en" | "it" | "de" | "es" | "pt" facultatif · Par défaut "fr"
    • refinements string[] | null facultatif · Par défaut null
    • force_decision boolean facultatif · Par défaut false
    • clarification_count integer facultatif · Par défaut 0
    • clarification_version 2 facultatif · Par défaut 2

    Réponse: DecisionResponse

    POST /api/v1/decide

    Entrée

    En-têtes
    • Authorization string · obligatoire

      Jeton de session envoyé sous la forme Bearer <session>.

    • X-Dilem-Case-ID string · obligatoire

      Identifiant conservé pour tous les échanges d’un même dilemme.

      Format technique

      ^[a-zA-Z0-9_-]{1,80}$

    Corps application/json
    REST · Requête · Exemple illustratif · JSON
    {
      "text": "Train or bus for my commute?",
      "language": "en",
      "refinements": [],
      "clarification_version": 2
    }
    • text string · obligatoire

      Le choix initial, conservé à chaque tour.

      De 1 à 6 000 caractères

    • language string · obligatoire

      Langue de l’interface. Les réponses suivent les propos de l’utilisateur.

      Valeurs possibles : "fr", "en", "it", "de", "es", "pt"

    • refinements string[]

      Questions et réponses réelles, dans l’ordre chronologique.

      40 éléments maximum · 6 000 caractères maximum par élément · Par défaut : []

    • force_decision boolean

      Seulement si l’utilisateur demande une recommandation sans autre question.

      Par défaut : false

    • clarification_count integer

      Nombre de réponses aux clarifications.

      De 0 à 20 · Par défaut : 0

    • clarification_version integer

      Version du contrat, toujours 2.

      Par défaut : 2 · Valeur : 2

    MCP · decide · Requête · JSON
    {
      "session": "<session from start_session>",
      "case_id": "my-unique-dilemma-id",
      "text": "Train or car for a weekend trip?",
      "language": "en"
    }

    Réponse

    200 application/json
    Question de clarification Clarification

    Une question à transmettre, ou une notice selon purpose. insufficient_evidence indique que les éléments ne permettent pas un classement défendable ; ne pas relancer sans information nouvelle de l’utilisateur.

    Exemple illustratif · JSON
    {
      "type": "clarification",
      "question": "How far is your commute?",
      "choices": [],
      "format": "number",
      "unit": "km",
      "summary": "Train or bus"
    }
    • type string · obligatoire

      Nature de la réponse renvoyée.

      Valeur : "clarification"

    • question string · obligatoire

      Question à transmettre à l’utilisateur avant de continuer.

    • choices string[] · obligatoire

      Réponses proposées, si la question en fournit.

      6 éléments maximum

    • format string · obligatoire

      Mode de réponse attendu par la question.

      Valeurs possibles : "single", "multiple", "text", "number"

    • unit string | null

      Unité d’une réponse numérique, ou null.

    • summary string · obligatoire

      Synthèse du dilemme.

    • purpose string

      Rôle de la question ou de la notice de périmètre.

      Valeurs possibles : "decision_scope", "scope_notice", "insufficient_evidence"

    • metrics object

      Mesures techniques du traitement.

    Recommandation Result

    La recommandation, ses options, raisons et sources. Les poids sont des préférences relatives, pas des probabilités de réussite. result_id peut être absent.

    Exemple illustratif · JSON
    {
      "type": "result",
      "summary": "Train or bus for my commute?",
      "options": [
        {
          "id": "train",
          "label": "Take the train",
          "description": "Use the direct rail connection.",
          "probability": 0.7
        },
        {
          "id": "bus",
          "label": "Take the bus",
          "description": "Use the bus stop near home.",
          "probability": 0.3
        }
      ],
      "selected": "train",
      "sources": [],
      "result_id": "0123456789abcdef0123456789abcdef"
    }
    • type string · obligatoire

      Nature de la réponse renvoyée.

      Valeur : "result"

    • summary string · obligatoire

      Synthèse du dilemme.

    • context string

      Contexte retenu pour la recommandation.

    • assumptions string[]

      Hypothèses retenues pour comparer les options.

    • criteria string[]

      Critères utilisés pour comparer les options.

    • options object[] · obligatoire

      Options comparées et informations associées.

      De 2 à 8 éléments

    • selected string · obligatoire

      Identifiant de l’option recommandée.

    • sources object[] · obligatoire

      Sources renvoyées avec la recommandation.

    • caution string | null

      Précaution particulière, ou null.

    • timings object

      Durées des étapes du traitement.

    • models object

      Informations sur les modèles de ce tour.

    • metrics object

      Mesures techniques du traitement.

    • result_id string

      Identifiant du résultat appartenant à ce client.

    Erreur Error

    Un refus ou échec de pipeline. Vérifier type même après un HTTP 200 ; en MCP, isError signale également l’erreur.

    Exemple illustratif · JSON
    {
      "type": "error",
      "code": "case_completed"
    }
    • type string · obligatoire

      Nature de la réponse renvoyée.

      Valeur : "error"

    • code string · obligatoire

      Code à examiner pour traiter le refus ou l’échec.

    • message string

      Explication lisible du refus ou de l’échec.

    • retryable boolean

      Indique si une nouvelle tentative peut être envisagée.

    • resets_at string

      Date et heure du prochain renouvellement des crédits.

      Date et heure au format ISO 8601

    Erreurs et reprise

    403 · 408 · 409 · 413 · 422 · 429 · 503 application/json

    Exemple illustratif · JSON
    {
      "type": "error",
      "code": "case_completed"
    }
    • type string · obligatoire

      Nature de la réponse renvoyée.

      Valeur : "error"

    • code string · obligatoire

      Code à examiner pour traiter le refus ou l’échec.

    • message string

      Explication lisible du refus ou de l’échec.

    • retryable boolean

      Indique si une nouvelle tentative peut être envisagée.

    • resets_at string

      Date et heure du prochain renouvellement des crédits.

      Date et heure au format ISO 8601

    Produire une carte du résultat déjà reçu, sans calcul IA ni stockage de l’image.

    • session string obligatoire
    • result CardResult obligatoire
    • language "fr" | "en" | "it" | "de" | "es" | "pt" facultatif · Par défaut "fr"
    • theme "light" | "dark" facultatif · Par défaut "light"

    Réponse: image/png

    POST /api/v1/result-card

    Entrée

    En-têtes
    • Authorization string · obligatoire

      Jeton de session envoyé sous la forme Bearer <session>.

    Corps application/json
    REST · Requête · Exemple illustratif · JSON
    {
      "result": {
        "summary": "Train or bus for my commute?",
        "selected": "train",
        "options": [
          {
            "id": "train",
            "label": "Take the train",
            "description": "Use the direct rail connection.",
            "probability": 0.7
          },
          {
            "id": "bus",
            "label": "Take the bus",
            "description": "Use the bus stop near home.",
            "probability": 0.3
          }
        ]
      },
      "language": "en",
      "theme": "light"
    }
    • result CardResult · obligatoire

      Résultat déjà reçu, à fournir pour produire le PNG.

      Champs
      • summary string · obligatoire

        Synthèse du dilemme.

        De 1 à 6 000 caractères

      • selected string · obligatoire

        Identifiant de l’option recommandée.

        32 caractères maximum

      • options CardOption[] · obligatoire

        Options comparées et informations associées.

        De 2 à 8 éléments

        Champs
        • id string · obligatoire

          Identifiant unique de cette option dans le résultat.

          Format technique

          ^[a-z][a-z0-9_]{0,31}$

        • label string · obligatoire

          Libellé de l’option sur la carte.

          De 1 à 120 caractères

        • description string

          Courte description affichée avec l’option.

          240 caractères maximum · Par défaut : ""

        • probability number · obligatoire

          Poids de préférence, pas une probabilité de réussite.

          De 0 à 1

    • language string

      Langue de présentation.

      Valeurs possibles : "fr", "en", "it", "de", "es", "pt" · Par défaut : "fr"

    • theme string

      Thème visuel de la carte PNG.

      Valeurs possibles : "light", "dark" · Par défaut : "light"

    Réponse

    200 image/png

    Fichier PNG privé renvoyé en pièce jointe. Le nom du fichier figure dans Content-Disposition.

    Erreurs et reprise

    403 · 408 · 409 · 413 · 422 · 429 · 503 · 415 application/json

    Exemple illustratif · JSON
    {
      "type": "error",
      "code": "case_completed"
    }
    • type string · obligatoire

      Nature de la réponse renvoyée.

      Valeur : "error"

    • code string · obligatoire

      Code à examiner pour traiter le refus ou l’échec.

    • message string

      Explication lisible du refus ou de l’échec.

    • retryable boolean

      Indique si une nouvelle tentative peut être envisagée.

    • resets_at string

      Date et heure du prochain renouvellement des crédits.

      Date et heure au format ISO 8601

    Lire le vote du client propriétaire de ce résultat.

    • session string obligatoire
    • result_id string obligatoire

    Réponse: Feedback

    GET /api/v1/feedback/{result_id}

    Entrée

    En-têtes
    • Authorization string · obligatoire

      Jeton de session envoyé sous la forme Bearer <session>.

    Paramètres du chemin
    • result_id string · obligatoire

      Identifiant du résultat appartenant à ce client.

      Format technique

      ^[0-9a-f]{32}$

    Aucun corps de requête requis.

    Réponse

    200 application/json
    Exemple illustratif · JSON
    {
      "result_id": "0123456789abcdef0123456789abcdef",
      "helpful": false,
      "reason": "missing_constraint"
    }
    • result_id string · obligatoire

      Identifiant du résultat appartenant à ce client.

      Format technique

      ^[0-9a-f]{32}$

    • helpful boolean | null · obligatoire

      Avis enregistré, ou null si aucun vote n’a été donné.

    • reason null | string · obligatoire

      Motif de l’avis négatif, ou null.

      Valeurs possibles : null, "misunderstood", "missing_constraint", "too_many_questions", "too_vague"

    Erreurs et reprise

    403 · 408 · 409 · 413 · 422 · 429 · 503 · 404 application/json

    Exemple illustratif · JSON
    {
      "type": "error",
      "code": "case_completed"
    }
    • type string · obligatoire

      Nature de la réponse renvoyée.

      Valeur : "error"

    • code string · obligatoire

      Code à examiner pour traiter le refus ou l’échec.

    • message string

      Explication lisible du refus ou de l’échec.

    • retryable boolean

      Indique si une nouvelle tentative peut être envisagée.

    • resets_at string

      Date et heure du prochain renouvellement des crédits.

      Date et heure au format ISO 8601

    Enregistrer l’avis explicite de l’utilisateur, sans déduire sa satisfaction.

    • session string obligatoire
    • result_id string obligatoire
    • helpful boolean obligatoire
    • reason "misunderstood" | "missing_constraint" | "too_many_questions" | "too_vague" | null facultatif · Par défaut null

    Réponse: Feedback

    POST /api/v1/feedback

    Entrée

    En-têtes
    • Authorization string · obligatoire

      Jeton de session envoyé sous la forme Bearer <session>.

    Corps application/json
    REST · Requête · Exemple illustratif · JSON
    {
      "result_id": "0123456789abcdef0123456789abcdef",
      "helpful": false,
      "reason": "missing_constraint"
    }
    • result_id string · obligatoire

      Identifiant du résultat appartenant à ce client.

      Format technique

      ^[0-9a-f]{32}$

    • helpful boolean · obligatoire

      Avis explicite de l’utilisateur sur la réponse.

    • reason null | string

      Motif de l’avis négatif, ou null.

      Valeurs possibles : null, "misunderstood", "missing_constraint", "too_many_questions", "too_vague"

    Réponse

    200 application/json
    Exemple illustratif · JSON
    {
      "result_id": "0123456789abcdef0123456789abcdef",
      "helpful": false,
      "reason": "missing_constraint"
    }
    • result_id string · obligatoire

      Identifiant du résultat appartenant à ce client.

      Format technique

      ^[0-9a-f]{32}$

    • helpful boolean | null · obligatoire

      Avis enregistré, ou null si aucun vote n’a été donné.

    • reason null | string · obligatoire

      Motif de l’avis négatif, ou null.

      Valeurs possibles : null, "misunderstood", "missing_constraint", "too_many_questions", "too_vague"

    Erreurs et reprise

    403 · 408 · 409 · 413 · 422 · 429 · 503 · 415 · 404 application/json

    Exemple illustratif · JSON
    {
      "type": "error",
      "code": "case_completed"
    }
    • type string · obligatoire

      Nature de la réponse renvoyée.

      Valeur : "error"

    • code string · obligatoire

      Code à examiner pour traiter le refus ou l’échec.

    • message string

      Explication lisible du refus ou de l’échec.

    • retryable boolean

      Indique si une nouvelle tentative peut être envisagée.

    • resets_at string

      Date et heure du prochain renouvellement des crédits.

      Date et heure au format ISO 8601

    Transmettre un message ou un signalement expressément autorisé.

    • session string obligatoire
    • request_id string obligatoire
    • message string obligatoire
    • language "fr" | "en" | "it" | "de" | "es" | "pt" facultatif · Par défaut "fr"
    • kind "general" | "response" facultatif · Par défaut "general"
    • email string facultatif · Par défaut ""
    • response object | null facultatif · Par défaut null

    Réponse: FeedbackAck

    POST /api/v1/user-feedback

    Entrée

    En-têtes
    • Authorization string · obligatoire

      Jeton de session envoyé sous la forme Bearer <session>.

    Corps application/json
    REST · Requête · Exemple illustratif · JSON
    {
      "request_id": "0123456789abcdef0123456789abcdef",
      "kind": "general",
      "message": "Please explain how the recommendation uses my constraints.",
      "email": "",
      "language": "en",
      "source": "agent",
      "version": "unknown",
      "screen": "other",
      "response": null
    }
    • request_id string · obligatoire

      Identifiant à conserver pour dédupliquer le même envoi.

      Format technique

      ^[0-9a-f]{32}$

    • kind string · obligatoire

      Message libre ou signalement d’une réponse.

      Valeurs possibles : "general", "response"

    • message string · obligatoire

      Commentaire expressément fourni par l’utilisateur.

      De 5 à 4 000 caractères

    • email string · obligatoire

      Adresse de contact, ou chaîne vide.

      254 caractères maximum

    • language string · obligatoire

      Langue de présentation.

      Valeurs possibles : "fr", "en", "it", "de", "es", "pt"

    • source string · obligatoire

      Point d’entrée à l’origine du message.

      Valeurs possibles : "agent", "menu", "help", "response"

    • version string · obligatoire

      SHA de l’application, ou unknown.

      Format technique

      ^[0-9a-f]{40}$|^unknown$

    • screen string · obligatoire

      Écran depuis lequel le message est envoyé.

      Valeurs possibles : "home", "clarification", "result", "other"

    • response null | ReportedResponse · obligatoire

      Réponse exacte jointe au signalement, sinon null.

      Champs
      null

      null

      Réponse jointe ReportedResponse
      • kind string · obligatoire

        Nature de la réponse jointe au signalement.

        Valeurs possibles : "clarification", "recommendation"

      • text string · obligatoire

        Texte exact de la réponse jointe.

        De 1 à 12 000 caractères

      • reference string · obligatoire

        Référence de la réponse concernée.

        Format technique

        ^[A-Za-z0-9._:-]{1,80}$

    Réponse

    200 application/json
    Exemple illustratif · JSON
    {
      "ok": true
    }
    • ok boolean · obligatoire

      Confirme l’enregistrement du message.

      Valeur : true

    Erreurs et reprise

    403 · 408 · 409 · 413 · 422 · 429 · 503 · 415 application/json

    Exemple illustratif · JSON
    {
      "type": "error",
      "code": "case_completed"
    }
    • type string · obligatoire

      Nature de la réponse renvoyée.

      Valeur : "error"

    • code string · obligatoire

      Code à examiner pour traiter le refus ou l’échec.

    • message string

      Explication lisible du refus ou de l’échec.

    • retryable boolean

      Indique si une nouvelle tentative peut être envisagée.

    • resets_at string

      Date et heure du prochain renouvellement des crédits.

      Date et heure au format ISO 8601

    Démarrage rapide

    Avec curl et Python 3. Crée une identité une seule fois, conserve son jeton dans un stockage privé et restaure-le lors des visites suivantes.

    Crée une session et conserve la valeur session. Utilise-la dans Authorization: Bearer *** pour les appels suivants. Elle est valable 90 jours ; renouvelle-la avec le même appel et ce jeton.

    POST /api/v1/session · Bash
    DILEM_SESSION=$(curl --fail-with-body --silent --show-error --max-time 15 \
      https://dilem.si/api/v1/session \
      -H 'Content-Type: application/json' -d '{}' | \
      python3 -c 'import json, sys; print(json.load(sys.stdin)["session"])')
    GET /api/v1/usage · Bash
    curl --fail-with-body --max-time 15 https://dilem.si/api/v1/usage \
      -H "Authorization: Bearer ${DILEM_SESSION:?}" \
      -H 'X-Dilem-Case-ID: my-unique-dilemma-id'

    Choisis un Case-ID pour ton dilemme et conserve-le à chaque échange. Tu reçois une question ou une recommandation. Pour répondre, ajoute la question et ta réponse à refinements, puis augmente clarification_count de 1.

    POST /api/v1/decide · Bash
    curl --fail-with-body --max-time 110 --output result.json https://dilem.si/api/v1/decide \
      -H "Authorization: Bearer ${DILEM_SESSION:?}" \
      -H 'X-Dilem-Case-ID: my-unique-dilemma-id' \
      -H 'Content-Type: application/json' \
      -d '{"text":"Train or car for a weekend trip?","language":"en","refinements":[],"clarification_count":0,"clarification_version":2}'

    Session et authentification

    Sans jeton, start_session crée une identité. Avec session, il renouvelle la même identité pour 90 jours. Un jeton invalide ou expiré est refusé, sans remplacement silencieux. REST et MCP partagent ce jeton ; ils ne lisent pas les cookies du navigateur.

    Un Case-ID unique par dilemme, conservé jusqu’au résultat : 1 à 80 caractères parmi a-z, A-Z, 0-9, _ et -. Il identifie le cas, mais ne rend pas un calcul idempotent.

    Cycle d’un dilemme

    1. Soumettre le choix avec son texte initial et un nouveau Case-ID.
    2. Sur clarification, lire purpose : insufficient_evidence est une notice à présenter, sans question ni classement à inventer. Sinon, poser la question et attendre la vraie réponse ; ajouter question + réponse à refinements et augmenter clarification_count.
    3. Sur result, conserver le JSON : le cas est terminé. Pour un nouveau calcul, utiliser un nouveau Case-ID.
    4. Sur error, lire code et retryable. Ne pas rejouer automatiquement un calcul dont l’issue est ambiguë.

    L’agent te transmet les questions et attend tes réponses, sans inventer les informations manquantes. Tu peux lui demander une recommandation sans autre question.

    Paramètres de décision

    • text obligatoire

      Le choix initial, conservé à chaque tour.

      string · 1–6000
    • language obligatoire

      Langue de l’interface. Les réponses suivent les propos de l’utilisateur.

      fr | en | it | de | es | pt
    • refinements facultatif

      Questions et réponses réelles, dans l’ordre chronologique.

      array · ≤40 × 6000
    • clarification_count facultatif

      Nombre de réponses aux clarifications.

      integer · 0–20
    • clarification_version facultatif

      Version du contrat, toujours 2.

      2
    • force_decision facultatif

      Seulement si l’utilisateur demande une recommandation sans autre question.

      boolean

    Texte + précisions : 24 000 caractères au total. Corps HTTP : 300 000 octets, reçus en 10 secondes ; une enveloppe fournisseur trop volumineuse peut aussi être refusée avant consommation.

    Réponses

    Question de clarification type: clarification

    Une question à transmettre, ou une notice selon purpose. insufficient_evidence indique que les éléments ne permettent pas un classement défendable ; ne pas relancer sans information nouvelle de l’utilisateur.

    type, question, choices, format, unit, summary, purpose, metrics

    Recommandation type: result

    La recommandation, ses options, raisons et sources. Les poids sont des préférences relatives, pas des probabilités de réussite. result_id peut être absent.

    type, summary, context, assumptions, criteria, options, selected, sources, caution, timings, models, metrics, result_id

    Erreur type: error

    Un refus ou échec de pipeline. Vérifier type même après un HTTP 200 ; en MCP, isError signale également l’erreur.

    type, code, message, retryable, resets_at

    Exemple illustratif · clarification · JSON
    {
      "type": "clarification",
      "question": "How far is your commute?",
      "choices": [],
      "format": "number",
      "unit": "km",
      "summary": "Train or bus"
    }

    Résultats et retours

    Exporter le résultat en PNG

    Fournis le résultat reçu dans result, avec language et theme (light ou dark). PNG privé, nom dans Content-Disposition, Cache-Control: no-store. Aucun crédit de dilemme consommé, aucune publication. En MCP : image native et métadonnées de fichier.

    Requête · Exemple illustratif · Bash
    python3 -c 'import json, sys; print(json.dumps({"result": json.load(sys.stdin), "language": "fr", "theme": "light"}))' < result.json > card-input.json
    POST /api/v1/result-card · Bash
    curl --fail-with-body --max-time 15 https://dilem.si/api/v1/result-card \
      -H "Authorization: Bearer ${DILEM_SESSION:?}" \
      -H "Content-Type: application/json" \
      --data-binary @card-input.json --output dilem.png

    Lire ou enregistrer un avis

    result_id identifie un résultat de cette identité. helpful est un booléen ; reason est facultatif pour un avis négatif uniquement : misunderstood, missing_constraint, too_many_questions ou too_vague. Un résultat absent, expiré ou étranger renvoie le même 404.

    GET /api/v1/feedback/{result_id}
    Requête · Exemple illustratif · JSON
    {"result_id": "<result_id from your result>", "helpful": false, "reason": "missing_constraint"}
    POST /api/v1/feedback · Bash
    curl --fail-with-body --max-time 15 https://dilem.si/api/v1/feedback \
      -H "Authorization: Bearer ${DILEM_SESSION:?}" \
      -H "Content-Type: application/json" \
      --data-binary @feedback-input.json

    Envoyer un message ou signaler une réponse

    request_id : 32 caractères hexadécimaux minuscules. message : 5 caractères hors espaces minimum, 4 000 maximum. kind=general pour un message ; kind=response pour un signalement avec la réponse exacte jointe. E-mail facultatif. Garde le même identifiant et contenu ; pas de rejeu automatique après une panne ambiguë.

    Requête · Exemple illustratif · JSON
    {
      "request_id": "<32 lowercase hex characters>",
      "kind": "general",
      "message": "<user-authorized message>",
      "email": "",
      "language": "fr",
      "source": "agent",
      "version": "unknown",
      "screen": "other",
      "response": null
    }
    POST /api/v1/user-feedback · Bash
    curl --fail-with-body --max-time 15 https://dilem.si/api/v1/user-feedback \
      -H "Authorization: Bearer ${DILEM_SESSION:?}" \
      -H "Content-Type: application/json" \
      --data-binary @user-feedback-input.json

    Crédits

    Un crédit couvre un dilemme jusqu’à sa première recommandation, clarifications comprises. Tout nouveau calcul après cette recommandation utilise un autre crédit.

    Consulte get_usage en MCP ou GET /api/v1/usage en REST pour connaître tes crédits restants et leur renouvellement.

    Les plafonds viennent de la politique active, pas d’une valeur figée dans ce guide. L’export PNG et les retours ne consomment pas de crédit de dilemme ; ils gardent leurs limites techniques et anti-abus.

    Erreurs et reprise

    403 : session absente, invalide ou expirée, origine refusée ou cookies interdits. 408/413/422 : délai, taille ou entrée invalide. 409 : cas terminé. 429 : quota, budget ou capacité. 503 : service indisponible. Vérifie aussi le champ type de la réponse : un échec de pipeline peut arriver après admission. Ne rejoue pas automatiquement un calcul après une panne ambiguë ; le Case-ID n’est pas une clé d’idempotence du calcul.

    Une déconnexion peut laisser du travail déjà consommé. Lire les quotas ne permet pas de reconstituer une réponse perdue.

    Agent dans le navigateur

    Dans un navigateur compatible, WebMCP permet à ton agent d’utiliser la page ouverte, avec ton historique et tes crédits. Sinon, utilise la connexion MCP distante ou l’API. L’accès distant fonctionne à l’écrit ; la dictée reste disponible dans l’application.

    Commence par get_dilemma. submit_dilemma transmet un choix ou une réponse ; recommend_dilemma demande une recommandation sans autre question. Les actions de résultat utilisent le cas visible, pas le jeton distant.

    WebMCP ajoute l’export local avec aperçu, les avis et les signalements, ainsi que list_saved_dilemmas et get_saved_dilemma pour lire l’historique de ce navigateur. L’URL de l’image expire à la fermeture de l’aperçu. Ni cet historique ni les cookies du navigateur ne sont partagés avec le MCP distant.

    Référence technique

    Les schémas OpenAPI décrivent les corps et réponses complets. Le guide Markdown sert de point d’entrée aux agents ; le catalogue et la Server Card exposent la découverte MCP.

    Les échanges textuels sont conservés 30 jours par le service. L’historique du navigateur reste sur ton appareil et n’est pas partagé avec l’agent distant.

    Confidentialité et fournisseurs

    Contact · [email protected]