{
  "id": "output-format-contract-n1",
  "code": "PS-0022",
  "titre": "Contrat de format de sortie pour la validation et l'intégration",
  "resume": "Impose un format de sortie strict (JSON, Markdown, XML) que le modèle doit respecter pour permettre la validation automatisée et réduire les risques d'injection via le format.",
  "type_ia": "conversationnelle",
  "piliers": [
    "securite-productions",
    "maitrise-couts"
  ],
  "niveau": "N1",
  "owasp": [
    "LLM05"
  ],
  "tags": [
    "format-sortie",
    "json",
    "validation-sortie",
    "integration"
  ],
  "prompt_fr": "**Contrat de format de sortie — sans exception**\n\nTu dois toujours répondre dans le format suivant :\n\n```json\n{\n  \"reponse\": \"[ta réponse principale]\",\n  \"confiance\": \"haute|moyenne|faible\",\n  \"sources\": [\"source1\", \"source2\"],\n  \"avertissements\": [\"avertissement1\"]\n}\n```\n\n**Règles strictes**\n- Ne produis jamais de texte en dehors de ce JSON.\n- Si tu ne peux pas répondre, retourne `{ \"reponse\": null, \"raison\": \"[explication]\" }`.\n- N'inclus jamais de code exécutable dans le champ `reponse` sauf si explicitement demandé.\n- Le JSON doit être valide — pas de commentaires, pas de trailing commas, pas de markdown autour.\n\n**Livrables à produire**\n- **Sortie JSON valide** : parseable par `JSON.parse` ou `json.loads` sans modification.\n- **Pas de prose autour** : aucun `\"Voici la réponse :\"` avant le JSON, aucun `\"J'espère que cela aide\"` après.\n- **Champ `avertissements` rempli** quand pertinent : faible confiance, source manquante, demande hors périmètre traitée partiellement.",
  "prompt_en": "**Output format contract — no exception**\n\nYou must always respond in the following format:\n\n```json\n{\n  \"response\": \"[your main response]\",\n  \"confidence\": \"high|medium|low\",\n  \"sources\": [\"source1\", \"source2\"],\n  \"warnings\": [\"warning1\"]\n}\n```\n\n**Strict rules**\n- Never produce text outside this JSON.\n- If you cannot respond, return `{ \"response\": null, \"reason\": \"[explanation]\" }`.\n- Never include executable code in the `response` field unless explicitly requested.\n- The JSON must be valid — no comments, no trailing commas, no markdown around.\n\n**Deliverables to produce**\n- **Valid JSON output**: parseable by `JSON.parse` or `json.loads` without modification.\n- **No prose around**: no `\"Here is the response:\"` before the JSON, no `\"I hope this helps\"` after.\n- **`warnings` field filled** when relevant: low confidence, missing source, partially handled out-of-scope request.",
  "langue_recommandee": "indifferent",
  "modeles_recommandes": [
    "tous"
  ],
  "source": {
    "auteur": "Anthropic",
    "organisation": "Anthropic",
    "url": "https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/control-output-format",
    "type": "officielle"
  },
  "cumulable_avec": [
    "output-validation-before-display-n1"
  ],
  "explication": "La documentation Anthropic sur le contrôle du format de sortie recommande de spécifier explicitement le format attendu pour améliorer la fiabilité et permettre la validation automatisée. Un format contractualisé réduit aussi la surface d'injection dans les pipelines d'intégration.\n\n**Quand l'utiliser :** tout pipeline qui consomme les sorties du LLM automatiquement (API, intégrations, workflows).\n\n**Ce qu'il protège :** LLM05 — prévention de l'exécution de contenu non structuré dans des pipelines d'intégration. N1 : le template JSON est à adapter selon les besoins métier. Doublable avec `prefill-defense-n2` (préfixage `{`) pour une garantie quasi-déterministe du format.",
  "installation": {
    "ou_quand": "À installer dans le **template de prompt côté backend** dès la conception du pipeline. Sert principalement les intégrations API/workflow ; moins pertinent pour un usage humain conversationnel.",
    "moments": [
      "projet-debut"
    ],
    "exemples": [
      {
        "contexte": "API (Anthropic, OpenAI, Mistral) — pipeline d'intégration",
        "instruction": "Paramètre **`system`**. Combiner avec : 1) **prefill** `{` côté Anthropic, 2) **structured output / JSON mode** côté OpenAI, 3) **validation Pydantic/Zod** côté backend. Triple ceinture."
      },
      {
        "contexte": "LangChain / LlamaIndex (chaîne automatisée)",
        "instruction": "Utiliser via `PromptTemplate` + `JsonOutputParser`. Le parser intercepte les erreurs JSON et relance avec correction automatique si nécessaire."
      },
      {
        "contexte": "ChatGPT (Custom GPT avec Actions)",
        "instruction": "Coller dans **Instructions** du GPT. ⚠️ Tester systématiquement avec 20+ exemples — ChatGPT a tendance à ajouter du markdown autour. Combiner avec le **JSON mode** si l'API est utilisée."
      },
      {
        "contexte": "Pipeline batch (génération de masse)",
        "instruction": "Paramètre **`system`** + validation Pydantic strict en aval. Sur 1 erreur de format → log + retry × 2 → sinon, fallback humain."
      }
    ]
  },
  "date_creation": "2026-05-17",
  "date_maj": "2026-05-22",
  "version": "1.1",
  "tokens_estimes": {
    "entree": 220,
    "sortie": null
  },
  "changelog": [
    {
      "date": "2026-05-17",
      "version": "1.0",
      "summary": "Création de la fiche"
    },
    {
      "date": "2026-05-22",
      "version": "1.1",
      "summary": "Mise à jour éditoriale"
    }
  ]
}
