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.
Connexion MCP
https://dilem.si/api/v1/mcpTransport 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
claude mcp add --transport http dilem https://dilem.si/api/v1/mcpCodex
~/.codex/config.toml[mcp_servers.dilem]
url = "https://dilem.si/api/v1/mcp"
tool_timeout_sec = 110Cursor
.cursor/mcp.json{
"mcpServers": {
"dilem": {
"url": "https://dilem.si/api/v1/mcp"
}
}
}OpenCode
opencode.json{
"mcp": {
"dilem": {
"type": "remote",
"url": "https://dilem.si/api/v1/mcp",
"enabled": true,
"oauth": false
}
}
}Hermes Agent
hermes mcp add dilem --url https://dilem.si/api/v1/mcpMistral Vibe
~/.vibe/config.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 = {}OpenClaw
~/.openclaw/openclaw.json{
"mcp": {
"servers": {
"dilem": {
"url": "https://dilem.si/api/v1/mcp",
"transport": "streamable-http",
"enabled": true,
"connectionTimeoutMs": 10000,
"requestTimeoutMs": 110000
}
}
}
}Pi
~/.pi/agent/mcp.json{
"mcpServers": {
"dilem": {
"url": "https://dilem.si/api/v1/mcp",
"timeout": 110
}
}
}Référence MCP
start_session
ÉcritureCréer ou renouveler l’identité privée du client.
sessionstring | nullfacultatif · Par défaut null
Réponse: Session
POST /api/v1/session
Entrée
En-têtes
AuthorizationJeton de session envoyé sous la forme Bearer <session>.
Aucun corps de requête requis.
Réponse
200 application/json
{
"session": "OPAQUE_SESSION_KEEP_PRIVATE",
"expires_in": 7776000
}sessionJeton privé du client, à conserver pour les appels suivants.
expires_inDurée de validité de la session, en secondes.
Valeur :
7776000
Erreurs et reprise
403 · 408 · 409 · 413 · 422 · 429 · 503 application/json
{
"type": "error",
"code": "case_completed"
}typeNature de la réponse renvoyée.
Valeur :
"error"codeCode à examiner pour traiter le refus ou l’échec.
messageExplication lisible du refus ou de l’échec.
retryableIndique si une nouvelle tentative peut être envisagée.
resets_atDate et heure du prochain renouvellement des crédits.
Date et heure au format ISO 8601
get_usage
LectureConsulter les crédits, leur renouvellement et l’état éventuel du cas.
sessionstringobligatoirecase_idstring | nullfacultatif · Par défaut null
Réponse: Usage
GET /api/v1/usage
Entrée
En-têtes
AuthorizationJeton de session envoyé sous la forme Bearer <session>.
X-Dilem-Case-IDIdentifiant 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
{
"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
}
}dayJournée UTC des compteurs.
Date au format ISO 8601
resets_atDate et heure du prochain renouvellement des crédits.
Date et heure au format ISO 8601
collectiveCompteur collectif des dilemmes terminés.
Champs
completedNombre de dilemmes terminés dans le compteur collectif.
dilemmasCrédits de dilemme utilisés, disponibles et autorisés.
Champs
usedCrédits déjà utilisés.
Minimum : 0
limitPlafond de crédits de la politique active.
Minimum : 0
remainingCrédits encore disponibles.
Minimum : 0
caseÉtat du dilemme correspondant au Case-ID fourni.
Champs
idCase-ID demandé, ou null sans identifiant.
admittedIndique si ce dilemme a déjà été admis dans le quota.
completedIndique si une première recommandation a terminé ce dilemme.
voiceDurées de dictée et plafonds, en secondes.
Champs
seconds_usedSecondes de dictée déjà consommées.
seconds_reservedSecondes temporairement réservées par une capture en cours.
seconds_remainingSecondes de dictée encore disponibles.
seconds_limitPlafond total de dictée, en secondes.
max_secondsDurée maximale d’une capture, en secondes.
budgetBudget financier partagé et disponibilité du service.
Champs
daily_usdPlafond financier quotidien du service, en dollars US.
availableIndique si le budget permet encore des calculs.
Erreurs et reprise
403 · 408 · 409 · 413 · 422 · 429 · 503 application/json
{
"type": "error",
"code": "case_completed"
}typeNature de la réponse renvoyée.
Valeur :
"error"codeCode à examiner pour traiter le refus ou l’échec.
messageExplication lisible du refus ou de l’échec.
retryableIndique si une nouvelle tentative peut être envisagée.
resets_atDate et heure du prochain renouvellement des crédits.
Date et heure au format ISO 8601
decide
Calcul IASoumettre un tour de décision : question, recommandation ou erreur.
sessionstringobligatoirecase_idstringobligatoiretextstringobligatoirelanguage"fr" | "en" | "it" | "de" | "es" | "pt"facultatif · Par défaut "fr"refinementsstring[] | nullfacultatif · Par défaut nullforce_decisionbooleanfacultatif · Par défaut falseclarification_countintegerfacultatif · Par défaut 0clarification_version2facultatif · Par défaut 2
Réponse: DecisionResponse
POST /api/v1/decide
Entrée
En-têtes
AuthorizationJeton de session envoyé sous la forme Bearer <session>.
X-Dilem-Case-IDIdentifiant conservé pour tous les échanges d’un même dilemme.
Format technique
^[a-zA-Z0-9_-]{1,80}$
Corps application/json
{
"text": "Train or bus for my commute?",
"language": "en",
"refinements": [],
"clarification_version": 2
}textLe choix initial, conservé à chaque tour.
De 1 à 6 000 caractères
languageLangue de l’interface. Les réponses suivent les propos de l’utilisateur.
Valeurs possibles :
"fr","en","it","de","es","pt"refinementsQuestions 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_decisionSeulement si l’utilisateur demande une recommandation sans autre question.
Par défaut :
falseclarification_countNombre de réponses aux clarifications.
De 0 à 20 · Par défaut :
0clarification_versionVersion du contrat, toujours 2.
Par défaut :
2· Valeur :2
{
"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.
{
"type": "clarification",
"question": "How far is your commute?",
"choices": [],
"format": "number",
"unit": "km",
"summary": "Train or bus"
}typeNature de la réponse renvoyée.
Valeur :
"clarification"questionQuestion à transmettre à l’utilisateur avant de continuer.
choicesRéponses proposées, si la question en fournit.
6 éléments maximum
formatMode de réponse attendu par la question.
Valeurs possibles :
"single","multiple","text","number"unitUnité d’une réponse numérique, ou null.
summarySynthèse du dilemme.
purposeRôle de la question ou de la notice de périmètre.
Valeurs possibles :
"decision_scope","scope_notice","insufficient_evidence"metricsMesures 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.
{
"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"
}typeNature de la réponse renvoyée.
Valeur :
"result"summarySynthèse du dilemme.
contextContexte retenu pour la recommandation.
assumptionsHypothèses retenues pour comparer les options.
criteriaCritères utilisés pour comparer les options.
optionsOptions comparées et informations associées.
De 2 à 8 éléments
selectedIdentifiant de l’option recommandée.
sourcesSources renvoyées avec la recommandation.
cautionPrécaution particulière, ou null.
timingsDurées des étapes du traitement.
modelsInformations sur les modèles de ce tour.
metricsMesures techniques du traitement.
result_idIdentifiant 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.
{
"type": "error",
"code": "case_completed"
}typeNature de la réponse renvoyée.
Valeur :
"error"codeCode à examiner pour traiter le refus ou l’échec.
messageExplication lisible du refus ou de l’échec.
retryableIndique si une nouvelle tentative peut être envisagée.
resets_atDate 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
{
"type": "error",
"code": "case_completed"
}typeNature de la réponse renvoyée.
Valeur :
"error"codeCode à examiner pour traiter le refus ou l’échec.
messageExplication lisible du refus ou de l’échec.
retryableIndique si une nouvelle tentative peut être envisagée.
resets_atDate et heure du prochain renouvellement des crédits.
Date et heure au format ISO 8601
export_result_card
LectureProduire une carte du résultat déjà reçu, sans calcul IA ni stockage de l’image.
sessionstringobligatoireresultCardResultobligatoirelanguage"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
AuthorizationJeton de session envoyé sous la forme Bearer <session>.
Corps application/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"
}resultRésultat déjà reçu, à fournir pour produire le PNG.
Champs
summarySynthèse du dilemme.
De 1 à 6 000 caractères
selectedIdentifiant de l’option recommandée.
32 caractères maximum
optionsOptions comparées et informations associées.
De 2 à 8 éléments
Champs
idIdentifiant unique de cette option dans le résultat.
Format technique
^[a-z][a-z0-9_]{0,31}$labelLibellé de l’option sur la carte.
De 1 à 120 caractères
descriptionCourte description affichée avec l’option.
240 caractères maximum · Par défaut :
""probabilityPoids de préférence, pas une probabilité de réussite.
De 0 à 1
languageLangue de présentation.
Valeurs possibles :
"fr","en","it","de","es","pt"· Par défaut :"fr"themeThè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
{
"type": "error",
"code": "case_completed"
}typeNature de la réponse renvoyée.
Valeur :
"error"codeCode à examiner pour traiter le refus ou l’échec.
messageExplication lisible du refus ou de l’échec.
retryableIndique si une nouvelle tentative peut être envisagée.
resets_atDate et heure du prochain renouvellement des crédits.
Date et heure au format ISO 8601
get_result_feedback
LectureLire le vote du client propriétaire de ce résultat.
sessionstringobligatoireresult_idstringobligatoire
Réponse: Feedback
GET /api/v1/feedback/{result_id}
Entrée
En-têtes
AuthorizationJeton de session envoyé sous la forme Bearer <session>.
Paramètres du chemin
result_idIdentifiant du résultat appartenant à ce client.
Format technique
^[0-9a-f]{32}$
Aucun corps de requête requis.
Réponse
200 application/json
{
"result_id": "0123456789abcdef0123456789abcdef",
"helpful": false,
"reason": "missing_constraint"
}result_idIdentifiant du résultat appartenant à ce client.
Format technique
^[0-9a-f]{32}$helpfulAvis enregistré, ou null si aucun vote n’a été donné.
reasonMotif 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
{
"type": "error",
"code": "case_completed"
}typeNature de la réponse renvoyée.
Valeur :
"error"codeCode à examiner pour traiter le refus ou l’échec.
messageExplication lisible du refus ou de l’échec.
retryableIndique si une nouvelle tentative peut être envisagée.
resets_atDate et heure du prochain renouvellement des crédits.
Date et heure au format ISO 8601
set_result_feedback
ÉcritureEnregistrer l’avis explicite de l’utilisateur, sans déduire sa satisfaction.
sessionstringobligatoireresult_idstringobligatoirehelpfulbooleanobligatoirereason"misunderstood" | "missing_constraint" | "too_many_questions" | "too_vague" | nullfacultatif · Par défaut null
Réponse: Feedback
POST /api/v1/feedback
Entrée
En-têtes
AuthorizationJeton de session envoyé sous la forme Bearer <session>.
Corps application/json
{
"result_id": "0123456789abcdef0123456789abcdef",
"helpful": false,
"reason": "missing_constraint"
}result_idIdentifiant du résultat appartenant à ce client.
Format technique
^[0-9a-f]{32}$helpfulAvis explicite de l’utilisateur sur la réponse.
reasonMotif de l’avis négatif, ou null.
Valeurs possibles :
null,"misunderstood","missing_constraint","too_many_questions","too_vague"
Réponse
200 application/json
{
"result_id": "0123456789abcdef0123456789abcdef",
"helpful": false,
"reason": "missing_constraint"
}result_idIdentifiant du résultat appartenant à ce client.
Format technique
^[0-9a-f]{32}$helpfulAvis enregistré, ou null si aucun vote n’a été donné.
reasonMotif 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
{
"type": "error",
"code": "case_completed"
}typeNature de la réponse renvoyée.
Valeur :
"error"codeCode à examiner pour traiter le refus ou l’échec.
messageExplication lisible du refus ou de l’échec.
retryableIndique si une nouvelle tentative peut être envisagée.
resets_atDate et heure du prochain renouvellement des crédits.
Date et heure au format ISO 8601
send_user_feedback
ÉcritureTransmettre un message ou un signalement expressément autorisé.
sessionstringobligatoirerequest_idstringobligatoiremessagestringobligatoirelanguage"fr" | "en" | "it" | "de" | "es" | "pt"facultatif · Par défaut "fr"kind"general" | "response"facultatif · Par défaut "general"emailstringfacultatif · Par défaut ""responseobject | nullfacultatif · Par défaut null
Réponse: FeedbackAck
POST /api/v1/user-feedback
Entrée
En-têtes
AuthorizationJeton de session envoyé sous la forme Bearer <session>.
Corps application/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_idIdentifiant à conserver pour dédupliquer le même envoi.
Format technique
^[0-9a-f]{32}$kindMessage libre ou signalement d’une réponse.
Valeurs possibles :
"general","response"messageCommentaire expressément fourni par l’utilisateur.
De 5 à 4 000 caractères
emailAdresse de contact, ou chaîne vide.
254 caractères maximum
languageLangue de présentation.
Valeurs possibles :
"fr","en","it","de","es","pt"sourcePoint d’entrée à l’origine du message.
Valeurs possibles :
"agent","menu","help","response"versionSHA de l’application, ou unknown.
Format technique
^[0-9a-f]{40}$|^unknown$screenÉcran depuis lequel le message est envoyé.
Valeurs possibles :
"home","clarification","result","other"responseRéponse exacte jointe au signalement, sinon null.
Champs
nullnullRéponse jointe
ReportedResponsekindNature de la réponse jointe au signalement.
Valeurs possibles :
"clarification","recommendation"textTexte exact de la réponse jointe.
De 1 à 12 000 caractères
referenceRéférence de la réponse concernée.
Format technique
^[A-Za-z0-9._:-]{1,80}$
Réponse
200 application/json
{
"ok": true
}okConfirme l’enregistrement du message.
Valeur :
true
Erreurs et reprise
403 · 408 · 409 · 413 · 422 · 429 · 503 · 415 application/json
{
"type": "error",
"code": "case_completed"
}typeNature de la réponse renvoyée.
Valeur :
"error"codeCode à examiner pour traiter le refus ou l’échec.
messageExplication lisible du refus ou de l’échec.
retryableIndique si une nouvelle tentative peut être envisagée.
resets_atDate 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.
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"])')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.
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
- Soumettre le choix avec son texte initial et un nouveau Case-ID.
- 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.
- Sur result, conserver le JSON : le cas est terminé. Pour un nouveau calcul, utiliser un nouveau Case-ID.
- 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
textobligatoireLe choix initial, conservé à chaque tour.
string · 1–6000languageobligatoireLangue de l’interface. Les réponses suivent les propos de l’utilisateur.
fr | en | it | de | es | ptrefinementsfacultatifQuestions et réponses réelles, dans l’ordre chronologique.
array · ≤40 × 6000clarification_countfacultatifNombre de réponses aux clarifications.
integer · 0–20clarification_versionfacultatifVersion du contrat, toujours 2.
2force_decisionfacultatifSeulement 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
{
"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.
python3 -c 'import json, sys; print(json.dumps({"result": json.load(sys.stdin), "language": "fr", "theme": "light"}))' < result.json > card-input.jsoncurl --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.pngLire 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}{"result_id": "<result_id from your result>", "helpful": false, "reason": "missing_constraint"}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.jsonEnvoyer 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ë.
{
"request_id": "<32 lowercase hex characters>",
"kind": "general",
"message": "<user-authorized message>",
"email": "",
"language": "fr",
"source": "agent",
"version": "unknown",
"screen": "other",
"response": null
}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.jsonCré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